diff --git a/TESTING.md b/TESTING.md index 34fcd2150c..041a2fea93 100644 --- a/TESTING.md +++ b/TESTING.md @@ -434,8 +434,7 @@ make test-package PACKAGE=nmp_common uv run pytest -v packages/nmp_common/tests/ # Test a specific service -make test-service SERVICE=evaluator -uv run pytest -v services/evaluator/tests/ +make test-service SERVICE=guardrails # Test a specific file uv run pytest -v path/to/test_file.py @@ -746,4 +745,3 @@ If you're updating existing tests: - [ ] Chaos engineering tests - [ ] Load and stress tests - [ ] Contract testing between services - diff --git a/conftest.py b/conftest.py index dc4a33c51a..f4deccde38 100644 --- a/conftest.py +++ b/conftest.py @@ -232,7 +232,7 @@ def pytest_collection_modifyitems(config, items): item.add_marker(pytest.mark.e2e) marker_names.add("e2e") - # Auto-mark integration tests (e.g., /services/evaluator/tests/integration/) + # Auto-mark integration tests (e.g., /services/core/jobs/tests/integration/) elif "/integration/" in fspath_str: if "integration" not in marker_names: item.add_marker(pytest.mark.integration) diff --git a/docs/evaluator/tutorials/run-llm-judge-evaluation.mdx b/docs/evaluator/tutorials/run-llm-judge-evaluation.mdx index 27bb0113a1..b83c4d5d76 100644 --- a/docs/evaluator/tutorials/run-llm-judge-evaluation.mdx +++ b/docs/evaluator/tutorials/run-llm-judge-evaluation.mdx @@ -155,12 +155,12 @@ This tutorial uses `nvidia/nemotron-3-nano-30b-a3b` from NVIDIA Build. ```python from nemo_evaluator_sdk import RunConfig, LLMJudgeMetric from nemo_evaluator_sdk.values import ( + FilesetRef, InferenceParams, JSONScoreParser, Model, RangeScore, ) -from nmp.evaluator.app.values import FilesetRef JUDGE_MODEL_URL = "https://integrate.api.nvidia.com/v1/chat/completions" JUDGE_MODEL_NAME = "nvidia/nemotron-3-nano-30b-a3b" diff --git a/docs/set-up/config-reference.mdx b/docs/set-up/config-reference.mdx index fc716d2c59..bbd4cd1d95 100644 --- a/docs/set-up/config-reference.mdx +++ b/docs/set-up/config-reference.mdx @@ -813,44 +813,6 @@ unsloth: default_training_execution_profile: gpu ``` -### `evaluator` - -Configuration for the Evaluator service. - -```yaml -evaluator: - # Configuration for jobs created with Evaluator service. - jobs: - # Directory path in job container for evaluation configuration. | default: '/configs' - configs_dir: /configs - # Directory path of the shared volume mount for job steps to persist artifacts for a job. | default: '/jobs' - volume_path: /jobs - # Directory path in the job container for results to be output. | default: '/jobs/results' - results_dir: /jobs/results - # Directory path in the job container for dataset files to be downloaded to and loaded from. | default: '/jobs/datasets' - dataset_dir: /jobs/datasets - # Configuration for EvalFactory integration with NeMo Platform. - evalfactory: - # default: 'nvcr.io/nvidia/eval-factory/agentic_eval:26.01' - agentic_eval: nvcr.io/nvidia/eval-factory/agentic_eval:26.01 - # default: 'nvcr.io/nvidia/eval-factory/bfcl:26.01' - bfcl: nvcr.io/nvidia/eval-factory/bfcl:26.01 - # default: 'nvcr.io/nvidia/eval-factory/lm-evaluation-harness:26.01' - lm_eval_harness: nvcr.io/nvidia/eval-factory/lm-evaluation-harness:26.01 - # default: 'nvcr.io/nvidia/eval-factory/bigcode-evaluation-harness:26.01' - bigcode_evaluation_harness: nvcr.io/nvidia/eval-factory/bigcode-evaluation-harness:26.01 - # default: 'nvcr.io/nvidia/eval-factory/rag_retriever_eval:26.01' - rag_retriever: nvcr.io/nvidia/eval-factory/rag_retriever_eval:26.01 - # default: 'nvcr.io/nvidia/eval-factory/safety-harness:26.01' - safety_harness: nvcr.io/nvidia/eval-factory/safety-harness:26.01 - # default: 'nvcr.io/nvidia/eval-factory/simple-evals:26.01' - simple_evals: nvcr.io/nvidia/eval-factory/simple-evals:26.01 - # Connect to a hosted Milvus server for retrieval evaluations - milvus_url: - # Upsert system metrics and benchmarks on app startup | default: False - recreate_existing_system_entities: false -``` - ### `safe_synthesizer` Configuration for Safe Synthesizer plugin API and task compilation. diff --git a/e2e/test_inference.py b/e2e/test_inference.py index 4931ab8a7f..578e9a7c90 100644 --- a/e2e/test_inference.py +++ b/e2e/test_inference.py @@ -236,7 +236,6 @@ def test_model_list_via_openai_route(sdk: NeMoPlatform, workspace: str): workspace=workspace, name=entity_name, mock_response_body={"id": "chatcmpl-test", "choices": []}, - served_models={entity_name: f"served-{entity_name}"}, ) models = sdk.inference.gateway.openai.v1.models.list(workspace=workspace) diff --git a/openapi/ga/individual/platform.openapi.yaml b/openapi/ga/individual/platform.openapi.yaml index 194ccf56cc..4b77e71108 100644 --- a/openapi/ga/individual/platform.openapi.yaml +++ b/openapi/ga/individual/platform.openapi.yaml @@ -7946,7 +7946,7 @@ components: title: Name title: BaseModelFilter type: object - CPUExecutionProvider: + CPUExecutionProviderInput: properties: provider: type: string @@ -7966,7 +7966,34 @@ components: type: object required: - container - title: CPUExecutionProvider + title: CPUExecutionProviderInput + description: 'CPU-based execution provider. + + + Provides configuration for running jobs on CPU resources with + + resource requests and limits.' + CPUExecutionProviderOutput: + properties: + provider: + type: string + const: cpu + title: Provider + default: cpu + profile: + type: string + title: Profile + default: default + container: + $ref: '#/components/schemas/ContainerSpec' + resources: + allOf: + - $ref: '#/components/schemas/ComputeResources' + description: Resource requests and limits for CPU execution. + type: object + required: + - container + title: CPUExecutionProviderOutput description: 'CPU-based execution provider. @@ -8610,7 +8637,7 @@ components: default: generic metadata: allOf: - - $ref: '#/components/schemas/FilesetMetadata' + - $ref: '#/components/schemas/FilesetMetadataInput' description: 'Purpose-specific metadata. Use the purpose as the key (e.g., {dataset: {...}}).' custom_fields: @@ -8955,7 +8982,7 @@ components: type: object title: Spec platform_spec: - $ref: '#/components/schemas/PlatformJobSpec' + $ref: '#/components/schemas/PlatformJobSpecInput' source: type: string title: Source @@ -9137,7 +9164,34 @@ components: type: object title: DialogRails description: Configuration of topical rails. - DistributedGPUExecutionProvider: + DistributedGPUExecutionProviderInput: + properties: + provider: + type: string + const: gpu_distributed + title: Provider + default: gpu_distributed + profile: + type: string + title: Profile + default: default + container: + $ref: '#/components/schemas/ContainerSpec' + resources: + allOf: + - $ref: '#/components/schemas/ComputeResources' + description: Resource requests and limits for distributed GPU execution. + type: object + required: + - container + title: DistributedGPUExecutionProviderInput + description: 'GPU-based execution provider. + + + Provides configuration for running jobs on GPU resources with + + resource requests and limits.' + DistributedGPUExecutionProviderOutput: properties: provider: type: string @@ -9157,7 +9211,7 @@ components: type: object required: - container - title: DistributedGPUExecutionProvider + title: DistributedGPUExecutionProviderOutput description: 'GPU-based execution provider. @@ -10373,14 +10427,25 @@ components: (on or before) datetime filters. title: FilesetFilter type: object - FilesetMetadata: + FilesetMetadataInput: + properties: + dataset: + $ref: '#/components/schemas/DatasetMetadataContent' + model: + $ref: '#/components/schemas/ModelMetadataContent' + type: object + title: FilesetMetadataInput + description: "Tagged metadata container - the key indicates the type.\n\nExample:\n\ + \ metadata = FilesetMetadata(\n dataset=DatasetMetadataContent(\n\ + \ schema={\"columns\": [\"id\", \"name\"]},\n )\n )" + FilesetMetadataOutput: properties: dataset: $ref: '#/components/schemas/DatasetMetadataContent' model: $ref: '#/components/schemas/ModelMetadataContent' type: object - title: FilesetMetadata + title: FilesetMetadataOutput description: "Tagged metadata container - the key indicates the type.\n\nExample:\n\ \ metadata = FilesetMetadata(\n dataset=DatasetMetadataContent(\n\ \ schema={\"columns\": [\"id\", \"name\"]},\n )\n )" @@ -10408,7 +10473,7 @@ components: - $ref: '#/components/schemas/S3StorageConfig' title: Storage metadata: - $ref: '#/components/schemas/FilesetMetadata' + $ref: '#/components/schemas/FilesetMetadataOutput' custom_fields: additionalProperties: true type: object @@ -10613,7 +10678,34 @@ components: type: object title: GLiNERDetectionOptions description: Configuration options for GLiNER. - GPUExecutionProvider: + GPUExecutionProviderInput: + properties: + provider: + type: string + const: gpu + title: Provider + default: gpu + profile: + type: string + title: Profile + default: default + container: + $ref: '#/components/schemas/ContainerSpec' + resources: + allOf: + - $ref: '#/components/schemas/ComputeResources' + description: Resource requests and limits for GPU execution. + type: object + required: + - container + title: GPUExecutionProviderInput + description: 'GPU-based execution provider. + + + Provides configuration for running jobs on GPU resources with + + resource requests and limits.' + GPUExecutionProviderOutput: properties: provider: type: string @@ -10633,7 +10725,7 @@ components: type: object required: - container - title: GPUExecutionProvider + title: GPUExecutionProviderOutput description: 'GPU-based execution provider. @@ -11064,7 +11156,7 @@ components: type: string data: allOf: - - $ref: '#/components/schemas/RailsConfig' + - $ref: '#/components/schemas/RailsConfigOutput' type: object description: Guardrail configuration data additionalProperties: true @@ -11247,7 +11339,7 @@ components: - type: string title: Reference description: A reference to RailsConfig. - - $ref: '#/components/schemas/RailsConfig' + - $ref: '#/components/schemas/RailsConfigInput' title: Config description: The id of the configuration or its dict representation to be used. @@ -13867,14 +13959,23 @@ components: type: object title: PatronusEvaluateApiParams description: Config to parameterize the Patronus Evaluate API call - PatronusEvaluateConfig: + PatronusEvaluateConfigInput: + properties: + evaluate_config: + allOf: + - $ref: '#/components/schemas/PatronusEvaluateApiParams' + description: Configuration passed to the Patronus Evaluate API + type: object + title: PatronusEvaluateConfigInput + description: Config for the Patronus Evaluate API call + PatronusEvaluateConfigOutput: properties: evaluate_config: allOf: - $ref: '#/components/schemas/PatronusEvaluateApiParams' description: Configuration passed to the Patronus Evaluate API type: object - title: PatronusEvaluateConfig + title: PatronusEvaluateConfigOutput description: Config for the Patronus Evaluate API call PatronusEvaluationSuccessStrategy: type: string @@ -13891,18 +13992,31 @@ components: ALL_PASS requires all evaluators to pass for success. ANY_PASS requires only one evaluator to pass for success.' - PatronusRailConfig: + PatronusRailConfigInput: + properties: + input: + allOf: + - $ref: '#/components/schemas/PatronusEvaluateConfigInput' + description: Patronus Evaluate API configuration for an Input Guardrail + output: + allOf: + - $ref: '#/components/schemas/PatronusEvaluateConfigInput' + description: Patronus Evaluate API configuration for an Output Guardrail + type: object + title: PatronusRailConfigInput + description: Configuration data for the Patronus Evaluate API + PatronusRailConfigOutput: properties: input: allOf: - - $ref: '#/components/schemas/PatronusEvaluateConfig' + - $ref: '#/components/schemas/PatronusEvaluateConfigOutput' description: Patronus Evaluate API configuration for an Input Guardrail output: allOf: - - $ref: '#/components/schemas/PatronusEvaluateConfig' + - $ref: '#/components/schemas/PatronusEvaluateConfigOutput' description: Patronus Evaluate API configuration for an Output Guardrail type: object - title: PatronusRailConfig + title: PatronusRailConfigOutput description: Configuration data for the Patronus Evaluate API PlatformJobEnvironmentVariable: properties: @@ -14027,7 +14141,7 @@ components: title: Spec description: Job Spec platform_spec: - $ref: '#/components/schemas/PlatformJobSpec' + $ref: '#/components/schemas/PlatformJobSpecOutput' fileset: type: string title: Fileset @@ -14166,18 +14280,31 @@ components: - updated_at - -updated_at title: PlatformJobSortField - PlatformJobSpec: + PlatformJobSpecInput: + properties: + steps: + items: + $ref: '#/components/schemas/PlatformJobStepSpecInput' + type: array + title: Steps + description: List of steps to be executed in the job + type: object + required: + - steps + title: PlatformJobSpecInput + description: Specification for a platform job, containing steps and secrets. + PlatformJobSpecOutput: properties: steps: items: - $ref: '#/components/schemas/PlatformJobStepSpec' + $ref: '#/components/schemas/PlatformJobStepSpecOutput' type: array title: Steps description: List of steps to be executed in the job type: object required: - steps - title: PlatformJobSpec + title: PlatformJobSpecOutput description: Specification for a platform job, containing steps and secrets. PlatformJobStatus: type: string @@ -14352,7 +14479,7 @@ components: Parent-scoped: unique within (workspace, entity_type, parent=attempt_id).' - PlatformJobStepSpec: + PlatformJobStepSpecInput: properties: name: type: string @@ -14374,18 +14501,18 @@ components: type: array executor: oneOf: - - $ref: '#/components/schemas/CPUExecutionProvider' - - $ref: '#/components/schemas/GPUExecutionProvider' - - $ref: '#/components/schemas/DistributedGPUExecutionProvider' + - $ref: '#/components/schemas/CPUExecutionProviderInput' + - $ref: '#/components/schemas/GPUExecutionProviderInput' + - $ref: '#/components/schemas/DistributedGPUExecutionProviderInput' - $ref: '#/components/schemas/SubprocessExecutionProvider' title: Executor description: The executor for the step discriminator: propertyName: provider mapping: - cpu: '#/components/schemas/CPUExecutionProvider' - gpu: '#/components/schemas/GPUExecutionProvider' - gpu_distributed: '#/components/schemas/DistributedGPUExecutionProvider' + cpu: '#/components/schemas/CPUExecutionProviderInput' + gpu: '#/components/schemas/GPUExecutionProviderInput' + gpu_distributed: '#/components/schemas/DistributedGPUExecutionProviderInput' subprocess: '#/components/schemas/SubprocessExecutionProvider' config: additionalProperties: true @@ -14400,7 +14527,57 @@ components: required: - name - executor - title: PlatformJobStepSpec + title: PlatformJobStepSpecInput + description: Specification for a single step in a platform job. + PlatformJobStepSpecOutput: + properties: + name: + type: string + pattern: ^[a-z](?!.*--)[a-z0-9\-@.+_]{1,62}(?=1.61.0", "sacrebleu>=2.5.1", "rouge_score==0.1.2", + "ragas==0.3.5", + "langchain-openai>=1.1.14", + "langchain-nvidia-ai-endpoints>=1.0.0,<2.0.0", ] [dependency-groups] diff --git a/packages/nemo_platform/pyproject.toml b/packages/nemo_platform/pyproject.toml index 00c779afec..eb8ae4bfa0 100644 --- a/packages/nemo_platform/pyproject.toml +++ b/packages/nemo_platform/pyproject.toml @@ -110,36 +110,6 @@ entities-service = [ "alembic>=1.13.1", ] -# Generated from [tool.bundle-package]; do not edit by hand. -evaluator-service = [ - "fastapi[standard]>=0.115.4", - "pydantic>=2.10.3", - "pydantic-settings>=2.6.1", - "uvicorn<1.0.0.0,>=0.24.0-post.0", - "starlette<1.0.0,>=0.52.1", - "requests<3.0.0,>=2.31.0", - "base58<3.0.0,>=2.1.1", - "opentelemetry-distro>=0.48b0,<1.0", - "opentelemetry-exporter-otlp>=1.27.0", - "sqlmodel<1.0.0,>=0.0.14", - "psycopg2-binary<3.0.0,>=2.9.9", - "alembic<2.0.0,>=1.13.1", - "python-box>=7.3.2", - "jsonpath-ng>=1.6.0", - "nmp-common", - "aiofiles>=25.1.0", - "aiohttp>=3.13.4", - "datasets>=3.3.1", - "huggingface-hub>=1.0.1,<2.0.0", - "kubernetes>=31.0.0", - "openai>=1.61.0", - "ragas==0.3.5", - "langchain-community>=0.3.31,<0.4", - "pymilvus==2.6.9", - "langchain-nvidia-ai-endpoints>=1.0.0,<2.0.0", - "nemo-evaluator-sdk", -] - # Generated from [tool.bundle-package]; do not edit by hand. files-service = [ "fastapi>=0.115.8", @@ -322,6 +292,9 @@ nemo-evaluator-sdk = [ "openai>=1.61.0", "sacrebleu>=2.5.1", "rouge_score==0.1.2", + "ragas==0.3.5", + "langchain-openai>=1.1.14", + "langchain-nvidia-ai-endpoints>=1.0.0,<2.0.0", ] # Generated from [tool.bundle-package]; do not edit by hand. @@ -368,6 +341,7 @@ nemo-platform-sdk = [ # Generated from [tool.bundle-package]; do not edit by hand. nemo-safe-synthesizer-plugin = [ + "datasets>=3.3.1,<=4.3.0", "fastapi>=0.115.8", "fsspec>=2024.10.0", "gunicorn>=23.0.0", @@ -460,7 +434,6 @@ services = [ "nemo-platform[intake-service]", "nemo-platform[hello-world-service]", "nemo-platform[guardrails-service]", - "nemo-platform[evaluator-service]", "nemo-platform[plugins]", ] @@ -637,7 +610,6 @@ nmp-inference-gateway = { source = "../../services/core/inference-gateway/src/nm # Non-core services nmp-guardrails = { source = "../../services/guardrails/src/nmp/guardrails", module = "nmp/guardrails", deps_group = "guardrails-service" } -nmp-evaluator = { source = "../../services/evaluator/src/nmp/evaluator", module = "nmp/evaluator", deps_group = "evaluator-service" } nmp-platform-seed = { source = "../../services/platform-seed/src/nmp/platform_seed", module = "nmp/platform_seed", deps_group = "platform-seed-service" } nmp-hello-world = { source = "../../services/hello-world/src/nmp/hello_world", module = "nmp/hello_world", deps_group = "hello-world-service" } nmp-intake = { source = "../../services/intake/src/nmp/intake", module = "nmp/intake", deps_group = "intake-service" } diff --git a/packages/nmp_common/src/nmp/common/mcp/README.md b/packages/nmp_common/src/nmp/common/mcp/README.md index 0a02e6d2bb..283e00c1ff 100644 --- a/packages/nmp_common/src/nmp/common/mcp/README.md +++ b/packages/nmp_common/src/nmp/common/mcp/README.md @@ -13,7 +13,6 @@ When multiple MCP servers exist across the platform: ``` services/core/mcp/ # Core infrastructure tools services/guardrails/mcp/ # Guardrails-specific tools -services/evaluator/mcp/ # Evaluation-specific tools plugins/nemo-customizer/ # Customization plugin (router + contributor discovery) ``` @@ -157,11 +156,9 @@ When aggregating multiple service MCP servers: ```python # services/core/mcp/src/nmp/core/mcp/server.py from nmp.guardrails.mcp.server import guardrails -from nmp.evaluator.mcp.server import evaluator platform = FastMCP("NeMo Platform") platform.mount(guardrails) # All tools use same patterns -platform.mount(evaluator) # Consistent for agents ``` **Benefits**: diff --git a/packages/nmp_testing/src/nmp/testing/client.py b/packages/nmp_testing/src/nmp/testing/client.py index 0d9d50a79e..9fb7e04fac 100644 --- a/packages/nmp_testing/src/nmp/testing/client.py +++ b/packages/nmp_testing/src/nmp/testing/client.py @@ -246,11 +246,11 @@ def create_test_client( Example (with access_log for request verification): with create_test_client( - EvaluatorService, auth_enabled=True, access_log=True, client_type=ClientContext + FilesService, auth_enabled=True, access_log=True, client_type=ClientContext ) as ctx: ctx.access_log.clear() # Clear requests from setup ctx.test_client.get( - "/apis/evaluation/v2/workspaces/default/metrics", + "/apis/files/v2/workspaces/default/filesets", headers={"X-NMP-Principal-Id": "test@example.com"}, ) # Verify internal entity requests used the same principal diff --git a/plugins/nemo-auditor/openapi/openapi.yaml b/plugins/nemo-auditor/openapi/openapi.yaml index 0fa3ef6f54..1423232e2a 100644 --- a/plugins/nemo-auditor/openapi/openapi.yaml +++ b/plugins/nemo-auditor/openapi/openapi.yaml @@ -446,7 +446,7 @@ components: run: $ref: '#/components/schemas/AuditRunData' plugins: - $ref: '#/components/schemas/AuditPluginsData' + $ref: '#/components/schemas/AuditPluginsDataOutput' reporting: $ref: '#/components/schemas/AuditReportData' id: @@ -501,7 +501,7 @@ components: type: object title: AuditModuleConfig description: Per-module plugin configuration mapping. - AuditPluginsData: + AuditPluginsDataInput: properties: model_type: title: Model Type @@ -567,7 +567,74 @@ components: type: object title: Probes type: object - title: AuditPluginsData + title: AuditPluginsDataInput + AuditPluginsDataOutput: + properties: + model_type: + title: Model Type + type: string + model_name: + title: Model Name + type: string + probe_spec: + type: string + title: Probe Spec + default: all + detector_spec: + type: string + title: Detector Spec + default: auto + extended_detectors: + type: boolean + title: Extended Detectors + default: false + buff_spec: + title: Buff Spec + type: string + buffs_include_original_prompt: + type: boolean + title: Buffs Include Original Prompt + default: false + buff_max: + title: Buff Max + type: string + detectors: + additionalProperties: + anyOf: + - $ref: '#/components/schemas/AuditModuleConfig' + - $ref: '#/components/schemas/AuditClassConfig' + type: object + title: Detectors + generators: + additionalProperties: + anyOf: + - $ref: '#/components/schemas/AuditModuleConfig' + - $ref: '#/components/schemas/AuditClassConfig' + type: object + title: Generators + buffs: + additionalProperties: + anyOf: + - $ref: '#/components/schemas/AuditModuleConfig' + - $ref: '#/components/schemas/AuditClassConfig' + type: object + title: Buffs + harnesses: + additionalProperties: + anyOf: + - $ref: '#/components/schemas/AuditModuleConfig' + - $ref: '#/components/schemas/AuditClassConfig' + type: object + title: Harnesses + probes: + additionalProperties: + anyOf: + - $ref: '#/components/schemas/AuditModuleConfig' + - $ref: '#/components/schemas/AuditClassConfig' + type: object + title: Probes + type: object + title: AuditPluginsDataOutput AuditReportData: properties: report_prefix: @@ -771,7 +838,7 @@ components: run: $ref: '#/components/schemas/AuditRunData' plugins: - $ref: '#/components/schemas/AuditPluginsData' + $ref: '#/components/schemas/AuditPluginsDataInput' reporting: $ref: '#/components/schemas/AuditReportData' type: object @@ -871,7 +938,7 @@ components: run: $ref: '#/components/schemas/AuditRunData' plugins: - $ref: '#/components/schemas/AuditPluginsData' + $ref: '#/components/schemas/AuditPluginsDataInput' reporting: $ref: '#/components/schemas/AuditReportData' type: object diff --git a/plugins/nemo-evaluator/openapi/openapi.yaml b/plugins/nemo-evaluator/openapi/openapi.yaml index 338af4c311..ecbed63932 100644 --- a/plugins/nemo-evaluator/openapi/openapi.yaml +++ b/plugins/nemo-evaluator/openapi/openapi.yaml @@ -23,9 +23,7 @@ paths: tags: - Evaluator Plugin Hello Routes summary: Hello - description: "Greet a name.\n\nThe greeting style is controlled by ``EvaluatorConfig.greeting_style``:\n\ - \n- ``\"formal\"`` (default) \u2192 ``\"Hello, {name}!\"``\n- ``\"casual\"\ - `` \u2192 ``\"Hey, {name}!\"``\n\nOverride at runtime: ``NMP_EVALUATOR_GREETING_STYLE=casual``." + description: Greet a name. operationId: hello_apis_evaluator_v1_hello__name__get parameters: - name: name @@ -1419,10 +1417,6 @@ components: description: 'Reference to a platform secret or local environment variable. Format: ''secret_name'' (uses request workspace) or ''workspace/secret_name'' (explicit workspace).' - examples: - - my-secret - - my-workspace/my-secret - - NVIDIA_API_KEY StringFilter: additionalProperties: false properties: diff --git a/plugins/nemo-evaluator/src/nemo_evaluator/config.py b/plugins/nemo-evaluator/src/nemo_evaluator/config.py index 15dd296663..20564006c5 100644 --- a/plugins/nemo-evaluator/src/nemo_evaluator/config.py +++ b/plugins/nemo-evaluator/src/nemo_evaluator/config.py @@ -1,47 +1,17 @@ # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -"""Configuration for the Evaluator plugin. - -Demonstrates the :class:`~nemo_platform_plugin.config.NemoConfig` pattern: declare -:attr:`plugin_name` and :attr:`plugin_description` as ``ClassVar`` strings, then -add plugin-specific fields as regular Pydantic fields. - -Operators set values via environment variables or the Helm ``platformConfig`` key: - - # Environment variables (highest priority) - NMP_EVALUATOR_GREETING_STYLE=casual - - # Helm values.yaml (platformConfig key) - platformConfig: - evaluator: - greeting_style: casual -""" +"""Configuration namespace for the evaluator plugin.""" from __future__ import annotations -from typing import ClassVar, Literal +from typing import ClassVar from nemo_platform_plugin.config import NemoConfig -from pydantic import Field class EvaluatorConfig(NemoConfig): - """Configuration for the NeMo Platform evaluator plugin. - - All fields have defaults so the plugin runs out-of-the-box without any - operator configuration. Override via environment variables or the Helm - ``platformConfig.evaluator`` section. - """ + """Configuration namespace for the evaluator plugin.""" plugin_name: ClassVar[str] = "evaluator" - plugin_description: ClassVar[str] = "Configuration for the NeMo Platform evaluator plugin." - - greeting_style: Literal["formal", "casual"] = Field( - default="formal", - description=( - "Controls the tone of /hello/{name} responses. " - '"formal" → "Hello, {name}!" "casual" → "Hey, {name}!"' - " Set NMP_EVALUATOR_GREETING_STYLE to override." - ), - ) + plugin_description: ClassVar[str] = "Configuration namespace for the evaluator plugin." diff --git a/plugins/nemo-evaluator/src/nemo_evaluator/service.py b/plugins/nemo-evaluator/src/nemo_evaluator/service.py index a456e70ecc..3209f84fb8 100644 --- a/plugins/nemo-evaluator/src/nemo_evaluator/service.py +++ b/plugins/nemo-evaluator/src/nemo_evaluator/service.py @@ -8,6 +8,7 @@ from typing import ClassVar from fastapi import APIRouter +from nemo_evaluator.core import say_hello from nemo_evaluator.jobs.evaluate import EvaluateJob from nemo_evaluator.schema import HelloResponse from nemo_platform_plugin.jobs.routes import add_job_routes @@ -62,22 +63,7 @@ def _build_hello_router() -> APIRouter: @router.get("/hello/{name}", response_model=HelloResponse) async def hello(name: str) -> HelloResponse: - """Greet a name. - - The greeting style is controlled by ``EvaluatorConfig.greeting_style``: - - - ``"formal"`` (default) → ``"Hello, {name}!"`` - - ``"casual"`` → ``"Hey, {name}!"`` - - Override at runtime: ``NMP_EVALUATOR_GREETING_STYLE=casual``. - """ - from nemo_evaluator.config import EvaluatorConfig - - config = EvaluatorConfig.get() - if config.greeting_style == "casual": - message = f"Hey, {name}!" - else: - message = f"Hello, {name}!" - return HelloResponse(message=message) + """Greet a name.""" + return HelloResponse(message=say_hello(name)) return router diff --git a/plugins/nemo-guardrails/benchmarks/README.md b/plugins/nemo-guardrails/benchmarks/README.md index 4a923f9833..bede28d85e 100644 --- a/plugins/nemo-guardrails/benchmarks/README.md +++ b/plugins/nemo-guardrails/benchmarks/README.md @@ -44,9 +44,8 @@ the `bench` extra on `nemo-guardrails-plugin`. The `make benchmark-guardrails` target installs them automatically via `uv run --extra bench`; they are not part of the plugin's runtime install. -The upstream `aiperf` CLI itself pins `aiofiles<24.2`, which conflicts with -NMP's evaluator-service. To avoid downgrading the shared workspace venv, the -harness creates an isolated venv at +The upstream `aiperf` CLI itself pins older transitive dependencies. To avoid +downgrading the shared workspace venv, the harness creates an isolated venv at `plugins/nemo-guardrails/benchmarks/artifacts/venvs/aiperf/` on first run and reuses it on subsequent runs. CI gets a fresh one each invocation; locally this caches across runs for fast iteration. diff --git a/plugins/nemo-guardrails/pyproject.toml b/plugins/nemo-guardrails/pyproject.toml index 83a6db4797..1de56c6344 100644 --- a/plugins/nemo-guardrails/pyproject.toml +++ b/plugins/nemo-guardrails/pyproject.toml @@ -18,10 +18,9 @@ dependencies = [ bench = [ "httpx>=0.27", "pyyaml>=6.0", - # NOTE: aiperf itself is *not* listed here. Its 0.x line pins - # aiofiles<24.2 which conflicts with evaluator-service's - # aiofiles>=25.1. To avoid downgrading the shared workspace venv, the - # harness installs aiperf into a dedicated venv at run time; see + # NOTE: aiperf itself is *not* listed here. Its 0.x line pins older + # transitive dependencies. To avoid downgrading the shared workspace venv, + # the harness installs aiperf into a dedicated venv at run time; see # `nemo_guardrails_plugin.benchmarks.bootstrap`. ] diff --git a/plugins/nemo-guardrails/src/nemo_guardrails_plugin/benchmarks/bootstrap.py b/plugins/nemo-guardrails/src/nemo_guardrails_plugin/benchmarks/bootstrap.py index 761a5f56c3..708a23c810 100644 --- a/plugins/nemo-guardrails/src/nemo_guardrails_plugin/benchmarks/bootstrap.py +++ b/plugins/nemo-guardrails/src/nemo_guardrails_plugin/benchmarks/bootstrap.py @@ -3,9 +3,8 @@ """Bootstrap an isolated venv for the upstream AIPerf load generator. -``aiperf`` pins ``aiofiles<24.2`` which conflicts with NMP's evaluator-service -requirement of ``aiofiles>=25.1``, so we install it into a dedicated venv -instead of the shared workspace one. The venv is reused across local runs; +``aiperf`` pins older transitive dependencies, so we install it into a dedicated +venv instead of the shared workspace one. The venv is reused across local runs; CI gets a fresh one each invocation. """ diff --git a/plugins/nemo-safe-synthesizer/pyproject.toml b/plugins/nemo-safe-synthesizer/pyproject.toml index 130dcb6b29..649a76b8bf 100644 --- a/plugins/nemo-safe-synthesizer/pyproject.toml +++ b/plugins/nemo-safe-synthesizer/pyproject.toml @@ -6,6 +6,7 @@ readme = "README.md" requires-python = ">=3.11,<3.14" authors = [{ name = "NVIDIA", email = "nemo@nvidia.com" }] dependencies = [ + "datasets>=3.3.1,<=4.3.0", "fastapi>=0.115.8", "fsspec>=2024.10.0", "gunicorn>=23.0.0", diff --git a/pyproject.toml b/pyproject.toml index 3702b119aa..a460d34304 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,6 @@ dependencies = [ "mypy-extensions==1.0.0", "tornado>=6.5.5", # pinned for CVE GHSA-7cx3-6m66-7c5m (>=6.5.0) + GHSA-qjxf-f2mg-c6mc (<=6.5.4, fixed in 6.5.5) "tomlkit>=0.13.3", - "nmp-evaluator", "nmp-guardrails", "nmp-hello-world", "nmp-intake", @@ -122,7 +121,6 @@ dev = [ # Service packages for local development (not in root deps to allow --only-group in containers) "nemo-anonymizer-plugin", "nemo-data-designer-plugin", - "nmp-evaluator", "nmp-guardrails", "nemo-safe-synthesizer-plugin", "nmp-hello-world", @@ -203,7 +201,6 @@ core-services = [ functional-services = [ { include-group = "core-services" }, "nmp-studio", - "nmp-evaluator", "nmp-guardrails", "nemo-data-designer-plugin", "nemo-anonymizer-plugin", @@ -217,7 +214,6 @@ functional-services = [ cpu-tasks = [ { include-group = "nmp-base" }, { include-group = "nmp-task-runtime" }, - "nmp-evaluator", "nemo-anonymizer-plugin", "nemo-data-designer-plugin", "nmp-hello-world", @@ -333,7 +329,6 @@ nmp-auth = { workspace = true } nemo-anonymizer-plugin = { workspace = true } nemo-data-designer-plugin = { workspace = true } data-designer-nemo = { workspace = true } -nmp-evaluator = { workspace = true } nemo-evaluator-sdk = { workspace = true } nmp-guardrails = { workspace = true } nmp-intake = { workspace = true } @@ -392,7 +387,6 @@ members = [ "services/hello-world", "services/studio", "services/guardrails", - "services/evaluator", "services/intake", "plugins/nemo-anonymizer", "plugins/nemo-data-designer", diff --git a/pytest.ini b/pytest.ini index 2dd3a99528..cd079a4899 100644 --- a/pytest.ini +++ b/pytest.ini @@ -40,7 +40,6 @@ testpaths = services/core/secrets/tests services/core/tests services/data-designer/tests - services/evaluator/tests services/guardrails/tests services/hello-world/tests services/intake/tests diff --git a/ruff.toml b/ruff.toml index 053e7d25b4..f0ddddca61 100644 --- a/ruff.toml +++ b/ruff.toml @@ -26,10 +26,8 @@ exclude = [ "node_modules", "site-packages", "venv", - "services/evaluator/src/external/evaltool", "services/auditor/fixes/cve-2025-8194", "services/guardrails/fixes/cve-2025-8194", - "services/evaluator/fixes/cve-2025-8194", "services/safe-synthesizer/fixes/cve-2025-8194", "services/safe-synthesizer-api/fixes/cve-2025-8194", "architecture/examples", diff --git a/script/copyright_fixer.py b/script/copyright_fixer.py index 5c9f4cefe2..25beb0260d 100755 --- a/script/copyright_fixer.py +++ b/script/copyright_fixer.py @@ -158,8 +158,8 @@ def _matches_path_filter(relpath: str, patterns: list[str]) -> bool: """Return True if *relpath* matches any of the given path patterns. - Patterns are matched as prefixes first (e.g. ``services/evaluator`` - matches ``services/evaluator/src/foo.py``). If a pattern contains + Patterns are matched as prefixes first (e.g. ``services/guardrails`` + matches ``services/guardrails/src/foo.py``). If a pattern contains glob characters it falls back to fnmatch on the full relative path. """ for pat in patterns: @@ -524,7 +524,7 @@ def update_license_headers( don't end up with a monster commit:: # Only process two directories - ./script/copyright_fixer.py . --include services/evaluator --include packages/models + ./script/copyright_fixer.py . --include services/guardrails --include packages/models # Process everything except generated SDK code ./script/copyright_fixer.py . --exclude packages/nemo_platform diff --git a/script/generate_config_docs.py b/script/generate_config_docs.py index 3ed49f9407..2837d3ffc4 100644 --- a/script/generate_config_docs.py +++ b/script/generate_config_docs.py @@ -49,7 +49,6 @@ from nmp.core.jobs.config import JobsServiceConfig from nmp.core.models.config import ModelsConfig from nmp.core.secrets.config import SecretsServiceConfig -from nmp.evaluator.config import EvaluatorSettings from nmp.studio.config import StudioConfig from nmp.unsloth.config import UnslothConfig from ruamel.yaml import YAML @@ -72,7 +71,6 @@ SecretsServiceConfig, AutomodelConfig, UnslothConfig, - EvaluatorSettings, SafeSynthesizerConfig, StudioConfig, ] diff --git a/script/generate_openapi_spec.py b/script/generate_openapi_spec.py index 85628283cc..275158f528 100644 --- a/script/generate_openapi_spec.py +++ b/script/generate_openapi_spec.py @@ -471,29 +471,6 @@ def apply_schema_fixes(spec_files: List[str], apply_reorder: bool = True) -> Non print_verbose(f"Applying streaming fixes to {spec_file}") spec = fix_openai_streaming_endpoints(spec) - # Rename namespaced schemas BEFORE tweak_spec strips namespace prefixes. - # This prevents collisions when multiple services define classes with the - # same name (e.g. both evaluator and guardrail define "Model"). - # Keys are the full namespaced schema name as generated by FastAPI/Pydantic; - # values are the desired OpenAPI schema name after renaming. - namespaced_schema_renames: dict[str, str] = { - # SDK Model schema (Model is imported from nemo_evaluator_sdk.values.models) - "nmp__evaluator__app__values__models__Model": "Evaluator.Model", - "nemo_evaluator_sdk__values__models__Model": "Evaluator.Model", - } - if "platform" in spec_file: - if "components" in spec and "schemas" in spec["components"]: - schemas = spec["components"]["schemas"] - for namespaced_key, new_name in namespaced_schema_renames.items(): - if namespaced_key in schemas: - schemas[new_name] = schemas.pop(namespaced_key) - rename_schema_references(spec, namespaced_key, new_name) - else: - print_verbose( - f"Warning: expected schema '{namespaced_key}' not found in {spec_file}, " - f"skipping rename to '{new_name}'" - ) - # Apply the standard fix-schema logic spec = tweak_spec(spec) spec = hoist_nested_defs(spec) diff --git a/sdk/python/nemo-platform/.nmpcontext/openapi.yaml b/sdk/python/nemo-platform/.nmpcontext/openapi.yaml index 194ccf56cc..4b77e71108 100644 --- a/sdk/python/nemo-platform/.nmpcontext/openapi.yaml +++ b/sdk/python/nemo-platform/.nmpcontext/openapi.yaml @@ -7946,7 +7946,7 @@ components: title: Name title: BaseModelFilter type: object - CPUExecutionProvider: + CPUExecutionProviderInput: properties: provider: type: string @@ -7966,7 +7966,34 @@ components: type: object required: - container - title: CPUExecutionProvider + title: CPUExecutionProviderInput + description: 'CPU-based execution provider. + + + Provides configuration for running jobs on CPU resources with + + resource requests and limits.' + CPUExecutionProviderOutput: + properties: + provider: + type: string + const: cpu + title: Provider + default: cpu + profile: + type: string + title: Profile + default: default + container: + $ref: '#/components/schemas/ContainerSpec' + resources: + allOf: + - $ref: '#/components/schemas/ComputeResources' + description: Resource requests and limits for CPU execution. + type: object + required: + - container + title: CPUExecutionProviderOutput description: 'CPU-based execution provider. @@ -8610,7 +8637,7 @@ components: default: generic metadata: allOf: - - $ref: '#/components/schemas/FilesetMetadata' + - $ref: '#/components/schemas/FilesetMetadataInput' description: 'Purpose-specific metadata. Use the purpose as the key (e.g., {dataset: {...}}).' custom_fields: @@ -8955,7 +8982,7 @@ components: type: object title: Spec platform_spec: - $ref: '#/components/schemas/PlatformJobSpec' + $ref: '#/components/schemas/PlatformJobSpecInput' source: type: string title: Source @@ -9137,7 +9164,34 @@ components: type: object title: DialogRails description: Configuration of topical rails. - DistributedGPUExecutionProvider: + DistributedGPUExecutionProviderInput: + properties: + provider: + type: string + const: gpu_distributed + title: Provider + default: gpu_distributed + profile: + type: string + title: Profile + default: default + container: + $ref: '#/components/schemas/ContainerSpec' + resources: + allOf: + - $ref: '#/components/schemas/ComputeResources' + description: Resource requests and limits for distributed GPU execution. + type: object + required: + - container + title: DistributedGPUExecutionProviderInput + description: 'GPU-based execution provider. + + + Provides configuration for running jobs on GPU resources with + + resource requests and limits.' + DistributedGPUExecutionProviderOutput: properties: provider: type: string @@ -9157,7 +9211,7 @@ components: type: object required: - container - title: DistributedGPUExecutionProvider + title: DistributedGPUExecutionProviderOutput description: 'GPU-based execution provider. @@ -10373,14 +10427,25 @@ components: (on or before) datetime filters. title: FilesetFilter type: object - FilesetMetadata: + FilesetMetadataInput: + properties: + dataset: + $ref: '#/components/schemas/DatasetMetadataContent' + model: + $ref: '#/components/schemas/ModelMetadataContent' + type: object + title: FilesetMetadataInput + description: "Tagged metadata container - the key indicates the type.\n\nExample:\n\ + \ metadata = FilesetMetadata(\n dataset=DatasetMetadataContent(\n\ + \ schema={\"columns\": [\"id\", \"name\"]},\n )\n )" + FilesetMetadataOutput: properties: dataset: $ref: '#/components/schemas/DatasetMetadataContent' model: $ref: '#/components/schemas/ModelMetadataContent' type: object - title: FilesetMetadata + title: FilesetMetadataOutput description: "Tagged metadata container - the key indicates the type.\n\nExample:\n\ \ metadata = FilesetMetadata(\n dataset=DatasetMetadataContent(\n\ \ schema={\"columns\": [\"id\", \"name\"]},\n )\n )" @@ -10408,7 +10473,7 @@ components: - $ref: '#/components/schemas/S3StorageConfig' title: Storage metadata: - $ref: '#/components/schemas/FilesetMetadata' + $ref: '#/components/schemas/FilesetMetadataOutput' custom_fields: additionalProperties: true type: object @@ -10613,7 +10678,34 @@ components: type: object title: GLiNERDetectionOptions description: Configuration options for GLiNER. - GPUExecutionProvider: + GPUExecutionProviderInput: + properties: + provider: + type: string + const: gpu + title: Provider + default: gpu + profile: + type: string + title: Profile + default: default + container: + $ref: '#/components/schemas/ContainerSpec' + resources: + allOf: + - $ref: '#/components/schemas/ComputeResources' + description: Resource requests and limits for GPU execution. + type: object + required: + - container + title: GPUExecutionProviderInput + description: 'GPU-based execution provider. + + + Provides configuration for running jobs on GPU resources with + + resource requests and limits.' + GPUExecutionProviderOutput: properties: provider: type: string @@ -10633,7 +10725,7 @@ components: type: object required: - container - title: GPUExecutionProvider + title: GPUExecutionProviderOutput description: 'GPU-based execution provider. @@ -11064,7 +11156,7 @@ components: type: string data: allOf: - - $ref: '#/components/schemas/RailsConfig' + - $ref: '#/components/schemas/RailsConfigOutput' type: object description: Guardrail configuration data additionalProperties: true @@ -11247,7 +11339,7 @@ components: - type: string title: Reference description: A reference to RailsConfig. - - $ref: '#/components/schemas/RailsConfig' + - $ref: '#/components/schemas/RailsConfigInput' title: Config description: The id of the configuration or its dict representation to be used. @@ -13867,14 +13959,23 @@ components: type: object title: PatronusEvaluateApiParams description: Config to parameterize the Patronus Evaluate API call - PatronusEvaluateConfig: + PatronusEvaluateConfigInput: + properties: + evaluate_config: + allOf: + - $ref: '#/components/schemas/PatronusEvaluateApiParams' + description: Configuration passed to the Patronus Evaluate API + type: object + title: PatronusEvaluateConfigInput + description: Config for the Patronus Evaluate API call + PatronusEvaluateConfigOutput: properties: evaluate_config: allOf: - $ref: '#/components/schemas/PatronusEvaluateApiParams' description: Configuration passed to the Patronus Evaluate API type: object - title: PatronusEvaluateConfig + title: PatronusEvaluateConfigOutput description: Config for the Patronus Evaluate API call PatronusEvaluationSuccessStrategy: type: string @@ -13891,18 +13992,31 @@ components: ALL_PASS requires all evaluators to pass for success. ANY_PASS requires only one evaluator to pass for success.' - PatronusRailConfig: + PatronusRailConfigInput: + properties: + input: + allOf: + - $ref: '#/components/schemas/PatronusEvaluateConfigInput' + description: Patronus Evaluate API configuration for an Input Guardrail + output: + allOf: + - $ref: '#/components/schemas/PatronusEvaluateConfigInput' + description: Patronus Evaluate API configuration for an Output Guardrail + type: object + title: PatronusRailConfigInput + description: Configuration data for the Patronus Evaluate API + PatronusRailConfigOutput: properties: input: allOf: - - $ref: '#/components/schemas/PatronusEvaluateConfig' + - $ref: '#/components/schemas/PatronusEvaluateConfigOutput' description: Patronus Evaluate API configuration for an Input Guardrail output: allOf: - - $ref: '#/components/schemas/PatronusEvaluateConfig' + - $ref: '#/components/schemas/PatronusEvaluateConfigOutput' description: Patronus Evaluate API configuration for an Output Guardrail type: object - title: PatronusRailConfig + title: PatronusRailConfigOutput description: Configuration data for the Patronus Evaluate API PlatformJobEnvironmentVariable: properties: @@ -14027,7 +14141,7 @@ components: title: Spec description: Job Spec platform_spec: - $ref: '#/components/schemas/PlatformJobSpec' + $ref: '#/components/schemas/PlatformJobSpecOutput' fileset: type: string title: Fileset @@ -14166,18 +14280,31 @@ components: - updated_at - -updated_at title: PlatformJobSortField - PlatformJobSpec: + PlatformJobSpecInput: + properties: + steps: + items: + $ref: '#/components/schemas/PlatformJobStepSpecInput' + type: array + title: Steps + description: List of steps to be executed in the job + type: object + required: + - steps + title: PlatformJobSpecInput + description: Specification for a platform job, containing steps and secrets. + PlatformJobSpecOutput: properties: steps: items: - $ref: '#/components/schemas/PlatformJobStepSpec' + $ref: '#/components/schemas/PlatformJobStepSpecOutput' type: array title: Steps description: List of steps to be executed in the job type: object required: - steps - title: PlatformJobSpec + title: PlatformJobSpecOutput description: Specification for a platform job, containing steps and secrets. PlatformJobStatus: type: string @@ -14352,7 +14479,7 @@ components: Parent-scoped: unique within (workspace, entity_type, parent=attempt_id).' - PlatformJobStepSpec: + PlatformJobStepSpecInput: properties: name: type: string @@ -14374,18 +14501,18 @@ components: type: array executor: oneOf: - - $ref: '#/components/schemas/CPUExecutionProvider' - - $ref: '#/components/schemas/GPUExecutionProvider' - - $ref: '#/components/schemas/DistributedGPUExecutionProvider' + - $ref: '#/components/schemas/CPUExecutionProviderInput' + - $ref: '#/components/schemas/GPUExecutionProviderInput' + - $ref: '#/components/schemas/DistributedGPUExecutionProviderInput' - $ref: '#/components/schemas/SubprocessExecutionProvider' title: Executor description: The executor for the step discriminator: propertyName: provider mapping: - cpu: '#/components/schemas/CPUExecutionProvider' - gpu: '#/components/schemas/GPUExecutionProvider' - gpu_distributed: '#/components/schemas/DistributedGPUExecutionProvider' + cpu: '#/components/schemas/CPUExecutionProviderInput' + gpu: '#/components/schemas/GPUExecutionProviderInput' + gpu_distributed: '#/components/schemas/DistributedGPUExecutionProviderInput' subprocess: '#/components/schemas/SubprocessExecutionProvider' config: additionalProperties: true @@ -14400,7 +14527,57 @@ components: required: - name - executor - title: PlatformJobStepSpec + title: PlatformJobStepSpecInput + description: Specification for a single step in a platform job. + PlatformJobStepSpecOutput: + properties: + name: + type: string + pattern: ^[a-z](?!.*--)[a-z0-9\-@.+_]{1,62}(? files/dataset_metadata_content -> files/__init__ # -> files/fileset -> shared/fileset_metadata dataset_metadata_content: DatasetMetadataContent - fileset_metadata: FilesetMetadata tool_calling_metadata_content: ToolCallingMetadataContent backend_format: BackendFormat finetuning_type: FinetuningType diff --git a/sdk/python/nemo-platform/pyproject.toml b/sdk/python/nemo-platform/pyproject.toml index 16db3ac184..0f943aae94 100644 --- a/sdk/python/nemo-platform/pyproject.toml +++ b/sdk/python/nemo-platform/pyproject.toml @@ -58,6 +58,9 @@ nemo-evaluator-sdk = [ "openai>=1.61.0", "sacrebleu>=2.5.1", "rouge_score==0.1.2", + "ragas==0.3.5", + "langchain-openai>=1.1.14", + "langchain-nvidia-ai-endpoints>=1.0.0,<2.0.0", ] [project.entry-points."nemo.skills"] diff --git a/sdk/stainless.yaml b/sdk/stainless.yaml index 14dda10ca6..f24fb98ccf 100644 --- a/sdk/stainless.yaml +++ b/sdk/stainless.yaml @@ -254,6 +254,8 @@ resources: filesets: models: fileset_filter: FilesetFilter + fileset_metadata: FilesetMetadataOutput + fileset_metadata_param: FilesetMetadataInput methods: create: post /apis/files/v2/workspaces/{workspace}/filesets list: get /apis/files/v2/workspaces/{workspace}/filesets @@ -328,19 +330,24 @@ resources: pangea_rail_config: PangeaRailConfig pangea_rail_options: PangeaRailOptions patronus_evaluate_api_params: PatronusEvaluateApiParams + patronus_evaluate_config: PatronusEvaluateConfigOutput + patronus_evaluate_config_param: PatronusEvaluateConfigInput patronus_evaluation_success_strategy: PatronusEvaluationSuccessStrategy + patronus_rail_config: PatronusRailConfigOutput + patronus_rail_config_param: PatronusRailConfigInput private_ai_detection: PrivateAIDetection private_ai_detection_options: PrivateAIDetectionOptions rail_status: RailStatus + rails: RailsOutput + rails_config: RailsConfigOutput + rails_config_data: RailsConfigDataOutput + rails_config_data_param: RailsConfigDataInput + rails_config_param: RailsConfigInput + rails_param: RailsInput reasoning_config: ReasoningConfig regex_detection: RegexDetection regex_detection_options: RegexDetectionOptions retrieval_rails: RetrievalRails - patronus_evaluate_config: PatronusEvaluateConfig - patronus_rail_config: PatronusRailConfig - rails: Rails - rails_config: RailsConfig - rails_config_data: RailsConfigData sensitive_data_detection: SensitiveDataDetection sensitive_data_detection_options: SensitiveDataDetectionOptions single_call_config: SingleCallConfig @@ -497,13 +504,19 @@ resources: compute_resource_spec: ComputeResourceSpec compute_resources: ComputeResources container_spec: ContainerSpec + cpu_execution_provider: CPUExecutionProviderOutput + cpu_execution_provider_param: CPUExecutionProviderInput create_platform_job_request: CreatePlatformJobRequest + distributed_gpu_execution_provider: DistributedGPUExecutionProviderOutput + distributed_gpu_execution_provider_param: DistributedGPUExecutionProviderInput docker_job_execution_profile: DockerJobExecutionProfile docker_job_execution_profile_config: DockerJobExecutionProfileConfig docker_job_network_config: DockerJobNetworkConfig docker_job_storage_config: DockerJobStorageConfig docker_volume_mount: DockerVolumeMount e2e_job_execution_profile: E2EJobExecutionProfile + gpu_execution_provider: GPUExecutionProviderOutput + gpu_execution_provider_param: GPUExecutionProviderInput image_pull_secret: ImagePullSecret job_execution_profile_config: JobExecutionProfileConfig kubernetes_empty_dir_volume: KubernetesEmptyDirVolume @@ -519,12 +532,11 @@ resources: platform_job_responses_page: PlatformJobResponsesPage platform_job_secret_environment_variable_ref: PlatformJobSecretEnvironmentVariableRef platform_job_sort_field: PlatformJobSortField + platform_job_spec: PlatformJobSpecOutput + platform_job_spec_param: PlatformJobSpecInput + platform_job_step_spec: PlatformJobStepSpecOutput + platform_job_step_spec_param: PlatformJobStepSpecInput platform_jobs_list_filter: PlatformJobsListFilter - cpu_execution_provider: CPUExecutionProvider - distributed_gpu_execution_provider: DistributedGPUExecutionProvider - gpu_execution_provider: GPUExecutionProvider - platform_job_spec: PlatformJobSpec - platform_job_step_spec: PlatformJobStepSpec step_lifecycle: StepLifecycle subprocess_execution_provider: SubprocessExecutionProvider subprocess_job_execution_profile: SubprocessJobExecutionProfile @@ -705,7 +717,6 @@ resources: # shared/fileset_metadata -> files/dataset_metadata_content -> files/__init__ # -> files/fileset -> shared/fileset_metadata dataset_metadata_content: DatasetMetadataContent - fileset_metadata: FilesetMetadata tool_calling_metadata_content: ToolCallingMetadataContent backend_format: BackendFormat finetuning_type: FinetuningType diff --git a/services/core/auth/src/nmp/core/auth/app/policy_tests/helpers_test.rego b/services/core/auth/src/nmp/core/auth/app/policy_tests/helpers_test.rego index 0824de8e34..368e740fe8 100644 --- a/services/core/auth/src/nmp/core/auth/app/policy_tests/helpers_test.rego +++ b/services/core/auth/src/nmp/core/auth/app/policy_tests/helpers_test.rego @@ -29,6 +29,7 @@ test_normalize_endpoint if { mock_endpoints := { "/apis/models/v2/workspaces/{workspace}/models": {"get": {}}, "/apis/models/v2/workspaces/{workspace}/models/{name}": {"get": {}}, + "/apis/files/v2/workspaces/{workspace}/filesets": {"get": {}}, "/apis/files/v2/workspaces/{workspace}/filesets/{name}": {"get": {}}, "/apis/entities/v2/workspaces": {"get": {}}, "/apis/entities/v2/workspaces/{workspace}/members": {"get": {}} @@ -52,4 +53,7 @@ test_normalize_endpoint if { common.normalize_endpoint("/apis/entities/v2/workspaces") == "/apis/entities/v2/workspaces" with data.authz.endpoints as mock_endpoints + # Test filesets collection pattern + common.normalize_endpoint("/apis/files/v2/workspaces/test-ns/filesets") == "/apis/files/v2/workspaces/{workspace}/filesets" + with data.authz.endpoints as mock_endpoints } diff --git a/services/core/jobs/tests/controllers/test_subprocess_backend.py b/services/core/jobs/tests/controllers/test_subprocess_backend.py index 7bc7e3b329..2f40410326 100644 --- a/services/core/jobs/tests/controllers/test_subprocess_backend.py +++ b/services/core/jobs/tests/controllers/test_subprocess_backend.py @@ -221,13 +221,13 @@ def test_build_command_uses_current_interpreter_for_python_module_commands() -> executor = SubprocessExecutionProvider( provider="subprocess", profile="default", - command=["python", "-m", "nmp.evaluator.tasks.evaluate_metric"], + command=["python", "-m", "nemo_evaluator.tasks.evaluate"], ) assert SubprocessJobBackend._build_command(executor, None) == [ sys.executable, "-m", - "nmp.evaluator.tasks.evaluate_metric", + "nemo_evaluator.tasks.evaluate", ] @@ -235,13 +235,13 @@ def test_build_command_uses_current_interpreter_for_python3_commands() -> None: executor = SubprocessExecutionProvider( provider="subprocess", profile="default", - command=["python3", "-m", "nmp.evaluator.tasks.evaluate_metric"], + command=["python3", "-m", "nemo_evaluator.tasks.evaluate"], ) assert SubprocessJobBackend._build_command(executor, None) == [ sys.executable, "-m", - "nmp.evaluator.tasks.evaluate_metric", + "nemo_evaluator.tasks.evaluate", ] @@ -253,13 +253,13 @@ def test_build_command_prefers_virtual_env_python(tmp_path) -> None: executor = SubprocessExecutionProvider( provider="subprocess", profile="default", - command=["python", "-m", "nmp.evaluator.tasks.evaluate_metric"], + command=["python", "-m", "nemo_evaluator.tasks.evaluate"], ) assert SubprocessJobBackend._build_command(executor, str(tmp_path / "venv")) == [ str(venv_python), "-m", - "nmp.evaluator.tasks.evaluate_metric", + "nemo_evaluator.tasks.evaluate", ] diff --git a/services/core/mcp/README.md b/services/core/mcp/README.md index 9012568855..0961e7d233 100644 --- a/services/core/mcp/README.md +++ b/services/core/mcp/README.md @@ -101,7 +101,6 @@ This service follows NeMo Platform v2 patterns: Future expansion will support mounting service-specific MCP servers from: - `nmp.guardrails.mcp` -- `nmp.evaluator.mcp` - `nemo_customizer` plugin MCP tools (when enabled) - etc. diff --git a/services/evaluator/.dockerignore b/services/evaluator/.dockerignore deleted file mode 100644 index 461075eb69..0000000000 --- a/services/evaluator/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -Dockerfile* -.dockerignore -skaffold.yaml -skaffold -**/__pycache__ diff --git a/services/evaluator/README.md b/services/evaluator/README.md deleted file mode 100644 index ee0d5ac9fb..0000000000 --- a/services/evaluator/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Legacy Evaluator Service - -This directory contains legacy NeMo Evaluator service code. - -Evaluator functionality is in the process of migrating to the first-party -Evaluator plugin in `plugins/nemo-evaluator` and the shared Evaluator SDK in -`packages/nemo_evaluator_sdk`. New Evaluator work should target those packages -unless it is specifically maintaining compatibility for this legacy service. diff --git a/services/evaluator/docker-compose-db-migration.yaml b/services/evaluator/docker-compose-db-migration.yaml deleted file mode 100644 index c54eedd930..0000000000 --- a/services/evaluator/docker-compose-db-migration.yaml +++ /dev/null @@ -1,42 +0,0 @@ -# TODO(v2): This should no longer be needed after the migration. -version: "3.8" - -services: - postgres-db-migration: - image: evaluator-build:local - command: - - "/bin/sh" - - "-c" - - "alembic revision --autogenerate -m '${UPGRADE}'" - - volumes: - - ./alembic:/app/services/evaluator/alembic - - environment: - - MODE=development - - POSTGRES_URI=postgresql://nemo:nemo@postgres:5432/evaluation - - depends_on: - postgres: - condition: service_healthy - - postgres: - image: postgres:16.9 - restart: always - environment: - - POSTGRES_USER=nemo - - POSTGRES_PASSWORD=nemo - - POSTGRES_DB=evaluation - - POSTGRES_PORT=5432 - ports: - - "5432:5432" - volumes: - - postgres_data:/var/lib/postgresql/data:Z - healthcheck: - test: ["CMD-SHELL", "sh -c 'pg_isready -U nemo -d evaluation'"] - interval: 10s - timeout: 3s - retries: 3 - -volumes: - postgres_data: diff --git a/services/evaluator/example-config.yaml b/services/evaluator/example-config.yaml deleted file mode 100644 index 68fa04f12f..0000000000 --- a/services/evaluator/example-config.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# Example configuration for the Evaluator service -# Set NMP_CONFIG_FILE_PATH to this file path to use it - -# Common service settings -service: - log_format: plain # Use 'plain' for local dev, 'json' for production - log_level: INFO - host: "127.0.0.1" - port: 8080 - -# Platform-wide settings -platform: - base_url: "http://127.0.0.1:8080" - entitystore_url: "http://127.0.0.1:8080" - secrets_url: "http://127.0.0.1:8080" - files_url: "http://127.0.0.1:8080" - jobs_url: "http://127.0.0.1:8080" - models_url: "http://127.0.0.1:8080" - image_registry: "my-registry" - image_tag: "local" - -# Authorization settings -auth: - enabled: false - -# Entity Store service settings -entities: - backend: memory - -evaluator: - recreate_existing_system_entities: True - -# Jobs service settings -jobs: - executor_defaults: - docker: - cleanup_completed_jobs_immediately: false - # Path to the jobs-launcher binary for log forwarding - launcher_tool_path: ./services/core/jobs/jobs-launcher/jobs-launcher - -# Secrets service configuration - uses a secret key for encryption -secrets: - encryption: - current_provider: local_v1 - providers: - secret_key: - local_v1: - value: "f4NPSp39YN5oWTwZ3iDX/L3PTvEH8qFvUs1noC/jWuo=" - -# Files service settings -files: - default_storage_config: - type: local - path: ~/.local/share/nemo/files diff --git a/services/evaluator/fixes/cve-2025-8194/tarfile.py.fix b/services/evaluator/fixes/cve-2025-8194/tarfile.py.fix deleted file mode 100755 index 1b7d4d1834..0000000000 --- a/services/evaluator/fixes/cve-2025-8194/tarfile.py.fix +++ /dev/null @@ -1,2930 +0,0 @@ -#!/usr/bin/env python3 -#------------------------------------------------------------------- -# tarfile.py -#------------------------------------------------------------------- -# Copyright (C) 2002 Lars Gustaebel -# All rights reserved. -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -"""Read from and write to tar format archives. -""" - -version = "0.9.0" -__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" -__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." - -#--------- -# Imports -#--------- -from builtins import open as bltn_open -import sys -import os -import io -import shutil -import stat -import time -import struct -import copy -import re -import warnings - -try: - import pwd -except ImportError: - pwd = None -try: - import grp -except ImportError: - grp = None - -# os.symlink on Windows prior to 6.0 raises NotImplementedError -symlink_exception = (AttributeError, NotImplementedError) -try: - # OSError (winerror=1314) will be raised if the caller does not hold the - # SeCreateSymbolicLinkPrivilege privilege - symlink_exception += (OSError,) -except NameError: - pass - -# from tarfile import * -__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError", "ReadError", - "CompressionError", "StreamError", "ExtractError", "HeaderError", - "ENCODING", "USTAR_FORMAT", "GNU_FORMAT", "PAX_FORMAT", - "DEFAULT_FORMAT", "open"] - - -#--------------------------------------------------------- -# tar constants -#--------------------------------------------------------- -NUL = b"\0" # the null character -BLOCKSIZE = 512 # length of processing blocks -RECORDSIZE = BLOCKSIZE * 20 # length of records -GNU_MAGIC = b"ustar \0" # magic gnu tar string -POSIX_MAGIC = b"ustar\x0000" # magic posix tar string - -LENGTH_NAME = 100 # maximum length of a filename -LENGTH_LINK = 100 # maximum length of a linkname -LENGTH_PREFIX = 155 # maximum length of the prefix field - -REGTYPE = b"0" # regular file -AREGTYPE = b"\0" # regular file -LNKTYPE = b"1" # link (inside tarfile) -SYMTYPE = b"2" # symbolic link -CHRTYPE = b"3" # character special device -BLKTYPE = b"4" # block special device -DIRTYPE = b"5" # directory -FIFOTYPE = b"6" # fifo special device -CONTTYPE = b"7" # contiguous file - -GNUTYPE_LONGNAME = b"L" # GNU tar longname -GNUTYPE_LONGLINK = b"K" # GNU tar longlink -GNUTYPE_SPARSE = b"S" # GNU tar sparse file - -XHDTYPE = b"x" # POSIX.1-2001 extended header -XGLTYPE = b"g" # POSIX.1-2001 global header -SOLARIS_XHDTYPE = b"X" # Solaris extended header - -USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format -GNU_FORMAT = 1 # GNU tar format -PAX_FORMAT = 2 # POSIX.1-2001 (pax) format -DEFAULT_FORMAT = PAX_FORMAT - -#--------------------------------------------------------- -# tarfile constants -#--------------------------------------------------------- -# File types that tarfile supports: -SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, - SYMTYPE, DIRTYPE, FIFOTYPE, - CONTTYPE, CHRTYPE, BLKTYPE, - GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# File types that will be treated as a regular file. -REGULAR_TYPES = (REGTYPE, AREGTYPE, - CONTTYPE, GNUTYPE_SPARSE) - -# File types that are part of the GNU tar format. -GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# Fields from a pax header that override a TarInfo attribute. -PAX_FIELDS = ("path", "linkpath", "size", "mtime", - "uid", "gid", "uname", "gname") - -# Fields from a pax header that are affected by hdrcharset. -PAX_NAME_FIELDS = {"path", "linkpath", "uname", "gname"} - -# Fields in a pax header that are numbers, all other fields -# are treated as strings. -PAX_NUMBER_FIELDS = { - "atime": float, - "ctime": float, - "mtime": float, - "uid": int, - "gid": int, - "size": int -} - -#--------------------------------------------------------- -# initialization -#--------------------------------------------------------- -if os.name == "nt": - ENCODING = "utf-8" -else: - ENCODING = sys.getfilesystemencoding() - -#--------------------------------------------------------- -# Some useful functions -#--------------------------------------------------------- - -def stn(s, length, encoding, errors): - """Convert a string to a null-terminated bytes object. - """ - if s is None: - raise ValueError("metadata cannot contain None") - s = s.encode(encoding, errors) - return s[:length] + (length - len(s)) * NUL - -def nts(s, encoding, errors): - """Convert a null-terminated bytes object to a string. - """ - p = s.find(b"\0") - if p != -1: - s = s[:p] - return s.decode(encoding, errors) - -def nti(s): - """Convert a number field to a python number. - """ - # There are two possible encodings for a number field, see - # itn() below. - if s[0] in (0o200, 0o377): - n = 0 - for i in range(len(s) - 1): - n <<= 8 - n += s[i + 1] - if s[0] == 0o377: - n = -(256 ** (len(s) - 1) - n) - else: - try: - s = nts(s, "ascii", "strict") - n = int(s.strip() or "0", 8) - except ValueError: - raise InvalidHeaderError("invalid header") - return n - -def itn(n, digits=8, format=DEFAULT_FORMAT): - """Convert a python number to a number field. - """ - # POSIX 1003.1-1988 requires numbers to be encoded as a string of - # octal digits followed by a null-byte, this allows values up to - # (8**(digits-1))-1. GNU tar allows storing numbers greater than - # that if necessary. A leading 0o200 or 0o377 byte indicate this - # particular encoding, the following digits-1 bytes are a big-endian - # base-256 representation. This allows values up to (256**(digits-1))-1. - # A 0o200 byte indicates a positive number, a 0o377 byte a negative - # number. - original_n = n - n = int(n) - if 0 <= n < 8 ** (digits - 1): - s = bytes("%0*o" % (digits - 1, n), "ascii") + NUL - elif format == GNU_FORMAT and -256 ** (digits - 1) <= n < 256 ** (digits - 1): - if n >= 0: - s = bytearray([0o200]) - else: - s = bytearray([0o377]) - n = 256 ** digits + n - - for i in range(digits - 1): - s.insert(1, n & 0o377) - n >>= 8 - else: - raise ValueError("overflow in number field") - - return s - -def calc_chksums(buf): - """Calculate the checksum for a member's header by summing up all - characters except for the chksum field which is treated as if - it was filled with spaces. According to the GNU tar sources, - some tars (Sun and NeXT) calculate chksum with signed char, - which will be different if there are chars in the buffer with - the high bit set. So we calculate two checksums, unsigned and - signed. - """ - unsigned_chksum = 256 + sum(struct.unpack_from("148B8x356B", buf)) - signed_chksum = 256 + sum(struct.unpack_from("148b8x356b", buf)) - return unsigned_chksum, signed_chksum - -def copyfileobj(src, dst, length=None, exception=OSError, bufsize=None): - """Copy length bytes from fileobj src to fileobj dst. - If length is None, copy the entire content. - """ - bufsize = bufsize or 16 * 1024 - if length == 0: - return - if length is None: - shutil.copyfileobj(src, dst, bufsize) - return - - blocks, remainder = divmod(length, bufsize) - for b in range(blocks): - buf = src.read(bufsize) - if len(buf) < bufsize: - raise exception("unexpected end of data") - dst.write(buf) - - if remainder != 0: - buf = src.read(remainder) - if len(buf) < remainder: - raise exception("unexpected end of data") - dst.write(buf) - return - -def _safe_print(s): - encoding = getattr(sys.stdout, 'encoding', None) - if encoding is not None: - s = s.encode(encoding, 'backslashreplace').decode(encoding) - print(s, end=' ') - - -class TarError(Exception): - """Base exception.""" - pass -class ExtractError(TarError): - """General exception for extract errors.""" - pass -class ReadError(TarError): - """Exception for unreadable tar archives.""" - pass -class CompressionError(TarError): - """Exception for unavailable compression methods.""" - pass -class StreamError(TarError): - """Exception for unsupported operations on stream-like TarFiles.""" - pass -class HeaderError(TarError): - """Base exception for header errors.""" - pass -class EmptyHeaderError(HeaderError): - """Exception for empty headers.""" - pass -class TruncatedHeaderError(HeaderError): - """Exception for truncated headers.""" - pass -class EOFHeaderError(HeaderError): - """Exception for end of file headers.""" - pass -class InvalidHeaderError(HeaderError): - """Exception for invalid headers.""" - pass -class SubsequentHeaderError(HeaderError): - """Exception for missing and invalid extended headers.""" - pass - -#--------------------------- -# internal stream interface -#--------------------------- -class _LowLevelFile: - """Low-level file object. Supports reading and writing. - It is used instead of a regular file object for streaming - access. - """ - - def __init__(self, name, mode): - mode = { - "r": os.O_RDONLY, - "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, - }[mode] - if hasattr(os, "O_BINARY"): - mode |= os.O_BINARY - self.fd = os.open(name, mode, 0o666) - - def close(self): - os.close(self.fd) - - def read(self, size): - return os.read(self.fd, size) - - def write(self, s): - os.write(self.fd, s) - -class _Stream: - """Class that serves as an adapter between TarFile and - a stream-like object. The stream-like object only - needs to have a read() or write() method that works with bytes, - and the method is accessed blockwise. - Use of gzip or bzip2 compression is possible. - A stream-like object could be for example: sys.stdin.buffer, - sys.stdout.buffer, a socket, a tape device etc. - - _Stream is intended to be used only internally. - """ - - def __init__(self, name, mode, comptype, fileobj, bufsize): - """Construct a _Stream object. - """ - self._extfileobj = True - if fileobj is None: - fileobj = _LowLevelFile(name, mode) - self._extfileobj = False - - if comptype == '*': - # Enable transparent compression detection for the - # stream interface - fileobj = _StreamProxy(fileobj) - comptype = fileobj.getcomptype() - - self.name = name or "" - self.mode = mode - self.comptype = comptype - self.fileobj = fileobj - self.bufsize = bufsize - self.buf = b"" - self.pos = 0 - self.closed = False - - try: - if comptype == "gz": - try: - import zlib - except ImportError: - raise CompressionError("zlib module is not available") from None - self.zlib = zlib - self.crc = zlib.crc32(b"") - if mode == "r": - self.exception = zlib.error - self._init_read_gz() - else: - self._init_write_gz() - - elif comptype == "bz2": - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") from None - if mode == "r": - self.dbuf = b"" - self.cmp = bz2.BZ2Decompressor() - self.exception = OSError - else: - self.cmp = bz2.BZ2Compressor() - - elif comptype == "xz": - try: - import lzma - except ImportError: - raise CompressionError("lzma module is not available") from None - if mode == "r": - self.dbuf = b"" - self.cmp = lzma.LZMADecompressor() - self.exception = lzma.LZMAError - else: - self.cmp = lzma.LZMACompressor() - - elif comptype != "tar": - raise CompressionError("unknown compression type %r" % comptype) - - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - def __del__(self): - if hasattr(self, "closed") and not self.closed: - self.close() - - def _init_write_gz(self): - """Initialize for writing with gzip compression. - """ - self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, - -self.zlib.MAX_WBITS, - self.zlib.DEF_MEM_LEVEL, - 0) - timestamp = struct.pack(" self.bufsize: - self.fileobj.write(self.buf[:self.bufsize]) - self.buf = self.buf[self.bufsize:] - - def close(self): - """Close the _Stream object. No operation should be - done on it afterwards. - """ - if self.closed: - return - - self.closed = True - try: - if self.mode == "w" and self.comptype != "tar": - self.buf += self.cmp.flush() - - if self.mode == "w" and self.buf: - self.fileobj.write(self.buf) - self.buf = b"" - if self.comptype == "gz": - self.fileobj.write(struct.pack("= 0: - blocks, remainder = divmod(pos - self.pos, self.bufsize) - for i in range(blocks): - self.read(self.bufsize) - self.read(remainder) - else: - raise StreamError("seeking backwards is not allowed") - return self.pos - - def read(self, size): - """Return the next size number of bytes from the stream.""" - assert size is not None - buf = self._read(size) - self.pos += len(buf) - return buf - - def _read(self, size): - """Return size bytes from the stream. - """ - if self.comptype == "tar": - return self.__read(size) - - c = len(self.dbuf) - t = [self.dbuf] - while c < size: - # Skip underlying buffer to avoid unaligned double buffering. - if self.buf: - buf = self.buf - self.buf = b"" - else: - buf = self.fileobj.read(self.bufsize) - if not buf: - break - try: - buf = self.cmp.decompress(buf) - except self.exception as e: - raise ReadError("invalid compressed data") from e - t.append(buf) - c += len(buf) - t = b"".join(t) - self.dbuf = t[size:] - return t[:size] - - def __read(self, size): - """Return size bytes from stream. If internal buffer is empty, - read another block from the stream. - """ - c = len(self.buf) - t = [self.buf] - while c < size: - buf = self.fileobj.read(self.bufsize) - if not buf: - break - t.append(buf) - c += len(buf) - t = b"".join(t) - self.buf = t[size:] - return t[:size] -# class _Stream - -class _StreamProxy(object): - """Small proxy class that enables transparent compression - detection for the Stream interface (mode 'r|*'). - """ - - def __init__(self, fileobj): - self.fileobj = fileobj - self.buf = self.fileobj.read(BLOCKSIZE) - - def read(self, size): - self.read = self.fileobj.read - return self.buf - - def getcomptype(self): - if self.buf.startswith(b"\x1f\x8b\x08"): - return "gz" - elif self.buf[0:3] == b"BZh" and self.buf[4:10] == b"1AY&SY": - return "bz2" - elif self.buf.startswith((b"\x5d\x00\x00\x80", b"\xfd7zXZ")): - return "xz" - else: - return "tar" - - def close(self): - self.fileobj.close() -# class StreamProxy - -#------------------------ -# Extraction file object -#------------------------ -class _FileInFile(object): - """A thin wrapper around an existing file object that - provides a part of its data as an individual file - object. - """ - - def __init__(self, fileobj, offset, size, blockinfo=None): - self.fileobj = fileobj - self.offset = offset - self.size = size - self.position = 0 - self.name = getattr(fileobj, "name", None) - self.closed = False - - if blockinfo is None: - blockinfo = [(0, size)] - - # Construct a map with data and zero blocks. - self.map_index = 0 - self.map = [] - lastpos = 0 - realpos = self.offset - for offset, size in blockinfo: - if offset > lastpos: - self.map.append((False, lastpos, offset, None)) - self.map.append((True, offset, offset + size, realpos)) - realpos += size - lastpos = offset + size - if lastpos < self.size: - self.map.append((False, lastpos, self.size, None)) - - def flush(self): - pass - - def readable(self): - return True - - def writable(self): - return False - - def seekable(self): - return self.fileobj.seekable() - - def tell(self): - """Return the current file position. - """ - return self.position - - def seek(self, position, whence=io.SEEK_SET): - """Seek to a position in the file. - """ - if whence == io.SEEK_SET: - self.position = min(max(position, 0), self.size) - elif whence == io.SEEK_CUR: - if position < 0: - self.position = max(self.position + position, 0) - else: - self.position = min(self.position + position, self.size) - elif whence == io.SEEK_END: - self.position = max(min(self.size + position, self.size), 0) - else: - raise ValueError("Invalid argument") - return self.position - - def read(self, size=None): - """Read data from the file. - """ - if size is None: - size = self.size - self.position - else: - size = min(size, self.size - self.position) - - buf = b"" - while size > 0: - while True: - data, start, stop, offset = self.map[self.map_index] - if start <= self.position < stop: - break - else: - self.map_index += 1 - if self.map_index == len(self.map): - self.map_index = 0 - length = min(size, stop - self.position) - if data: - self.fileobj.seek(offset + (self.position - start)) - b = self.fileobj.read(length) - if len(b) != length: - raise ReadError("unexpected end of data") - buf += b - else: - buf += NUL * length - size -= length - self.position += length - return buf - - def readinto(self, b): - buf = self.read(len(b)) - b[:len(buf)] = buf - return len(buf) - - def close(self): - self.closed = True -#class _FileInFile - -class ExFileObject(io.BufferedReader): - - def __init__(self, tarfile, tarinfo): - fileobj = _FileInFile(tarfile.fileobj, tarinfo.offset_data, - tarinfo.size, tarinfo.sparse) - super().__init__(fileobj) -#class ExFileObject - - -#----------------------------- -# extraction filters (PEP 706) -#----------------------------- - -class FilterError(TarError): - pass - -class AbsolutePathError(FilterError): - def __init__(self, tarinfo): - self.tarinfo = tarinfo - super().__init__(f'member {tarinfo.name!r} has an absolute path') - -class OutsideDestinationError(FilterError): - def __init__(self, tarinfo, path): - self.tarinfo = tarinfo - self._path = path - super().__init__(f'{tarinfo.name!r} would be extracted to {path!r}, ' - + 'which is outside the destination') - -class SpecialFileError(FilterError): - def __init__(self, tarinfo): - self.tarinfo = tarinfo - super().__init__(f'{tarinfo.name!r} is a special file') - -class AbsoluteLinkError(FilterError): - def __init__(self, tarinfo): - self.tarinfo = tarinfo - super().__init__(f'{tarinfo.name!r} is a link to an absolute path') - -class LinkOutsideDestinationError(FilterError): - def __init__(self, tarinfo, path): - self.tarinfo = tarinfo - self._path = path - super().__init__(f'{tarinfo.name!r} would link to {path!r}, ' - + 'which is outside the destination') - -def _get_filtered_attrs(member, dest_path, for_data=True): - new_attrs = {} - name = member.name - dest_path = os.path.realpath(dest_path) - # Strip leading / (tar's directory separator) from filenames. - # Include os.sep (target OS directory separator) as well. - if name.startswith(('/', os.sep)): - name = new_attrs['name'] = member.path.lstrip('/' + os.sep) - if os.path.isabs(name): - # Path is absolute even after stripping. - # For example, 'C:/foo' on Windows. - raise AbsolutePathError(member) - # Ensure we stay in the destination - target_path = os.path.realpath(os.path.join(dest_path, name)) - if os.path.commonpath([target_path, dest_path]) != dest_path: - raise OutsideDestinationError(member, target_path) - # Limit permissions (no high bits, and go-w) - mode = member.mode - if mode is not None: - # Strip high bits & group/other write bits - mode = mode & 0o755 - if for_data: - # For data, handle permissions & file types - if member.isreg() or member.islnk(): - if not mode & 0o100: - # Clear executable bits if not executable by user - mode &= ~0o111 - # Ensure owner can read & write - mode |= 0o600 - elif member.isdir() or member.issym(): - # Ignore mode for directories & symlinks - mode = None - else: - # Reject special files - raise SpecialFileError(member) - if mode != member.mode: - new_attrs['mode'] = mode - if for_data: - # Ignore ownership for 'data' - if member.uid is not None: - new_attrs['uid'] = None - if member.gid is not None: - new_attrs['gid'] = None - if member.uname is not None: - new_attrs['uname'] = None - if member.gname is not None: - new_attrs['gname'] = None - # Check link destination for 'data' - if member.islnk() or member.issym(): - if os.path.isabs(member.linkname): - raise AbsoluteLinkError(member) - if member.issym(): - target_path = os.path.join(dest_path, - os.path.dirname(name), - member.linkname) - else: - target_path = os.path.join(dest_path, - member.linkname) - target_path = os.path.realpath(target_path) - if os.path.commonpath([target_path, dest_path]) != dest_path: - raise LinkOutsideDestinationError(member, target_path) - return new_attrs - -def fully_trusted_filter(member, dest_path): - return member - -def tar_filter(member, dest_path): - new_attrs = _get_filtered_attrs(member, dest_path, False) - if new_attrs: - return member.replace(**new_attrs, deep=False) - return member - -def data_filter(member, dest_path): - new_attrs = _get_filtered_attrs(member, dest_path, True) - if new_attrs: - return member.replace(**new_attrs, deep=False) - return member - -_NAMED_FILTERS = { - "fully_trusted": fully_trusted_filter, - "tar": tar_filter, - "data": data_filter, -} - -#------------------ -# Exported Classes -#------------------ - -# Sentinel for replace() defaults, meaning "don't change the attribute" -_KEEP = object() - -# Header length is digits followed by a space. -_header_length_prefix_re = re.compile(br"([0-9]{1,20}) ") - -class TarInfo(object): - """Informational class which holds the details about an - archive member given by a tar header block. - TarInfo objects are returned by TarFile.getmember(), - TarFile.getmembers() and TarFile.gettarinfo() and are - usually created internally. - """ - - __slots__ = dict( - name = 'Name of the archive member.', - mode = 'Permission bits.', - uid = 'User ID of the user who originally stored this member.', - gid = 'Group ID of the user who originally stored this member.', - size = 'Size in bytes.', - mtime = 'Time of last modification.', - chksum = 'Header checksum.', - type = ('File type. type is usually one of these constants: ' - 'REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, ' - 'CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.'), - linkname = ('Name of the target file name, which is only present ' - 'in TarInfo objects of type LNKTYPE and SYMTYPE.'), - uname = 'User name.', - gname = 'Group name.', - devmajor = 'Device major number.', - devminor = 'Device minor number.', - offset = 'The tar header starts here.', - offset_data = "The file's data starts here.", - pax_headers = ('A dictionary containing key-value pairs of an ' - 'associated pax extended header.'), - sparse = 'Sparse member information.', - tarfile = None, - _sparse_structs = None, - _link_target = None, - ) - - def __init__(self, name=""): - """Construct a TarInfo object. name is the optional name - of the member. - """ - self.name = name # member name - self.mode = 0o644 # file permissions - self.uid = 0 # user id - self.gid = 0 # group id - self.size = 0 # file size - self.mtime = 0 # modification time - self.chksum = 0 # header checksum - self.type = REGTYPE # member type - self.linkname = "" # link name - self.uname = "" # user name - self.gname = "" # group name - self.devmajor = 0 # device major number - self.devminor = 0 # device minor number - - self.offset = 0 # the tar header starts here - self.offset_data = 0 # the file's data starts here - - self.sparse = None # sparse member information - self.pax_headers = {} # pax header information - - @property - def path(self): - 'In pax headers, "name" is called "path".' - return self.name - - @path.setter - def path(self, name): - self.name = name - - @property - def linkpath(self): - 'In pax headers, "linkname" is called "linkpath".' - return self.linkname - - @linkpath.setter - def linkpath(self, linkname): - self.linkname = linkname - - def __repr__(self): - return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) - - def replace(self, *, - name=_KEEP, mtime=_KEEP, mode=_KEEP, linkname=_KEEP, - uid=_KEEP, gid=_KEEP, uname=_KEEP, gname=_KEEP, - deep=True, _KEEP=_KEEP): - """Return a deep copy of self with the given attributes replaced. - """ - if deep: - result = copy.deepcopy(self) - else: - result = copy.copy(self) - if name is not _KEEP: - result.name = name - if mtime is not _KEEP: - result.mtime = mtime - if mode is not _KEEP: - result.mode = mode - if linkname is not _KEEP: - result.linkname = linkname - if uid is not _KEEP: - result.uid = uid - if gid is not _KEEP: - result.gid = gid - if uname is not _KEEP: - result.uname = uname - if gname is not _KEEP: - result.gname = gname - return result - - def get_info(self): - """Return the TarInfo's attributes as a dictionary. - """ - if self.mode is None: - mode = None - else: - mode = self.mode & 0o7777 - info = { - "name": self.name, - "mode": mode, - "uid": self.uid, - "gid": self.gid, - "size": self.size, - "mtime": self.mtime, - "chksum": self.chksum, - "type": self.type, - "linkname": self.linkname, - "uname": self.uname, - "gname": self.gname, - "devmajor": self.devmajor, - "devminor": self.devminor - } - - if info["type"] == DIRTYPE and not info["name"].endswith("/"): - info["name"] += "/" - - return info - - def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): - """Return a tar header as a string of 512 byte blocks. - """ - info = self.get_info() - for name, value in info.items(): - if value is None: - raise ValueError("%s may not be None" % name) - - if format == USTAR_FORMAT: - return self.create_ustar_header(info, encoding, errors) - elif format == GNU_FORMAT: - return self.create_gnu_header(info, encoding, errors) - elif format == PAX_FORMAT: - return self.create_pax_header(info, encoding) - else: - raise ValueError("invalid format") - - def create_ustar_header(self, info, encoding, errors): - """Return the object as a ustar header block. - """ - info["magic"] = POSIX_MAGIC - - if len(info["linkname"].encode(encoding, errors)) > LENGTH_LINK: - raise ValueError("linkname is too long") - - if len(info["name"].encode(encoding, errors)) > LENGTH_NAME: - info["prefix"], info["name"] = self._posix_split_name(info["name"], encoding, errors) - - return self._create_header(info, USTAR_FORMAT, encoding, errors) - - def create_gnu_header(self, info, encoding, errors): - """Return the object as a GNU header block sequence. - """ - info["magic"] = GNU_MAGIC - - buf = b"" - if len(info["linkname"].encode(encoding, errors)) > LENGTH_LINK: - buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) - - if len(info["name"].encode(encoding, errors)) > LENGTH_NAME: - buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) - - return buf + self._create_header(info, GNU_FORMAT, encoding, errors) - - def create_pax_header(self, info, encoding): - """Return the object as a ustar header block. If it cannot be - represented this way, prepend a pax extended header sequence - with supplement information. - """ - info["magic"] = POSIX_MAGIC - pax_headers = self.pax_headers.copy() - - # Test string fields for values that exceed the field length or cannot - # be represented in ASCII encoding. - for name, hname, length in ( - ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), - ("uname", "uname", 32), ("gname", "gname", 32)): - - if hname in pax_headers: - # The pax header has priority. - continue - - # Try to encode the string as ASCII. - try: - info[name].encode("ascii", "strict") - except UnicodeEncodeError: - pax_headers[hname] = info[name] - continue - - if len(info[name]) > length: - pax_headers[hname] = info[name] - - # Test number fields for values that exceed the field limit or values - # that like to be stored as float. - for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): - needs_pax = False - - val = info[name] - val_is_float = isinstance(val, float) - val_int = round(val) if val_is_float else val - if not 0 <= val_int < 8 ** (digits - 1): - # Avoid overflow. - info[name] = 0 - needs_pax = True - elif val_is_float: - # Put rounded value in ustar header, and full - # precision value in pax header. - info[name] = val_int - needs_pax = True - - # The existing pax header has priority. - if needs_pax and name not in pax_headers: - pax_headers[name] = str(val) - - # Create a pax extended header if necessary. - if pax_headers: - buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) - else: - buf = b"" - - return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") - - @classmethod - def create_pax_global_header(cls, pax_headers): - """Return the object as a pax global header block sequence. - """ - return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf-8") - - def _posix_split_name(self, name, encoding, errors): - """Split a name longer than 100 chars into a prefix - and a name part. - """ - components = name.split("/") - for i in range(1, len(components)): - prefix = "/".join(components[:i]) - name = "/".join(components[i:]) - if len(prefix.encode(encoding, errors)) <= LENGTH_PREFIX and \ - len(name.encode(encoding, errors)) <= LENGTH_NAME: - break - else: - raise ValueError("name is too long") - - return prefix, name - - @staticmethod - def _create_header(info, format, encoding, errors): - """Return a header block. info is a dictionary with file - information, format must be one of the *_FORMAT constants. - """ - has_device_fields = info.get("type") in (CHRTYPE, BLKTYPE) - if has_device_fields: - devmajor = itn(info.get("devmajor", 0), 8, format) - devminor = itn(info.get("devminor", 0), 8, format) - else: - devmajor = stn("", 8, encoding, errors) - devminor = stn("", 8, encoding, errors) - - # None values in metadata should cause ValueError. - # itn()/stn() do this for all fields except type. - filetype = info.get("type", REGTYPE) - if filetype is None: - raise ValueError("TarInfo.type must not be None") - - parts = [ - stn(info.get("name", ""), 100, encoding, errors), - itn(info.get("mode", 0) & 0o7777, 8, format), - itn(info.get("uid", 0), 8, format), - itn(info.get("gid", 0), 8, format), - itn(info.get("size", 0), 12, format), - itn(info.get("mtime", 0), 12, format), - b" ", # checksum field - filetype, - stn(info.get("linkname", ""), 100, encoding, errors), - info.get("magic", POSIX_MAGIC), - stn(info.get("uname", ""), 32, encoding, errors), - stn(info.get("gname", ""), 32, encoding, errors), - devmajor, - devminor, - stn(info.get("prefix", ""), 155, encoding, errors) - ] - - buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) - chksum = calc_chksums(buf[-BLOCKSIZE:])[0] - buf = buf[:-364] + bytes("%06o\0" % chksum, "ascii") + buf[-357:] - return buf - - @staticmethod - def _create_payload(payload): - """Return the string payload filled with zero bytes - up to the next 512 byte border. - """ - blocks, remainder = divmod(len(payload), BLOCKSIZE) - if remainder > 0: - payload += (BLOCKSIZE - remainder) * NUL - return payload - - @classmethod - def _create_gnu_long_header(cls, name, type, encoding, errors): - """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence - for name. - """ - name = name.encode(encoding, errors) + NUL - - info = {} - info["name"] = "././@LongLink" - info["type"] = type - info["size"] = len(name) - info["magic"] = GNU_MAGIC - - # create extended header + name blocks. - return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ - cls._create_payload(name) - - @classmethod - def _create_pax_generic_header(cls, pax_headers, type, encoding): - """Return a POSIX.1-2008 extended or global header sequence - that contains a list of keyword, value pairs. The values - must be strings. - """ - # Check if one of the fields contains surrogate characters and thereby - # forces hdrcharset=BINARY, see _proc_pax() for more information. - binary = False - for keyword, value in pax_headers.items(): - try: - value.encode("utf-8", "strict") - except UnicodeEncodeError: - binary = True - break - - records = b"" - if binary: - # Put the hdrcharset field at the beginning of the header. - records += b"21 hdrcharset=BINARY\n" - - for keyword, value in pax_headers.items(): - keyword = keyword.encode("utf-8") - if binary: - # Try to restore the original byte representation of `value'. - # Needless to say, that the encoding must match the string. - value = value.encode(encoding, "surrogateescape") - else: - value = value.encode("utf-8") - - l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' - n = p = 0 - while True: - n = l + len(str(p)) - if n == p: - break - p = n - records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" - - # We use a hardcoded "././@PaxHeader" name like star does - # instead of the one that POSIX recommends. - info = {} - info["name"] = "././@PaxHeader" - info["type"] = type - info["size"] = len(records) - info["magic"] = POSIX_MAGIC - - # Create pax header + record blocks. - return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ - cls._create_payload(records) - - @classmethod - def frombuf(cls, buf, encoding, errors): - """Construct a TarInfo object from a 512 byte bytes object. - """ - if len(buf) == 0: - raise EmptyHeaderError("empty header") - if len(buf) != BLOCKSIZE: - raise TruncatedHeaderError("truncated header") - if buf.count(NUL) == BLOCKSIZE: - raise EOFHeaderError("end of file header") - - chksum = nti(buf[148:156]) - if chksum not in calc_chksums(buf): - raise InvalidHeaderError("bad checksum") - - obj = cls() - obj.name = nts(buf[0:100], encoding, errors) - obj.mode = nti(buf[100:108]) - obj.uid = nti(buf[108:116]) - obj.gid = nti(buf[116:124]) - obj.size = nti(buf[124:136]) - obj.mtime = nti(buf[136:148]) - obj.chksum = chksum - obj.type = buf[156:157] - obj.linkname = nts(buf[157:257], encoding, errors) - obj.uname = nts(buf[265:297], encoding, errors) - obj.gname = nts(buf[297:329], encoding, errors) - obj.devmajor = nti(buf[329:337]) - obj.devminor = nti(buf[337:345]) - prefix = nts(buf[345:500], encoding, errors) - - # Old V7 tar format represents a directory as a regular - # file with a trailing slash. - if obj.type == AREGTYPE and obj.name.endswith("/"): - obj.type = DIRTYPE - - # The old GNU sparse format occupies some of the unused - # space in the buffer for up to 4 sparse structures. - # Save them for later processing in _proc_sparse(). - if obj.type == GNUTYPE_SPARSE: - pos = 386 - structs = [] - for i in range(4): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[482]) - origsize = nti(buf[483:495]) - obj._sparse_structs = (structs, isextended, origsize) - - # Remove redundant slashes from directories. - if obj.isdir(): - obj.name = obj.name.rstrip("/") - - # Reconstruct a ustar longname. - if prefix and obj.type not in GNU_TYPES: - obj.name = prefix + "/" + obj.name - return obj - - @classmethod - def fromtarfile(cls, tarfile): - """Return the next TarInfo object from TarFile object - tarfile. - """ - buf = tarfile.fileobj.read(BLOCKSIZE) - obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) - obj.offset = tarfile.fileobj.tell() - BLOCKSIZE - return obj._proc_member(tarfile) - - #-------------------------------------------------------------------------- - # The following are methods that are called depending on the type of a - # member. The entry point is _proc_member() which can be overridden in a - # subclass to add custom _proc_*() methods. A _proc_*() method MUST - # implement the following - # operations: - # 1. Set self.offset_data to the position where the data blocks begin, - # if there is data that follows. - # 2. Set tarfile.offset to the position where the next member's header will - # begin. - # 3. Return self or another valid TarInfo object. - def _proc_member(self, tarfile): - """Choose the right processing method depending on - the type and call it. - """ - if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): - return self._proc_gnulong(tarfile) - elif self.type == GNUTYPE_SPARSE: - return self._proc_sparse(tarfile) - elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): - return self._proc_pax(tarfile) - else: - return self._proc_builtin(tarfile) - - def _proc_builtin(self, tarfile): - """Process a builtin type or an unknown type which - will be treated as a regular file. - """ - self.offset_data = tarfile.fileobj.tell() - offset = self.offset_data - if self.isreg() or self.type not in SUPPORTED_TYPES: - # Skip the following data blocks. - offset += self._block(self.size) - tarfile.offset = offset - - # Patch the TarInfo object with saved global - # header information. - self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) - - # Remove redundant slashes from directories. This is to be consistent - # with frombuf(). - if self.isdir(): - self.name = self.name.rstrip("/") - - return self - - def _proc_gnulong(self, tarfile): - """Process the blocks that hold a GNU longname - or longlink member. - """ - buf = tarfile.fileobj.read(self._block(self.size)) - - # Fetch the next header and process it. - try: - next = self.fromtarfile(tarfile) - except HeaderError as e: - raise SubsequentHeaderError(str(e)) from None - - # Patch the TarInfo object from the next header with - # the longname information. - next.offset = self.offset - if self.type == GNUTYPE_LONGNAME: - next.name = nts(buf, tarfile.encoding, tarfile.errors) - elif self.type == GNUTYPE_LONGLINK: - next.linkname = nts(buf, tarfile.encoding, tarfile.errors) - - # Remove redundant slashes from directories. This is to be consistent - # with frombuf(). - if next.isdir(): - next.name = next.name.removesuffix("/") - - return next - - def _proc_sparse(self, tarfile): - """Process a GNU sparse header plus extra headers. - """ - # We already collected some sparse structures in frombuf(). - structs, isextended, origsize = self._sparse_structs - del self._sparse_structs - - # Collect sparse structures from extended header blocks. - while isextended: - buf = tarfile.fileobj.read(BLOCKSIZE) - pos = 0 - for i in range(21): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - if offset and numbytes: - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[504]) - self.sparse = structs - - self.offset_data = tarfile.fileobj.tell() - tarfile.offset = self.offset_data + self._block(self.size) - self.size = origsize - return self - - def _proc_pax(self, tarfile): - """Process an extended or global header as described in - POSIX.1-2008. - """ - # Read the header information. - buf = tarfile.fileobj.read(self._block(self.size)) - - # A pax header stores supplemental information for either - # the following file (extended) or all following files - # (global). - if self.type == XGLTYPE: - pax_headers = tarfile.pax_headers - else: - pax_headers = tarfile.pax_headers.copy() - - # Parse pax header information. A record looks like that: - # "%d %s=%s\n" % (length, keyword, value). length is the size - # of the complete record including the length field itself and - # the newline. - pos = 0 - encoding = None - raw_headers = [] - while len(buf) > pos and buf[pos] != 0x00: - if not (match := _header_length_prefix_re.match(buf, pos)): - raise InvalidHeaderError("invalid header") - try: - length = int(match.group(1)) - except ValueError: - raise InvalidHeaderError("invalid header") - # Headers must be at least 5 bytes, shortest being '5 x=\n'. - # Value is allowed to be empty. - if length < 5: - raise InvalidHeaderError("invalid header") - if pos + length > len(buf): - raise InvalidHeaderError("invalid header") - - header_value_end_offset = match.start(1) + length - 1 # Last byte of the header - keyword_and_value = buf[match.end(1) + 1:header_value_end_offset] - raw_keyword, equals, raw_value = keyword_and_value.partition(b"=") - - # Check the framing of the header. The last character must be '\n' (0x0A) - if not raw_keyword or equals != b"=" or buf[header_value_end_offset] != 0x0A: - raise InvalidHeaderError("invalid header") - raw_headers.append((length, raw_keyword, raw_value)) - - # Check if the pax header contains a hdrcharset field. This tells us - # the encoding of the path, linkpath, uname and gname fields. Normally, - # these fields are UTF-8 encoded but since POSIX.1-2008 tar - # implementations are allowed to store them as raw binary strings if - # the translation to UTF-8 fails. For the time being, we don't care about - # anything other than "BINARY". The only other value that is currently - # allowed by the standard is "ISO-IR 10646 2000 UTF-8" in other words UTF-8. - # Note that we only follow the initial 'hdrcharset' setting to preserve - # the initial behavior of the 'tarfile' module. - if raw_keyword == b"hdrcharset" and encoding is None: - if raw_value == b"BINARY": - encoding = tarfile.encoding - else: # This branch ensures only the first 'hdrcharset' header is used. - encoding = "utf-8" - - pos += length - - # If no explicit hdrcharset is set, we use UTF-8 as a default. - if encoding is None: - encoding = "utf-8" - - # After parsing the raw headers we can decode them to text. - for length, raw_keyword, raw_value in raw_headers: - # Normally, we could just use "utf-8" as the encoding and "strict" - # as the error handler, but we better not take the risk. For - # example, GNU tar <= 1.23 is known to store filenames it cannot - # translate to UTF-8 as raw strings (unfortunately without a - # hdrcharset=BINARY header). - # We first try the strict standard encoding, and if that fails we - # fall back on the user's encoding and error handler. - keyword = self._decode_pax_field(raw_keyword, "utf-8", "utf-8", - tarfile.errors) - if keyword in PAX_NAME_FIELDS: - value = self._decode_pax_field(raw_value, encoding, tarfile.encoding, - tarfile.errors) - else: - value = self._decode_pax_field(raw_value, "utf-8", "utf-8", - tarfile.errors) - - pax_headers[keyword] = value - - # Fetch the next header. - try: - next = self.fromtarfile(tarfile) - except HeaderError as e: - raise SubsequentHeaderError(str(e)) from None - - # Process GNU sparse information. - if "GNU.sparse.map" in pax_headers: - # GNU extended sparse format version 0.1. - self._proc_gnusparse_01(next, pax_headers) - - elif "GNU.sparse.size" in pax_headers: - # GNU extended sparse format version 0.0. - self._proc_gnusparse_00(next, raw_headers) - - elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": - # GNU extended sparse format version 1.0. - self._proc_gnusparse_10(next, pax_headers, tarfile) - - if self.type in (XHDTYPE, SOLARIS_XHDTYPE): - # Patch the TarInfo object with the extended header info. - next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) - next.offset = self.offset - - if "size" in pax_headers: - # If the extended header replaces the size field, - # we need to recalculate the offset where the next - # header starts. - offset = next.offset_data - if next.isreg() or next.type not in SUPPORTED_TYPES: - offset += next._block(next.size) - tarfile.offset = offset - - return next - - def _proc_gnusparse_00(self, next, raw_headers): - """Process a GNU tar extended sparse header, version 0.0. - """ - offsets = [] - numbytes = [] - for _, keyword, value in raw_headers: - if keyword == b"GNU.sparse.offset": - try: - offsets.append(int(value.decode())) - except ValueError: - raise InvalidHeaderError("invalid header") - - elif keyword == b"GNU.sparse.numbytes": - try: - numbytes.append(int(value.decode())) - except ValueError: - raise InvalidHeaderError("invalid header") - - next.sparse = list(zip(offsets, numbytes)) - - def _proc_gnusparse_01(self, next, pax_headers): - """Process a GNU tar extended sparse header, version 0.1. - """ - sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _proc_gnusparse_10(self, next, pax_headers, tarfile): - """Process a GNU tar extended sparse header, version 1.0. - """ - fields = None - sparse = [] - buf = tarfile.fileobj.read(BLOCKSIZE) - fields, buf = buf.split(b"\n", 1) - fields = int(fields) - while len(sparse) < fields * 2: - if b"\n" not in buf: - buf += tarfile.fileobj.read(BLOCKSIZE) - number, buf = buf.split(b"\n", 1) - sparse.append(int(number)) - next.offset_data = tarfile.fileobj.tell() - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _apply_pax_info(self, pax_headers, encoding, errors): - """Replace fields with supplemental information from a previous - pax extended or global header. - """ - for keyword, value in pax_headers.items(): - if keyword == "GNU.sparse.name": - setattr(self, "path", value) - elif keyword == "GNU.sparse.size": - setattr(self, "size", int(value)) - elif keyword == "GNU.sparse.realsize": - setattr(self, "size", int(value)) - elif keyword in PAX_FIELDS: - if keyword in PAX_NUMBER_FIELDS: - try: - value = PAX_NUMBER_FIELDS[keyword](value) - except ValueError: - value = 0 - if keyword == "path": - value = value.rstrip("/") - setattr(self, keyword, value) - - self.pax_headers = pax_headers.copy() - - def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): - """Decode a single field from a pax record. - """ - try: - return value.decode(encoding, "strict") - except UnicodeDecodeError: - return value.decode(fallback_encoding, fallback_errors) - - def _block(self, count): - """Round up a byte count by BLOCKSIZE and return it, - e.g. _block(834) => 1024. - """ - # Only non-negative offsets are allowed - if count < 0: - raise InvalidHeaderError("invalid offset") - blocks, remainder = divmod(count, BLOCKSIZE) - if remainder: - blocks += 1 - return blocks * BLOCKSIZE - - def isreg(self): - 'Return True if the Tarinfo object is a regular file.' - return self.type in REGULAR_TYPES - - def isfile(self): - 'Return True if the Tarinfo object is a regular file.' - return self.isreg() - - def isdir(self): - 'Return True if it is a directory.' - return self.type == DIRTYPE - - def issym(self): - 'Return True if it is a symbolic link.' - return self.type == SYMTYPE - - def islnk(self): - 'Return True if it is a hard link.' - return self.type == LNKTYPE - - def ischr(self): - 'Return True if it is a character device.' - return self.type == CHRTYPE - - def isblk(self): - 'Return True if it is a block device.' - return self.type == BLKTYPE - - def isfifo(self): - 'Return True if it is a FIFO.' - return self.type == FIFOTYPE - - def issparse(self): - return self.sparse is not None - - def isdev(self): - 'Return True if it is one of character device, block device or FIFO.' - return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) -# class TarInfo - -class TarFile(object): - """The TarFile Class provides an interface to tar archives. - """ - - debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) - - dereference = False # If true, add content of linked file to the - # tar file, else the link. - - ignore_zeros = False # If true, skips empty or invalid blocks and - # continues processing. - - errorlevel = 1 # If 0, fatal errors only appear in debug - # messages (if debug >= 0). If > 0, errors - # are passed to the caller as exceptions. - - format = DEFAULT_FORMAT # The format to use when creating an archive. - - encoding = ENCODING # Encoding for 8-bit character strings. - - errors = None # Error handler for unicode conversion. - - tarinfo = TarInfo # The default TarInfo class to use. - - fileobject = ExFileObject # The file-object for extractfile(). - - extraction_filter = None # The default filter for extraction. - - def __init__(self, name=None, mode="r", fileobj=None, format=None, - tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, - errors="surrogateescape", pax_headers=None, debug=None, - errorlevel=None, copybufsize=None): - """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to - read from an existing archive, 'a' to append data to an existing - file or 'w' to create a new file overwriting an existing one. `mode' - defaults to 'r'. - If `fileobj' is given, it is used for reading or writing data. If it - can be determined, `mode' is overridden by `fileobj's mode. - `fileobj' is not closed, when TarFile is closed. - """ - modes = {"r": "rb", "a": "r+b", "w": "wb", "x": "xb"} - if mode not in modes: - raise ValueError("mode must be 'r', 'a', 'w' or 'x'") - self.mode = mode - self._mode = modes[mode] - - if not fileobj: - if self.mode == "a" and not os.path.exists(name): - # Create nonexistent files in append mode. - self.mode = "w" - self._mode = "wb" - fileobj = bltn_open(name, self._mode) - self._extfileobj = False - else: - if (name is None and hasattr(fileobj, "name") and - isinstance(fileobj.name, (str, bytes))): - name = fileobj.name - if hasattr(fileobj, "mode"): - self._mode = fileobj.mode - self._extfileobj = True - self.name = os.path.abspath(name) if name else None - self.fileobj = fileobj - - # Init attributes. - if format is not None: - self.format = format - if tarinfo is not None: - self.tarinfo = tarinfo - if dereference is not None: - self.dereference = dereference - if ignore_zeros is not None: - self.ignore_zeros = ignore_zeros - if encoding is not None: - self.encoding = encoding - self.errors = errors - - if pax_headers is not None and self.format == PAX_FORMAT: - self.pax_headers = pax_headers - else: - self.pax_headers = {} - - if debug is not None: - self.debug = debug - if errorlevel is not None: - self.errorlevel = errorlevel - - # Init datastructures. - self.copybufsize = copybufsize - self.closed = False - self.members = [] # list of members as TarInfo objects - self._loaded = False # flag if all members have been read - self.offset = self.fileobj.tell() - # current position in the archive file - self.inodes = {} # dictionary caching the inodes of - # archive members already added - - try: - if self.mode == "r": - self.firstmember = None - self.firstmember = self.next() - - if self.mode == "a": - # Move to the end of the archive, - # before the first empty block. - while True: - self.fileobj.seek(self.offset) - try: - tarinfo = self.tarinfo.fromtarfile(self) - self.members.append(tarinfo) - except EOFHeaderError: - self.fileobj.seek(self.offset) - break - except HeaderError as e: - raise ReadError(str(e)) from None - - if self.mode in ("a", "w", "x"): - self._loaded = True - - if self.pax_headers: - buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) - self.fileobj.write(buf) - self.offset += len(buf) - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - #-------------------------------------------------------------------------- - # Below are the classmethods which act as alternate constructors to the - # TarFile class. The open() method is the only one that is needed for - # public use; it is the "super"-constructor and is able to select an - # adequate "sub"-constructor for a particular compression using the mapping - # from OPEN_METH. - # - # This concept allows one to subclass TarFile without losing the comfort of - # the super-constructor. A sub-constructor is registered and made available - # by adding it to the mapping in OPEN_METH. - - @classmethod - def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): - """Open a tar archive for reading, writing or appending. Return - an appropriate TarFile class. - - mode: - 'r' or 'r:*' open for reading with transparent compression - 'r:' open for reading exclusively uncompressed - 'r:gz' open for reading with gzip compression - 'r:bz2' open for reading with bzip2 compression - 'r:xz' open for reading with lzma compression - 'a' or 'a:' open for appending, creating the file if necessary - 'w' or 'w:' open for writing without compression - 'w:gz' open for writing with gzip compression - 'w:bz2' open for writing with bzip2 compression - 'w:xz' open for writing with lzma compression - - 'x' or 'x:' create a tarfile exclusively without compression, raise - an exception if the file is already created - 'x:gz' create a gzip compressed tarfile, raise an exception - if the file is already created - 'x:bz2' create a bzip2 compressed tarfile, raise an exception - if the file is already created - 'x:xz' create an lzma compressed tarfile, raise an exception - if the file is already created - - 'r|*' open a stream of tar blocks with transparent compression - 'r|' open an uncompressed stream of tar blocks for reading - 'r|gz' open a gzip compressed stream of tar blocks - 'r|bz2' open a bzip2 compressed stream of tar blocks - 'r|xz' open an lzma compressed stream of tar blocks - 'w|' open an uncompressed stream for writing - 'w|gz' open a gzip compressed stream for writing - 'w|bz2' open a bzip2 compressed stream for writing - 'w|xz' open an lzma compressed stream for writing - """ - - if not name and not fileobj: - raise ValueError("nothing to open") - - if mode in ("r", "r:*"): - # Find out which *open() is appropriate for opening the file. - def not_compressed(comptype): - return cls.OPEN_METH[comptype] == 'taropen' - error_msgs = [] - for comptype in sorted(cls.OPEN_METH, key=not_compressed): - func = getattr(cls, cls.OPEN_METH[comptype]) - if fileobj is not None: - saved_pos = fileobj.tell() - try: - return func(name, "r", fileobj, **kwargs) - except (ReadError, CompressionError) as e: - error_msgs.append(f'- method {comptype}: {e!r}') - if fileobj is not None: - fileobj.seek(saved_pos) - continue - error_msgs_summary = '\n'.join(error_msgs) - raise ReadError(f"file could not be opened successfully:\n{error_msgs_summary}") - - elif ":" in mode: - filemode, comptype = mode.split(":", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - # Select the *open() function according to - # given compression. - if comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - else: - raise CompressionError("unknown compression type %r" % comptype) - return func(name, filemode, fileobj, **kwargs) - - elif "|" in mode: - filemode, comptype = mode.split("|", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - if filemode not in ("r", "w"): - raise ValueError("mode must be 'r' or 'w'") - - stream = _Stream(name, filemode, comptype, fileobj, bufsize) - try: - t = cls(name, filemode, stream, **kwargs) - except: - stream.close() - raise - t._extfileobj = False - return t - - elif mode in ("a", "w", "x"): - return cls.taropen(name, mode, fileobj, **kwargs) - - raise ValueError("undiscernible mode") - - @classmethod - def taropen(cls, name, mode="r", fileobj=None, **kwargs): - """Open uncompressed tar archive name for reading or writing. - """ - if mode not in ("r", "a", "w", "x"): - raise ValueError("mode must be 'r', 'a', 'w' or 'x'") - return cls(name, mode, fileobj, **kwargs) - - @classmethod - def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open gzip compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if mode not in ("r", "w", "x"): - raise ValueError("mode must be 'r', 'w' or 'x'") - - try: - from gzip import GzipFile - except ImportError: - raise CompressionError("gzip module is not available") from None - - try: - fileobj = GzipFile(name, mode + "b", compresslevel, fileobj) - except OSError as e: - if fileobj is not None and mode == 'r': - raise ReadError("not a gzip file") from e - raise - - try: - t = cls.taropen(name, mode, fileobj, **kwargs) - except OSError as e: - fileobj.close() - if mode == 'r': - raise ReadError("not a gzip file") from e - raise - except: - fileobj.close() - raise - t._extfileobj = False - return t - - @classmethod - def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open bzip2 compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if mode not in ("r", "w", "x"): - raise ValueError("mode must be 'r', 'w' or 'x'") - - try: - from bz2 import BZ2File - except ImportError: - raise CompressionError("bz2 module is not available") from None - - fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel) - - try: - t = cls.taropen(name, mode, fileobj, **kwargs) - except (OSError, EOFError) as e: - fileobj.close() - if mode == 'r': - raise ReadError("not a bzip2 file") from e - raise - except: - fileobj.close() - raise - t._extfileobj = False - return t - - @classmethod - def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs): - """Open lzma compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if mode not in ("r", "w", "x"): - raise ValueError("mode must be 'r', 'w' or 'x'") - - try: - from lzma import LZMAFile, LZMAError - except ImportError: - raise CompressionError("lzma module is not available") from None - - fileobj = LZMAFile(fileobj or name, mode, preset=preset) - - try: - t = cls.taropen(name, mode, fileobj, **kwargs) - except (LZMAError, EOFError) as e: - fileobj.close() - if mode == 'r': - raise ReadError("not an lzma file") from e - raise - except: - fileobj.close() - raise - t._extfileobj = False - return t - - # All *open() methods are registered here. - OPEN_METH = { - "tar": "taropen", # uncompressed tar - "gz": "gzopen", # gzip compressed tar - "bz2": "bz2open", # bzip2 compressed tar - "xz": "xzopen" # lzma compressed tar - } - - #-------------------------------------------------------------------------- - # The public methods which TarFile provides: - - def close(self): - """Close the TarFile. In write-mode, two finishing zero blocks are - appended to the archive. - """ - if self.closed: - return - - self.closed = True - try: - if self.mode in ("a", "w", "x"): - self.fileobj.write(NUL * (BLOCKSIZE * 2)) - self.offset += (BLOCKSIZE * 2) - # fill up the end with zero-blocks - # (like option -b20 for tar does) - blocks, remainder = divmod(self.offset, RECORDSIZE) - if remainder > 0: - self.fileobj.write(NUL * (RECORDSIZE - remainder)) - finally: - if not self._extfileobj: - self.fileobj.close() - - def getmember(self, name): - """Return a TarInfo object for member `name'. If `name' can not be - found in the archive, KeyError is raised. If a member occurs more - than once in the archive, its last occurrence is assumed to be the - most up-to-date version. - """ - tarinfo = self._getmember(name.rstrip('/')) - if tarinfo is None: - raise KeyError("filename %r not found" % name) - return tarinfo - - def getmembers(self): - """Return the members of the archive as a list of TarInfo objects. The - list has the same order as the members in the archive. - """ - self._check() - if not self._loaded: # if we want to obtain a list of - self._load() # all members, we first have to - # scan the whole archive. - return self.members - - def getnames(self): - """Return the members of the archive as a list of their names. It has - the same order as the list returned by getmembers(). - """ - return [tarinfo.name for tarinfo in self.getmembers()] - - def gettarinfo(self, name=None, arcname=None, fileobj=None): - """Create a TarInfo object from the result of os.stat or equivalent - on an existing file. The file is either named by `name', or - specified as a file object `fileobj' with a file descriptor. If - given, `arcname' specifies an alternative name for the file in the - archive, otherwise, the name is taken from the 'name' attribute of - 'fileobj', or the 'name' argument. The name should be a text - string. - """ - self._check("awx") - - # When fileobj is given, replace name by - # fileobj's real name. - if fileobj is not None: - name = fileobj.name - - # Building the name of the member in the archive. - # Backward slashes are converted to forward slashes, - # Absolute paths are turned to relative paths. - if arcname is None: - arcname = name - drv, arcname = os.path.splitdrive(arcname) - arcname = arcname.replace(os.sep, "/") - arcname = arcname.lstrip("/") - - # Now, fill the TarInfo object with - # information specific for the file. - tarinfo = self.tarinfo() - tarinfo.tarfile = self # Not needed - - # Use os.stat or os.lstat, depending on if symlinks shall be resolved. - if fileobj is None: - if not self.dereference: - statres = os.lstat(name) - else: - statres = os.stat(name) - else: - statres = os.fstat(fileobj.fileno()) - linkname = "" - - stmd = statres.st_mode - if stat.S_ISREG(stmd): - inode = (statres.st_ino, statres.st_dev) - if not self.dereference and statres.st_nlink > 1 and \ - inode in self.inodes and arcname != self.inodes[inode]: - # Is it a hardlink to an already - # archived file? - type = LNKTYPE - linkname = self.inodes[inode] - else: - # The inode is added only if its valid. - # For win32 it is always 0. - type = REGTYPE - if inode[0]: - self.inodes[inode] = arcname - elif stat.S_ISDIR(stmd): - type = DIRTYPE - elif stat.S_ISFIFO(stmd): - type = FIFOTYPE - elif stat.S_ISLNK(stmd): - type = SYMTYPE - linkname = os.readlink(name) - elif stat.S_ISCHR(stmd): - type = CHRTYPE - elif stat.S_ISBLK(stmd): - type = BLKTYPE - else: - return None - - # Fill the TarInfo object with all - # information we can get. - tarinfo.name = arcname - tarinfo.mode = stmd - tarinfo.uid = statres.st_uid - tarinfo.gid = statres.st_gid - if type == REGTYPE: - tarinfo.size = statres.st_size - else: - tarinfo.size = 0 - tarinfo.mtime = statres.st_mtime - tarinfo.type = type - tarinfo.linkname = linkname - if pwd: - try: - tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] - except KeyError: - pass - if grp: - try: - tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] - except KeyError: - pass - - if type in (CHRTYPE, BLKTYPE): - if hasattr(os, "major") and hasattr(os, "minor"): - tarinfo.devmajor = os.major(statres.st_rdev) - tarinfo.devminor = os.minor(statres.st_rdev) - return tarinfo - - def list(self, verbose=True, *, members=None): - """Print a table of contents to sys.stdout. If `verbose' is False, only - the names of the members are printed. If it is True, an `ls -l'-like - output is produced. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - self._check() - - if members is None: - members = self - for tarinfo in members: - if verbose: - if tarinfo.mode is None: - _safe_print("??????????") - else: - _safe_print(stat.filemode(tarinfo.mode)) - _safe_print("%s/%s" % (tarinfo.uname or tarinfo.uid, - tarinfo.gname or tarinfo.gid)) - if tarinfo.ischr() or tarinfo.isblk(): - _safe_print("%10s" % - ("%d,%d" % (tarinfo.devmajor, tarinfo.devminor))) - else: - _safe_print("%10d" % tarinfo.size) - if tarinfo.mtime is None: - _safe_print("????-??-?? ??:??:??") - else: - _safe_print("%d-%02d-%02d %02d:%02d:%02d" \ - % time.localtime(tarinfo.mtime)[:6]) - - _safe_print(tarinfo.name + ("/" if tarinfo.isdir() else "")) - - if verbose: - if tarinfo.issym(): - _safe_print("-> " + tarinfo.linkname) - if tarinfo.islnk(): - _safe_print("link to " + tarinfo.linkname) - print() - - def add(self, name, arcname=None, recursive=True, *, filter=None): - """Add the file `name' to the archive. `name' may be any type of file - (directory, fifo, symbolic link, etc.). If given, `arcname' - specifies an alternative name for the file in the archive. - Directories are added recursively by default. This can be avoided by - setting `recursive' to False. `filter' is a function - that expects a TarInfo object argument and returns the changed - TarInfo object, if it returns None the TarInfo object will be - excluded from the archive. - """ - self._check("awx") - - if arcname is None: - arcname = name - - # Skip if somebody tries to archive the archive... - if self.name is not None and os.path.abspath(name) == self.name: - self._dbg(2, "tarfile: Skipped %r" % name) - return - - self._dbg(1, name) - - # Create a TarInfo object from the file. - tarinfo = self.gettarinfo(name, arcname) - - if tarinfo is None: - self._dbg(1, "tarfile: Unsupported type %r" % name) - return - - # Change or exclude the TarInfo object. - if filter is not None: - tarinfo = filter(tarinfo) - if tarinfo is None: - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Append the tar header and data to the archive. - if tarinfo.isreg(): - with bltn_open(name, "rb") as f: - self.addfile(tarinfo, f) - - elif tarinfo.isdir(): - self.addfile(tarinfo) - if recursive: - for f in sorted(os.listdir(name)): - self.add(os.path.join(name, f), os.path.join(arcname, f), - recursive, filter=filter) - - else: - self.addfile(tarinfo) - - def addfile(self, tarinfo, fileobj=None): - """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is - given, it should be a binary file, and tarinfo.size bytes are read - from it and added to the archive. You can create TarInfo objects - directly, or by using gettarinfo(). - """ - self._check("awx") - - tarinfo = copy.copy(tarinfo) - - buf = tarinfo.tobuf(self.format, self.encoding, self.errors) - self.fileobj.write(buf) - self.offset += len(buf) - bufsize=self.copybufsize - # If there's data to follow, append it. - if fileobj is not None: - copyfileobj(fileobj, self.fileobj, tarinfo.size, bufsize=bufsize) - blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) - if remainder > 0: - self.fileobj.write(NUL * (BLOCKSIZE - remainder)) - blocks += 1 - self.offset += blocks * BLOCKSIZE - - self.members.append(tarinfo) - - def _get_filter_function(self, filter): - if filter is None: - filter = self.extraction_filter - if filter is None: - return fully_trusted_filter - if isinstance(filter, str): - raise TypeError( - 'String names are not supported for ' - + 'TarFile.extraction_filter. Use a function such as ' - + 'tarfile.data_filter directly.') - return filter - if callable(filter): - return filter - try: - return _NAMED_FILTERS[filter] - except KeyError: - raise ValueError(f"filter {filter!r} not found") from None - - def extractall(self, path=".", members=None, *, numeric_owner=False, - filter=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). If `numeric_owner` is True, only - the numbers for user/group names are used and not the names. - - The `filter` function will be called on each member just - before extraction. - It can return a changed TarInfo or None to skip the member. - String names of common filters are accepted. - """ - directories = [] - - filter_function = self._get_filter_function(filter) - if members is None: - members = self - - for member in members: - tarinfo = self._get_extract_tarinfo(member, filter_function, path) - if tarinfo is None: - continue - if tarinfo.isdir(): - # For directories, delay setting attributes until later, - # since permissions can interfere with extraction and - # extracting contents can reset mtime. - directories.append(tarinfo) - self._extract_one(tarinfo, path, set_attrs=not tarinfo.isdir(), - numeric_owner=numeric_owner) - - # Reverse sort directories. - directories.sort(key=lambda a: a.name, reverse=True) - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - dirpath = os.path.join(path, tarinfo.name) - try: - self.chown(tarinfo, dirpath, numeric_owner=numeric_owner) - self.utime(tarinfo, dirpath) - self.chmod(tarinfo, dirpath) - except ExtractError as e: - self._handle_nonfatal_error(e) - - def extract(self, member, path="", set_attrs=True, *, numeric_owner=False, - filter=None): - """Extract a member from the archive to the current working directory, - using its full name. Its file information is extracted as accurately - as possible. `member' may be a filename or a TarInfo object. You can - specify a different directory using `path'. File attributes (owner, - mtime, mode) are set unless `set_attrs' is False. If `numeric_owner` - is True, only the numbers for user/group names are used and not - the names. - - The `filter` function will be called before extraction. - It can return a changed TarInfo or None to skip the member. - String names of common filters are accepted. - """ - filter_function = self._get_filter_function(filter) - tarinfo = self._get_extract_tarinfo(member, filter_function, path) - if tarinfo is not None: - self._extract_one(tarinfo, path, set_attrs, numeric_owner) - - def _get_extract_tarinfo(self, member, filter_function, path): - """Get filtered TarInfo (or None) from member, which might be a str""" - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - unfiltered = tarinfo - try: - tarinfo = filter_function(tarinfo, path) - except (OSError, FilterError) as e: - self._handle_fatal_error(e) - except ExtractError as e: - self._handle_nonfatal_error(e) - if tarinfo is None: - self._dbg(2, "tarfile: Excluded %r" % unfiltered.name) - return None - # Prepare the link target for makelink(). - if tarinfo.islnk(): - tarinfo = copy.copy(tarinfo) - tarinfo._link_target = os.path.join(path, tarinfo.linkname) - return tarinfo - - def _extract_one(self, tarinfo, path, set_attrs, numeric_owner): - """Extract from filtered tarinfo to disk""" - self._check("r") - - try: - self._extract_member(tarinfo, os.path.join(path, tarinfo.name), - set_attrs=set_attrs, - numeric_owner=numeric_owner) - except OSError as e: - self._handle_fatal_error(e) - except ExtractError as e: - self._handle_nonfatal_error(e) - - def _handle_nonfatal_error(self, e): - """Handle non-fatal error (ExtractError) according to errorlevel""" - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def _handle_fatal_error(self, e): - """Handle "fatal" error according to self.errorlevel""" - if self.errorlevel > 0: - raise - elif isinstance(e, OSError): - if e.filename is None: - self._dbg(1, "tarfile: %s" % e.strerror) - else: - self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) - else: - self._dbg(1, "tarfile: %s %s" % (type(e).__name__, e)) - - def extractfile(self, member): - """Extract a member from the archive as a file object. `member' may be - a filename or a TarInfo object. If `member' is a regular file or - a link, an io.BufferedReader object is returned. For all other - existing members, None is returned. If `member' does not appear - in the archive, KeyError is raised. - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - if tarinfo.isreg() or tarinfo.type not in SUPPORTED_TYPES: - # Members with unknown types are treated as regular files. - return self.fileobject(self, tarinfo) - - elif tarinfo.islnk() or tarinfo.issym(): - if isinstance(self.fileobj, _Stream): - # A small but ugly workaround for the case that someone tries - # to extract a (sym)link as a file-object from a non-seekable - # stream of tar blocks. - raise StreamError("cannot extract (sym)link as file object") - else: - # A (sym)link's file object is its target's file object. - return self.extractfile(self._find_link_target(tarinfo)) - else: - # If there's no data associated with the member (directory, chrdev, - # blkdev, etc.), return None instead of a file object. - return None - - def _extract_member(self, tarinfo, targetpath, set_attrs=True, - numeric_owner=False): - """Extract the TarInfo object tarinfo to a physical - file called targetpath. - """ - # Fetch the TarInfo object for the given name - # and build the destination pathname, replacing - # forward slashes to platform specific separators. - targetpath = targetpath.rstrip("/") - targetpath = targetpath.replace("/", os.sep) - - # Create all upper directories. - upperdirs = os.path.dirname(targetpath) - if upperdirs and not os.path.exists(upperdirs): - # Create directories that are not part of the archive with - # default permissions. - os.makedirs(upperdirs) - - if tarinfo.islnk() or tarinfo.issym(): - self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) - else: - self._dbg(1, tarinfo.name) - - if tarinfo.isreg(): - self.makefile(tarinfo, targetpath) - elif tarinfo.isdir(): - self.makedir(tarinfo, targetpath) - elif tarinfo.isfifo(): - self.makefifo(tarinfo, targetpath) - elif tarinfo.ischr() or tarinfo.isblk(): - self.makedev(tarinfo, targetpath) - elif tarinfo.islnk() or tarinfo.issym(): - self.makelink(tarinfo, targetpath) - elif tarinfo.type not in SUPPORTED_TYPES: - self.makeunknown(tarinfo, targetpath) - else: - self.makefile(tarinfo, targetpath) - - if set_attrs: - self.chown(tarinfo, targetpath, numeric_owner) - if not tarinfo.issym(): - self.chmod(tarinfo, targetpath) - self.utime(tarinfo, targetpath) - - #-------------------------------------------------------------------------- - # Below are the different file methods. They are called via - # _extract_member() when extract() is called. They can be replaced in a - # subclass to implement other functionality. - - def makedir(self, tarinfo, targetpath): - """Make a directory called targetpath. - """ - try: - if tarinfo.mode is None: - # Use the system's default mode - os.mkdir(targetpath) - else: - # Use a safe mode for the directory, the real mode is set - # later in _extract_member(). - os.mkdir(targetpath, 0o700) - except FileExistsError: - if not os.path.isdir(targetpath): - raise - - def makefile(self, tarinfo, targetpath): - """Make a file called targetpath. - """ - source = self.fileobj - source.seek(tarinfo.offset_data) - bufsize = self.copybufsize - with bltn_open(targetpath, "wb") as target: - if tarinfo.sparse is not None: - for offset, size in tarinfo.sparse: - target.seek(offset) - copyfileobj(source, target, size, ReadError, bufsize) - target.seek(tarinfo.size) - target.truncate() - else: - copyfileobj(source, target, tarinfo.size, ReadError, bufsize) - - def makeunknown(self, tarinfo, targetpath): - """Make a file from a TarInfo object with an unknown type - at targetpath. - """ - self.makefile(tarinfo, targetpath) - self._dbg(1, "tarfile: Unknown file type %r, " \ - "extracted as regular file." % tarinfo.type) - - def makefifo(self, tarinfo, targetpath): - """Make a fifo called targetpath. - """ - if hasattr(os, "mkfifo"): - os.mkfifo(targetpath) - else: - raise ExtractError("fifo not supported by system") - - def makedev(self, tarinfo, targetpath): - """Make a character or block device called targetpath. - """ - if not hasattr(os, "mknod") or not hasattr(os, "makedev"): - raise ExtractError("special devices not supported by system") - - mode = tarinfo.mode - if mode is None: - # Use mknod's default - mode = 0o600 - if tarinfo.isblk(): - mode |= stat.S_IFBLK - else: - mode |= stat.S_IFCHR - - os.mknod(targetpath, mode, - os.makedev(tarinfo.devmajor, tarinfo.devminor)) - - def makelink(self, tarinfo, targetpath): - """Make a (symbolic) link called targetpath. If it cannot be created - (platform limitation), we try to make a copy of the referenced file - instead of a link. - """ - try: - # For systems that support symbolic and hard links. - if tarinfo.issym(): - if os.path.lexists(targetpath): - # Avoid FileExistsError on following os.symlink. - os.unlink(targetpath) - os.symlink(tarinfo.linkname, targetpath) - else: - if os.path.exists(tarinfo._link_target): - os.link(tarinfo._link_target, targetpath) - else: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except symlink_exception: - try: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except KeyError: - raise ExtractError("unable to resolve link inside archive") from None - - def chown(self, tarinfo, targetpath, numeric_owner): - """Set owner of targetpath according to tarinfo. If numeric_owner - is True, use .gid/.uid instead of .gname/.uname. If numeric_owner - is False, fall back to .gid/.uid when the search based on name - fails. - """ - if hasattr(os, "geteuid") and os.geteuid() == 0: - # We have to be root to do so. - g = tarinfo.gid - u = tarinfo.uid - if not numeric_owner: - try: - if grp and tarinfo.gname: - g = grp.getgrnam(tarinfo.gname)[2] - except KeyError: - pass - try: - if pwd and tarinfo.uname: - u = pwd.getpwnam(tarinfo.uname)[2] - except KeyError: - pass - if g is None: - g = -1 - if u is None: - u = -1 - try: - if tarinfo.issym() and hasattr(os, "lchown"): - os.lchown(targetpath, u, g) - else: - os.chown(targetpath, u, g) - except OSError as e: - raise ExtractError("could not change owner") from e - - def chmod(self, tarinfo, targetpath): - """Set file permissions of targetpath according to tarinfo. - """ - if tarinfo.mode is None: - return - try: - os.chmod(targetpath, tarinfo.mode) - except OSError as e: - raise ExtractError("could not change mode") from e - - def utime(self, tarinfo, targetpath): - """Set modification time of targetpath according to tarinfo. - """ - mtime = tarinfo.mtime - if mtime is None: - return - if not hasattr(os, 'utime'): - return - try: - os.utime(targetpath, (mtime, mtime)) - except OSError as e: - raise ExtractError("could not change modification time") from e - - #-------------------------------------------------------------------------- - def next(self): - """Return the next member of the archive as a TarInfo object, when - TarFile is opened for reading. Return None if there is no more - available. - """ - self._check("ra") - if self.firstmember is not None: - m = self.firstmember - self.firstmember = None - return m - - # Advance the file pointer. - if self.offset != self.fileobj.tell(): - if self.offset == 0: - return None - self.fileobj.seek(self.offset - 1) - if not self.fileobj.read(1): - raise ReadError("unexpected end of data") - - # Read the next block. - tarinfo = None - while True: - try: - tarinfo = self.tarinfo.fromtarfile(self) - except EOFHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - except InvalidHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - elif self.offset == 0: - raise ReadError(str(e)) from None - except EmptyHeaderError: - if self.offset == 0: - raise ReadError("empty file") from None - except TruncatedHeaderError as e: - if self.offset == 0: - raise ReadError(str(e)) from None - except SubsequentHeaderError as e: - raise ReadError(str(e)) from None - except Exception as e: - try: - import zlib - if isinstance(e, zlib.error): - raise ReadError(f'zlib error: {e}') from None - else: - raise e - except ImportError: - raise e - break - - if tarinfo is not None: - self.members.append(tarinfo) - else: - self._loaded = True - - return tarinfo - - #-------------------------------------------------------------------------- - # Little helper methods: - - def _getmember(self, name, tarinfo=None, normalize=False): - """Find an archive member by name from bottom to top. - If tarinfo is given, it is used as the starting point. - """ - # Ensure that all members have been loaded. - members = self.getmembers() - - # Limit the member search list up to tarinfo. - skipping = False - if tarinfo is not None: - try: - index = members.index(tarinfo) - except ValueError: - # The given starting point might be a (modified) copy. - # We'll later skip members until we find an equivalent. - skipping = True - else: - # Happy fast path - members = members[:index] - - if normalize: - name = os.path.normpath(name) - - for member in reversed(members): - if skipping: - if tarinfo.offset == member.offset: - skipping = False - continue - if normalize: - member_name = os.path.normpath(member.name) - else: - member_name = member.name - - if name == member_name: - return member - - if skipping: - # Starting point was not found - raise ValueError(tarinfo) - - def _load(self): - """Read through the entire archive file and look for readable - members. - """ - while True: - tarinfo = self.next() - if tarinfo is None: - break - self._loaded = True - - def _check(self, mode=None): - """Check if TarFile is still open, and if the operation's mode - corresponds to TarFile's mode. - """ - if self.closed: - raise OSError("%s is closed" % self.__class__.__name__) - if mode is not None and self.mode not in mode: - raise OSError("bad operation for mode %r" % self.mode) - - def _find_link_target(self, tarinfo): - """Find the target member of a symlink or hardlink member in the - archive. - """ - if tarinfo.issym(): - # Always search the entire archive. - linkname = "/".join(filter(None, (os.path.dirname(tarinfo.name), tarinfo.linkname))) - limit = None - else: - # Search the archive before the link, because a hard link is - # just a reference to an already archived file. - linkname = tarinfo.linkname - limit = tarinfo - - member = self._getmember(linkname, tarinfo=limit, normalize=True) - if member is None: - raise KeyError("linkname %r not found" % linkname) - return member - - def __iter__(self): - """Provide an iterator object. - """ - if self._loaded: - yield from self.members - return - - # Yield items using TarFile's next() method. - # When all members have been read, set TarFile as _loaded. - index = 0 - # Fix for SF #1100429: Under rare circumstances it can - # happen that getmembers() is called during iteration, - # which will have already exhausted the next() method. - if self.firstmember is not None: - tarinfo = self.next() - index += 1 - yield tarinfo - - while True: - if index < len(self.members): - tarinfo = self.members[index] - elif not self._loaded: - tarinfo = self.next() - if not tarinfo: - self._loaded = True - return - else: - return - index += 1 - yield tarinfo - - def _dbg(self, level, msg): - """Write debugging output to sys.stderr. - """ - if level <= self.debug: - print(msg, file=sys.stderr) - - def __enter__(self): - self._check() - return self - - def __exit__(self, type, value, traceback): - if type is None: - self.close() - else: - # An exception occurred. We must not call close() because - # it would try to write end-of-archive blocks and padding. - if not self._extfileobj: - self.fileobj.close() - self.closed = True - -#-------------------- -# exported functions -#-------------------- - -def is_tarfile(name): - """Return True if name points to a tar archive that we - are able to handle, else return False. - - 'name' should be a string, file, or file-like object. - """ - try: - if hasattr(name, "read"): - pos = name.tell() - t = open(fileobj=name) - name.seek(pos) - else: - t = open(name) - t.close() - return True - except TarError: - return False - -open = TarFile.open - - -def main(): - import argparse - - description = 'A simple command-line interface for tarfile module.' - parser = argparse.ArgumentParser(description=description) - parser.add_argument('-v', '--verbose', action='store_true', default=False, - help='Verbose output') - parser.add_argument('--filter', metavar='', - choices=_NAMED_FILTERS, - help='Filter for extraction') - - group = parser.add_mutually_exclusive_group(required=True) - group.add_argument('-l', '--list', metavar='', - help='Show listing of a tarfile') - group.add_argument('-e', '--extract', nargs='+', - metavar=('', ''), - help='Extract tarfile into target dir') - group.add_argument('-c', '--create', nargs='+', - metavar=('', ''), - help='Create tarfile from sources') - group.add_argument('-t', '--test', metavar='', - help='Test if a tarfile is valid') - - args = parser.parse_args() - - if args.filter and args.extract is None: - parser.exit(1, '--filter is only valid for extraction\n') - - if args.test is not None: - src = args.test - if is_tarfile(src): - with open(src, 'r') as tar: - tar.getmembers() - print(tar.getmembers(), file=sys.stderr) - if args.verbose: - print('{!r} is a tar archive.'.format(src)) - else: - parser.exit(1, '{!r} is not a tar archive.\n'.format(src)) - - elif args.list is not None: - src = args.list - if is_tarfile(src): - with TarFile.open(src, 'r:*') as tf: - tf.list(verbose=args.verbose) - else: - parser.exit(1, '{!r} is not a tar archive.\n'.format(src)) - - elif args.extract is not None: - if len(args.extract) == 1: - src = args.extract[0] - curdir = os.curdir - elif len(args.extract) == 2: - src, curdir = args.extract - else: - parser.exit(1, parser.format_help()) - - if is_tarfile(src): - with TarFile.open(src, 'r:*') as tf: - tf.extractall(path=curdir, filter=args.filter) - if args.verbose: - if curdir == '.': - msg = '{!r} file is extracted.'.format(src) - else: - msg = ('{!r} file is extracted ' - 'into {!r} directory.').format(src, curdir) - print(msg) - else: - parser.exit(1, '{!r} is not a tar archive.\n'.format(src)) - - elif args.create is not None: - tar_name = args.create.pop(0) - _, ext = os.path.splitext(tar_name) - compressions = { - # gz - '.gz': 'gz', - '.tgz': 'gz', - # xz - '.xz': 'xz', - '.txz': 'xz', - # bz2 - '.bz2': 'bz2', - '.tbz': 'bz2', - '.tbz2': 'bz2', - '.tb2': 'bz2', - } - tar_mode = 'w:' + compressions[ext] if ext in compressions else 'w' - tar_files = args.create - - with TarFile.open(tar_name, tar_mode) as tf: - for file_name in tar_files: - tf.add(file_name) - - if args.verbose: - print('{!r} file created.'.format(tar_name)) - -if __name__ == '__main__': - main() diff --git a/services/evaluator/pyproject.toml b/services/evaluator/pyproject.toml deleted file mode 100644 index eb7a8bc64f..0000000000 --- a/services/evaluator/pyproject.toml +++ /dev/null @@ -1,105 +0,0 @@ -[project] -name = "nmp-evaluator" -version = "0.0.1" -description = "The NeMo Evaluation Microservice is the one stop shop for evaluation needs as part of the NeMo Platform ecosystem" -readme = "README.md" -requires-python = ">=3.11,<3.14" - -classifiers = [ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "Intended Audience :: Science/Research", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Scientific/Engineering :: Human Machine Interfaces", - "Topic :: Software Development", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: 3.11" -] - -dependencies = [ - # All evaluator runtime dependencies - evaluator doesn't have clean API/task separation - # so all deps are needed for the service to start - "fastapi[standard]>=0.115.4", - "pydantic>=2.10.3", - "pydantic-settings>=2.6.1", - "uvicorn<1.0.0.0,>=0.24.0-post.0", - "starlette<1.0.0,>=0.52.1", - "requests<3.0.0,>=2.31.0", - "base58<3.0.0,>=2.1.1", - "opentelemetry-distro>=0.48b0,<1.0", - "opentelemetry-exporter-otlp>=1.27.0", - "sqlmodel<1.0.0,>=0.0.14", - "psycopg2-binary<3.0.0,>=2.9.9", - "alembic<2.0.0,>=1.13.1", - "python-box>=7.3.2", - "jsonpath-ng>=1.6.0", - "nmp-common", - # Task deps that are imported at startup - "aiofiles>=25.1.0", - "aiohttp>=3.13.4", - "datasets>=3.3.1", - "huggingface-hub>=1.0.1,<2.0.0", - "kubernetes>=31.0.0", - "openai>=1.61.0", - "ragas==0.3.5", - "langchain-community>=0.3.31,<0.4", - "pymilvus==2.6.9", - "langchain-nvidia-ai-endpoints>=1.0.0,<2.0.0", - "nemo-evaluator-sdk", -] - -[project.scripts] -evaluator-server = "nmp.evaluator.main:run_standalone" - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build.targets.wheel] -packages = ["src/nmp"] - -[dependency-groups] -# Task deps are all in main dependencies now since evaluator imports them at startup - -dev = [ - "aioresponses>=0.7.8", - "flake8<7.0.0,>=6.1.0", - "pre-commit<4.0.0,>=3.5.0", - "ipython<9.0.0,>=8.17.2", - "ipdb<1.0.0,>=0.13.13", - "responses<1.0.0,>=0.24.1", - "pytest>=9.0.3, <10.0.0", - "pytest-asyncio>=0.24.0", - "pytest-cov>=6.0.0", - "httpx<1.0.0,>=0.26.0", - "pytest-mock<4.0.0,>=3.14.0", - "pytest-subtests>=0.13.1", - "pytest-httpserver", - "nmp-testing", -] - -[tool.black] -line-length = 99 -exclude = ''' -( -^alembic/versions # autogenerated code -) -''' - -[tool.isort] -line_length = 99 -profile = "black" -skip_glob = ["alembic/versions/*"] - -[tool.pytest] -plugins = ["pytest-cov"] - -[tool.uv] -cache-keys = [ - { file = "pyproject.toml" } -] - -[tool.uv.sources] -nmp-common = {workspace = true} -nmp-testing = {workspace = true} -nemo-evaluator-sdk = {workspace = true} diff --git a/services/evaluator/pytest.ini b/services/evaluator/pytest.ini deleted file mode 100644 index 44c6aa1f92..0000000000 --- a/services/evaluator/pytest.ini +++ /dev/null @@ -1,63 +0,0 @@ -[pytest] -# Pytest configuration for NeMo Evaluator Service -# This mirrors the root pytest.ini configuration for standalone test runs - -# Python files and directories to search for tests -python_files = test_*.py *_test.py -python_classes = Test* -python_functions = test_* -pythonpath = - src - ../../packages/nemo_evaluator_sdk/src - ../.. - -# Test discovery paths -testpaths = tests - -# Markers for different test categories -markers = - integration: Integration tests - test service interfaces and interactions between systems - e2e: End-to-end tests - test complete customer workflows and blueprints - regression: Regression tests - test individual functional microservices for baseline functionality - slow: Tests that take a long time to run - skip_in_ci: Tests that should be skipped in CI environment - unit: Unit tests - test single classes/functions with no infrastructure dependencies - unit_test: Legacy marker for unit tests (deprecated, use 'unit' instead) - noautouse: Marker to skip autouse fixtures for specific tests - -# Asyncio configuration -asyncio_default_fixture_loop_scope = function -asyncio_mode = auto - -# Output options -addopts = - --verbose - --tb=short - --import-mode=importlib - -# Minimum Python version -minversion = 8.0 - -# Test timeout (in seconds) -timeout = 300 -timeout_method = thread - -# Log configuration -log_cli = false -log_cli_level = INFO - -# Filter warnings -filterwarnings = - ignore::DeprecationWarning - ignore::PendingDeprecationWarning - ignore::UserWarning:pytest_only.version - -# Paths to ignore during test collection -norecursedirs = - .git - .tox - dist - build - .venv - __pycache__ - *.egg-info diff --git a/services/evaluator/scripts/BFCL-Conversions.ipynb b/services/evaluator/scripts/BFCL-Conversions.ipynb deleted file mode 100644 index a057085faa..0000000000 --- a/services/evaluator/scripts/BFCL-Conversions.ipynb +++ /dev/null @@ -1,272 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "b777bd70-76fa-4576-af74-6b32547bad2f", - "metadata": {}, - "source": [ - "\n", - "A notebook with scripts to convert BFCL-formatted datasets into input datasets (with \"messages\", \"tools\" serving as inputs and \"tool_calls\" as ground truths) of OpenAI compatible format supported by custom evaluation with tool calling metric.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "cf6880ae-a20f-4cc2-bbd2-408dfb9cc9fa", - "metadata": {}, - "outputs": [], - "source": [ - "import copy\n", - "import re\n", - "\n", - "\n", - "def convert_to_tool(functions, mapping):\n", - " functions = copy.deepcopy(functions)\n", - " oai_tool = []\n", - " for item in functions:\n", - " if \".\" in item[\"name\"]:\n", - " # OAI does not support \".\" in the function name so we replace it with \"_\". ^[a-zA-Z0-9_-]{1,64}$ is the regex for the name.\n", - " item[\"name\"] = re.sub(r\"\\.\", \"_\", item[\"name\"])\n", - "\n", - " item[\"parameters\"][\"type\"] = \"object\"\n", - " item[\"parameters\"][\"properties\"] = _cast_to_openai_type(item[\"parameters\"][\"properties\"], mapping)\n", - "\n", - " oai_tool.append({\"type\": \"function\", \"function\": item})\n", - "\n", - " return oai_tool\n", - "\n", - "\n", - "def _cast_to_openai_type(properties, mapping):\n", - " for key, value in properties.items():\n", - " if \"type\" not in value:\n", - " properties[key][\"type\"] = \"string\"\n", - " else:\n", - " var_type = value[\"type\"]\n", - " if mapping == GORILLA_TO_OPENAPI and var_type == \"float\":\n", - " properties[key][\"format\"] = \"float\"\n", - " properties[key][\"description\"] += \" This is a float type value.\"\n", - " if var_type in mapping:\n", - " properties[key][\"type\"] = mapping[var_type]\n", - " else:\n", - " properties[key][\"type\"] = \"string\"\n", - "\n", - " # Currently support:\n", - " # - list of any\n", - " # - list of list of any\n", - " # - list of dict\n", - " # - list of list of dict\n", - " # - dict of any\n", - "\n", - " if properties[key][\"type\"] == \"array\" or properties[key][\"type\"] == \"object\":\n", - " if \"properties\" in properties[key]:\n", - " properties[key][\"properties\"] = _cast_to_openai_type(properties[key][\"properties\"], mapping)\n", - " elif \"items\" in properties[key]:\n", - " properties[key][\"items\"][\"type\"] = mapping[properties[key][\"items\"][\"type\"]]\n", - " if properties[key][\"items\"][\"type\"] == \"array\" and \"items\" in properties[key][\"items\"]:\n", - " properties[key][\"items\"][\"items\"][\"type\"] = mapping[properties[key][\"items\"][\"items\"][\"type\"]]\n", - " elif properties[key][\"items\"][\"type\"] == \"object\" and \"properties\" in properties[key][\"items\"]:\n", - " properties[key][\"items\"][\"properties\"] = _cast_to_openai_type(\n", - " properties[key][\"items\"][\"properties\"], mapping\n", - " )\n", - " return properties\n", - "\n", - "\n", - "GORILLA_TO_OPENAPI = {\n", - " \"integer\": \"integer\",\n", - " \"number\": \"number\",\n", - " \"float\": \"number\",\n", - " \"string\": \"string\",\n", - " \"boolean\": \"boolean\",\n", - " \"bool\": \"boolean\",\n", - " \"array\": \"array\",\n", - " \"list\": \"array\",\n", - " \"dict\": \"object\",\n", - " \"object\": \"object\",\n", - " \"tuple\": \"array\",\n", - " \"any\": \"string\",\n", - " \"byte\": \"integer\",\n", - " \"short\": \"integer\",\n", - " \"long\": \"integer\",\n", - " \"double\": \"number\",\n", - " \"char\": \"string\",\n", - " \"ArrayList\": \"array\",\n", - " \"Array\": \"array\",\n", - " \"HashMap\": \"object\",\n", - " \"Hashtable\": \"object\",\n", - " \"Queue\": \"array\",\n", - " \"Stack\": \"array\",\n", - " \"Any\": \"string\",\n", - " \"String\": \"string\",\n", - " \"Bigint\": \"integer\",\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "b01ab78b-ed25-428e-be9b-7d2e4fddf085", - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "\n", - "\n", - "def read_jsonl(file_path):\n", - " \"\"\"Reads a JSONL file and returns a list of JSON objects.\"\"\"\n", - " data = []\n", - " with open(file_path, \"r\", encoding=\"utf-8\") as file:\n", - " for line in file:\n", - " try:\n", - " json_object = json.loads(line.strip())\n", - " data.append(json_object)\n", - " except json.JSONDecodeError as e:\n", - " print(f\"Error parsing line: {line.strip()} - {e}\")\n", - " return data" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "efb77916-47aa-4040-98b9-f7ded48493fc", - "metadata": {}, - "outputs": [], - "source": [ - "def write_jsonl(file_path, data):\n", - " with open(file_path, \"w\") as file:\n", - " for entry in data:\n", - " json.dump(entry, file, ensure_ascii=False)\n", - " file.write(\"\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "0dded1ca-45f5-42fc-be86-a85936694d7a", - "metadata": {}, - "outputs": [], - "source": [ - "def convert_bfcl_to_custom_tool_calling(input_file, gt_file, output_file):\n", - " bfcl_simple_inputs = read_jsonl(input_file)\n", - " bfcl_simple_gts = read_jsonl(gt_file)\n", - "\n", - " result = []\n", - "\n", - " for i in range(len(bfcl_simple_inputs)):\n", - " record_output = {}\n", - " record_input = bfcl_simple_inputs[i]\n", - " record_gt = bfcl_simple_gts[i]\n", - "\n", - " record_output[\"messages\"] = record_input[\"question\"][0]\n", - " record_output[\"tools\"] = convert_to_tool(record_input[\"function\"], GORILLA_TO_OPENAPI)\n", - "\n", - " tool_calls = []\n", - " for gt in record_gt[\"ground_truth\"]:\n", - " gt_fn_name = next(iter(gt))\n", - " gt_fn_args = gt[gt_fn_name]\n", - "\n", - " fn_name = gt_fn_name.replace(\".\", \"_\") # Replace dots in function names\n", - " fn_args = {}\n", - " for arg_name, arg_value in gt_fn_args.items():\n", - " corrected_arg_value = arg_value\n", - "\n", - " # The following lines correct some deficiencies in original datasets where arguments were put into (nested) lists\n", - "\n", - " # if isinstance(arg_value, list):\n", - " # filtered_args = [arg for arg in arg_value if arg != \"\"] # Filter out empty strings\n", - "\n", - " # if len(filtered_args) == 1:\n", - " # corrected_arg_value = filtered_args[0] # Flatten\n", - " # else:\n", - " # corrected_arg_value = filtered_args\n", - "\n", - " fn_args[arg_name] = corrected_arg_value\n", - "\n", - " fn = {\n", - " \"function\": {\n", - " \"name\": fn_name,\n", - " \"arguments\": fn_args,\n", - " }\n", - " }\n", - " tool_calls.append(fn)\n", - "\n", - " record_output[\"tool_calls\"] = tool_calls\n", - "\n", - " result.append(record_output)\n", - "\n", - " write_jsonl(output_file, result)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "49b995f3-87fa-428e-8fb9-22e43b4b72c0", - "metadata": {}, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: '~/workspace/bfcl/BFCL_v3_simple.json'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[7], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mconvert_bfcl_to_custom_tool_calling\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m~/workspace/bfcl/BFCL_v3_simple.json\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m~/workspace/bfcl/BFCL_v3_simple_gt.json\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m~/workspace/bfcl/BFCL_v3_simple_sample.jsonl\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 5\u001b[0m \u001b[43m)\u001b[49m\n", - "Cell \u001b[0;32mIn[4], line 2\u001b[0m, in \u001b[0;36mconvert_bfcl_to_custom_tool_calling\u001b[0;34m(input_file, gt_file, output_file)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconvert_bfcl_to_custom_tool_calling\u001b[39m(input_file, gt_file, output_file):\n\u001b[0;32m----> 2\u001b[0m bfcl_simple_inputs \u001b[38;5;241m=\u001b[39m \u001b[43mread_jsonl\u001b[49m\u001b[43m(\u001b[49m\u001b[43minput_file\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m bfcl_simple_gts \u001b[38;5;241m=\u001b[39m read_jsonl(gt_file)\n\u001b[1;32m 5\u001b[0m result \u001b[38;5;241m=\u001b[39m []\n", - "Cell \u001b[0;32mIn[2], line 6\u001b[0m, in \u001b[0;36mread_jsonl\u001b[0;34m(file_path)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Reads a JSONL file and returns a list of JSON objects.\"\"\"\u001b[39;00m\n\u001b[1;32m 5\u001b[0m data \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m----> 6\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mfile_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mutf-8\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m file:\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m line \u001b[38;5;129;01min\u001b[39;00m file:\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m~/.pyenv/versions/3.12.2/lib/python3.12/site-packages/IPython/core/interactiveshell.py:324\u001b[0m, in \u001b[0;36m_modified_open\u001b[0;34m(file, *args, **kwargs)\u001b[0m\n\u001b[1;32m 317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m file \u001b[38;5;129;01min\u001b[39;00m {\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m}:\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 319\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIPython won\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt let you open fd=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfile\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m by default \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 320\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mas it is likely to crash IPython. If you know what you are doing, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124myou can use builtins\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m open.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 322\u001b[0m )\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mio_open\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '~/workspace/bfcl/BFCL_v3_simple.json'" - ] - } - ], - "source": [ - "convert_bfcl_to_custom_tool_calling(\n", - " \"~/workspace/bfcl/BFCL_v3_simple.json\",\n", - " \"~/workspace/bfcl/BFCL_v3_simple_gt.json\",\n", - " \"~/workspace/bfcl/BFCL_v3_simple_sample.jsonl\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "c8f41477-d127-4f1e-9926-3eb3dbf441dc", - "metadata": {}, - "outputs": [], - "source": [ - "convert_bfcl_to_custom_tool_calling(\n", - " \"~/workspace/bfcl/BFCL_v3_parallel_multiple.json\",\n", - " \"~/workspace/bfcl/BFCL_v3_parallel_multiple_gt.json\",\n", - " \"~/workspace/bfcl/BFCL_v3_parallel_multiple_sample.jsonl\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dae84784-e29a-42ac-9a71-d405f3581d7f", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/services/evaluator/scripts/autogenerate-db-upgrade.sh b/services/evaluator/scripts/autogenerate-db-upgrade.sh deleted file mode 100755 index 72f6c73340..0000000000 --- a/services/evaluator/scripts/autogenerate-db-upgrade.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -while getopts 'm:' opt; do - case "$opt" in - m) - arg="${OPTARG}" - UPGRADE=$arg docker compose -f docker-compose-db-migration.yaml up --build --abort-on-container-exit - ;; - esac -done diff --git a/services/evaluator/scripts/run-db-migration.sh b/services/evaluator/scripts/run-db-migration.sh deleted file mode 100755 index cfd0667c2b..0000000000 --- a/services/evaluator/scripts/run-db-migration.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -/app/.venv/bin/alembic upgrade head diff --git a/services/evaluator/scripts/test_ragas_dataset_modes.py b/services/evaluator/scripts/test_ragas_dataset_modes.py deleted file mode 100644 index 7f514fb73a..0000000000 --- a/services/evaluator/scripts/test_ragas_dataset_modes.py +++ /dev/null @@ -1,1248 +0,0 @@ -#!/usr/bin/env python3 -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -""" -Test script for RAGAS evaluation metrics using DatasetRows, FilesetUrn, and InlineFileset. - -This script tests RAGAS metrics with three dataset modes: -1. DatasetRows - Dataset rows embedded directly in the API request -2. FilesetUrn - Dataset uploaded to Files API first, then referenced by URN -3. InlineFileset - Dataset from HuggingFace with storage config (e.g., ramadhani/ragas-subject-test-01) - -Usage: - # Test with DatasetRows (default) - python test_ragas_dataset_modes.py \ - --model-endpoint https://integrate.api.nvidia.com/v1/chat/completions \ - --model-name meta/llama-3.1-8b-instruct \ - --model-api-key \ - --embedding-endpoint https://integrate.api.nvidia.com/v1 \ - --embedding-model nvidia/nv-embedqa-e5-v5 \ - --embedding-api-key \ - --judge-endpoint https://integrate.api.nvidia.com/v1/chat/completions \ - --judge-model meta/llama-3.1-8b-instruct \ - --judge-api-key - - # Test with FilesetUrn (upload to Files API) - python test_ragas_dataset_modes.py --use-fileset-urn \ - --model-endpoint https://integrate.api.nvidia.com/v1/chat/completions \ - --model-name meta/llama-3.1-8b-instruct \ - --model-api-key \ - --embedding-endpoint https://integrate.api.nvidia.com/v1 \ - --embedding-model nvidia/nv-embedqa-e5-v5 \ - --embedding-api-key \ - --judge-endpoint https://integrate.api.nvidia.com/v1/chat/completions \ - --judge-model meta/llama-3.1-8b-instruct \ - --judge-api-key - - # Test with InlineFileset (HuggingFace dataset - uses default public repo NotYours/test_ragas_dataset) - # Note: --hf-token is optional for public repos - python test_ragas_dataset_modes.py --use-inline-fileset \ - --model-endpoint https://integrate.api.nvidia.com/v1/chat/completions \ - --model-name meta/llama-3.1-8b-instruct \ - --model-api-key \ - --embedding-endpoint https://integrate.api.nvidia.com/v1 \ - --embedding-model nvidia/nv-embedqa-e5-v5 \ - --embedding-api-key \ - --judge-endpoint https://integrate.api.nvidia.com/v1/chat/completions \ - --judge-model meta/llama-3.1-8b-instruct \ - --judge-api-key - - # Test all three modes (uses default public HF repo NotYours/test_ragas_dataset for InlineFileset) - python test_ragas_dataset_modes.py --test-all-modes \ - --model-endpoint https://integrate.api.nvidia.com/v1/chat/completions \ - --model-name meta/llama-3.1-8b-instruct \ - --model-api-key \ - --embedding-endpoint https://integrate.api.nvidia.com/v1 \ - --embedding-model nvidia/nv-embedqa-e5-v5 \ - --embedding-api-key \ - --judge-endpoint https://integrate.api.nvidia.com/v1/chat/completions \ - --judge-model meta/llama-3.1-8b-instruct \ - --judge-api-key -""" - -import argparse -import asyncio -import json -import os -import subprocess -import sys -import threading -import time -import uuid -from dataclasses import dataclass -from datetime import datetime -from pathlib import Path - -import httpx -from nemo_platform import AsyncNeMoPlatform - -# Default configuration -DEFAULT_BASE_URL = "http://localhost:8080" -DEFAULT_WORKSPACE = "default" - -# Path to test datasets (relative to evaluator service root) -DEFAULT_DATASET_FILE = "tests/datasets/rag-retriever/small_dataset_with_retrieved_context.jsonl" - -# Secret names -MODEL_API_KEY_SECRET = "model-api-key" -EMBEDDING_API_KEY_SECRET = "embedding-api-key" -JUDGE_API_KEY_SECRET = "judge-api-key" -JUDGE_EMBEDDING_API_KEY_SECRET = "judge-embedding-api-key" -HF_TOKEN_SECRET = "hf-token" - -# Default HuggingFace dataset for InlineFileset mode -DEFAULT_HF_REPO_ID = "NotYours/test_ragas_dataset" -DEFAULT_HF_DATASET_PATH = "dataset.json" - -# RAGAS metrics to test (subset that works with offline evaluation) -# These metrics evaluate pre-computed contexts and answers -# Note: All RAGAS metrics have the "rag-" prefix -RAGAS_OFFLINE_METRICS = [ - "rag-faithfulness", - "rag-answer-correctness", - "rag-answer-relevancy", - "rag-context-recall", -] - -# Thread-safe printing -_print_lock = threading.Lock() - - -def safe_print(*args, **kwargs): - """Thread-safe print function.""" - with _print_lock: - print(*args, **kwargs) - - -@dataclass -class JobResult: - """Result of a metric job run.""" - - metric: str - mode: str # "inline" or "fileset" - job_name: str - job_id: str - status: str - duration_seconds: float - container_logs: str | None = None - error: str | None = None - - -# ============================================================================ -# Dataset Loading -# ============================================================================ - - -def load_dataset_from_file(file_path: str) -> list[dict]: - """Load dataset from a JSONL or JSON file. - - Args: - file_path: Path to the dataset file (.jsonl or .json) - - Returns: - List of dataset rows - """ - path = Path(file_path) - if not path.exists(): - raise FileNotFoundError(f"Dataset file not found: {file_path}") - - rows = [] - if path.suffix == ".jsonl": - with open(path) as f: - for line in f: - line = line.strip() - if line: - rows.append(json.loads(line)) - elif path.suffix == ".json": - with open(path) as f: - data = json.load(f) - if isinstance(data, list): - rows = data - else: - rows = [data] - else: - raise ValueError(f"Unsupported file format: {path.suffix}. Use .jsonl or .json") - - return rows - - -def get_sample_ragas_dataset() -> list[dict]: - """Get a sample RAGAS dataset for testing. - - Returns dataset in RAGAS columnar format where each field is a list. - This matches the format expected by RAGAS evaluation. - """ - # RAGAS expects columnar format: each field is a list of values - return [ - { - "question": [ - "When did the 2024 SF Taiwan Day take place?", - "Where did the 2024 SF Taiwan Day take place?", - "Who threw the first pitch during the 2024 SF Taiwan Day?", - ], - "contexts": [ - [ - "The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch." - ], - [ - "The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch." - ], - [ - "The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch." - ], - ], - "ground_truth": [ - "May 25th", - "Oakland Coliseum", - "NVIDIA founder and CEO Jensen Huang", - ], - "answer": [ - "The 2024 SF Taiwan Day took place on May 25th.", - "The 2024 SF Taiwan Day took place at the Oakland Coliseum.", - "Jensen Huang, NVIDIA's founder and CEO, threw the ceremonial first pitch.", - ], - } - ] - - -# ============================================================================ -# FilesetUrn Support - For testing with data uploaded to Files API -# ============================================================================ - - -async def create_dataset_fileset( - base_url: str, - workspace: str, - dataset_rows: list[dict], - fileset_name: str | None = None, -) -> str: - """ - Create a fileset and upload a dataset to it using the SDK. - - Args: - base_url: API base URL - workspace: Workspace ID - dataset_rows: Dataset rows to upload - fileset_name: Optional fileset name (auto-generated if not provided) - - Returns: - The fileset URN (workspace/fileset-name) - """ - if fileset_name is None: - fileset_name = f"ragas-test-dataset-{uuid.uuid4().hex[:8]}" - - sdk = AsyncNeMoPlatform(base_url=base_url) - - # Create the fileset - safe_print(f" 📁 Creating fileset: {fileset_name}") - await sdk.files.filesets.create( - workspace=workspace, - name=fileset_name, - description="Test dataset fileset for RAGAS evaluation", - ) - - # Upload dataset as JSON file (RAGAS columnar format) - # RAGAS expects a dict with list values, not a list of dicts - # If dataset_rows is [columnar_dict], unwrap it for HuggingFace Dataset.from_dict() compatibility - if len(dataset_rows) == 1 and all(isinstance(v, list) for v in dataset_rows[0].values()): - data_to_upload = dataset_rows[0] # Unwrap columnar format - else: - data_to_upload = dataset_rows - - dataset_filename = "dataset.json" - dataset_content = json.dumps(data_to_upload, indent=2).encode("utf-8") - safe_print(f" 📤 Uploading {dataset_filename} ({len(dataset_content)} bytes)") - await sdk.files.upload_content( - content=dataset_content, - remote_path=dataset_filename, - fileset=fileset_name, - workspace=workspace, - ) - - # Return full file path reference (workspace/fileset-name/filename) - # The FilesetRef must point to the actual file, not just the fileset directory - fileset_file_urn = f"{workspace}/{fileset_name}/{dataset_filename}" - safe_print(f" ✅ Fileset created: {fileset_file_urn}") - return fileset_file_urn - - -def create_dataset_fileset_sync( - base_url: str, - workspace: str, - dataset_rows: list[dict], - fileset_name: str | None = None, -) -> str: - """Synchronous wrapper for create_dataset_fileset.""" - return asyncio.run(create_dataset_fileset(base_url, workspace, dataset_rows, fileset_name)) - - -async def delete_fileset(base_url: str, workspace: str, fileset_name: str) -> bool: - """Delete a fileset using the SDK.""" - sdk = AsyncNeMoPlatform(base_url=base_url) - try: - await sdk.files.filesets.delete(fileset_name, workspace=workspace) - return True - except Exception: - return False - - -def delete_fileset_sync(base_url: str, workspace: str, fileset_name: str) -> bool: - """Synchronous wrapper for delete_fileset.""" - return asyncio.run(delete_fileset(base_url, workspace, fileset_name)) - - -def create_inline_fileset_spec( - hf_repo_id: str, - path: str, - hf_token_secret: str | None = None, -) -> dict: - """ - Create an InlineFileset dataset specification for HuggingFace datasets. - - Args: - hf_repo_id: HuggingFace repository ID (e.g., "ramadhani/ragas-subject-test-01") - path: Path to the dataset file within the repo (e.g., "dataset.json") - hf_token_secret: Optional secret name for HuggingFace token - - Returns: - InlineFileset dataset specification dict - """ - storage_config: dict = { - "type": "huggingface", - "repo_id": hf_repo_id, - "repo_type": "dataset", - } - if hf_token_secret: - storage_config["token_secret"] = hf_token_secret - - return { - "storage": storage_config, - "path": path, - } - - -# ============================================================================ -# Secret Management -# ============================================================================ - - -def ensure_secret(client: httpx.Client, base_url: str, workspace: str, secret_name: str, secret_value: str) -> bool: - """Ensure a secret exists in the platform.""" - secrets_url = f"{base_url}/v2/workspaces/{workspace}/secrets" - - # Check if secret exists - try: - response = client.get(f"{secrets_url}/{secret_name}") - if response.status_code == 200: - safe_print(f" Secret '{secret_name}' already exists") - return True - except Exception: - pass - - # Create the secret - try: - response = client.post( - secrets_url, - json={"name": secret_name, "value": secret_value}, - ) - if response.status_code in (200, 201): - safe_print(f" Created secret '{secret_name}'") - return True - else: - safe_print(f" Failed to create secret '{secret_name}': {response.status_code}") - return False - except Exception as e: - safe_print(f" Error creating secret '{secret_name}': {e}") - return False - - -# ============================================================================ -# Job Payload Creation -# ============================================================================ - - -def create_ragas_offline_job_payload( - metric: str, - # Dataset - one of: inline rows, fileset URN, or inline fileset spec - dataset_rows: list[dict] | None = None, - fileset_urn: str | None = None, - inline_fileset_spec: dict | None = None, - # RAG model config (required for RAG job type recognition) - model_endpoint: str | None = None, - model_name: str | None = None, - model_api_key_secret: str | None = None, - # Embedding model config (required for RAG job type recognition) - embedding_endpoint: str | None = None, - embedding_model: str | None = None, - embedding_api_key_secret: str | None = None, - # Judge LLM config - judge_endpoint: str | None = None, - judge_model: str | None = None, - judge_api_key_secret: str | None = None, - judge_request_timeout: int = 120, - judge_max_retries: int = 3, - # Judge embeddings config (optional, required for some metrics) - judge_embedding_endpoint: str | None = None, - judge_embedding_model: str | None = None, - judge_embedding_api_key_secret: str | None = None, - # Limit samples - limit_samples: int | None = None, -) -> dict: - """Create the job payload for a RAGAS RAG metric evaluation. - - RAG jobs require model and retriever_pipeline config to be recognized as RAG job type. - - Args: - metric: The metric name (e.g., 'rag-faithfulness', 'rag-answer-correctness') - dataset_rows: List of evaluation rows (mutually exclusive with fileset_urn/inline_fileset_spec) - fileset_urn: FilesetUrn (workspace/fileset-name/file) for dataset - inline_fileset_spec: InlineFileset spec dict with storage config and path - model_endpoint: RAG model endpoint URL (required) - model_name: RAG model name (required) - model_api_key_secret: Secret name for RAG model API key - embedding_endpoint: Embedding model endpoint URL (required) - embedding_model: Embedding model name (required) - embedding_api_key_secret: Secret name for embedding model API key - judge_endpoint: Chat endpoint for judge model - judge_model: Model name for the judge - judge_api_key_secret: Secret name for judge API key - judge_request_timeout: Request timeout for judge - judge_max_retries: Max retries for judge requests - judge_embedding_endpoint: Embeddings endpoint for judge (optional) - judge_embedding_model: Embeddings model name (optional) - judge_embedding_api_key_secret: Secret name for judge embeddings API key - limit_samples: Number of samples to evaluate - - Returns: - Job payload dictionary - """ - # Validate exactly one dataset source is provided - dataset_sources = [dataset_rows, fileset_urn, inline_fileset_spec] - provided_sources = sum(1 for s in dataset_sources if s is not None) - if provided_sources == 0: - raise ValueError("One of dataset_rows, fileset_urn, or inline_fileset_spec must be provided") - if provided_sources > 1: - raise ValueError("Only one of dataset_rows, fileset_urn, or inline_fileset_spec can be provided") - if not model_endpoint or not model_name: - raise ValueError("model_endpoint and model_name are required for RAG jobs") - if not embedding_endpoint or not embedding_model: - raise ValueError("embedding_endpoint and embedding_model are required for RAG jobs") - - # Build RAG model config - API expects 'url' not 'endpoint' - model_config: dict = { - "url": model_endpoint, - "name": model_name, - } - if model_api_key_secret: - model_config["api_key_secret"] = model_api_key_secret - - # Build embedding model config - API expects 'url' not 'endpoint' - embedding_model_config: dict = { - "url": embedding_endpoint, - "name": embedding_model, - } - if embedding_api_key_secret: - embedding_model_config["api_key_secret"] = embedding_api_key_secret - - # Build retriever pipeline - retriever_pipeline: dict = { - "embedding_model": embedding_model_config, - } - - # Build metric params - metric_params: dict = {} - - # Add judge LLM config if provided - if judge_endpoint and judge_model: - judge_config: dict = { - "model": { - "url": judge_endpoint, - "name": judge_model, - }, - "request_timeout": judge_request_timeout, - "max_retries": judge_max_retries, - "inference_params": { - "max_tokens": 4000, - }, - } - if judge_api_key_secret: - judge_config["model"]["api_key_secret"] = judge_api_key_secret - metric_params["judge_llm"] = judge_config - - # Add judge embeddings config if provided - if judge_embedding_endpoint and judge_embedding_model: - judge_embeddings_config: dict = { - "model": { - "url": judge_embedding_endpoint, - "name": judge_embedding_model, - } - } - if judge_embedding_api_key_secret: - judge_embeddings_config["model"]["api_key_secret"] = judge_embedding_api_key_secret - metric_params["judge_embeddings"] = judge_embeddings_config - - # Build dataset spec - one of: inline rows, FilesetUrn, or InlineFileset - if fileset_urn: - dataset_spec: dict | str = fileset_urn - elif inline_fileset_spec: - dataset_spec = inline_fileset_spec - else: - assert dataset_rows is not None - rows = dataset_rows[:limit_samples] if limit_samples else dataset_rows - dataset_spec = {"rows": rows} - - # Build job spec for RAG evaluation - job_spec: dict = { - "metric": f"system/{metric}", - "model": model_config, - "retriever_pipeline": retriever_pipeline, - "dataset": dataset_spec, - } - - if metric_params: - job_spec["metric_params"] = metric_params - - if limit_samples: - job_spec["limit_samples"] = limit_samples - - return {"spec": job_spec} - - -# ============================================================================ -# Job Submission and Monitoring -# ============================================================================ - - -def submit_job(client: httpx.Client, base_url: str, workspace: str, payload: dict) -> dict: - """Submit a metric job and return the response.""" - url = f"{base_url}/v2/workspaces/{workspace}/evaluation/metric-jobs/" - response = client.post(url, json=payload) - if response.status_code >= 400: - try: - error_detail = response.json() - safe_print(f" API Error: {response.status_code} - {error_detail}") - except Exception: - safe_print(f" API Error: {response.status_code} - {response.text}") - response.raise_for_status() - return response.json() - - -def get_job_status(client: httpx.Client, base_url: str, workspace: str, job_name: str) -> dict: - """Get the current status of a job.""" - url = f"{base_url}/v2/workspaces/{workspace}/evaluation/metric-jobs/{job_name}" - response = client.get(url) - response.raise_for_status() - return response.json() - - -def wait_for_job( - client: httpx.Client, - base_url: str, - workspace: str, - job_name: str, - poll_interval: float = 2.0, - timeout: float = 600.0, - quiet: bool = False, -) -> dict: - """Wait for a job to complete and return the final status.""" - start_time = time.time() - terminal_statuses = {"completed", "error", "cancelled"} - - while True: - elapsed = time.time() - start_time - if elapsed > timeout: - raise TimeoutError(f"Job {job_name} did not complete within {timeout} seconds") - - job = get_job_status(client, base_url, workspace, job_name) - status = job.get("status", "unknown") - - if status in terminal_statuses: - return job - - if not quiet: - safe_print(f" Job status: {status} (elapsed: {elapsed:.1f}s)") - time.sleep(poll_interval) - - -def get_container_logs(job_name: str) -> str | None: - """Get logs from the Docker container for a job.""" - container_name = f"{job_name}-evaluation" - try: - result = subprocess.run( - ["docker", "logs", container_name], - capture_output=True, - text=True, - timeout=30, - ) - if result.returncode == 0: - return result.stdout + result.stderr - return f"Error getting logs: {result.stderr}" - except subprocess.TimeoutExpired: - return "Error: Timeout getting container logs" - except FileNotFoundError: - return "Error: Docker not found" - except Exception as e: - return f"Error getting logs: {e}" - - -# ============================================================================ -# Test Runner -# ============================================================================ - - -def run_metric_test( - client: httpx.Client, - base_url: str, - workspace: str, - metric: str, - mode: str, # "inline", "fileset", or "inline_fileset" - dataset_rows: list[dict] | None, - fileset_urn: str | None, - inline_fileset_spec: dict | None, - # RAG model config - model_endpoint: str, - model_name: str, - model_api_key_secret: str | None, - # Embedding model config - embedding_endpoint: str, - embedding_model: str, - embedding_api_key_secret: str | None, - # Judge LLM config - judge_endpoint: str | None, - judge_model: str | None, - judge_api_key_secret: str | None, - judge_request_timeout: int, - judge_max_retries: int, - judge_embedding_endpoint: str | None, - judge_embedding_model: str | None, - judge_embedding_api_key_secret: str | None, - limit_samples: int | None, - timeout: float, - quiet: bool = False, -) -> JobResult: - """Run a single metric test and return the result.""" - if not quiet: - safe_print(f"\n{'=' * 60}") - safe_print(f"Testing: {metric} (mode: {mode})") - safe_print(f" Dataset mode: {mode}") - if mode == "inline": - safe_print(f" Dataset rows: {len(dataset_rows or [])}") - elif mode == "fileset": - safe_print(f" Fileset URN: {fileset_urn}") - elif mode == "inline_fileset": - safe_print(f" InlineFileset: {inline_fileset_spec}") - if judge_endpoint and judge_model: - safe_print(f" Judge LLM: {judge_model}") - if judge_embedding_endpoint and judge_embedding_model: - safe_print(f" Judge embeddings: {judge_embedding_model}") - safe_print(f"{'=' * 60}") - else: - safe_print(f"[{metric}:{mode}] Starting...") - - start_time = time.time() - - try: - # Create payload based on mode - if mode == "fileset": - payload = create_ragas_offline_job_payload( - metric=metric, - fileset_urn=fileset_urn, - model_endpoint=model_endpoint, - model_name=model_name, - model_api_key_secret=model_api_key_secret, - embedding_endpoint=embedding_endpoint, - embedding_model=embedding_model, - embedding_api_key_secret=embedding_api_key_secret, - judge_endpoint=judge_endpoint, - judge_model=judge_model, - judge_api_key_secret=judge_api_key_secret, - judge_request_timeout=judge_request_timeout, - judge_max_retries=judge_max_retries, - judge_embedding_endpoint=judge_embedding_endpoint, - judge_embedding_model=judge_embedding_model, - judge_embedding_api_key_secret=judge_embedding_api_key_secret, - limit_samples=limit_samples, - ) - elif mode == "inline_fileset": - payload = create_ragas_offline_job_payload( - metric=metric, - inline_fileset_spec=inline_fileset_spec, - model_endpoint=model_endpoint, - model_name=model_name, - model_api_key_secret=model_api_key_secret, - embedding_endpoint=embedding_endpoint, - embedding_model=embedding_model, - embedding_api_key_secret=embedding_api_key_secret, - judge_endpoint=judge_endpoint, - judge_model=judge_model, - judge_api_key_secret=judge_api_key_secret, - judge_request_timeout=judge_request_timeout, - judge_max_retries=judge_max_retries, - judge_embedding_endpoint=judge_embedding_endpoint, - judge_embedding_model=judge_embedding_model, - judge_embedding_api_key_secret=judge_embedding_api_key_secret, - limit_samples=limit_samples, - ) - else: # inline - payload = create_ragas_offline_job_payload( - metric=metric, - dataset_rows=dataset_rows, - model_endpoint=model_endpoint, - model_name=model_name, - model_api_key_secret=model_api_key_secret, - embedding_endpoint=embedding_endpoint, - embedding_model=embedding_model, - embedding_api_key_secret=embedding_api_key_secret, - judge_endpoint=judge_endpoint, - judge_model=judge_model, - judge_api_key_secret=judge_api_key_secret, - judge_request_timeout=judge_request_timeout, - judge_max_retries=judge_max_retries, - judge_embedding_endpoint=judge_embedding_endpoint, - judge_embedding_model=judge_embedding_model, - judge_embedding_api_key_secret=judge_embedding_api_key_secret, - limit_samples=limit_samples, - ) - - if not quiet: - safe_print(" Submitting job...") - safe_print(f" Payload: {json.dumps(payload, indent=2)}") - - job_response = submit_job(client, base_url, workspace, payload) - job_name = job_response["name"] - job_id = job_response["id"] - - if not quiet: - safe_print(f" Job created: {job_name} ({job_id})") - else: - safe_print(f"[{metric}:{mode}] Job submitted: {job_name}") - - # Wait for completion - if not quiet: - safe_print(" Waiting for completion...") - final_job = wait_for_job(client, base_url, workspace, job_name, timeout=timeout, quiet=quiet) - status = final_job.get("status", "unknown") - duration = time.time() - start_time - - # Get container logs - if not quiet: - safe_print(" Getting container logs...") - logs = get_container_logs(job_name) - - if not quiet: - safe_print(f" Status: {status}") - safe_print(f" Duration: {duration:.1f}s") - else: - status_icon = "✅" if status == "completed" else "❌" - safe_print(f"[{metric}:{mode}] {status_icon} {status} ({duration:.1f}s)") - - return JobResult( - metric=metric, - mode=mode, - job_name=job_name, - job_id=job_id, - status=status, - duration_seconds=duration, - container_logs=logs, - ) - - except Exception as e: - duration = time.time() - start_time - safe_print(f"[{metric}:{mode}] ❌ ERROR: {e}") - return JobResult( - metric=metric, - mode=mode, - job_name="", - job_id="", - status="error", - duration_seconds=duration, - error=str(e), - ) - - -# ============================================================================ -# Results Reporting -# ============================================================================ - - -def save_results(results: list[JobResult], output_dir: Path) -> None: - """Save test results to files.""" - output_dir.mkdir(parents=True, exist_ok=True) - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - - # Save individual logs - for result in results: - if result.container_logs: - log_file = output_dir / f"{result.metric}_{result.mode}_{timestamp}.log" - log_file.write_text(result.container_logs) - print(f" Saved logs: {log_file}") - - # Save summary - summary = { - "timestamp": timestamp, - "results": [ - { - "metric": r.metric, - "mode": r.mode, - "job_name": r.job_name, - "job_id": r.job_id, - "status": r.status, - "duration_seconds": r.duration_seconds, - "error": r.error, - } - for r in results - ], - } - summary_file = output_dir / f"summary_{timestamp}.json" - summary_file.write_text(json.dumps(summary, indent=2)) - print(f" Saved summary: {summary_file}") - - -def print_summary(results: list[JobResult]) -> None: - """Print a summary of all test results.""" - print(f"\n{'=' * 60}") - print("TEST SUMMARY") - print(f"{'=' * 60}") - - passed = sum(1 for r in results if r.status == "completed") - failed = sum(1 for r in results if r.status not in ("completed", "skipped")) - skipped = sum(1 for r in results if r.status == "skipped") - total = len(results) - - print(f"Total: {total}, Passed: {passed}, Failed: {failed}, Skipped: {skipped}") - print() - - # Group by mode - inline_results = [r for r in results if r.mode == "inline"] - fileset_results = [r for r in results if r.mode == "fileset"] - inline_fileset_results = [r for r in results if r.mode == "inline_fileset"] - - if inline_results: - print("DatasetRows mode:") - for result in inline_results: - status_icon = "✅" if result.status == "completed" else "❌" if result.status != "skipped" else "⏭️" - print(f" {status_icon} {result.metric}: {result.status} ({result.duration_seconds:.1f}s)") - if result.error: - print(f" Error: {result.error}") - - if fileset_results: - print("\nFilesetUrn mode:") - for result in fileset_results: - status_icon = "✅" if result.status == "completed" else "❌" if result.status != "skipped" else "⏭️" - print(f" {status_icon} {result.metric}: {result.status} ({result.duration_seconds:.1f}s)") - if result.error: - print(f" Error: {result.error}") - - if inline_fileset_results: - print("\nInlineFileset mode (HuggingFace):") - for result in inline_fileset_results: - status_icon = "✅" if result.status == "completed" else "❌" if result.status != "skipped" else "⏭️" - print(f" {status_icon} {result.metric}: {result.status} ({result.duration_seconds:.1f}s)") - if result.error: - print(f" Error: {result.error}") - - -# ============================================================================ -# Main -# ============================================================================ - - -def main(): - parser = argparse.ArgumentParser( - description="Test RAGAS evaluation metrics with DatasetRows and FilesetUrn modes", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=f""" -Available RAGAS metrics: - {", ".join(RAGAS_OFFLINE_METRICS)} - -Dataset modes: - - DatasetRows: Dataset rows embedded directly in API request (default) - - FilesetUrn: Dataset uploaded to Files API and referenced by URN - - InlineFileset: Dataset from HuggingFace with storage config - -Example (all modes - uses default public HF repo NotYours/test_ragas_dataset for InlineFileset): - python test_ragas_dataset_modes.py --test-all-modes \\ - --model-endpoint https://integrate.api.nvidia.com/v1/chat/completions \\ - --model-name meta/llama-3.1-8b-instruct \\ - --model-api-key $NVIDIA_API_KEY \\ - --embedding-endpoint https://integrate.api.nvidia.com/v1 \\ - --embedding-model nvidia/nv-embedqa-e5-v5 \\ - --embedding-api-key $NVIDIA_API_KEY \\ - --judge-endpoint https://integrate.api.nvidia.com/v1/chat/completions \\ - --judge-model meta/llama-3.1-8b-instruct \\ - --judge-api-key $NVIDIA_API_KEY - -Example (InlineFileset only - default: NotYours/test_ragas_dataset/dataset.json): - python test_ragas_dataset_modes.py --use-inline-fileset \\ - --model-endpoint https://integrate.api.nvidia.com/v1/chat/completions \\ - ... - -Example (InlineFileset with private repo): - python test_ragas_dataset_modes.py --use-inline-fileset \\ - --hf-repo-id my-org/private-dataset --hf-token $HF_TOKEN \\ - --model-endpoint https://integrate.api.nvidia.com/v1/chat/completions \\ - ... - """, - ) - - # Metrics selection - parser.add_argument( - "--metrics", - nargs="+", - choices=RAGAS_OFFLINE_METRICS, - help=f"Specific metrics to test (default: {RAGAS_OFFLINE_METRICS[0]})", - ) - - # Dataset mode - parser.add_argument( - "--use-fileset-urn", - action="store_true", - help="Use FilesetUrn mode (upload dataset to Files API)", - ) - parser.add_argument( - "--use-inline-fileset", - action="store_true", - help="Use InlineFileset mode (HuggingFace dataset with storage config)", - ) - parser.add_argument( - "--test-both-modes", - action="store_true", - help="Test both DatasetRows and FilesetUrn modes", - ) - parser.add_argument( - "--test-all-modes", - action="store_true", - help="Test all three modes: DatasetRows, FilesetUrn, and InlineFileset", - ) - - # Dataset source - parser.add_argument( - "--dataset-file", - type=str, - default=None, - help="Path to dataset file (.jsonl or .json). Default: uses built-in sample dataset", - ) - parser.add_argument( - "--limit-samples", - type=int, - default=None, - help="Limit number of samples to evaluate", - ) - - # HuggingFace InlineFileset config - parser.add_argument( - "--hf-repo-id", - type=str, - default=DEFAULT_HF_REPO_ID, - help=f"HuggingFace dataset repo ID (default: {DEFAULT_HF_REPO_ID})", - ) - parser.add_argument( - "--hf-dataset-path", - type=str, - default=DEFAULT_HF_DATASET_PATH, - help=f"Path to dataset file within HF repo (default: {DEFAULT_HF_DATASET_PATH})", - ) - parser.add_argument( - "--hf-token", - type=str, - default=os.environ.get("HF_TOKEN"), - help="HuggingFace token (optional for public repos, required for private). Can also be set via HF_TOKEN env var.", - ) - - # API config - parser.add_argument( - "--base-url", - default=DEFAULT_BASE_URL, - help=f"Base URL of the platform (default: {DEFAULT_BASE_URL})", - ) - parser.add_argument( - "--workspace", - default=DEFAULT_WORKSPACE, - help=f"Workspace to use (default: {DEFAULT_WORKSPACE})", - ) - - # RAG model config (required for RAG job type) - parser.add_argument( - "--model-endpoint", - required=True, - help="RAG model endpoint URL (required for RAG job type)", - ) - parser.add_argument( - "--model-name", - required=True, - help="RAG model name (required for RAG job type)", - ) - parser.add_argument( - "--model-api-key", - default=os.environ.get("MODEL_API_KEY"), - help="API key for RAG model. Can also be set via MODEL_API_KEY env var.", - ) - - # Embedding model config (required for RAG job type) - parser.add_argument( - "--embedding-endpoint", - required=True, - help="Embedding model endpoint URL (required for RAG job type)", - ) - parser.add_argument( - "--embedding-model", - required=True, - help="Embedding model name (required for RAG job type)", - ) - parser.add_argument( - "--embedding-api-key", - default=os.environ.get("EMBEDDING_API_KEY"), - help="API key for embedding model. Can also be set via EMBEDDING_API_KEY env var.", - ) - - # Judge LLM config - parser.add_argument( - "--judge-endpoint", - required=True, - help="Judge LLM endpoint URL (required)", - ) - parser.add_argument( - "--judge-model", - required=True, - help="Judge LLM model name (required)", - ) - parser.add_argument( - "--judge-api-key", - default=os.environ.get("JUDGE_API_KEY"), - help="API key for judge LLM. Can also be set via JUDGE_API_KEY env var.", - ) - parser.add_argument( - "--judge-request-timeout", - type=int, - default=120, - help="Request timeout for judge LLM in seconds (default: 120)", - ) - parser.add_argument( - "--judge-max-retries", - type=int, - default=3, - help="Max retries for judge LLM requests (default: 3)", - ) - - # Judge embeddings config (optional) - parser.add_argument( - "--judge-embedding-endpoint", - help="Judge embeddings endpoint URL (optional)", - ) - parser.add_argument( - "--judge-embedding-model", - help="Judge embeddings model name (optional)", - ) - parser.add_argument( - "--judge-embedding-api-key", - default=os.environ.get("JUDGE_EMBEDDING_API_KEY"), - help="API key for judge embeddings. Can also be set via JUDGE_EMBEDDING_API_KEY env var.", - ) - - # Job config - parser.add_argument( - "--output-dir", - type=Path, - default=Path("./ragas-dataset-test-results"), - help="Directory to save results (default: ./ragas-dataset-test-results)", - ) - parser.add_argument( - "--timeout", - type=float, - default=600.0, - help="Timeout per job in seconds (default: 600 = 10 min)", - ) - parser.add_argument( - "--quiet", - action="store_true", - help="Reduce output verbosity", - ) - - args = parser.parse_args() - - # Determine which metrics to test - metrics_to_test = args.metrics or [RAGAS_OFFLINE_METRICS[0]] - - # Determine which modes to test - modes_to_test = [] - if args.test_all_modes: - modes_to_test = ["inline", "fileset", "inline_fileset"] - elif args.test_both_modes: - modes_to_test = ["inline", "fileset"] - elif args.use_inline_fileset: - modes_to_test = ["inline_fileset"] - elif args.use_fileset_urn: - modes_to_test = ["fileset"] - else: - modes_to_test = ["inline"] - - # Load dataset - if args.dataset_file: - print(f"Loading dataset from: {args.dataset_file}") - dataset_rows = load_dataset_from_file(args.dataset_file) - else: - print("Using built-in sample RAGAS dataset") - dataset_rows = get_sample_ragas_dataset() - - if args.limit_samples: - dataset_rows = dataset_rows[: args.limit_samples] - - print(f"\n{'=' * 60}") - print("RAGAS Dataset Modes Test") - print(f"{'=' * 60}") - print(f"Base URL: {args.base_url}") - print(f"Workspace: {args.workspace}") - print(f"Metrics to test: {', '.join(metrics_to_test)}") - print(f"Modes to test: {', '.join(modes_to_test)}") - print(f"Dataset rows: {len(dataset_rows)}") - print(f"RAG model: {args.model_name}") - print(f"Embedding model: {args.embedding_model}") - print(f"Judge LLM: {args.judge_model}") - if args.judge_embedding_model: - print(f"Judge embeddings: {args.judge_embedding_model}") - if "inline_fileset" in modes_to_test: - print(f"HF repo: {args.hf_repo_id}") - print(f"HF dataset path: {args.hf_dataset_path}") - print(f"HF token: {'provided' if args.hf_token else 'not provided (public repo)'}") - print(f"Output dir: {args.output_dir}") - - results: list[JobResult] = [] - created_filesets: list[str] = [] # Track filesets for cleanup - - with httpx.Client(timeout=30.0, follow_redirects=True) as client: - # Create model API key secret if provided - model_api_key_secret = None - if args.model_api_key: - print("\nEnsuring model API key secret exists...") - if ensure_secret(client, args.base_url, args.workspace, MODEL_API_KEY_SECRET, args.model_api_key): - model_api_key_secret = MODEL_API_KEY_SECRET - - # Create embedding API key secret if provided - embedding_api_key_secret = None - if args.embedding_api_key: - print("Ensuring embedding API key secret exists...") - if ensure_secret(client, args.base_url, args.workspace, EMBEDDING_API_KEY_SECRET, args.embedding_api_key): - embedding_api_key_secret = EMBEDDING_API_KEY_SECRET - - # Create judge API key secret if provided - judge_api_key_secret = None - if args.judge_api_key: - print("Ensuring judge API key secret exists...") - if ensure_secret(client, args.base_url, args.workspace, JUDGE_API_KEY_SECRET, args.judge_api_key): - judge_api_key_secret = JUDGE_API_KEY_SECRET - - # Create judge embedding API key secret if provided - judge_embedding_api_key_secret = None - if args.judge_embedding_api_key: - print("Ensuring judge embedding API key secret exists...") - if ensure_secret( - client, args.base_url, args.workspace, JUDGE_EMBEDDING_API_KEY_SECRET, args.judge_embedding_api_key - ): - judge_embedding_api_key_secret = JUDGE_EMBEDDING_API_KEY_SECRET - - # Create HuggingFace token secret if provided and inline_fileset mode is used - hf_token_secret = None - if args.hf_token and "inline_fileset" in modes_to_test: - print("Ensuring HuggingFace token secret exists...") - if ensure_secret(client, args.base_url, args.workspace, HF_TOKEN_SECRET, args.hf_token): - hf_token_secret = HF_TOKEN_SECRET - - # Test each combination of metric and mode - for mode in modes_to_test: - fileset_urn = None - inline_fileset_spec = None - - # Create fileset if needed - if mode == "fileset": - print(f"\n📁 Creating fileset for {mode} mode...") - try: - fileset_name = f"ragas-test-{uuid.uuid4().hex[:8]}" - fileset_urn = create_dataset_fileset_sync( - args.base_url, - args.workspace, - dataset_rows, - fileset_name=fileset_name, - ) - created_filesets.append(fileset_name) - except Exception as e: - print(f" ❌ Failed to create fileset: {e}") - # Add error results for all metrics in this mode - for metric in metrics_to_test: - results.append( - JobResult( - metric=metric, - mode=mode, - job_name="", - job_id="", - status="error", - duration_seconds=0, - error=f"Failed to create fileset: {e}", - ) - ) - continue - elif mode == "inline_fileset": - print("\n📁 Creating InlineFileset spec for HuggingFace dataset...") - print(f" HF repo: {args.hf_repo_id}") - print(f" Dataset path: {args.hf_dataset_path}") - print(f" Using token: {'yes' if hf_token_secret else 'no (public repo)'}") - inline_fileset_spec = create_inline_fileset_spec( - hf_repo_id=args.hf_repo_id, - path=args.hf_dataset_path, - hf_token_secret=hf_token_secret, - ) - - # Run tests for each metric - for metric in metrics_to_test: - result = run_metric_test( - client=client, - base_url=args.base_url, - workspace=args.workspace, - metric=metric, - mode=mode, - dataset_rows=dataset_rows if mode == "inline" else None, - fileset_urn=fileset_urn if mode == "fileset" else None, - inline_fileset_spec=inline_fileset_spec if mode == "inline_fileset" else None, - model_endpoint=args.model_endpoint, - model_name=args.model_name, - model_api_key_secret=model_api_key_secret, - embedding_endpoint=args.embedding_endpoint, - embedding_model=args.embedding_model, - embedding_api_key_secret=embedding_api_key_secret, - judge_endpoint=args.judge_endpoint, - judge_model=args.judge_model, - judge_api_key_secret=judge_api_key_secret, - judge_request_timeout=args.judge_request_timeout, - judge_max_retries=args.judge_max_retries, - judge_embedding_endpoint=args.judge_embedding_endpoint, - judge_embedding_model=args.judge_embedding_model, - judge_embedding_api_key_secret=judge_embedding_api_key_secret, - limit_samples=args.limit_samples, - timeout=args.timeout, - quiet=args.quiet, - ) - results.append(result) - - # Cleanup filesets - if created_filesets: - print(f"\n🧹 Cleaning up {len(created_filesets)} filesets...") - for fileset_name in created_filesets: - try: - if delete_fileset_sync(args.base_url, args.workspace, fileset_name): - print(f" ✅ Deleted fileset: {fileset_name}") - else: - print(f" ⚠️ Could not delete fileset: {fileset_name}") - except Exception as e: - print(f" ⚠️ Error deleting fileset {fileset_name}: {e}") - - # Save and print results - save_results(results, args.output_dir) - print_summary(results) - - # Return exit code based on results - failed = sum(1 for r in results if r.status not in ("completed", "skipped")) - sys.exit(1 if failed > 0 else 0) - - -if __name__ == "__main__": - main() diff --git a/services/evaluator/src/nmp/evaluator/__init__.py b/services/evaluator/src/nmp/evaluator/__init__.py deleted file mode 100644 index d231d92d42..0000000000 --- a/services/evaluator/src/nmp/evaluator/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -"""Evaluator service for NeMo Platform.""" diff --git a/services/evaluator/src/nmp/evaluator/api/__init__.py b/services/evaluator/src/nmp/evaluator/api/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/api/v2/__init__.py b/services/evaluator/src/nmp/evaluator/api/v2/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/__init__.py b/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/checks.py b/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/checks.py deleted file mode 100644 index 7e94a82e25..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/checks.py +++ /dev/null @@ -1,392 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Prechecks for benchmark job validation.""" - -import asyncio -import logging -from collections.abc import Iterable -from typing import get_args - -import nmp.evaluator.app.values as app -import nmp.evaluator.entities as entities -from nemo_platform import AsyncNeMoPlatform -from nmp.evaluator.api.v2.benchmarks.schemas.jobs import ( - BenchmarkJob, - SystemBenchmarkOfflineJob, - benchmark_job_type, - is_online_benchmark_job, -) -from nmp.evaluator.api.v2.common.checks import ( - ValidationResult, - collect_schema_target_errors, - format_model_reachability_error, - mapping_hint, - prompt_hint, - schema_error_message, - validation_result_from_exception, -) -from nmp.evaluator.app.dataset_schemas import ( - TemplateSchemaInferenceError, - group_schema_resolution_targets, - merge_metric_required_schemas, - prune_schema_properties, - resolve_dataset_schema_targets, - runtime_available_evaluator_fields, - validate_dataset_schema_requirement, - validate_prompt_template_against_dataset_schema, -) - -# Extract the set of built-in dataset IDs from the Literal type for runtime checking -BUILTIN_DATASET_IDS: set[str] = set(get_args(app.BuiltInDatasetID)) - -log = logging.getLogger(__name__) - - -async def job_fileset_exists_check(job: BenchmarkJob, sdk: AsyncNeMoPlatform) -> ValidationResult: - """Check if the job's fileset dataset exists. - - Used for SystemBenchmarkOfflineJob which may have a dataset. - - Args: - job: The benchmark job input to validate. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - - Returns: - ValidationResult indicating if the fileset exists. - """ - # Lazy imports to avoid slow startup (SDK imports kubernetes, etc.) - from nmp.evaluator.app.datasets.nmp_datasets.fileset import dataset_exists as fileset_exists - - # Check if job has a dataset attribute - dataset: app.Dataset | None = getattr(job, "dataset", None) - if dataset is None: - return ValidationResult(True) - - log.info(f"job_fileset_exists_check: dataset type={type(dataset).__name__}, value={dataset}") - - # Handle FilesetRef that is actually a built-in dataset ID (e.g., "beir/fiqa") - # This can happen when Pydantic coerces a string to FilesetRef before trying BuiltInDataset - if isinstance(dataset, app.FilesetRef) and dataset.root in BUILTIN_DATASET_IDS: - log.info(f"Dataset '{dataset.root}' is a built-in dataset, skipping fileset check") - return ValidationResult(True) - - try: - exists = await fileset_exists(sdk, dataset) - if not exists: - return ValidationResult(False, ["Dataset does not exist in fileset."]) - except Exception as e: - return ValidationResult(False, [f"Error checking fileset existence: {e}"]) - - return ValidationResult(True) - - -async def benchmark_fileset_exists_check( - job: BenchmarkJob, - benchmark: entities.Benchmark | entities.SystemBenchmark | app.SystemBenchmark, - sdk: AsyncNeMoPlatform, -) -> ValidationResult: - """Check if the fileset dataset exists for benchmark jobs. - - Args: - job: The benchmark job input to validate. - benchmark: The benchmark entity to validate against. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - - Returns: - ValidationResult indicating if the fileset exists. - """ - # Lazy imports to avoid slow startup (SDK imports kubernetes, etc.) - from nmp.evaluator.app.datasets.nmp_datasets.fileset import dataset_exists as fileset_exists - - # Determine which dataset to check based on job/benchmark type - dataset: app.Dataset | None = None - - if isinstance(benchmark, (entities.SystemBenchmark, app.SystemBenchmark)): - # System benchmarks have dataset download step included in the container - # Only verify fileset if it's an offline job with a dataset - if isinstance(job, SystemBenchmarkOfflineJob): - dataset = getattr(job, "dataset", None) - else: - # Online system benchmarks don't need fileset check - return ValidationResult(True) - elif isinstance(benchmark, entities.Benchmark): - # Custom benchmarks always have a dataset on the benchmark entity - dataset = benchmark.dataset - - if dataset is None: - return ValidationResult(True) - - log.info(f"benchmark_fileset_exists_check: dataset type={type(dataset).__name__}, value={dataset}") - - # Handle FilesetRef that is actually a built-in dataset ID (e.g., "beir/fiqa") - # This can happen when Pydantic coerces a string to FilesetRef before trying BuiltInDataset - if isinstance(dataset, app.FilesetRef) and dataset.root in BUILTIN_DATASET_IDS: - log.info(f"Dataset '{dataset.root}' is a built-in dataset, skipping fileset check") - return ValidationResult(True) - - try: - exists = await fileset_exists(sdk, dataset) - if not exists: - return ValidationResult(False, ["Benchmark dataset does not exist in fileset."]) - except Exception as e: - return ValidationResult(False, [f"Error checking fileset existence: {e}"]) - - return ValidationResult(True) - - -async def benchmark_model_check( - job: BenchmarkJob, - benchmark: entities.Benchmark | entities.SystemBenchmark | app.SystemBenchmark, - workspace: str, - sdk: AsyncNeMoPlatform, -) -> ValidationResult: - """Check if models in a benchmark job are reachable. - - Args: - job: The benchmark job input to validate. - benchmark: The benchmark entity (unused but kept for consistent interface). - workspace: Workspace for resolving secrets. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - - Returns: - ValidationResult indicating if all models are reachable. - """ - - models_to_check: list[tuple[str, dict]] = [] - - # Check job.model if present (for online benchmark jobs) - model = getattr(job, "model", None) - if model is not None: - model_dict = model.model_dump() if hasattr(model, "model_dump") else model - if isinstance(model_dict, dict) and "url" in model_dict and "name" in model_dict: - models_to_check.append(("job.model", model_dict)) - - # Check benchmark_params.judge.model if present (for benchmarks requiring judge) - benchmark_params = getattr(job, "benchmark_params", None) - if benchmark_params and isinstance(benchmark_params, dict): - judge = benchmark_params.get("judge") - if judge and isinstance(judge, dict): - judge_model = judge.get("model") - if judge_model: - judge_model_dict = judge_model.model_dump() if hasattr(judge_model, "model_dump") else judge_model - if isinstance(judge_model_dict, dict) and "url" in judge_model_dict and "name" in judge_model_dict: - models_to_check.append(("benchmark_params.judge.model", judge_model_dict)) - - if not models_to_check: - return ValidationResult(True) - - # Check all models in parallel, resolving secrets before checking reachability - from nmp.evaluator.app.inference import verify_model_reachable - - results = await asyncio.gather( - *[verify_model_reachable(model_dict, sdk=sdk, workspace=workspace) for _, model_dict in models_to_check], - return_exceptions=True, - ) - errors = [] - for (name, model_dict), result in zip(models_to_check, results, strict=True): - # Only treat Exceptions as errors; successful responses are dicts - if isinstance(result, Exception): - errors.append(format_model_reachability_error(name, model_dict, result)) - - if errors: - return ValidationResult(False, errors) - return ValidationResult(True) - - -async def benchmark_creation_schema_check( - dataset: app.FilesetRef, - metrics: list[entities.Metric], - field_mapping: app.FieldMapping | None, - sdk: AsyncNeMoPlatform, -) -> ValidationResult: - """Validate benchmark metric requirements and the bound dataset schema.""" - compatibility_result, requested_job_types = _resolve_benchmark_job_types(metrics, job_types=None) - if not compatibility_result.status: - return compatibility_result - - try: - dataset_targets = await resolve_dataset_schema_targets(dataset, sdk) - except Exception as e: - return validation_result_from_exception("Invalid dataset schema metadata", e) - if not dataset_targets: - return ValidationResult(True) - dataset_targets = group_schema_resolution_targets(dataset_targets) - - errors = collect_schema_target_errors( - dataset_targets, - lambda dataset_schema: _validate_benchmark_dataset_schema_requirements( - metrics, - field_mapping, - dataset_schema, - job_types=requested_job_types, - ), - ) - if errors: - return ValidationResult(False, errors) - return ValidationResult(True) - - -async def benchmark_job_schema_check( - job: BenchmarkJob, - benchmark: entities.Benchmark | entities.SystemBenchmark | app.SystemBenchmark, - sdk: AsyncNeMoPlatform, -) -> ValidationResult: - """Validate a custom benchmark's dataset schema for the requested job type.""" - if not isinstance(benchmark, entities.Benchmark): - return ValidationResult(True) - - job_type = benchmark_job_type(job) - if job_type not in {app.SupportedJobTypes.ONLINE, app.SupportedJobTypes.OFFLINE}: - return ValidationResult(True) - - compatibility_result, requested_job_types = _resolve_benchmark_job_types(benchmark.metrics, job_types=[job_type]) - if not compatibility_result.status: - return compatibility_result - - try: - dataset_targets = await resolve_dataset_schema_targets(benchmark.dataset, sdk) - except Exception as e: - return validation_result_from_exception("Invalid dataset schema metadata", e) - if not dataset_targets: - return ValidationResult(True) - dataset_targets = group_schema_resolution_targets(dataset_targets) - - schema_validation_errors = collect_schema_target_errors( - dataset_targets, - lambda dataset_schema: _validate_benchmark_dataset_schema_requirements( - benchmark.metrics, - benchmark.field_mapping, - dataset_schema, - job_types=requested_job_types, - ), - ) - if schema_validation_errors: - return ValidationResult(False, schema_validation_errors) - - prompt_validation_errors: list[str] = [] - if is_online_benchmark_job(job): - - def validate_prompt_schema(dataset_schema: dict | None) -> ValidationResult: - if dataset_schema is None: - return ValidationResult(True) - errors = validate_prompt_template_against_dataset_schema( - dataset_schema, - job.prompt_template, - benchmark.field_mapping, - ignored_roots=runtime_available_evaluator_fields(app.SupportedJobTypes.ONLINE), - optional_fields=set(job.optional_fields), - ) - return ValidationResult(not errors, errors) - - try: - prompt_validation_errors = collect_schema_target_errors(dataset_targets, validate_prompt_schema) - except TemplateSchemaInferenceError as e: - return validation_result_from_exception("Unsupported prompt template for schema inference", e) - except Exception as e: - return validation_result_from_exception("Invalid dataset schema metadata", e) - - if prompt_validation_errors: - return ValidationResult( - False, - [ - schema_error_message( - "Benchmark dataset schema is incompatible with the job prompt template", - prompt_validation_errors, - hint=prompt_hint(benchmark.field_mapping), - ) - ], - ) - - return ValidationResult(True) - - -def _resolve_benchmark_job_types( - metrics: list[entities.Metric], - job_types: Iterable[app.SupportedJobTypes] | None, -) -> tuple[ValidationResult, tuple[app.SupportedJobTypes, ...]]: - supported_job_types = _supported_benchmark_job_types(metrics) - if not supported_job_types: - return ( - ValidationResult( - False, - ["Benchmark metrics have no compatible job types. The supported_job_types intersection is empty."], - ), - (), - ) - - requested_job_types = tuple(job_types) if job_types is not None else _ordered_job_types(supported_job_types) - unsupported_job_types = [job_type for job_type in requested_job_types if job_type not in supported_job_types] - if unsupported_job_types: - labels = ", ".join(job_type.value for job_type in unsupported_job_types) - return ValidationResult(False, [f"Benchmark does not support {labels} jobs."]), () - return ValidationResult(True), requested_job_types - - -def _validate_benchmark_dataset_schema_requirements( - metrics: list[entities.Metric], - field_mapping: app.FieldMapping | None, - dataset_schema: dict | None, - job_types: Iterable[app.SupportedJobTypes], -) -> ValidationResult: - if dataset_schema is None: - return ValidationResult(True) - - errors: list[str] = [] - for job_type in job_types: - try: - merged_required_schema = merge_metric_required_schemas( - _metric_required_schemas_for_job_type(metrics, job_type) - ) - required_schema = prune_schema_properties( - merged_required_schema, - runtime_available_evaluator_fields(job_type), - ) - errors.extend(validate_dataset_schema_requirement(dataset_schema, required_schema, field_mapping)) - except Exception as e: - return validation_result_from_exception("Invalid dataset schema metadata", e) - - if errors: - return ValidationResult( - False, - [ - schema_error_message( - "Benchmark dataset schema is incompatible with benchmark metrics", - errors, - hint=mapping_hint(field_mapping), - ) - ], - ) - return ValidationResult(True) - - -def _metric_required_schemas_for_job_type( - metrics: Iterable[entities.Metric], - job_type: app.SupportedJobTypes, -) -> Iterable[tuple[str, dict]]: - for metric in metrics: - input_schema = metric.input_schema() - supported_job_types = getattr(metric, "supported_job_types", []) - if supported_job_types and job_type not in supported_job_types: - continue - metric_name = f"{metric.workspace}/{metric.name}" - yield metric_name, input_schema.schema_ - - -def _supported_benchmark_job_types(metrics: Iterable[entities.Metric]) -> set[app.SupportedJobTypes]: - intersections: set[app.SupportedJobTypes] | None = None - for metric in metrics: - supported = set(getattr(metric, "supported_job_types", None) or []) - if intersections is None: - intersections = supported - else: - intersections &= supported - return intersections or set() - - -def _ordered_job_types(job_types: set[app.SupportedJobTypes]) -> tuple[app.SupportedJobTypes, ...]: - ordering = (app.SupportedJobTypes.OFFLINE, app.SupportedJobTypes.ONLINE) - return tuple(job_type for job_type in ordering if job_type in job_types) diff --git a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/endpoints.py b/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/endpoints.py deleted file mode 100644 index 3a599b4e5d..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/endpoints.py +++ /dev/null @@ -1,552 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import logging -import textwrap -from datetime import datetime -from typing import Annotated, Literal - -from fastapi import APIRouter, Depends, HTTPException, Query, Request, status -from fastapi.routing import APIRoute -from nemo_evaluator_sdk.values import RowScore -from nemo_platform import AsyncNeMoPlatform -from nemo_platform_plugin.entities import EntityClient -from nemo_platform_plugin.jobs.api_factory import ( - FileResultSerializer, - PlatformJobResultRoute, - PlatformJobSpec, - PydanticJSONLResultSerializer, - PydanticResultSerializer, - job_route_factory, -) -from nmp.common.api.common import DeleteResponse, Page, PaginationData -from nmp.common.api.parsed_filter import ParsedFilter, make_filter_dep -from nmp.common.entities import SYSTEM_WORKSPACE -from nmp.common.service.dependencies import get_entity_client, get_sdk_client -from nmp.evaluator.api.v2.benchmarks.manager import ( - BenchmarkCreationError, - BenchmarkDeletionError, - BenchmarkRetrievalError, - BenchmarksManager, -) -from nmp.evaluator.api.v2.benchmarks.schemas.benchmarks import ( - Benchmark, - BenchmarkJobResult, - BenchmarkJobResultsListFilter, - BenchmarkJobResultsListResponse, - BenchmarkRequest, - BenchmarksListFilter, - BenchmarksListResponse, - ExtendedBenchmark, - SystemBenchmark, -) -from nmp.evaluator.api.v2.benchmarks.schemas.jobs import BenchmarkJob -from nmp.evaluator.api.v2.common.query_params import AggregateFieldsQuery, validate_list_query_params -from nmp.evaluator.api.v2.common.schemas import ErrorResponse -from nmp.evaluator.app.jobs.constants import ( - JOB_RESULTS_AGGREGATE_SCORES, - JOB_RESULTS_ROW_SCORES, - JOBS_RESULTS_ARTIFACTS, -) -from nmp.evaluator.app.values import BenchmarkEvaluationResult - -_logger = logging.getLogger(__name__) -router = APIRouter() - -API_TAG = "Evaluator" - - -def get_benchmarks_manager(entity_client: Annotated[EntityClient, Depends(get_entity_client)]) -> BenchmarksManager: - return BenchmarksManager(entity_client) - - -BenchmarksManagerDep = Annotated[BenchmarksManager, Depends(get_benchmarks_manager)] -SdkDep = Annotated[AsyncNeMoPlatform, Depends(get_sdk_client)] -BenchmarksFilterDep = Annotated[ParsedFilter, Depends(make_filter_dep(BenchmarksListFilter))] -BenchmarkJobResultsFilterDep = Annotated[ParsedFilter, Depends(make_filter_dep(BenchmarkJobResultsListFilter))] - - -# ============================================================================= -# /v2/workspaces/{workspace}/benchmark-jobs -# ============================================================================= - - -async def platform_job_config_compiler( - workspace: str, - original_spec: BenchmarkJob, - transformed_spec: BenchmarkJob, - entity_client: EntityClient, - job_name: str | None, - sdk: AsyncNeMoPlatform, -) -> PlatformJobSpec: - """Compile a benchmark job spec to a platform job spec. - - This function provides exception mapping for the manager's compile_job method. - - Args: - workspace: The workspace for this job. - original_spec: The user-provided input specification. - transformed_spec: The spec after applying the input-to-output transformer. - Since no transformer is configured for benchmarks, original_spec - and transformed_spec are identical (both BenchmarkJob). - entity_client: Entity client for lookups. - job_name: The resolved job name (user-provided or auto-generated). - sdk: SDK instance for accessing secrets with user context. - """ - benchmarks_manager = get_benchmarks_manager(entity_client) - - try: - return await benchmarks_manager.compile_job(workspace, transformed_spec, sdk=sdk) - except BenchmarkRetrievalError as e: - raise HTTPException(status_code=404, detail=e.detail) from e - except (KeyError, ValueError, AssertionError, RuntimeError) as e: - detail = str(e) or f"Job compilation failed: {type(e).__name__}" - raise HTTPException(status_code=422, detail=detail) from e - - -_jobs_router = job_route_factory( - # Use distinct job sources to prevent mixing incompatible job specs when listing. - # (MetricEvaluation and BenchmarkEvaluation jobs have different spec schemas.) - service_name="evaluator-benchmarks", - job_type="BenchmarkEvaluation", - job_input=BenchmarkJob, - platform_job_config_compiler=platform_job_config_compiler, - job_result_routes=[ - PlatformJobResultRoute( - name=JOB_RESULTS_AGGREGATE_SCORES, - serializer=PydanticResultSerializer(model=BenchmarkEvaluationResult), - ), - PlatformJobResultRoute( - name=JOB_RESULTS_ROW_SCORES, - serializer=PydanticJSONLResultSerializer(model=RowScore), - ), - PlatformJobResultRoute(name=JOBS_RESULTS_ARTIFACTS, serializer=FileResultSerializer()), - ], -) - -# Rebase job routes from /jobs to / so we can include with /benchmark-jobs prefix. -# This avoids route collision with /benchmarks/{name} endpoints (e.g., a benchmark named "jobs"). -_benchmark_jobs_router = APIRouter() -for route in _jobs_router.routes: - if isinstance(route, APIRoute): - # Remove /jobs prefix from path: '/jobs' -> '', '/jobs/{name}' -> '/{name}' - new_path = route.path - if new_path.startswith("/jobs"): - new_path = new_path[5:] - _benchmark_jobs_router.add_api_route( - path=new_path, - endpoint=route.endpoint, - methods=route.methods, - name=route.name, - response_model=route.response_model, - status_code=route.status_code, - tags=route.tags, - dependencies=route.dependencies, - summary=route.summary, - description=route.description, - response_description=route.response_description, - responses=route.responses, - deprecated=route.deprecated, - operation_id=route.operation_id, - response_model_include=route.response_model_include, - response_model_exclude=route.response_model_exclude, - response_model_by_alias=route.response_model_by_alias, - response_model_exclude_unset=route.response_model_exclude_unset, - response_model_exclude_defaults=route.response_model_exclude_defaults, - response_model_exclude_none=route.response_model_exclude_none, - include_in_schema=route.include_in_schema, - response_class=route.response_class, - openapi_extra=route.openapi_extra, - ) - -router.include_router(_benchmark_jobs_router, prefix="/v2/workspaces/{workspace}/benchmark-jobs") - - -# ============================================================================= -# /v2/workspaces/{workspace}/benchmarks -# ============================================================================= - - -@router.get( - "/v2/workspaces/{workspace}/benchmarks", - description="List all available evaluation benchmarks.", - response_model=BenchmarksListResponse, - tags=[API_TAG], - response_model_exclude_none=True, - openapi_extra={ - "parameters": [ - { - "in": "query", - "name": "filter", - "style": "deepObject", - "required": False, - "explode": True, - "schema": BenchmarksListFilter.model_json_schema(ref_template="#/components/schemas/{model}"), - "description": ( - "Filter benchmarks by name, description, dataset, project, and dates. " - "Supports JSON filter syntax with operators: " - "$eq, $like, $lt, $lte, $gt, $gte, $in, $nin, $and, $or, $not. " - "Also supports text filter syntax." - ), - }, - ] - }, - responses={ - status.HTTP_400_BAD_REQUEST: { - "description": "Invalid Request Body", - "model": ErrorResponse, - }, - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def list_benchmarks( - workspace: str, - request: Request, - benchmarks_manager: BenchmarksManagerDep, - parsed_filter: BenchmarksFilterDep, - extended_response: bool = Query(default=False, description="Whether to return the extended benchmark."), - page: int = Query(default=1, description="Page number."), - page_size: int = Query(default=100, description="Page size."), - sort: Literal["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"] = Query( - default="-created_at", - description="The field to sort by. To sort in decreasing order, use `-` in front of the field name.", - examples=["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"], - ), -): - """List all evaluation benchmarks with optional filtering, pagination, and sorting.""" - - validate_list_query_params(request, {"extended_response"}) - _logger.info("Listing benchmarks", extra={"workspace": workspace}) - - results = await benchmarks_manager.get_all( - workspace=workspace, - extended_response=extended_response, - page=page, - page_size=page_size, - sort=sort, - parsed_filter=parsed_filter, - ) - - return Page( - data=results.data, - pagination=PaginationData(**results.pagination.model_dump()), - sort=sort, - filter=parsed_filter.to_response(), - ) - - -@router.get( - "/v2/workspaces/{workspace}/benchmarks/{name}", - description="Get a specific evaluation benchmark by workspace and benchmark name.", - response_model=Benchmark | ExtendedBenchmark | SystemBenchmark, - tags=[API_TAG], - response_model_exclude_none=True, - responses={ - status.HTTP_404_NOT_FOUND: { - "description": "Benchmark Not Found", - "model": ErrorResponse, - }, - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def get_benchmark( - workspace: str, - name: str, - benchmarks_manager: BenchmarksManagerDep, - extended_response: bool = Query(default=False, description="Whether to return the extended benchmark."), -): - """Get a specific evaluation benchmark by workspace and benchmark name.""" - _logger.info("Getting benchmark", extra={"workspace": workspace, "benchmark_name": name}) - - try: - benchmark = await benchmarks_manager.get_by_name(workspace, name, extended_response=extended_response) - except BenchmarkRetrievalError as e: - if e.error_code == "BENCHMARK_NOT_FOUND": - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=e.detail) from e - else: - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=e.detail) from e - - return benchmark - - -@router.post( - "/v2/workspaces/{workspace}/benchmarks", - description=textwrap.dedent(""" - Create a new custom evaluation benchmark. - - Benchmarks can be reused across multiple evaluations. The benchmark type determines - the evaluation method (currently only LLM-as-a-Judge is supported). - """), - status_code=status.HTTP_201_CREATED, - response_model=Benchmark | ExtendedBenchmark, - tags=[API_TAG], - response_model_exclude_none=True, - responses={ - status.HTTP_400_BAD_REQUEST: { - "description": "Invalid Request Body", - "model": ErrorResponse, - }, - status.HTTP_403_FORBIDDEN: { - "description": "Operation Not Permitted", - "model": ErrorResponse, - }, - status.HTTP_409_CONFLICT: { - "description": "Benchmark Already Exists", - "model": ErrorResponse, - }, - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def create_benchmark( - workspace: str, - benchmark: BenchmarkRequest, - benchmarks_manager: BenchmarksManagerDep, - sdk: SdkDep, - extended_response: bool = Query(default=False, description="Whether to return the extended benchmark."), -): - """Create a new evaluation benchmark.""" - if workspace == SYSTEM_WORKSPACE: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail="Cannot create benchmark in 'system' workspace reserved for system defined entities. " - "Select another workspace for the benchmark.", - ) - - _logger.info("Creating benchmark", extra={"workspace": workspace, "benchmark_name": benchmark.name}) - - try: - return await benchmarks_manager.create(workspace, benchmark, sdk, extended_response=extended_response) - except BenchmarkCreationError as e: - _logger.warning("Error creating benchmark", extra={"detail": e.detail}) - if e.error_code == "METRIC_NOT_FOUND": - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=e.detail) from e - if e.error_code == "BENCHMARK_ALREADY_EXISTS": - raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail=e.detail) from e - if e.error_code in {"INVALID_BENCHMARK", "INVALID_METRIC"}: - raise HTTPException(status_code=status.HTTP_422_UNPROCESSABLE_CONTENT, detail=e.detail) from e - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) from e - except Exception as e: - _logger.exception("Error creating benchmark") - detail = str(e) or f"Benchmark creation failed: {type(e).__name__}" - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=detail) from e - - -@router.delete( - "/v2/workspaces/{workspace}/benchmarks/{name}", - description=textwrap.dedent(""" - Delete a custom evaluation benchmark. Predefined benchmarks cannot be deleted. - """), - response_model=DeleteResponse, - tags=[API_TAG], - responses={ - status.HTTP_200_OK: { - "description": "Benchmark Deleted Successfully", - "model": DeleteResponse, - }, - status.HTTP_400_BAD_REQUEST: { - "description": "Invalid Request Body", - "model": ErrorResponse, - }, - status.HTTP_403_FORBIDDEN: { - "description": "Operation Not Permitted", - "model": ErrorResponse, - }, - status.HTTP_404_NOT_FOUND: { - "description": "Benchmark Not Found", - "model": ErrorResponse, - }, - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def delete_benchmark(workspace: str, name: str, benchmarks_manager: BenchmarksManagerDep): - """Delete a custom evaluation benchmark.""" - if workspace == SYSTEM_WORKSPACE: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail="Cannot delete benchmark in 'system' workspace reserved for system defined entities. " - "Select another workspace for the benchmark.", - ) - - _logger.info("Deleting benchmark", extra={"workspace": workspace, "benchmark_name": name}) - - try: - delete_response: DeleteResponse = await benchmarks_manager.delete(workspace, name) - except BenchmarkDeletionError as e: - if e.error_code == "BENCHMARK_NOT_FOUND": - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=e.detail) from e - else: - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=e.detail) from e - - return DeleteResponse(id=delete_response.id, message=delete_response.message, deleted_at=datetime.now()) - - -# ============================================================================= -# /v2/workspaces/{workspace}/benchmark-job-results -# ============================================================================= - - -@router.get( - "/v2/workspaces/{workspace}/benchmark-job-results", - description="List stored evaluation results for benchmark jobs.", - response_model=BenchmarkJobResultsListResponse, - tags=[API_TAG], - response_model_exclude_none=True, - openapi_extra={ - "parameters": [ - { - "in": "query", - "name": "filter", - "style": "deepObject", - "required": False, - "explode": True, - "schema": BenchmarkJobResultsListFilter.model_json_schema(ref_template="#/components/schemas/{model}"), - "description": ( - "Filter benchmark job results by name, benchmark, metrics, dataset, model, and dates. " - "Supports JSON filter syntax with operators: " - "$eq, $like, $lt, $lte, $gt, $gte, $in, $nin, $and, $or, $not. " - "Also supports text filter syntax." - ), - }, - ] - }, - responses={ - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Query Parameter Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def list_benchmark_job_results( - workspace: str, - request: Request, - benchmarks_manager: BenchmarksManagerDep, - aggregate_fields: AggregateFieldsQuery, - parsed_filter: BenchmarkJobResultsFilterDep, - page: int = Query(default=1, description="Page number."), - page_size: int = Query(default=100, description="Page size."), - sort: Literal["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"] = Query( - default="-created_at", - description="The field to sort by. To sort in decreasing order, use `-` in front of the field name.", - examples=["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"], - ), -): - """List benchmark job results with optional filtering, pagination, and sorting.""" - - validate_list_query_params(request, {"aggregate_fields"}) - _logger.info("Listing benchmark job results", extra={"workspace": workspace}) - - # Convert list to frozenset (or None if empty to use defaults) - fields = frozenset(aggregate_fields) if aggregate_fields else None - - return await benchmarks_manager.get_job_results( - workspace=workspace, - aggregate_fields=fields, - page=page, - page_size=page_size, - sort=sort, - parsed_filter=parsed_filter, - ) - - -@router.get( - "/v2/workspaces/{workspace}/benchmark-job-results/{name}", - description="Get a specific benchmark job result by workspace and job name.", - response_model=BenchmarkJobResult, - tags=[API_TAG], - response_model_exclude_none=True, - responses={ - status.HTTP_200_OK: { - "description": "Benchmark Job Result Found", - "model": BenchmarkJobResult, - }, - status.HTTP_404_NOT_FOUND: { - "description": "Benchmark Job Result Not Found", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def get_benchmark_job_result( - workspace: str, name: str, benchmarks_manager: BenchmarksManagerDep, aggregate_fields: AggregateFieldsQuery -): - """Get a specific benchmark job result by workspace and job name.""" - _logger.info("Getting benchmark job result", extra={"workspace": workspace, "benchmark_job_result_name": name}) - - # Convert list to frozenset (or None if empty to use defaults) - fields = frozenset(aggregate_fields) if aggregate_fields else None - - try: - return await benchmarks_manager.get_job_result(workspace, name, aggregate_fields=fields) - except BenchmarkRetrievalError as e: - if e.error_code == "BENCHMARK_JOB_RESULT_NOT_FOUND": - raise HTTPException(status_code=404, detail=e.detail) from e - else: - raise HTTPException(status_code=500, detail=e.detail) from e - - -@router.delete( - "/v2/workspaces/{workspace}/benchmark-job-results/{name}", - description="Delete an evaluation benchmark job result.", - response_model=DeleteResponse, - tags=[API_TAG], - responses={ - status.HTTP_200_OK: { - "description": "Benchmark Job Result Deleted Successfully", - "model": DeleteResponse, - }, - status.HTTP_404_NOT_FOUND: { - "description": "Benchmark Job Result Not Found", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def delete_benchmark_job_result(workspace: str, name: str, benchmarks_manager: BenchmarksManagerDep): - """Delete an evaluation benchmark job result.""" - _logger.info("Deleting benchmark job result", extra={"workspace": workspace, "benchmark_job_result_name": name}) - - try: - return await benchmarks_manager.delete_job_result(workspace, name) - except BenchmarkDeletionError as e: - if e.error_code == "BENCHMARK_JOB_RESULT_NOT_FOUND": - raise HTTPException(status_code=404, detail=e.detail) - else: - raise HTTPException(status_code=500, detail=e.detail) diff --git a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/manager.py b/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/manager.py deleted file mode 100644 index 4f6ac58c64..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/manager.py +++ /dev/null @@ -1,484 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import logging -from datetime import datetime, timezone -from typing import Literal - -import nmp.evaluator.app.values as app -import nmp.evaluator.entities as entities -from nemo_evaluator_sdk.values.results import AggregateFieldName -from nemo_platform import AsyncNeMoPlatform -from nemo_platform_plugin.entities import EntityClient -from nemo_platform_plugin.jobs.api_factory import PlatformJobSpec -from nmp.common.api.common import DeleteResponse, PaginationData -from nmp.common.api.parsed_filter import ParsedFilter -from nmp.common.entities import SYSTEM_WORKSPACE, EntityConflictError, EntityNotFoundError, ListResponse -from nmp.common.observability.otel import MARK_INTERNAL_REQUEST_HEADERS, scoped_otel_headers -from nmp.common.sdk_factory import get_async_platform_sdk -from nmp.evaluator.api.v2.benchmarks.checks import ( - benchmark_creation_schema_check, - benchmark_fileset_exists_check, - benchmark_job_schema_check, - benchmark_model_check, -) -from nmp.evaluator.api.v2.benchmarks.mapper import BenchmarkMapper -from nmp.evaluator.api.v2.benchmarks.schemas.benchmarks import ( - Benchmark, - BenchmarkJobResult, - BenchmarkJobResultsListResponse, - BenchmarkRequest, - ExtendedBenchmark, - SystemBenchmark, -) -from nmp.evaluator.api.v2.benchmarks.schemas.jobs import ( - BenchmarkJob, - BenchmarkOnlineJob, - SystemBenchmarkOfflineJob, - SystemBenchmarkOnlineJob, -) -from nmp.evaluator.api.v2.common.checks import CompositeCheck -from nmp.evaluator.api.v2.common.model_resolution import ( - resolve_model, - resolve_params_model_refs, - rewrite_models_for_job_container, -) -from nmp.evaluator.app.evalfactory.system import get_all_system_benchmarks -from nmp.evaluator.app.jobs.benchmarks import compile_benchmark_job -from tenacity import retry, stop_after_attempt, wait_exponential - -BenchmarkServiceError = Literal[ - "BENCHMARK_NOT_FOUND", - "METRIC_NOT_FOUND", - "INVALID_METRIC", - "INVALID_BENCHMARK", - "BENCHMARK_ALREADY_EXISTS", - "BENCHMARK_JOB_RESULT_NOT_FOUND", -] - -_logger = logging.getLogger(__name__) - -# Fields generated by the entity store that should be excluded from metric comparisons -_ENTITY_METADATA_FIELDS = {"id", "entity_id", "created_at", "updated_at"} - - -class _BenchmarkServiceError(Exception): - error_code: BenchmarkServiceError - detail: str - - def __init__(self, error_code: BenchmarkServiceError, detail: str): - super().__init__(f"{error_code}: {detail}") - self.error_code = error_code - self.detail = detail - - -class BenchmarkRetrievalError(_BenchmarkServiceError): ... - - -class BenchmarkCreationError(_BenchmarkServiceError): ... - - -class BenchmarkDeletionError(_BenchmarkServiceError): ... - - -class BenchmarksManager: - def __init__(self, entity_client: EntityClient, *, as_service: str | None = None): - self._entity_client = entity_client - self._as_service = as_service - self._mapper = BenchmarkMapper() - - async def get_all( - self, - *, - workspace: str, - extended_response: bool = False, - page: int = 1, - page_size: int = 100, - sort: Literal["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"] = "-created_at", - parsed_filter: ParsedFilter | None = None, - ) -> ListResponse[Benchmark] | ListResponse[ExtendedBenchmark] | ListResponse[SystemBenchmark]: - """List all evaluation benchmarks with optional filtering, pagination, and sorting.""" - filter_op = parsed_filter.operation if parsed_filter else None - - if workspace == SYSTEM_WORKSPACE: - results = await self._entity_client.list( - entities.SystemBenchmark, - workspace=workspace, - sort=sort, - page=page, - page_size=page_size, - filter_operation=filter_op, - ) - results.data = [self._mapper.entity_to_schema(benchmark, SystemBenchmark) for benchmark in results.data] - return results - - results = await self._entity_client.list( - entities.Benchmark, - workspace=workspace, - sort=sort, - page=page, - page_size=page_size, - filter_operation=filter_op, - ) - if extended_response: - results.data = [self._mapper.entity_to_schema(benchmark, ExtendedBenchmark) for benchmark in results.data] - else: - results.data = [self._mapper.entity_to_schema(benchmark, Benchmark) for benchmark in results.data] - return results - - async def get_by_name( - self, workspace: str, name: str, *, extended_response: bool = False - ) -> Benchmark | ExtendedBenchmark | SystemBenchmark | None: - if workspace == SYSTEM_WORKSPACE: - try: - benchmark = await self._entity_client.get(entities.SystemBenchmark, name=name, workspace=workspace) - except EntityNotFoundError as e: - raise BenchmarkRetrievalError( - "BENCHMARK_NOT_FOUND", f"Benchmark '{workspace}/{name}' not found." - ) from e - return self._mapper.entity_to_schema(benchmark, SystemBenchmark) if benchmark else None - - try: - benchmark = await self._entity_client.get(entities.Benchmark, name=name, workspace=workspace) - except EntityNotFoundError as e: - raise BenchmarkRetrievalError("BENCHMARK_NOT_FOUND", f"Benchmark '{workspace}/{name}' not found.") from e - if extended_response: - return self._mapper.entity_to_schema(benchmark, ExtendedBenchmark) - return self._mapper.entity_to_schema(benchmark, Benchmark) if benchmark else None - - async def create( - self, - workspace: str, - benchmark: BenchmarkRequest, - sdk: AsyncNeMoPlatform, - *, - extended_response: bool = False, - ) -> Benchmark | ExtendedBenchmark: - metrics = [] - for metric_ref in benchmark.metrics: - metric_workspace, metric_name = metric_ref.root.split("/") - if metric_workspace == SYSTEM_WORKSPACE: - raise BenchmarkCreationError( - "INVALID_METRIC", - f"Metric in workspace '{SYSTEM_WORKSPACE}' cannot be used for benchmarks at this time.", - ) - try: - metric: entities.Metric = await self._entity_client.get( - entities.Metric, name=metric_name, workspace=metric_workspace - ) - except EntityNotFoundError as e: - raise BenchmarkCreationError( - "METRIC_NOT_FOUND", f"Metric '{metric_workspace}/{metric_name}' not found." - ) from e - metrics.append(metric) - creation_check = await benchmark_creation_schema_check( - benchmark.dataset, - metrics, - benchmark.field_mapping, - sdk, - ) - if not creation_check.status: - raise BenchmarkCreationError("INVALID_BENCHMARK", " ".join(creation_check.errors)) - entity = self._mapper.request_to_entity(benchmark, workspace, metrics) - try: - entity_response = await self._entity_client.create(entity) - except EntityConflictError as e: - raise BenchmarkCreationError( - "BENCHMARK_ALREADY_EXISTS", - f"Benchmark '{workspace}/{benchmark.name}' already exists.", - ) from e - assert isinstance(entity_response, entities.Benchmark) - if extended_response: - return self._mapper.entity_to_schema(entity_response, ExtendedBenchmark) - return self._mapper.entity_to_schema(entity_response, Benchmark) - - async def delete(self, workspace: str, name: str) -> DeleteResponse: - try: - benchmark: entities.Benchmark = await self._entity_client.get( - entities.Benchmark, name=name, workspace=workspace - ) - except EntityNotFoundError as e: - raise BenchmarkDeletionError("BENCHMARK_NOT_FOUND", f"Benchmark '{workspace}/{name}' not found.") from e - delete_response = await self._entity_client.delete(entities.Benchmark, benchmark.name, workspace=workspace) - deleted_id = str(delete_response.id) if delete_response.id is not None else None - deleted_at = delete_response.deleted_at - if isinstance(deleted_at, str): - deleted_at = datetime.fromisoformat(deleted_at) - message = ( - str(delete_response.message) if delete_response.message is not None else "Resource deleted successfully." - ) - return DeleteResponse( - message=message, - id=deleted_id, - deleted_at=deleted_at, - ) - - async def exists(self, workspace: str, name: str) -> bool: - try: - if workspace == SYSTEM_WORKSPACE: - await self._entity_client.get(entities.SystemBenchmark, name=name, workspace=workspace) - else: - await self._entity_client.get(entities.Benchmark, name=name, workspace=workspace) - except EntityNotFoundError: - return False - return True - - async def get_benchmark(self, benchmark: app.BenchmarkRef) -> entities.Benchmark | entities.SystemBenchmark: - """Get a benchmark entity from a reference. - - Args: - benchmark: Reference to benchmark (format: workspace/name). - - Returns: - The benchmark entity. - - Raises: - BenchmarkRetrievalError: If benchmark does not exist. - """ - workspace, name = benchmark.root.split("/") - if workspace == SYSTEM_WORKSPACE: - try: - return await self._entity_client.get(entities.SystemBenchmark, name=name, workspace=workspace) - except EntityNotFoundError as e: - raise BenchmarkRetrievalError( - "BENCHMARK_NOT_FOUND", f"Benchmark '{workspace}/{name}' not found." - ) from e - try: - return await self._entity_client.get(entities.Benchmark, name=name, workspace=workspace) - except EntityNotFoundError as e: - raise BenchmarkRetrievalError("BENCHMARK_NOT_FOUND", f"Benchmark '{workspace}/{name}' not found.") from e - - async def compile_job(self, workspace: str, job: BenchmarkJob, sdk: AsyncNeMoPlatform) -> PlatformJobSpec: - """Compile a benchmark job input to a platform job spec. - - This function: - 1. Retrieves the benchmark entity from the reference - 2. Resolves any ModelRef fields in benchmark_params to Model - 3. Validates prechecks (fileset exists) - 4. Compiles to platform job spec - - Args: - workspace: The workspace for the job (from API path parameter). - job: The benchmark job input specification. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - - Returns: - Platform job specification ready for execution. - - Raises: - BenchmarkRetrievalError: If benchmark reference points to a non-existent benchmark. - ValueError: If prechecks fail or compilation fails. - """ - # Retrieve benchmark from reference - benchmark_entity = await self.get_benchmark(job.benchmark) - - # Resolve model refs in benchmark_params (for system benchmarks with judge models) - if isinstance(job, (SystemBenchmarkOnlineJob, SystemBenchmarkOfflineJob)): - job.benchmark_params = await resolve_params_model_refs(job.benchmark_params) - - # Run prechecks (fileset exists + model reachability) - result = await CompositeCheck( - benchmark_fileset_exists_check(job, benchmark_entity, sdk=sdk), - benchmark_model_check(job, benchmark_entity, workspace, sdk=sdk), - benchmark_job_schema_check(job, benchmark_entity, sdk=sdk), - )() - if not result.status: - raise ValueError(f"Job cannot be launched. Error: {str(result)}") - - # Resolve ModelRef to Model before converting to app-layer types. - # The app layer only accepts Model, so any ModelRef strings must be - # resolved to concrete model endpoints here in the API layer. - data = job.model_dump(exclude_none=True, exclude={"benchmark"}) - if isinstance(job, (BenchmarkOnlineJob, SystemBenchmarkOnlineJob)): - if isinstance(job.model, app.ModelRef): - data["model_ref"] = job.model - resolved = await resolve_model(job.model) - data["model"] = resolved.model_dump() - - # Build the benchmark value for the app-layer discriminated union. - # Both app.Benchmark and app.SystemBenchmark now have a "name" field; - # the discriminator distinguishes them by the presence of "metrics". - # For custom benchmarks, "name" is set to the full ref (workspace/name) - # so the app layer can identify the benchmark without being workspace-aware. - # SystemBenchmark (both entities and app layer) don't have a workspace attribute - if isinstance(benchmark_entity, (entities.SystemBenchmark, app.SystemBenchmark)): - benchmark = app.SystemBenchmark(**benchmark_entity.model_dump(exclude_none=True)) - else: - benchmark_ref = f"{benchmark_entity.workspace}/{benchmark_entity.name}" - benchmark_metrics: list[app.BenchmarkMetric] = [] - for metric in benchmark_entity.metrics: - benchmark_metrics.append( - app.BenchmarkMetric( - metric_ref=app.MetricRef(root=f"{metric.workspace}/{metric.name}"), - metric=app.MetricAdapter.validate_python(metric.model_dump(exclude_none=True)), - ) - ) - - benchmark = app.Benchmark( - name=benchmark_ref, - description=benchmark_entity.description, - metrics=benchmark_metrics, - dataset=benchmark_entity.dataset, - field_mapping=benchmark_entity.field_mapping, - labels=benchmark_entity.labels, - ) - - # Convert API schema to BenchmarkJob via discriminated union - compiled_data = rewrite_models_for_job_container(data | {"benchmark": benchmark}) - benchmark_job = app.BenchmarkJobAdapter.validate_python(compiled_data) - - # Compile to platform job spec - compiled_job = await compile_benchmark_job(benchmark_job) - return compiled_job - - # ============================================================================= - # Benchmark Job Results - # ============================================================================= - - async def delete_job_result(self, workspace: str, name: str) -> DeleteResponse: - try: - await self._entity_client.get(entities.BenchmarkJobResult, workspace=workspace, name=name) - except EntityNotFoundError as e: - raise BenchmarkDeletionError( - "BENCHMARK_JOB_RESULT_NOT_FOUND", f"Benchmark job result '{workspace}/{name}' not found." - ) from e - await self._entity_client.delete(entities.BenchmarkJobResult, name, workspace=workspace) - return DeleteResponse( - message="Resource deleted successfully", - id=f"{workspace}/{name}", - deleted_at=datetime.now(timezone.utc), - ) - - async def get_job_result( - self, workspace: str, name: str, aggregate_fields: frozenset[AggregateFieldName] | None = None - ) -> BenchmarkJobResult: - """Get a benchmark job result.""" - try: - entity: entities.BenchmarkJobResult = await self._entity_client.get( - entities.BenchmarkJobResult, workspace=workspace, name=name - ) - except EntityNotFoundError as e: - raise BenchmarkRetrievalError( - "BENCHMARK_JOB_RESULT_NOT_FOUND", f"Benchmark job result '{workspace}/{name}' not found." - ) from e - - job_result = self._mapper.entity_to_schema(entity, BenchmarkJobResult) - if aggregate_fields: - for result in job_result.results: - result.scores = [score.with_fields(aggregate_fields) for score in result.scores] - return job_result - - async def get_job_results( - self, - workspace: str, - aggregate_fields: frozenset[AggregateFieldName] | None = None, - page: int = 1, - page_size: int = 100, - sort: Literal["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"] = "-created_at", - parsed_filter: ParsedFilter | None = None, - ) -> BenchmarkJobResultsListResponse: - """List benchmark job results with optional filtering, pagination, and sorting.""" - filter_op = parsed_filter.operation if parsed_filter else None - - resp: ListResponse[entities.BenchmarkJobResult] = await self._entity_client.list( - entities.BenchmarkJobResult, - workspace=workspace, - sort=sort, - page=page, - page_size=page_size, - filter_operation=filter_op, - ) - - benchmarks = [self._mapper.entity_to_schema(result, BenchmarkJobResult) for result in resp.data] - - if aggregate_fields: - for benchmark in benchmarks: - for result in benchmark.results: - result.scores = [score.with_fields(aggregate_fields) for score in result.scores] - - return BenchmarkJobResultsListResponse( - data=benchmarks, - pagination=PaginationData(**resp.pagination.model_dump()), - sort=sort, - filter=parsed_filter.to_response() if parsed_filter else None, - ) - - # ============================================================================= - # System Benchmarks - # ============================================================================= - - @retry( - stop=stop_after_attempt(10), - wait=wait_exponential(multiplier=1, min=4, max=15), - ) - async def _get_registered_system_benchmarks(self) -> ListResponse[entities.SystemBenchmark]: - return await self._entity_client.list( - entities.SystemBenchmark, workspace=SYSTEM_WORKSPACE, page_size=1000 - ) # get all if more than 100 - - @retry( - stop=stop_after_attempt(10), - wait=wait_exponential(multiplier=1, min=4, max=30), - ) - async def _ensure_system_workspace_exists(self) -> None: - # Use service principal if configured for startup/background tasks - _ = await get_async_platform_sdk(as_service=self._as_service, internal=True).workspaces.retrieve( - SYSTEM_WORKSPACE - ) - - async def delete_all_system_benchmarks(self) -> None: - registered_system_benchmarks_list = await self._get_registered_system_benchmarks() - tasks = [] - for benchmark in registered_system_benchmarks_list.data: - _logger.debug("Deleting system benchmark from entity service", extra={"benchmark": benchmark.name}) - tasks.append( - self._entity_client.delete(entities.SystemBenchmark, benchmark.name, workspace=SYSTEM_WORKSPACE) - ) - await asyncio.gather(*tasks) - _logger.info("Deleted system benchmarks from the entity service", extra={"count": len(tasks)}) - - async def register_system_benchmarks(self, recreate_existing: bool = False) -> None: - with scoped_otel_headers(MARK_INTERNAL_REQUEST_HEADERS): - await self._register_system_benchmarks_impl(recreate_existing) - - async def _register_system_benchmarks_impl(self, recreate_existing: bool) -> None: - await self._ensure_system_workspace_exists() - if recreate_existing: - _logger.info("Reregistering system benchmarks in the entity service...") - await self.delete_all_system_benchmarks() - else: - _logger.info("Registering system benchmarks in the entity service...") - registered_system_benchmarks_list = await self._get_registered_system_benchmarks() - registered_system_benchmarks = { - benchmark.name: benchmark for benchmark in registered_system_benchmarks_list.data - } - - tasks = [] - system_benchmarks = get_all_system_benchmarks() - benchmarks_warning = [] - - for benchmark in system_benchmarks: - benchmark_entity = entities.SystemBenchmark(**benchmark.model_dump(exclude_none=True)) - if benchmark.name not in registered_system_benchmarks: - _logger.debug("Creating system benchmark in entity service", extra={"benchmark": benchmark.name}) - tasks.append(self._entity_client.create(benchmark_entity)) - elif not _benchmarks_equal(registered_system_benchmarks[benchmark.name], benchmark_entity): - benchmarks_warning.append(benchmark.name) - else: - _logger.debug("System benchmark is up to date in entity service", extra={"benchmark": benchmark.name}) - if benchmarks_warning: - _logger.warning( - "System benchmark is not up to date in entity service", extra={"benchmarks": benchmarks_warning} - ) - - await asyncio.gather(*tasks) - _logger.info("Registered new system benchmarks in the entity service", extra={"count": len(tasks)}) - - -def _benchmarks_equal(benchmark1: entities.SystemBenchmark, benchmark2: entities.SystemBenchmark) -> bool: - """Compare two benchmarks, ignoring database-generated metadata fields.""" - return benchmark1.model_dump(exclude=_ENTITY_METADATA_FIELDS) == benchmark2.model_dump( - exclude=_ENTITY_METADATA_FIELDS - ) diff --git a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/mapper.py b/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/mapper.py deleted file mode 100644 index df1954f532..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/mapper.py +++ /dev/null @@ -1,62 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Type, TypeVar - -import nmp.evaluator.entities as entities -from nmp.common.entities.client import EntityBase -from nmp.evaluator.api.v2.benchmarks.schemas.benchmarks import ( - Benchmark, - BenchmarkRequest, -) -from nmp.evaluator.app.values import MetricRef - -SchemaT = TypeVar("SchemaT", bound=EntityBase) - - -class BenchmarkMapper: - @staticmethod - def request_to_entity( - benchmark: BenchmarkRequest, workspace: str, metrics: list[entities.Metric] - ) -> entities.Benchmark: - # Metrics are already validated EntityBase instances with IDs - use them directly - return entities.Benchmark( - name=benchmark.name, - workspace=workspace, - description=benchmark.description, - metrics=metrics, - dataset=benchmark.dataset, - field_mapping=benchmark.field_mapping, - labels=benchmark.labels, - ) - - @staticmethod - def entity_to_schema(entity: EntityBase, schema_cls: Type[SchemaT]) -> SchemaT: - """Validate an entity into a schema class, preserving base private attributes. - - Constructs the schema from the entity's model dump, then copies the private - attributes managed by the entity store (_id, timestamps, _parent) from the - source entity to the resulting schema. - - Args: - entity: Source entity to serialize. - schema_cls: Target schema class to validate into. - - Returns: - Schema instance with private attributes populated. - """ - data = entity.model_dump(exclude_none=True) - - if isinstance(entity, entities.Benchmark) and issubclass(schema_cls, Benchmark): - # Special handling for Benchmark which maps metric to metric references - metrics = [MetricRef(root=f"{metric.workspace}/{metric.name}") for metric in entity.metrics] - data.update({"metrics": metrics}) - - resp = schema_cls.model_validate(data) - resp._id = entity._id - resp._created_at = entity._created_at - resp._created_by = entity._created_by - resp._updated_at = entity._updated_at - resp._updated_by = entity._updated_by - resp._parent = entity._parent - return resp diff --git a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/schemas/__init__.py b/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/schemas/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/schemas/benchmarks.py b/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/schemas/benchmarks.py deleted file mode 100644 index 293fcd8c01..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/schemas/benchmarks.py +++ /dev/null @@ -1,138 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Annotated - -import nmp.evaluator.app.values as app -import nmp.evaluator.entities as entities -from nemo_evaluator_sdk.values import DatasetRows -from nmp.common.api.common import Page -from nmp.common.entities.values import DatetimeFilter, Filter, StringFilter, map_entity_field -from nmp.evaluator.app.values import Fileset, FilesetRef, MetricRef -from pydantic import BaseModel, ConfigDict, Field, model_validator -from typing_extensions import Self - -# ============================================================================= -# Request input schemas -# ============================================================================= - - -class BenchmarksListFilter(Filter): - """Filter for list benchmarks query.""" - - name: StringFilter | str | None = Field(default=None, description="Filter benchmarks by name.") - description: StringFilter | str | None = Field(default=None, description="Filter benchmarks by description.") - dataset: FilesetRef | None = Field( - default=None, - description="Filter custom benchmarks by dataset used for evaluation (format workspace/fileset-name).", - ) - project: str | None = Field(default=None, description="Filter benchmarks by project name.") - created_at: DatetimeFilter | None = Field(default=None, description="Filter benchmarks by creation date range.") - updated_at: DatetimeFilter | None = Field(default=None, description="Filter benchmarks by last update date range.") - labels: Annotated[dict[str, str] | None, map_entity_field("data.labels", namespace=True)] = Field( - default=None, - description="Filter by labels. Address an individual label as a sub-path, e.g. filter[labels.eval_category]=agentic.", - ) - - -class BenchmarkRequest(BaseModel): - """Request schema for creating a benchmark. Workspace comes from route parameter.""" - - model_config = ConfigDict(extra="forbid") - name: str = Field(description="The name of the benchmark.") - description: str | None = Field(description="The description of the benchmark.") - metrics: list[MetricRef] = Field( - description="The metrics that comprise this benchmark (format: workspace/metric_name)." - ) - dataset: FilesetRef = Field(description="The Fileset containing test data (format: workspace/fileset-name).") - field_mapping: app.FieldMapping | None = Field( - default=None, - description="Maps canonical evaluator fields such as 'input' and 'output' to dataset column paths for this benchmark.", - ) - labels: dict[str, str] = Field( - default_factory=dict, description="Labels are key-value pairs that can be used for grouping and filtering." - ) - - @model_validator(mode="after") - def restrict_label_characters(self) -> Self: - """Restrict label key/value strings from unsupported characters""" - errs = [] - for k, v in self.labels.items(): - if not k.isalnum(): - errs.append(f"label {k}") - if not v.isalnum(): - errs.append(f"label {k} value {v}") - if errs: - raise ValueError(f"labels must be alphanumeric: {errs}") - return self - - @model_validator(mode="after") - def unique_metric_refs(self) -> Self: - metric_refs = [metric_ref.root for metric_ref in self.metrics] - if len(metric_refs) != len(set(metric_refs)): - raise ValueError("benchmark metric references must be unique") - return self - - -# ============================================================================= -# Response schemas -# Response objects must inherit from EntityBase to satisfy nmp.common.entities.client.ListResponse -# ============================================================================= - - -class Benchmark(entities.Benchmark): - """Benchmark response schema.""" - - metrics: list[MetricRef] = Field( - description="The metrics that comprise this benchmark (format: workspace/metric_name)." - ) - - -class ExtendedBenchmark(entities.Benchmark): - """Extended benchmark response. Includes the metrics and dataset as entities.""" - - metrics: list[entities.Metric] = Field(description="The fully defined metrics of the benchmark.") - # TODO remove FilesetRef type when resolved before saving - dataset: DatasetRows | Fileset | FilesetRef = Field( - description="Dataset containing the test cases for this benchmark." - ) - - -class SystemBenchmark(entities.SystemBenchmark): - """System Benchmark response schema.""" - - ... - - -# This is needed to ensure the generated OAS has a better name than UnionsPage. -class BenchmarksListResponse(Page[Benchmark | ExtendedBenchmark | SystemBenchmark]): ... - - -# ============================================================================= -# List Job Results -# ============================================================================= - - -class BenchmarkJobResultsListFilter(Filter): - """Filter for list benchmark job results.""" - - name: StringFilter | str | None = Field(default=None, description="Filter job results by name.") - benchmark: app.BenchmarkRef | None = Field(default=None, description="Filter results by benchmark reference.") - metrics: str | None = Field(default=None, description="Filter results by metric reference.") - dataset: app.FilesetRef | None = Field( - default=None, - description="Filter results by dataset if the benchmark job is configured with the fileset reference.", - ) - model: app.ModelRef | None = Field( - default=None, description="Filter results by model if the benchmark job is configured with the model reference." - ) - created_at: DatetimeFilter | None = Field(default=None, description="Filter job results by creation date range.") - - -class BenchmarkJobResult(entities.BenchmarkJobResult): - """Response type for benchmark job result.""" - - pass - - -class BenchmarkJobResultsListResponse(Page[BenchmarkJobResult]): ... diff --git a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/schemas/jobs.py b/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/schemas/jobs.py deleted file mode 100644 index f9e3ae70b5..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/benchmarks/schemas/jobs.py +++ /dev/null @@ -1,214 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Job input schemas for benchmark evaluation.""" - -from __future__ import annotations - -from typing import Annotated, Any, ClassVar, Literal, TypeGuard - -from nemo_evaluator_sdk.values import ( - RunConfig, - RunConfigOnline, - RunConfigOnlineModel, - SupportedJobTypes, -) -from nmp.common.entities import SYSTEM_WORKSPACE -from nmp.evaluator.api.v2.common.inline_models import Agent, Model -from nmp.evaluator.app.values import ( - BenchmarkRef, - FilesetRef, - ModelRef, -) -from pydantic import BaseModel, ConfigDict, Discriminator, Field, Tag, TypeAdapter - - -class _BenchmarkJobBase(BaseModel): - """Base input for a benchmark evaluation job.""" - - model_config = ConfigDict(extra="forbid", json_schema_mode_override="validation") - benchmark: BenchmarkRef = Field(description="Reference to the benchmark for evaluation (format: workspace/name).") - - -# TODO: Align optional_fields with template path semantics. -# Keep support for dataset-relative nested paths (for example "reference.text") -# and runtime sample paths (for example "sample.output_text"), while avoiding -# dependence on the "item." alias form (normalize "item.foo" -> "foo"). -OptionalFieldName = Annotated[str, Field(min_length=1)] - - -class BenchmarkOfflineJob(_BenchmarkJobBase): - """Input for an offline benchmark evaluation job. - - Evaluates the benchmark's dataset against all metrics in the benchmark. - """ - - params: RunConfig | None = Field( - default_factory=RunConfig, description="Execution parameters for the benchmark job." - ) - __job_type__: ClassVar[Literal[SupportedJobTypes.OFFLINE]] = SupportedJobTypes.OFFLINE - - -class SystemBenchmarkOfflineJob(_BenchmarkJobBase): - """Input for an offline system benchmark evaluation job. - - Evaluates the benchmark's standard dataset against all pre-defined metrics in the benchmark. - """ - - __job_type__: ClassVar[Literal[SupportedJobTypes.OFFLINE]] = SupportedJobTypes.OFFLINE - - dataset: FilesetRef = Field( - description="Reference to a Fileset in the Files API (format: workspace/fileset-name). The fileset contains the pre-generated outputs to evaluate this benchmark on." - ) - params: RunConfig | None = Field( - default_factory=RunConfig, description="Execution parameters for the benchmark job." - ) - benchmark_params: dict = Field(default_factory=dict, description="Additional parameters specific to the benchmark.") - - -class _BenchmarkOnlineJob(_BenchmarkJobBase): - """Base input for an online benchmark evaluation job.""" - - model: Model | ModelRef = Field(description="The model to evaluate.") - params: RunConfigOnlineModel | None = Field( - default_factory=RunConfigOnlineModel, description="Execution parameters for the benchmark job." - ) - - -class BenchmarkOnlineJob(_BenchmarkOnlineJob): - """Input for an online benchmark evaluation job. - - Evaluates a model by prompting it with the benchmark's dataset and then evaluating - the responses against all metrics in the benchmark. - """ - - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - - prompt_template: str | dict = Field( - description="The jinja template to prompt the model for evaluation. Can be either a simple string or a structured object (e.g., OpenAI messages format). Use Jinja template variables like {{input}}, {{output}}, {{context}}, {{reference}} to reference input columns.", - examples=[ - {"type": "string", "content": "Question: {{input}}\nAnswer: "}, - { - "type": "object", - "content": { - "messages": [ - { - "role": "user", - "content": "Question: {{input}}\nAnswer: ", - }, - ] - }, - }, - ], - ) - optional_fields: list[OptionalFieldName] = Field( - default_factory=list, - description=( - "Prompt template fields that should remain available to the prompt template but not be " - "required by dataset schema validation." - ), - ) - - -class BenchmarkOnlineAgentJob(_BenchmarkJobBase): - """Input for an online benchmark evaluation job targeting an agent. - - Evaluates an agent by prompting it with the benchmark's dataset and then evaluating - the responses against all metrics in the benchmark. - """ - - agent: Agent = Field(description="The agent to evaluate.") - params: RunConfigOnline | None = Field( - default_factory=RunConfigOnline, description="Execution parameters for the benchmark job." - ) - prompt_template: str | dict = Field( - description="The jinja template to prompt the agent for evaluation. Can be either a simple string or a structured object (e.g., OpenAI messages format). Use Jinja template variables like {{input}}, {{output}}, {{context}}, {{reference}} to reference input columns.", - examples=[ - {"type": "string", "content": "Question: {{input}}\nAnswer: "}, - { - "type": "object", - "content": { - "messages": [ - { - "role": "user", - "content": "Question: {{input}}\nAnswer: ", - }, - ] - }, - }, - ], - ) - optional_fields: list[OptionalFieldName] = Field( - default_factory=list, - description=( - "Prompt template fields that should remain available to the prompt template but not be " - "required by dataset schema validation." - ), - ) - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - - -class SystemBenchmarkOnlineJob(_BenchmarkOnlineJob): - """Input for an online system benchmark evaluation job. - - Evaluates the benchmark's standard dataset against all pre-defined metrics in the benchmark. - """ - - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - - benchmark_params: dict = Field(default_factory=dict, description="Additional parameters specific to the benchmark.") - - -def _benchmark_job_discriminator(data: Any) -> str: - """ - Discriminate union type specifically for API input job spec which has benchmark references. - """ - if isinstance(data, dict): - has_model = "model" in data - has_agent = "agent" in data - else: - has_model = hasattr(data, "model") - has_agent = hasattr(data, "agent") - - if has_agent and has_model: - raise ValueError("Only one of 'model' or 'agent' may be specified, not both.") - - if has_agent: - return "online-agent" - - if has_model: - if ("prompt_template" in data) if isinstance(data, dict) else hasattr(data, "prompt_template"): - return "online" - return "system-online" - - benchmark_ref = data.get("benchmark", "") if isinstance(data, dict) else getattr(data, "benchmark", "") - if isinstance(benchmark_ref, BenchmarkRef): - benchmark_ref = benchmark_ref.root - if benchmark_ref.split("/", 1)[0] == SYSTEM_WORKSPACE: - return "system-offline" - return "offline" - - -BenchmarkJob = Annotated[ - ( - Annotated[BenchmarkOfflineJob, Tag("offline")] - | Annotated[BenchmarkOnlineJob, Tag("online")] - | Annotated[BenchmarkOnlineAgentJob, Tag("online-agent")] - | Annotated[SystemBenchmarkOfflineJob, Tag("system-offline")] - | Annotated[SystemBenchmarkOnlineJob, Tag("system-online")] - ), - Discriminator(_benchmark_job_discriminator), -] -BenchmarkJobAdapter = TypeAdapter(BenchmarkJob) - - -def benchmark_job_type(job: BenchmarkJob) -> SupportedJobTypes: - """Return the supported evaluator job type for a benchmark job schema.""" - if isinstance(job, BenchmarkOnlineJob | BenchmarkOnlineAgentJob | SystemBenchmarkOnlineJob): - return SupportedJobTypes.ONLINE - return SupportedJobTypes.OFFLINE - - -def is_online_benchmark_job(job: BenchmarkJob) -> TypeGuard[BenchmarkOnlineJob | BenchmarkOnlineAgentJob]: - """Return True when the job schema carries a prompt_template override.""" - return isinstance(job, BenchmarkOnlineJob | BenchmarkOnlineAgentJob) diff --git a/services/evaluator/src/nmp/evaluator/api/v2/common/__init__.py b/services/evaluator/src/nmp/evaluator/api/v2/common/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/api/v2/common/checks.py b/services/evaluator/src/nmp/evaluator/api/v2/common/checks.py deleted file mode 100644 index 8e54f11a1c..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/common/checks.py +++ /dev/null @@ -1,236 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Precheck Protocol and utilities for validation checks. - -This module defines the Protocol that all prechecks must implement -and the ValidationResult class for check responses. -""" - -import asyncio -import logging -import re -from collections.abc import Awaitable, Callable, Iterable -from typing import Protocol, runtime_checkable - -from nemo_evaluator_sdk.inference import ClientInferenceError -from nemo_evaluator_sdk.values.dataset_schemas import FieldMapping - -log = logging.getLogger(__name__) -_MISSING_REQUIRED_FIELD_RE = re.compile(r"dataset schema missing required field '([^']+)'") -_MISSING_FIELD_DEFINITION_RE = re.compile(r"dataset schema missing field definition '([^']+)'") - - -class ValidationResult: - """Result of a validation check. - - Provides structure to responses from validation checks. - """ - - def __init__(self, status: bool = True, errors: list[str] | None = None): - self.status = status - self.errors = errors or [] - - def update(self, other_response: "ValidationResult"): - """Update the current status and error based on passed instance of ValidationResult.""" - self.status = self.status and other_response.status - self.errors.extend(other_response.errors) - - def __str__(self): - if self.status: - return "Valid payload." - else: - if isinstance(self.errors, str): - return self.errors - joined_errors = " ".join(self.errors) - return f"Invalid payload. Errors: {joined_errors}." - - -@runtime_checkable -class Check(Protocol): - """Protocol for validation checks. - - Prechecks validate job or entity configuration before execution. - They can be implemented as functions or callable classes. - - Example: - async def check_fileset_exists(job: MetricJob) -> ValidationResult: - # ... validation logic - return ValidationResult(True) - """ - - async def __call__(self, *args, **kwargs) -> Awaitable[ValidationResult]: - """Execute the precheck validation. - - Returns: - ValidationResult indicating success or failure with error details. - """ - ... - - -# Type alias for check functions -CheckFn = Callable[..., Awaitable[ValidationResult]] - - -class SchemaValidationTarget(Protocol): - schema: dict | None - - def path_context(self) -> str | None: ... - - -class CompositeCheck: - """Run multiple validation checks in parallel and aggregate results. - - Example: - result = await CompositeCheck( - job_fileset_exists_check(job), - job_model_check(job, workspace), - )() - """ - - def __init__(self, *checks: Awaitable[ValidationResult]): - """Initialize with check coroutines to run. - - Args: - *checks: Coroutines that return ValidationResult. - """ - self.checks = checks - - async def __call__(self) -> ValidationResult: - """Run all checks in parallel and aggregate results. - - Returns: - ValidationResult with combined status and errors from all checks. - """ - if not self.checks: - return ValidationResult(True) - - results = await asyncio.gather(*self.checks, return_exceptions=True) - errors = [] - - for result in results: - if isinstance(result, Exception): - errors.append(f"Check failed with exception: {result}") - elif isinstance(result, ValidationResult) and not result.status: - errors.extend(result.errors) - - if errors: - return ValidationResult(False, errors) - return ValidationResult(True) - - -def unique_preserve_order(items: list[str]) -> list[str]: - """Return unique strings while preserving first-seen order.""" - seen: set[str] = set() - unique_items: list[str] = [] - for item in items: - if item in seen: - continue - seen.add(item) - unique_items.append(item) - return unique_items - - -def collect_schema_target_errors( - dataset_targets: Iterable[SchemaValidationTarget], - validate_schema: Callable[[dict | None], ValidationResult], -) -> list[str]: - """Run schema validation across resolved targets and attach path context.""" - errors: list[str] = [] - for dataset_target in dataset_targets: - result = validate_schema(dataset_target.schema) - if result.status: - continue - path_context = dataset_target.path_context() - if path_context: - errors.extend(f"[{path_context}] {error}" for error in result.errors) - else: - errors.extend(result.errors) - return errors - - -def compress_schema_errors(errors: list[str]) -> list[str]: - """Deduplicate noisy schema errors while preserving first-seen order.""" - # TODO: Replace this regex-based dedupe once schema compatibility checks return - # structured issue objects instead of flattened strings. Today the SDK/precheck - # layers erase error codes/paths before we reach the API formatter. - missing_required_fields = { - match.group(1) for error in errors if (match := _MISSING_REQUIRED_FIELD_RE.fullmatch(error)) is not None - } - compressed: list[str] = [] - for error in unique_preserve_order(errors): - missing_definition_match = _MISSING_FIELD_DEFINITION_RE.fullmatch(error) - if missing_definition_match and missing_definition_match.group(1) in missing_required_fields: - continue - compressed.append(error) - return compressed - - -def mapping_hint(field_mapping: FieldMapping | None) -> str: - """Return an actionable hint for field_mapping-related schema validation failures.""" - mapping = field_mapping.mapping() if field_mapping is not None else {} - if mapping: - return "Hint: Check field_mapping values against your dataset schema" - return "Hint: If your dataset uses different field names, provide field_mapping to map canonical evaluator fields to dataset fields" - - -def prompt_hint(field_mapping: FieldMapping | None) -> str: - """Return an actionable hint for prompt-template schema validation failures.""" - mapping = field_mapping.mapping() if field_mapping is not None else {} - if mapping: - return "Hint: Update the prompt template variables or correct field_mapping to reference fields present in the dataset schema" - return "Hint: Update the prompt template variables to match your dataset schema, or provide field_mapping if the dataset uses different field names" - - -def schema_error_message(prefix: str, errors: list[str], *, hint: str | None = None) -> str: - """Format compressed schema-validation errors with an optional hint.""" - compressed = compress_schema_errors(errors) - message = f"{prefix}: " + "; ".join(compressed) - if hint: - message = f"{message}. {hint}" - return message - - -def validation_result_from_exception(prefix: str, error: Exception) -> ValidationResult: - """Convert an exception into a failed ValidationResult with a contextual prefix.""" - return ValidationResult(False, [f"{prefix}: {error}"]) - - -# User-facing copy for model reachability failures. Edit these to update wording. -# Templates expect `label` and `model_name` (and `error` for the unreachable variant). -# Strings do NOT end with a period: ValidationResult.__str__ appends one when joining. -MODEL_NO_DEPLOYMENT_MESSAGE = ( - "{label} '{model_name}' has no active inference deployment; deploy the model before running evaluation" -) -MODEL_UNREACHABLE_MESSAGE = "{label} '{model_name}' is not reachable: {error}" - -# Map internal job-spec field paths to user-facing labels for error messages. -_MODEL_FIELD_LABELS: dict[str, str] = { - "job.model": "Evaluation Model", - "job.metric.model": "Judge Model", - "metric_params.judge.model": "Judge Model", - "benchmark_params.judge.model": "Judge Model", -} - - -def format_model_reachability_error(field_path: str, model_dict: dict, error: BaseException) -> str: - """Build a user-facing error message for a failed model reachability check. - - Distinguishes the common "no active inference deployment" case (HTTP 404 from the - inference gateway) from other transport / inference failures, and substitutes a - user-facing label for the internal job-spec field path. - - Args: - field_path: Internal job-spec path (e.g. "job.model", "metric_params.judge.model"). - model_dict: Dict-form model spec with at least a "name" key. - error: Exception raised by the reachability check. - """ - label = _MODEL_FIELD_LABELS.get(field_path, field_path) - model_name = model_dict.get("name") or "" - # Only treat 404s coming from the inference call itself as "no active deployment". - # Other 404s in the reachability path (e.g. nemo_platform.NotFoundError raised by - # sdk.secrets.access() when an api_key_secret is missing) must fall through to the - # generic unreachable message so the real cause isn't masked. - if isinstance(error, ClientInferenceError) and error.status_code == 404: - return MODEL_NO_DEPLOYMENT_MESSAGE.format(label=label, model_name=model_name) - return MODEL_UNREACHABLE_MESSAGE.format(label=label, model_name=model_name, error=error) diff --git a/services/evaluator/src/nmp/evaluator/api/v2/common/inline_models.py b/services/evaluator/src/nmp/evaluator/api/v2/common/inline_models.py deleted file mode 100644 index 3175dbe564..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/common/inline_models.py +++ /dev/null @@ -1,80 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Service API wrappers for inline SDK model and agent definitions.""" - -from typing import Any - -from nemo_evaluator_sdk.values import Agent as SDKAgent -from nemo_evaluator_sdk.values import Model as SDKModel -from nmp.common.api.common import SecretRef as ApiSecretRef -from pydantic import Field, model_validator - -# Subclasses :class:`SDKModel` / :class:`SDKAgent` solely to swap the SDK's -# relaxed ``SecretRef`` pattern that allows uppercase secret names for -# the strict service ``ApiSecretRef`` on ``api_key_secret``, -# so the public API spec keeps the lowercase-only contract -# while the SDK can accept uppercase secret names. - - -class Model(SDKModel): - """Model definition for use without persisting to the Models API.""" - - # Keep the OpenAPI $defs key as `Model`, not the qualified service path — - # downstream spec post-processing keys off the original SDK module name. - __module__ = "nemo_evaluator_sdk.values.models" - - api_key_secret: ApiSecretRef | None = Field( - default=None, - description=SDKModel.model_fields["api_key_secret"].description, - ) - - @model_validator(mode="before") - @classmethod - def coerce_sdk_model(cls, value: Any) -> Any: - """Re-validate SDK model instances against this stricter wrapper. - - Pydantic does not implicitly downcast a parent-class instance to a - subclass, so callers passing already-built ``SDKModel`` values (for - example, app-layer or entity-layer values flowing into a response - schema) are dumped to a dict here and re-validated under the strict - ``ApiSecretRef`` pattern. - """ - if isinstance(value, SDKModel) and not isinstance(value, cls): - return value.model_dump(mode="python") - return value - - -class Agent(SDKAgent): - """Agent definition for inference in online evaluation jobs. - - An agent is an endpoint that accepts a request and returns a response, - potentially with a trajectory. Two formats are supported: - - - ``generic``: configurable HTTP POST with Jinja-templated body and - JSONPath extraction for response and trajectory. - - ``nemo_agent_toolkit``: NeMo Agent Toolkit SSE streaming protocol - (``/generate/full?filter_steps=none``). - """ - - # Keep the OpenAPI $defs key as `Agent`, not the qualified service path. - __module__ = "nemo_evaluator_sdk.values.agents" - - api_key_secret: ApiSecretRef | None = Field( - default=None, - description=SDKAgent.model_fields["api_key_secret"].description, - ) - - @model_validator(mode="before") - @classmethod - def coerce_sdk_agent(cls, value: Any) -> Any: - """Re-validate SDK agent instances against this stricter wrapper. - - See :meth:`Model.coerce_sdk_model` for the rationale. - """ - if isinstance(value, SDKAgent) and not isinstance(value, cls): - return value.model_dump(mode="python") - return value - - -__all__ = ["Agent", "Model"] diff --git a/services/evaluator/src/nmp/evaluator/api/v2/common/model_resolution.py b/services/evaluator/src/nmp/evaluator/api/v2/common/model_resolution.py deleted file mode 100644 index 905c8d536b..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/common/model_resolution.py +++ /dev/null @@ -1,277 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Protocol and utilities for resolving ModelRef to Model in the API layer. - -Resolution happens at the API layer before data is passed to the app layer, -ensuring the app layer only works with Model instances. -""" - -import logging -from collections.abc import Awaitable, Callable -from typing import Protocol, cast, runtime_checkable -from urllib.parse import urlparse - -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.values import Model as SDKModel -from nemo_platform import AsyncNeMoPlatform, NotFoundError -from nmp.common.config import get_platform_config -from nmp.common.config.base import LOOPBACK_ADDRESSES -from nmp.common.sdk_factory import get_async_platform_sdk -from nmp.evaluator.api.v2.common.inline_models import Model -from nmp.evaluator.app.values.common import ModelRef - -_logger = logging.getLogger(__name__) - -# ============================================================================= -# Model Union Type and Resolution -# ============================================================================= - - -async def _resolve_provider_host_url( - sdk: AsyncNeMoPlatform, - model_entity: object, -) -> str | None: - """Resolve the direct NIM host URL from a model entity's first provider. - - Returns the provider's host_url (e.g., http://nim-host:8080) or None if - the model has no providers or the lookup fails. - """ - model_providers = getattr(model_entity, "model_providers", None) - if not model_providers: - return None - - provider_ref = model_providers[0] - parts = provider_ref.split("/", 1) - if len(parts) != 2: - _logger.warning("Invalid provider reference format", extra={"provider_ref": provider_ref}) - return None - - provider_workspace, provider_name = parts - try: - provider = await sdk.inference.providers.retrieve(provider_name, workspace=provider_workspace) - _logger.debug( - "Resolved provider host_url", - extra={"provider_ref": provider_ref, "host_url": provider.host_url}, - ) - return provider.host_url - except NotFoundError: - _logger.warning("Provider not found during host_url resolution", extra={"provider_ref": provider_ref}) - return None - except Exception: - _logger.warning("Failed to resolve provider host_url", extra={"provider_ref": provider_ref}, exc_info=True) - return None - - -async def resolve_model( - model: SDKModel | ModelRef, - sdk: AsyncNeMoPlatform | None = None, -) -> Model: - """Resolve a Model or ModelRef to an Model. - - This function should only be called from the API layer. - The app layer should receive pre-resolved Model instances. - - If the model is already an Model, it is returned unchanged. - If the model is a ModelRef, queries the Models API to validate the model exists - and builds the Inference Gateway model entity route URL. - - Args: - model: An Model or ModelRef (workspace/model_name). - sdk: Optional SDK instance for testing. If None, uses get_async_platform_sdk(). - - Returns: - Model instance with url set to the appropriate Inference Gateway URL. - - Raises: - ValueError: If ModelRef format is invalid or points to a non-existent entity. - TypeError: If model is an unsupported type. - """ - if isinstance(model, Model): - return model - - if isinstance(model, SDKModel): - return Model.model_validate(model) - - if sdk is None: - sdk = get_async_platform_sdk() - - if isinstance(model, ModelRef): - parts = model.root.split("/", 1) - if len(parts) != 2 or not parts[0] or not parts[1]: - raise ValueError("ModelRef must be in format 'workspace/model_name'") - workspace, name = parts - - _logger.debug("Resolving ModelRef to Model", extra={"model_ref": model.root}) - - # Fetch model entity to validate it exists - try: - model_entity = await sdk.models.retrieve(name, workspace=workspace) - except NotFoundError as e: - raise ValueError( - f"Model reference '{model.root}' not found. " - f"Ensure the model entity '{name}' exists in workspace '{workspace}', " - f"or use an inline model definition instead." - ) from e - - # Build inference gateway model entity route URL - # The gateway will rewrite the model field in requests to the correct served_model_name - endpoint = sdk.models.get_model_entity_route_openai_url(model_entity) - - # Resolve the direct NIM host URL from the first model provider. - # Some EvalFactory containers (e.g., rag_retriever_eval) use Haystack components - # that only accept http://host:port URLs without path components, so we need - # the direct NIM endpoint rather than the IGW-proxied URL. - host_url = await _resolve_provider_host_url(sdk, model_entity) - - resolved = Model( - url=endpoint, - name=name, # Gateway rewrites this to served_model_name - format=ModelFormat.NVIDIA_NIM, # IGW uses NIM format - host_url=host_url, - ) - _logger.debug( - "Resolved ModelRef to Model", - extra={"model_ref": model.root, "endpoint": endpoint, "host_url": host_url}, - ) - return resolved - - raise TypeError(f"Unsupported model type: {type(model)}") - - -# ============================================================================= -# Resolution Protocol and Helpers -# ============================================================================= - -# Type alias for the model resolver function -ModelResolver = Callable[[SDKModel | ModelRef], Awaitable[Model]] - - -@runtime_checkable -class ResolvableModels(Protocol): - """Protocol for API types that have model fields needing resolution. - - Types implementing this protocol have fields typed as Model (Model | ModelRef) - that need to be resolved to Model before passing to the app layer. - - Note: Do not inherit from this protocol directly (causes Pydantic metaclass conflict). - Instead, use the _With* mixins which implement this protocol via structural typing. - """ - - async def resolve_models(self, resolver: ModelResolver) -> dict[str, Model]: - """Resolve all Model fields to Model. - - Args: - resolver: Function that resolves ModelRef to Model. - - Returns: - Dict mapping field names to resolved Model instances. - """ - ... - - -async def resolve_model_field(value: SDKModel | ModelRef | None, resolver: ModelResolver) -> Model | None: - """Helper to resolve a single Model field to Model. - - Args: - value: The field value (Model, ModelRef, or None). - resolver: Function that resolves ModelRef to Model. - - Returns: - The resolved Model, or None if value was None. - """ - if value is None: - return None - # resolver handles both Model (returns unchanged) and ModelRef (resolves) - return await resolver(value) - - -# ============================================================================= -# Params Resolution -# ============================================================================= - -# Known param names that contain a nested `model` field needing resolution. -# These are system metric/benchmark params that accept model config. -_MODEL_PARAM_KEYS = ("judge", "judge_embeddings") - - -async def resolve_params_model_refs(params: dict) -> dict: - """Resolve any ModelRef values in a params dict to Model. - - Scans known param keys for nested `model` fields that are string references. - - Args: - params: The metric_params or benchmark_params dict from job input. - - Returns: - A new dict with all model references resolved to Model. - """ - params = dict(params) # shallow copy - - for key in _MODEL_PARAM_KEYS: - if key in params and params[key] and "model" in params[key]: - model_value = params[key]["model"] - # String values are ModelRef references that need resolution - if isinstance(model_value, str): - _logger.debug("Resolving ModelRef in params", extra={"param_key": key, "model_ref": model_value}) - params[key] = dict(params[key]) # shallow copy nested dict - params[key]["model"] = (await resolve_model(ModelRef(model_value))).model_dump() - - return params - - -def _rebase_loopback_url(url: str, target_base_url: str | None) -> str: - """Rewrite loopback-host URLs to use the target base URL's network location.""" - if not target_base_url: - return url - - parsed_url = urlparse(url) - if parsed_url.hostname not in LOOPBACK_ADDRESSES: - return url - - parsed_target = urlparse(target_base_url) - if not parsed_target.scheme or not parsed_target.hostname: - return url - - return parsed_url._replace( - scheme=parsed_target.scheme, - netloc=parsed_target.netloc, - ).geturl() - - -def rewrite_models_for_job_container(payload: dict, target_base_url: str | None = None) -> dict: - """Rewrite resolved model URLs in a job payload for container execution. - - Jobs receive a container-reachable NMP_BASE_URL that may differ from the service's - own network view. This helper rebases any loopback-host model URLs in the compiled - payload onto that container-facing base URL while preserving the original path. - """ - if target_base_url is None: - target_base_url = get_platform_config().to_shared_envvars().get("NMP_BASE_URL") - - def _rewrite(value: object) -> object: - if isinstance(value, dict): - rewritten = {key: _rewrite(item) for key, item in value.items()} - url = rewritten.get("url") - name = rewritten.get("name") - if isinstance(url, str) and isinstance(name, str): - rewritten["url"] = _rebase_loopback_url(url, target_base_url) - host_url = rewritten.get("host_url") - if isinstance(host_url, str): - rewritten["host_url"] = _rebase_loopback_url(host_url, target_base_url) - return rewritten - if isinstance(value, list): - return [_rewrite(item) for item in value] - return value - - return cast(dict, _rewrite(payload)) - - -__all__ = [ - "ModelResolver", - "ResolvableModels", - "resolve_model_field", - "resolve_model", - "resolve_params_model_refs", - "rewrite_models_for_job_container", -] diff --git a/services/evaluator/src/nmp/evaluator/api/v2/common/query_params.py b/services/evaluator/src/nmp/evaluator/api/v2/common/query_params.py deleted file mode 100644 index 07c6e724d9..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/common/query_params.py +++ /dev/null @@ -1,115 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Annotated, get_args - -from fastapi import Depends, HTTPException, Query, Request, status -from nemo_evaluator_sdk.values.results import ( - AggregateFieldName, - DefaultAggregateFieldName, -) -from pydantic import RootModel, model_validator - - -def validate_list_query_params(request: Request, additional_params: set | None = None) -> None: - """Reject unsupported top-level query params for list endpoints.""" - allowed_top_level = {"page", "page_size", "sort", "filter"} - unsupported: list[str] = [] - - if additional_params: - allowed_top_level.update(additional_params) - - for key in request.query_params.keys(): - if key in allowed_top_level: - continue - if key.startswith("filter["): - continue - unsupported.append(key) - - if unsupported: - unsupported_sorted = sorted(set(unsupported)) - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=( - f"Unsupported query parameter(s): {', '.join(unsupported_sorted)}. " - f"Allowed parameters: {', '.join(allowed_top_level)}" - ), - ) - - -# ============================================================================= -# Query parameters for results -# /v2/workspaces/{workspace}/metric-evaluate -# /v2/workspaces/{workspace}/metric-job-results -# ============================================================================= - - -def _parse_aggregate_fields(value: str | list[str] | dict | None) -> list[AggregateFieldName]: - """Parse comma-separated or repeated query params into a list of AggregateFieldName.""" - if value is None: - return [] - # FastAPI passes dict with query param name as key - if isinstance(value, dict): - value = value.get("aggregate_fields", value.get("root", [])) - if isinstance(value, str): - return [v.strip() for v in value.split(",") if v.strip()] - if not value: - return [] - # Handle list that may contain comma-separated strings - result: list[AggregateFieldName] = [] - for item in value: - result.extend(v.strip() for v in item.split(",") if v.strip()) - return result - - -class AggregateFieldNameList(RootModel[list[AggregateFieldName]]): - """Query parameter type that accepts comma-separated values or repeated params. - - Used for testing. For the actual endpoint, we use AggregateFieldsQuery. - """ - - root: list[AggregateFieldName] = [] - - @model_validator(mode="before") - @classmethod - def parse_comma_separated(cls, value: str | list[str] | dict | None) -> list[str]: - return _parse_aggregate_fields(value) - - -def _aggregate_fields_dependency( - aggregate_fields: list[str] = Query( - default=[], - description=( - "Aggregate score fields to include in the response (comma-separated or repeated). " - f"Default: {get_args(DefaultAggregateFieldName)!r}. " - f"Available: {get_args(AggregateFieldName)!r}." - ), - # Add enum to OpenAPI schema - we use list[str] for parsing but want the enum documented - json_schema_extra={"items": {"enum": list(get_args(AggregateFieldName)), "type": "string"}}, - ), -) -> list[AggregateFieldName]: - """FastAPI dependency that parses and validates aggregate_fields query parameter. - - Handles both comma-separated values (e.g., ?aggregate_fields=std_dev,variance) - and repeated params (e.g., ?aggregate_fields=std_dev&aggregate_fields=variance). - - Note: We use list[str] for the Query type because FastAPI's query param handling - bypasses Pydantic's BeforeValidator. Validation happens after parsing. - """ - valid_fields = set(get_args(AggregateFieldName)) - result: list[AggregateFieldName] = [] - for item in aggregate_fields: - for v in item.split(","): - v = v.strip() - if v: - if v not in valid_fields: - raise HTTPException( - status_code=status.HTTP_422_UNPROCESSABLE_CONTENT, - detail=f"Invalid aggregate field: '{v}'. Valid fields: {sorted(valid_fields)}", - ) - result.append(v) - return result - - -# Type alias for use with Depends() - provides type hint for endpoint parameters -AggregateFieldsQuery = Annotated[list[AggregateFieldName], Depends(_aggregate_fields_dependency)] diff --git a/services/evaluator/src/nmp/evaluator/api/v2/common/schemas.py b/services/evaluator/src/nmp/evaluator/api/v2/common/schemas.py deleted file mode 100644 index fd0b0bf9f9..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/common/schemas.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Literal - -from pydantic import BaseModel, Field - -ErrorCode = Literal[ - "METRIC_NOT_FOUND", - "METRIC_ALREADY_EXISTS", - "METRIC_NAME_INVALID", - "METRIC_IMMUTABLE", - "BENCHMARK_NOT_FOUND", - "BENCHMARK_ALREADY_EXISTS", - "BENCHMARK_IMMUTABLE", -] - - -class FieldError(BaseModel): - field: str = Field(description="The field path that has an error.") - message: str = Field(description="Error message for this field.") - - -class ErrorResponse(BaseModel): - detail: str = Field(description="Human-readable error message describing what went wrong.") - error_code: ErrorCode = Field(description="Machine-readable error code.") - suggestions: list[str] = Field(description="Actionable suggestions on how to resolve the error.") - field_errors: list[FieldError] = Field(description="Validation errors for specific fields.") diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/__init__.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/checks.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/checks.py deleted file mode 100644 index d2e338bc2e..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/metrics/checks.py +++ /dev/null @@ -1,281 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Prechecks for metric job validation.""" - -import asyncio -import logging -from typing import Any - -import nmp.evaluator.app.values as app -from nemo_platform import AsyncNeMoPlatform -from nmp.evaluator.api.v2.common.checks import ( - ValidationResult, - collect_schema_target_errors, - format_model_reachability_error, - mapping_hint, - prompt_hint, - schema_error_message, - validation_result_from_exception, -) -from nmp.evaluator.api.v2.metrics.schemas.jobs import MetricJob -from nmp.evaluator.app.dataset_schemas import ( - TemplateSchemaInferenceError, - group_schema_resolution_targets, - prune_schema_properties, - resolve_dataset_schema_targets, - runtime_available_evaluator_fields, - validate_dataset_schema_requirement, - validate_prompt_template_against_dataset_schema, -) -from nmp.evaluator.app.values import Dataset as DatasetValue - -log = logging.getLogger(__name__) - - -async def job_fileset_exists_check(job: MetricJob, sdk: AsyncNeMoPlatform) -> ValidationResult: - """Check if the fileset dataset exists using the fileset API. - - Args: - job: The metric job input to validate. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - - Returns: - ValidationResult indicating if the fileset exists. - """ - # Lazy imports to avoid slow startup (SDK imports kubernetes, etc.) - from nmp.evaluator.app.datasets.nmp_datasets.fileset import dataset_exists as fileset_exists - - # Check if job has a dataset attribute - dataset: DatasetValue | None = getattr(job, "dataset", None) - if dataset is None: - return ValidationResult(True) - - log.info(f"job_fileset_exists_check: dataset type={type(dataset).__name__}, value={dataset}") - - try: - exists = await fileset_exists(sdk, dataset) - if not exists: - return ValidationResult(False, ["Dataset does not exist in fileset."]) - except Exception as e: - return ValidationResult(False, [f"Error checking fileset existence: {e}"]) - - return ValidationResult(True) - - -def _to_dict(value: Any) -> dict | None: - """Convert a value to a dict (Pydantic model or dict).""" - if value is None: - return None - - if hasattr(value, "model_dump"): - dumped = value.model_dump() - return dumped if isinstance(dumped, dict) else None - if isinstance(value, dict): - return value - - return None - - -def _extract_model_dict(value: Any) -> dict | None: - """Extract a model dictionary from a value (Pydantic model or dict).""" - value_dict = _to_dict(value) - if value_dict and isinstance(value_dict, dict) and "url" in value_dict and "name" in value_dict: - return value_dict - return None - - -def _extract_model_from_metric(job: MetricJob) -> dict | None: - """Extract model dictionary from job.metric (for inline LLM Judge metrics and other metrics with models).""" - metric = getattr(job, "metric", None) - if metric is None: - return None - - # Try to access model attribute directly (for Pydantic models like app.LLMJudgeMetric) - metric_model = getattr(metric, "model", None) - - # If not found as attribute, try accessing from dict representation - if metric_model is None: - metric_dict = _to_dict(metric) - if metric_dict: - metric_model = metric_dict.get("model") - - # If still no model found, this metric doesn't have a model field - if metric_model is None: - return None - - # Extract model dict (handles both Model objects and dicts) - model_dict = _extract_model_dict(metric_model) - if model_dict: - log.debug( - f"_extract_model_from_metric: Found model in job.metric: {model_dict.get('name', 'unknown')} at {model_dict.get('url', 'unknown')}" - ) - return model_dict - - -def _extract_judge_model_from_params(job: MetricJob) -> dict | None: - """Extract judge model dictionary from job.metric_params.""" - metric_params = getattr(job, "metric_params", None) - if not metric_params or not isinstance(metric_params, dict): - return None - - judge = metric_params.get("judge") - if not judge or not isinstance(judge, dict): - return None - - judge_model = judge.get("model") - return _extract_model_dict(judge_model) - - -async def job_model_check(job: MetricJob, workspace: str, sdk: AsyncNeMoPlatform) -> ValidationResult: - """Check if models in a metric job are reachable. - - Args: - job: The metric job input to validate. - workspace: Workspace for resolving secrets. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - - Returns: - ValidationResult indicating if all models are reachable. - """ - - models_to_check: list[tuple[str, dict]] = [] - - # Check job.model if present (for online/RAG jobs) - model = getattr(job, "model", None) - model_dict = _extract_model_dict(model) - if model_dict: - models_to_check.append(("job.model", model_dict)) - - # Check job.metric.model if present (for inline LLM Judge metrics and other metrics with models) - metric_model_dict = _extract_model_from_metric(job) - if metric_model_dict: - log.info(f"job_model_check: Found model in job.metric.model: {metric_model_dict.get('name', 'unknown')}") - models_to_check.append(("job.metric.model", metric_model_dict)) - else: - metric = getattr(job, "metric", None) - if metric: - log.debug( - f"job_model_check: No model found in job.metric. Metric type: {type(metric).__name__}, metric: {metric}" - ) - - # Check metric_params.judge.model if present (for metrics requiring judge) - judge_model_dict = _extract_judge_model_from_params(job) - if judge_model_dict: - models_to_check.append(("metric_params.judge.model", judge_model_dict)) - - if not models_to_check: - return ValidationResult(True) - - # Check all models in parallel, resolving secrets before checking reachability - from nmp.evaluator.app.inference import verify_model_reachable - - results = await asyncio.gather( - *[verify_model_reachable(model_dict, sdk=sdk, workspace=workspace) for _, model_dict in models_to_check], - return_exceptions=True, - ) - errors = [] - for (name, model_dict), result in zip(models_to_check, results, strict=True): - # Only treat Exceptions as errors; successful responses are dicts - if isinstance(result, Exception): - errors.append(format_model_reachability_error(name, model_dict, result)) - - if errors: - return ValidationResult(False, errors) - return ValidationResult(True) - - -async def metric_dataset_schema_check( - job: MetricJob, - metric: app.Metric, - sdk: AsyncNeMoPlatform, -) -> ValidationResult: - """Validate that the dataset schema is compatible with the metric requirements.""" - dataset = getattr(job, "dataset", None) - if dataset is None: - return ValidationResult(True) - - try: - dataset_targets = await resolve_dataset_schema_targets(dataset, sdk) - except Exception as e: - return validation_result_from_exception("Invalid dataset schema metadata", e) - if not dataset_targets: - return ValidationResult(True) - dataset_targets = group_schema_resolution_targets(dataset_targets) - - job_type = job.__job_type__ - field_mapping = getattr(job, "field_mapping", app.FieldMapping()) - metric_errors: list[str] = [] - prompt_errors: list[str] = [] - - try: - input_schema = metric.input_schema() - required_schema = prune_schema_properties( - input_schema.schema_, - runtime_available_evaluator_fields(job_type), - ) - except TemplateSchemaInferenceError as e: - return validation_result_from_exception("Unsupported metric prompt template for schema inference", e) - except Exception as e: - return validation_result_from_exception("Invalid dataset schema metadata", e) - - def validate_metric_schema(dataset_schema: dict | None) -> ValidationResult: - if dataset_schema is None: - return ValidationResult(True) - errors = validate_dataset_schema_requirement(dataset_schema, required_schema, field_mapping) - return ValidationResult(not errors, errors) - - try: - metric_errors.extend(collect_schema_target_errors(dataset_targets, validate_metric_schema)) - except Exception as e: - return validation_result_from_exception("Invalid dataset schema metadata", e) - - prompt_template = getattr(job, "prompt_template", None) - optional_fields = set(getattr(job, "optional_fields", None) or []) - if prompt_template is not None: - - def validate_prompt_schema(dataset_schema: dict | None) -> ValidationResult: - if dataset_schema is None: - return ValidationResult(True) - errors = validate_prompt_template_against_dataset_schema( - dataset_schema, - prompt_template, - field_mapping, - ignored_roots=runtime_available_evaluator_fields(job_type), - optional_fields=optional_fields, - ) - return ValidationResult(not errors, errors) - - try: - prompt_errors.extend(collect_schema_target_errors(dataset_targets, validate_prompt_schema)) - except TemplateSchemaInferenceError as e: - return validation_result_from_exception("Unsupported prompt template for schema inference", e) - except Exception as e: - return validation_result_from_exception("Invalid dataset schema metadata", e) - - if metric_errors or prompt_errors: - metric_name = getattr(metric, "name", None) or getattr(metric, "type", "metric") - errors: list[str] = [] - if metric_errors: - errors.append( - schema_error_message( - f"Dataset schema is incompatible with metric '{metric_name}'", - metric_errors, - hint=mapping_hint(field_mapping), - ) - ) - if prompt_errors: - errors.append( - schema_error_message( - "Dataset schema is incompatible with the job prompt template", - prompt_errors, - hint=prompt_hint(field_mapping), - ) - ) - return ValidationResult( - False, - errors, - ) - return ValidationResult(True) diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/endpoints.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/endpoints.py deleted file mode 100644 index d5247777a8..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/metrics/endpoints.py +++ /dev/null @@ -1,615 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import logging -import textwrap -from typing import Annotated, Literal - -import nmp.evaluator.app.values as app -from fastapi import APIRouter, Depends, HTTPException, Query, Request, status -from fastapi.routing import APIRoute -from nemo_evaluator_sdk.values import AggregatedMetricResult, RowScore -from nemo_platform import AsyncNeMoPlatform -from nemo_platform_plugin.entities import EntityClient -from nemo_platform_plugin.jobs.api_factory import ( - FileResultSerializer, - PlatformJobResultRoute, - PlatformJobSpec, - PydanticJSONLResultSerializer, - PydanticResultSerializer, - job_route_factory, -) -from nmp.common.api.common import DeleteResponse -from nmp.common.api.parsed_filter import ParsedFilter, make_filter_dep -from nmp.common.entities import SYSTEM_WORKSPACE -from nmp.common.service.dependencies import get_entity_client, get_sdk_client -from nmp.evaluator.api.v2.common.query_params import AggregateFieldsQuery, validate_list_query_params -from nmp.evaluator.api.v2.common.schemas import ErrorResponse -from nmp.evaluator.api.v2.metrics.manager import ( - MetricDeletionError, - MetricEvaluationError, - MetricResolutionError, - MetricRetrievalError, - MetricsManager, -) -from nmp.evaluator.api.v2.metrics.schemas.evaluation import ( - MetricEvaluationRequest, - MetricEvaluationResponse, -) -from nmp.evaluator.api.v2.metrics.schemas.jobs import ( - MetricJob, -) -from nmp.evaluator.api.v2.metrics.schemas.metrics import Metric -from nmp.evaluator.api.v2.metrics.schemas.metrics_resp import ( - MetricJobResult, - MetricJobResultsListFilter, - MetricJobResultsListResponse, - MetricResponse, - MetricsListFilter, - MetricsListResponse, -) -from nmp.evaluator.app.jobs.constants import ( - JOB_RESULTS_AGGREGATE_SCORES, - JOB_RESULTS_ROW_SCORES, - JOBS_RESULTS_ARTIFACTS, -) - -_logger = logging.getLogger(__name__) - - -API_TAG = "Evaluator" - - -router = APIRouter() - - -def get_metrics_manager(entity_client: Annotated[EntityClient, Depends(get_entity_client)]) -> MetricsManager: - return MetricsManager(entity_client) - - -MetricsManagerDep = Annotated[MetricsManager, Depends(get_metrics_manager)] - - -# ============================================================================= -# /v2/workspaces/{workspace}/metric-jobs -# ============================================================================= - - -async def platform_job_config_compiler( - workspace: str, - original_spec: MetricJob, - transformed_spec: MetricJob, - entity_client: EntityClient, - job_name: str | None, - sdk: AsyncNeMoPlatform, -) -> PlatformJobSpec: - """Compile a metric job spec to a platform job spec. - - This function provides exception mapping for the manager's compile_job method. - - Args: - workspace: The workspace for this job. - original_spec: The user-provided input specification. - transformed_spec: The spec after applying the input-to-output transformer. - Since no transformer is configured for metrics, original_spec - and transformed_spec are identical (both MetricJob). - entity_client: Entity client for lookups. - job_name: The resolved job name (user-provided or auto-generated). - sdk: SDK instance for accessing secrets with user context. - """ - if isinstance(transformed_spec.metric, app.SystemMetric): - # SystemMetric is needed for job response but job types represent input+response - # We return 422 invalid payload when request contains inline system metrics until supported. - err_msg = f"Unsupported job with custom system metric. Use metric reference instead 'system/': {transformed_spec.metric}" - raise HTTPException(status_code=422, detail=err_msg) - - metrics_manager = get_metrics_manager(entity_client) - - try: - return await metrics_manager.compile_job(workspace, transformed_spec, sdk=sdk) - except MetricRetrievalError as e: - raise HTTPException(status_code=404, detail=e.detail) from e - except MetricResolutionError as e: - raise HTTPException(status_code=403, detail=e.detail) from e - except (KeyError, ValueError, AssertionError, RuntimeError) as e: - detail = str(e) or f"Job compilation failed: {type(e).__name__}" - raise HTTPException(status_code=422, detail=detail) from e - - -_jobs_router = job_route_factory( - # Use distinct job sources to prevent mixing incompatible job specs when listing. - # (MetricEvaluation and BenchmarkEvaluation jobs have different spec schemas.) - service_name="evaluator-metrics", - job_type="MetricEvaluation", - job_input=MetricJob, - platform_job_config_compiler=platform_job_config_compiler, - job_result_routes=[ - PlatformJobResultRoute( - name=JOB_RESULTS_AGGREGATE_SCORES, - serializer=PydanticResultSerializer(model=AggregatedMetricResult), - ), - PlatformJobResultRoute( - name=JOB_RESULTS_ROW_SCORES, - serializer=PydanticJSONLResultSerializer(model=RowScore), - ), - PlatformJobResultRoute(name=JOBS_RESULTS_ARTIFACTS, serializer=FileResultSerializer()), - ], -) - -# Rebase job routes from /jobs to / so we can include with /metric-jobs prefix. -# This avoids route collision with /metrics/{name} endpoints. -_metric_jobs_router = APIRouter() -for route in _jobs_router.routes: - if isinstance(route, APIRoute): - # Remove /jobs prefix from path: '/jobs' -> '', '/jobs/{name}' -> '/{name}' - new_path = route.path - if new_path.startswith("/jobs"): - new_path = new_path[5:] - _metric_jobs_router.add_api_route( - path=new_path, - endpoint=route.endpoint, - methods=route.methods, - name=route.name, - response_model=route.response_model, - status_code=route.status_code, - tags=route.tags, - dependencies=route.dependencies, - summary=route.summary, - description=route.description, - response_description=route.response_description, - responses=route.responses, - deprecated=route.deprecated, - operation_id=route.operation_id, - response_model_include=route.response_model_include, - response_model_exclude=route.response_model_exclude, - response_model_by_alias=route.response_model_by_alias, - response_model_exclude_unset=route.response_model_exclude_unset, - response_model_exclude_defaults=route.response_model_exclude_defaults, - response_model_exclude_none=route.response_model_exclude_none, - include_in_schema=route.include_in_schema, - response_class=route.response_class, - openapi_extra=route.openapi_extra, - ) - -# TODO: There are no endpoints to list/filter job results -# We'll need to call list-jobs, and then for each job, call get-job-results -# Until then, these endpoints will not be available: -# GET /metrics/{namespace}/{name}/jobs/results # all results for a metric -# GET /metrics/jobs/results # all results for all metric jobs - -router.include_router(_metric_jobs_router, prefix="/v2/workspaces/{workspace}/metric-jobs") - - -# ============================================================================= -# /v2/workspaces/{workspace}/metrics -# ============================================================================= - - -@router.get( - "/v2/workspaces/{workspace}/metrics", - description="List evaluation metrics.", - response_model=MetricsListResponse, - tags=[API_TAG], - response_model_exclude_none=True, - openapi_extra={ - "parameters": [ - { - "in": "query", - "name": "filter", - "style": "deepObject", - "required": False, - "explode": True, - "schema": MetricsListFilter.model_json_schema(ref_template="#/components/schemas/{model}"), - "description": ( - "Filter metrics by name, description, type, project, and dates. " - "Supports JSON filter syntax with operators: " - "$eq, $like, $lt, $lte, $gt, $gte, $in, $nin, $and, $or, $not. " - "Also supports text filter syntax." - ), - }, - ] - }, - responses={ - status.HTTP_400_BAD_REQUEST: { - "description": "Invalid Request Body", - "model": ErrorResponse, - }, - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def list_metrics( - workspace: str, - request: Request, - metrics_manager: MetricsManagerDep, - page: int = Query(default=1, description="Page number."), - page_size: int = Query(default=100, description="Page size."), - sort: Literal["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"] = Query( - default="-created_at", - description="The field to sort by. To sort in decreasing order, use `-` in front of the field name.", - examples=["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"], - ), - parsed_filter: ParsedFilter = Depends(make_filter_dep(MetricsListFilter)), -): - """List evaluation metrics with optional filtering, pagination, and sorting.""" - - validate_list_query_params(request) - _logger.info("Listing metrics", extra={"workspace": workspace}) - - return await metrics_manager.get_all( - workspace=workspace, - page=page, - page_size=page_size, - sort=sort, - parsed_filter=parsed_filter, - ) - - -@router.get( - "/v2/workspaces/{workspace}/metrics/{name}", - description="Get a specific evaluation metric by workspace and metric name.", - response_model=MetricResponse, - tags=[API_TAG], - response_model_exclude_none=True, - responses={ - status.HTTP_200_OK: { - "description": "Metric Found", - "model": MetricResponse, - }, - status.HTTP_404_NOT_FOUND: { - "description": "Metric Not Found", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def get_metric(workspace: str, name: str, metrics_manager: MetricsManagerDep): - """Get a specific evaluation metric by workspace and metric name.""" - _logger.info("Getting metric", extra={"workspace": workspace, "metric_name": name}) - - try: - return await metrics_manager.get_by_name(workspace, name) - except MetricRetrievalError as e: - if e.error_code == "METRIC_NOT_FOUND": - raise HTTPException(status_code=404, detail=e.detail) from e - else: - raise HTTPException(status_code=500, detail=e.detail) from e - - -@router.post( - "/v2/workspaces/{workspace}/metrics/{name}", - description=textwrap.dedent(""" - Create a new custom evaluation metric. - - Metrics can be reused across multiple evaluations. The metric type determines - the evaluation method (currently only LLM-as-a-Judge is supported). - """), - response_model=MetricResponse, - tags=[API_TAG], - response_model_exclude_none=True, - responses={ - status.HTTP_201_CREATED: { - "description": "Metric Created Successfully", - "model": MetricResponse, - }, - status.HTTP_400_BAD_REQUEST: { - "description": "Invalid Request Body", - "model": ErrorResponse, - }, - status.HTTP_403_FORBIDDEN: { - "description": "Not Authorized to Create Metric.", - "model": ErrorResponse, - }, - status.HTTP_409_CONFLICT: { - "description": "Metric Already Exists", - "model": ErrorResponse, - }, - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def create_metric( - workspace: str, - name: str, - metric_request: Metric, - metrics_manager: MetricsManagerDep, - sdk: AsyncNeMoPlatform = Depends(get_sdk_client), -): - """Create a new evaluation metric.""" - if workspace == SYSTEM_WORKSPACE: - raise HTTPException( - status_code=403, - detail="Cannot create metric in 'system' workspace reserved for system defined entities. Select another workspace for the metric.", - ) - - _logger.info("Creating metric", extra={"workspace": workspace, "metric_name": name}) - return await metrics_manager.create_from_request(name=name, workspace=workspace, request=metric_request, sdk=sdk) - - -@router.delete( - "/v2/workspaces/{workspace}/metrics/{name}", - description=textwrap.dedent(""" - Delete a custom evaluation metric. Predefined metrics cannot be deleted. - """), - response_model=DeleteResponse, - tags=[API_TAG], - responses={ - status.HTTP_200_OK: { - "description": "Metric Deleted Successfully", - "model": DeleteResponse, - }, - status.HTTP_403_FORBIDDEN: { - "description": "Not Authorized to Delete Metric.", - "model": ErrorResponse, - }, - status.HTTP_404_NOT_FOUND: { - "description": "Metric Not Found", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def delete_metric(workspace: str, name: str, metrics_manager: MetricsManagerDep): - """Delete a custom evaluation metric.""" - if workspace == SYSTEM_WORKSPACE: - raise HTTPException( - status_code=403, - detail="Cannot delete metric in 'system' workspace reserved for system defined entities. Select another workspace for the metric.", - ) - - _logger.info("Deleting metric", extra={"workspace": workspace, "metric_name": name}) - - try: - return await metrics_manager.delete(workspace, name) - except MetricDeletionError as e: - if e.error_code == "METRIC_NOT_FOUND": - raise HTTPException(status_code=404, detail=e.detail) - else: - raise HTTPException(status_code=500, detail=e.detail) - - -# ============================================================================= -# /v2/workspaces/{workspace}/metric-job-results -# ============================================================================= - - -@router.get( - "/v2/workspaces/{workspace}/metric-job-results", - description="List stored evaluation results for metric jobs.", - response_model=MetricJobResultsListResponse, - tags=[API_TAG], - response_model_exclude_none=True, - openapi_extra={ - "parameters": [ - { - "in": "query", - "name": "filter", - "style": "deepObject", - "required": False, - "explode": True, - "schema": MetricJobResultsListFilter.model_json_schema(ref_template="#/components/schemas/{model}"), - "description": ( - "Filter metric job results by name, metric, dataset, model, and dates. " - "Supports JSON filter syntax with operators: " - "$eq, $like, $lt, $lte, $gt, $gte, $in, $nin, $and, $or, $not. " - "Also supports text filter syntax." - ), - }, - ] - }, - responses={ - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Query Parameter Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def list_metric_job_results( - workspace: str, - request: Request, - metrics_manager: MetricsManagerDep, - aggregate_fields: AggregateFieldsQuery, - page: int = Query(default=1, description="Page number."), - page_size: int = Query(default=100, description="Page size."), - sort: Literal["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"] = Query( - default="-created_at", - description="The field to sort by. To sort in decreasing order, use `-` in front of the field name.", - examples=["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"], - ), - parsed_filter: ParsedFilter = Depends(make_filter_dep(MetricJobResultsListFilter)), -): - """List metric job results with optional filtering, pagination, and sorting.""" - - validate_list_query_params(request) - _logger.info("Listing metric job results", extra={"workspace": workspace}) - - # Convert list to frozenset (or None if empty to use defaults) - fields = frozenset(aggregate_fields) if aggregate_fields else None - - return await metrics_manager.get_job_results( - workspace=workspace, - aggregate_fields=fields, - page=page, - page_size=page_size, - sort=sort, - parsed_filter=parsed_filter, - ) - - -@router.get( - "/v2/workspaces/{workspace}/metric-job-results/{name}", - description="Get a specific metric job result by workspace and job name.", - response_model=MetricJobResult, - tags=[API_TAG], - response_model_exclude_none=True, - responses={ - status.HTTP_200_OK: { - "description": "Metric Job Result Found", - "model": MetricJobResult, - }, - status.HTTP_404_NOT_FOUND: { - "description": "Metric Job Result Not Found", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def get_metric_job_result( - workspace: str, name: str, metrics_manager: MetricsManagerDep, aggregate_fields: AggregateFieldsQuery -): - """Get a specific metric job result by workspace and job name.""" - _logger.info("Getting metric job result", extra={"workspace": workspace, "metric_job_result_name": name}) - - # Convert list to frozenset (or None if empty to use defaults) - fields = frozenset(aggregate_fields) if aggregate_fields else None - - try: - return await metrics_manager.get_job_result(workspace, name, aggregate_fields=fields) - except MetricRetrievalError as e: - if e.error_code == "METRIC_JOB_RESULT_NOT_FOUND": - raise HTTPException(status_code=404, detail=e.detail) from e - else: - raise HTTPException(status_code=500, detail=e.detail) from e - - -@router.delete( - "/v2/workspaces/{workspace}/metric-job-results/{name}", - description="Delete an evaluation metric job result.", - response_model=DeleteResponse, - tags=[API_TAG], - responses={ - status.HTTP_200_OK: { - "description": "Metric Job Result Deleted Successfully", - "model": DeleteResponse, - }, - status.HTTP_404_NOT_FOUND: { - "description": "Metric Job Result Not Found", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def delete_metric_job_result(workspace: str, name: str, metrics_manager: MetricsManagerDep): - """Delete an evaluation metric job result.""" - _logger.info("Deleting metric job result", extra={"workspace": workspace, "metric_job_result_name": name}) - - try: - return await metrics_manager.delete_job_result(workspace, name) - except MetricDeletionError as e: - if e.error_code == "METRIC_JOB_RESULT_NOT_FOUND": - raise HTTPException(status_code=404, detail=e.detail) - else: - raise HTTPException(status_code=500, detail=e.detail) - - -# ============================================================================= -# /v2/workspaces/{workspace}/metric-evaluate -# ============================================================================= - - -# NOTE: This endpoint accepts the metric in the request body (URN or inline definition), -# following the pattern of /live. If needed, we could add a convenience endpoint: -# POST /v2/workspaces/{workspace}/metrics/{name}/evaluate -# That would only accept samples in the body and resolve the metric from the path. -# For now, this single endpoint covers both stored and inline metric evaluation. -# -# TODO: Add query parameter to control expanding/collapsing properties like `metric` to their URN value. -@router.post( - "/v2/workspaces/{workspace}/metric-evaluate", - description=textwrap.dedent(""" - Run a synchronous metric evaluation on a dataset. - - This endpoint evaluates the given dataset using the specified metric and returns - results immediately. Use this for quick, interactive evaluations with small datasets - (up to 10 rows). For larger evaluations, use the async job-based evaluation endpoints. - - The metric can be specified either as a URN reference to a stored metric - (e.g., "workspace/metric_name") or as an inline metric definition. - - The dataset must be provided inline with rows. - - **Aggregate Score Fields:** - The `name` and `count` fields are always included in aggregate scores. - By default, additional fields returned are: nan_count, sum, mean, min, max. - Use the `aggregate_fields` query parameter to customize which optional fields - are included (e.g., std_dev, variance, percentiles, histogram, rubric_distribution, mode_category). - """), - response_model=MetricEvaluationResponse, - tags=[API_TAG], - response_model_exclude_none=True, - responses={ - status.HTTP_200_OK: { - "description": "Evaluation Completed Successfully", - "model": MetricEvaluationResponse, - }, - status.HTTP_400_BAD_REQUEST: { - "description": "Invalid Request Body", - "model": ErrorResponse, - }, - status.HTTP_404_NOT_FOUND: { - "description": "Metric Not Found", - "model": ErrorResponse, - }, - status.HTTP_422_UNPROCESSABLE_CONTENT: { - "description": "Validation Error", - "model": ErrorResponse, - }, - status.HTTP_500_INTERNAL_SERVER_ERROR: { - "description": "Internal Server Error", - "model": ErrorResponse, - }, - }, -) -async def evaluate_metric( - workspace: str, - request: MetricEvaluationRequest, - metrics_manager: MetricsManagerDep, - aggregate_fields: AggregateFieldsQuery, - sdk: AsyncNeMoPlatform = Depends(get_sdk_client), -): - """Run a metric evaluation on a dataset.""" - # Convert list to frozenset (or None if empty to use defaults) - fields = frozenset(aggregate_fields) if aggregate_fields else None - - try: - return await metrics_manager.evaluate( - workspace=workspace, - metric_ref=request.metric, - dataset=request.dataset, - sdk=sdk, - aggregate_fields=fields, - ) - except MetricRetrievalError as e: - raise HTTPException(status_code=404, detail=e.detail) from e - except MetricResolutionError as e: - raise HTTPException(status_code=400, detail=e.detail) from e - except MetricEvaluationError as e: - raise HTTPException(status_code=500, detail=e.detail) from e diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/manager.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/manager.py deleted file mode 100644 index 95dccf9db7..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/metrics/manager.py +++ /dev/null @@ -1,661 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import logging -from datetime import datetime, timezone -from typing import Literal, cast, get_args - -import nmp.evaluator.app.values as app -import nmp.evaluator.entities as entities -from nemo_evaluator_sdk.execution.metric_execution import ( - ComputeMetricPipeline, - run_generated_sample_scoring_pipeline, -) -from nemo_evaluator_sdk.execution.scoring import finalize_evaluation_result -from nemo_evaluator_sdk.execution.values import EvaluationError -from nemo_evaluator_sdk.metrics.utils import metric_type_name -from nemo_evaluator_sdk.resilience.errors import get_evaluation_error -from nemo_evaluator_sdk.resolver_protocols import SecretResolver -from nemo_evaluator_sdk.values import ( - AggregateFieldName, - DatasetRows, - DefaultAggregateFieldName, - RunConfig, - SecretRef, - SupportedJobTypes, -) -from nemo_evaluator_sdk.values.metrics import _RAGASEmbeddingsConfig, _RAGASJudgeConfig -from nemo_platform import AsyncNeMoPlatform, NotFoundError -from nemo_platform_plugin.entities import EntityClient -from nemo_platform_plugin.jobs.api_factory import PlatformJobSpec -from nmp.common.api.common import DeleteResponse, PaginationData -from nmp.common.api.common import SecretRef as ApiSecretRef -from nmp.common.api.parsed_filter import ParsedFilter -from nmp.common.entities import SYSTEM_WORKSPACE, EntityBase, EntityNotFoundError, ListResponse -from nmp.common.observability.otel import MARK_INTERNAL_REQUEST_HEADERS, scoped_otel_headers -from nmp.common.sdk_factory import get_async_platform_sdk -from nmp.evaluator.api.v2.common.checks import CompositeCheck -from nmp.evaluator.api.v2.common.model_resolution import ( - ResolvableModels, - resolve_model, - resolve_params_model_refs, - rewrite_models_for_job_container, -) -from nmp.evaluator.api.v2.metrics.checks import ( - job_fileset_exists_check, - job_model_check, - metric_dataset_schema_check, -) -from nmp.evaluator.api.v2.metrics.mapper import MetricMapper -from nmp.evaluator.api.v2.metrics.schemas.evaluation import ( - MetricEvaluationResponse, - MetricEvaluationRowScore, -) -from nmp.evaluator.api.v2.metrics.schemas.jobs import MetricJob, MetricOnlineJob, MetricRetrieverJob -from nmp.evaluator.api.v2.metrics.schemas.metrics import Metric -from nmp.evaluator.api.v2.metrics.schemas.metrics_resp import ( - MetricJobResult, - MetricJobResultsListResponse, - MetricResponse, - MetricResponseAdapter, - MetricsListResponse, -) -from nmp.evaluator.app.evalfactory.system import get_all_system_metrics -from nmp.evaluator.app.jobs.metrics import compile_metric_job -from nmp.evaluator.app.metrics.metric import new_metric -from pydantic import BaseModel -from tenacity import retry, stop_after_attempt, wait_exponential - -_logger = logging.getLogger(__name__) - - -class _PlatformSecretResolver: - """Resolve evaluator SDK secret refs through the request-scoped platform SDK.""" - - def __init__(self, *, workspace: str, sdk: AsyncNeMoPlatform) -> None: - self._workspace = workspace - self._sdk = sdk - - async def resolve_secret(self, secret_ref: SecretRef) -> str | None: - try: - secret = await self._sdk.secrets.access(secret_ref.root, workspace=self._workspace) - return secret.value - except NotFoundError as e: - raise MetricEvaluationError( - "SECRET_NOT_FOUND", - f"Secret '{self._workspace}/{secret_ref.root}' required by metric not found.", - ) from e - - -def _append_model_secret(secrets: list[SecretRef | ApiSecretRef], model: object) -> None: - secret = getattr(model, "api_key_secret", None) - if isinstance(secret, SecretRef | ApiSecretRef): - secrets.append(secret) - - -# Fields generated by the entity store that should be excluded from metric comparisons -_ENTITY_METADATA_FIELDS = {"id", "entity_id", "created_at", "updated_at"} - - -def _metrics_equal(metric1: BaseModel, metric2: BaseModel) -> bool: - """Compare two metrics, ignoring database-generated metadata fields.""" - return metric1.model_dump(exclude=_ENTITY_METADATA_FIELDS) == metric2.model_dump(exclude=_ENTITY_METADATA_FIELDS) - - -def _default_aggregate_fields() -> frozenset[AggregateFieldName]: - """Return the default aggregate fields with the literal type retained for ty.""" - return cast(frozenset[AggregateFieldName], frozenset(get_args(DefaultAggregateFieldName))) - - -MetricsServiceError = Literal[ - "METRIC_JOB_RESULT_NOT_FOUND", - "METRIC_NOT_FOUND", - "SECRET_NOT_FOUND", - "INVALID_METRIC", - "DATASET_NOT_FOUND", - "EVALUATION_FAILED", -] - -DEFAULT_PARALLELISM = 8 - - -class _MetricsServiceError(Exception): - error_code: MetricsServiceError - detail: str - - def __init__(self, error_code: MetricsServiceError, detail: str): - super().__init__(f"{error_code}: {detail}") - self.error_code = error_code - self.detail = detail - - -class MetricCreationError(_MetricsServiceError): ... - - -class MetricRetrievalError(_MetricsServiceError): ... - - -class MetricDeletionError(_MetricsServiceError): ... - - -class MetricEvaluationError(_MetricsServiceError): ... - - -class MetricResolutionError(_MetricsServiceError): ... - - -class MetricsManager: - def __init__(self, entity_client: EntityClient, *, as_service: str | None = None): - self._entity_client = entity_client - self._as_service = as_service - self._mapper = MetricMapper() - - async def get_all( - self, - *, - workspace: str, - page: int = 1, - page_size: int = 100, - sort: Literal["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"] = "-created_at", - parsed_filter: ParsedFilter | None = None, - ) -> MetricsListResponse: - filter_op = parsed_filter.operation if parsed_filter else None - resp = await self._entity_client.list( - entities.Metric, - workspace=workspace, - sort=sort, - page=page, - page_size=page_size, - filter_operation=filter_op, - ) - return MetricsListResponse( - data=[self._mapper.entity_to_schema_via_adapter(metric, MetricResponseAdapter) for metric in resp.data], - pagination=PaginationData(**resp.pagination.model_dump()), - sort=sort, - filter=parsed_filter.to_response() if parsed_filter else None, - ) - - async def get_by_name(self, workspace: str, name: str) -> MetricResponse: - try: - if workspace == SYSTEM_WORKSPACE: - metric = await self._entity_client.get(entities.SystemMetric, workspace=workspace, name=name) - else: - metric = await self._entity_client.get(entities.Metric, workspace=workspace, name=name) - except EntityNotFoundError as e: - raise MetricRetrievalError("METRIC_NOT_FOUND", f"Metric '{workspace}/{name}' not found.") from e - return self._mapper.entity_to_schema_via_adapter(metric, MetricResponseAdapter) - - async def create(self, metric: entities.Metric, sdk: AsyncNeMoPlatform) -> MetricResponse: - """ - Verify secret references before creating entity. - - Args: - metric: The metric entity to create. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - """ - secrets: list[SecretRef | ApiSecretRef] = [] - if isinstance(metric, entities.RemoteMetric | entities.NemoAgentToolkitRemoteMetric): - if metric.api_key_secret is not None: - secrets.append(metric.api_key_secret) - - if isinstance(metric, entities.LLMJudgeMetric): - _append_model_secret(secrets, metric.model) - elif isinstance(metric, _RAGASJudgeConfig): - _append_model_secret(secrets, metric.judge_model) - if isinstance(metric, _RAGASEmbeddingsConfig): - _append_model_secret(secrets, metric.embeddings_model) - for secret in secrets: - try: - _ = await sdk.secrets.retrieve(secret.root, workspace=metric.workspace) - except NotFoundError as e: - raise MetricCreationError( - "SECRET_NOT_FOUND", - f"Secret '{metric.workspace}/{secret.root}' specified in metric {metric.name!r} not found.", - ) from e - - resp = await self._entity_client.create(metric) - return self._mapper.entity_to_schema_via_adapter(resp, MetricResponseAdapter) - - async def create_from_request( - self, name: str, workspace: str, request: Metric, sdk: AsyncNeMoPlatform - ) -> MetricResponse: - """Create a metric entity from a request DTO. - - Uses MetricMapper to handle model resolution and entity construction, - then validates secrets before persisting. - - Args: - name: Metric name (from path parameter) - workspace: Workspace (from path parameter) - request: Metric request DTO - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - request: The metric request DTO - - Returns: - The created metric entity - """ - try: - metric = await self._mapper.request_to_entity(request, name, workspace) - except ValueError as e: - raise MetricCreationError("INVALID_METRIC", str(e)) from e - return await self.create(metric, sdk) - - async def delete(self, workspace: str, name: str) -> DeleteResponse: - try: - metric = await self._entity_client.get(entities.Metric, workspace=workspace, name=name) - except EntityNotFoundError as e: - raise MetricDeletionError("METRIC_NOT_FOUND", f"Metric '{workspace}/{name}' not found.") from e - await self._entity_client.delete(entities.Metric, metric.name, workspace=workspace) - return DeleteResponse( - message="Resource deleted successfully", - id=f"{workspace}/{name}", - deleted_at=datetime.now(timezone.utc), - ) - - async def exists(self, workspace: str, name: str) -> bool: - try: - await self._entity_client.get(entities.Metric, workspace=workspace, name=name) - except EntityNotFoundError: - return False - return True - - async def get_metric( - self, metric: app.MetricRef | Metric | app.Metric | entities.Metric | entities.SystemMetric - ) -> app.Metric: - """ - Get a metric from a reference, inline definition, or entity. - - - References are looked up from the entity store - - Inline metrics have their ModelRef fields resolved, then are converted to app-layer types - - Entity-based metrics are validated and returned - - Args: - metric: Reference (e.g. "workspace/name"), inline definition, or entity. - - Returns: - The metric configuration with all ModelRef fields resolved to Model. - - Raises: - MetricRetrievalError: If reference points to a non-existent metric. - MetricResolutionError: If metric uses reserved 'system' workspace. - """ - if isinstance(metric, app.MetricRef): - # String reference - look up stored metric - workspace, name = metric.root.split("/") - referenced_metric = await self.get_by_name(workspace, name) - if referenced_metric is None: - raise MetricRetrievalError("METRIC_NOT_FOUND", f"Metric '{workspace}/{name}' not found.") - return app.MetricAdapter.validate_python(referenced_metric.model_dump(exclude_none=True)) - - if isinstance(metric, EntityBase): - return app.MetricAdapter.validate_python(metric.model_dump(exclude_none=True)) - - # Resolve any ModelRef fields to Model before converting to app-layer types. - # API-layer metrics may have ModelRef strings (e.g. "workspace/model_name") for - # model fields. These must be resolved to concrete Model instances because - # the app layer only accepts Model. - data = metric.model_dump(exclude_none=True) - if isinstance(metric, ResolvableModels): - resolved_models = await metric.resolve_models(resolve_model) - data.update({k: v.model_dump() for k, v in resolved_models.items()}) - - return app.MetricAdapter.validate_python(data) - - async def compile_job(self, workspace: str, job: MetricJob, sdk: AsyncNeMoPlatform) -> PlatformJobSpec: - """Compile a metric job input to a platform job spec. - - This method: - 1. Retrieves the metric entity from the reference - 2. Validates prechecks (fileset exists) - 3. Compiles to platform job spec - - Args: - workspace: The workspace for the job (from API path parameter). - job: The metric job input specification. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - - Returns: - Platform job specification ready for execution. - - Raises: - MetricRetrievalError: If metric reference points to a non-existent metric. - MetricResolutionError: If metric uses reserved 'system' workspace. - ValueError: If prechecks fail or compilation fails. - """ - refs = {} - if isinstance(job.metric, app.MetricRef): - refs["metric_ref"] = job.metric - if isinstance(job.dataset, app.FilesetRef): - refs["dataset_ref"] = job.dataset - - # Resolve metric reference (also resolves any ModelRef fields for inline metrics) - metric = await self.get_metric(job.metric) - - # Resolve model refs in metric_params (for metrics with judge models like RAGAS metrics) - job.metric_params = await resolve_params_model_refs(job.metric_params) - - # Resolve ModelRef fields on job surfaces before prechecks and app-layer validation. - if isinstance(job, MetricOnlineJob): - if isinstance(job.model, app.ModelRef): - refs["model_ref"] = job.model - job.model = await resolve_model(job.model) - if isinstance(job, MetricRetrieverJob): - job.retriever_pipeline.embeddings_model = await resolve_model(job.retriever_pipeline.embeddings_model) - - # Run prechecks (fileset exists + model reachability) - result = await CompositeCheck( - job_fileset_exists_check(job, sdk=sdk), - job_model_check(job, workspace, sdk=sdk), - metric_dataset_schema_check(job, metric, sdk), - )() - if not result.status: - raise ValueError(f"Job cannot be launched. Error: {str(result)}") - - # Convert API schema to MetricJob and compile - job_data = job.model_dump(exclude_none=True) - job_data["metric"] = metric.model_dump(exclude_none=True) - job_data.update(refs) - job_data = rewrite_models_for_job_container(job_data) - compiled_job = await compile_metric_job(app.MetricJobAdapter.validate_python(job_data)) - return compiled_job - - def _build_secret_resolver(self, workspace: str, sdk: AsyncNeMoPlatform) -> SecretResolver: - """Build a secret resolver that uses the provided SDK instance. - - Args: - workspace: Workspace for resolving secrets. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - """ - - return _PlatformSecretResolver(workspace=workspace, sdk=sdk) - - async def evaluate( - self, - workspace: str, - metric_ref: app.MetricRef | Metric, - dataset: DatasetRows, - sdk: AsyncNeMoPlatform, - limit_samples: int = 100, - aggregate_fields: frozenset[AggregateFieldName] | None = None, - ) -> MetricEvaluationResponse: - """ - Run a metric evaluation on a dataset. - - This method orchestrates the full evaluation: - 1. Resolves the metric (reference lookup or inline validation) - 2. Instantiates the metric for computation - 3. Runs evaluation via the app layer - 4. Returns the API response directly - - Args: - workspace: Workspace context for the evaluation. - metric_ref: Either a reference, inline metric definition, or resolved Metric. - dataset: Inline dataset with rows. - sdk: SDK instance with request-scoped user context. Required and must be obtained - from Depends(get_sdk_client) in API endpoints to ensure proper user context. - limit_samples: Maximum number of rows to evaluate. - aggregate_fields: Fields to include in aggregate scores. Defaults to - DefaultAggregateFieldName values if not specified. - - Returns: - MetricEvaluationResponse ready for API serialization. - - Raises: - MetricRetrievalError: If reference points to a non-existent metric. - MetricEvaluationError: If metric initialization or evaluation fails. - """ - rows = dataset.rows[:limit_samples] - - # Resolve stored metric params (not runtime metric model) reference - metric_config = await self.get_metric(metric_ref) - - # Generate identifier for logging - metric_id = ( - f"{metric_config.workspace}/{metric_config.name}" - if isinstance(metric_config, EntityBase) - else f"{metric_config.type}/_inline" - ) - - _logger.info("Running metric evaluation", extra={"metric": metric_id, "row_count": len(rows)}) - - # Build secret resolver for this metric - secret_resolver = self._build_secret_resolver(workspace, sdk) - - # Instantiate the metric - try: - metric_impl = await new_metric( - metric_config, - job_type=SupportedJobTypes.OFFLINE, - secret_resolver=secret_resolver, - run_preflight=True, - ) - except ValueError as e: - raise MetricEvaluationError( - "EVALUATION_FAILED", - f"Failed to initialize metric '{metric_id}': {e}", - ) from e - - # Build pipeline (offline: model=None, no inference) - pipeline = ComputeMetricPipeline( - rows=rows, - parallelism=DEFAULT_PARALLELISM, - metric=metric_impl, - target=None, - metric_key=metric_type_name(metric_impl), - params=RunConfig(), - ) - - try: - results = await run_generated_sample_scoring_pipeline(pipeline) - except Exception as e: - eval_error = get_evaluation_error(e) - if isinstance(eval_error, EvaluationError): - detail = f"Evaluation failed at row {eval_error.index}: {eval_error.message}" - else: - _logger.exception( - "Unexpected failure during metric evaluation", - extra={"metric": metric_id, "error_type": type(e).__name__, "error_message": str(e)}, - ) - detail = str(eval_error) - raise MetricEvaluationError("EVALUATION_FAILED", detail) from e - - try: - evaluation_result = await finalize_evaluation_result(metric_impl, results, skip_errored=True) - - # Determine which fields to include in aggregate scores - fields: frozenset[AggregateFieldName] = ( - aggregate_fields if aggregate_fields is not None else _default_aggregate_fields() - ) - agg_scores = [score.with_fields(fields) for score in evaluation_result.aggregate_scores.scores] - - # Convert SDK row scores to API response format - row_scores = [] - failed_count = 0 - for fallback_index, row_score in enumerate(evaluation_result.row_scores): - if row_score.metric_errors: - failed_count += 1 - row_index = row_score.row_index if row_score.row_index is not None else fallback_index - if row_index < 0 or row_index >= len(rows): - raise MetricEvaluationError( - "EVALUATION_FAILED", - f"Pipeline returned out-of-bounds row_index={row_index} for {len(rows)} rows", - ) - row_scores.append( - MetricEvaluationRowScore.from_row_score( - row_score, - row=rows[row_index], - index=row_index, - ) - ) - - _logger.info( - "Metric evaluation completed", - extra={ - "success_count": len(row_scores) - failed_count, - "failed_count": failed_count, - }, - ) - - return MetricEvaluationResponse( - metric=MetricResponseAdapter.validate_python(metric_config.model_dump(exclude_none=True)), - aggregate_scores=agg_scores, - row_scores=row_scores, - ) - except MetricEvaluationError: - raise - except Exception as e: - _logger.exception( - "Unexpected failure during post-pipeline metric evaluation", - extra={"metric": metric_id, "error_type": type(e).__name__, "error_message": str(e)}, - ) - raise MetricEvaluationError("EVALUATION_FAILED", str(e)) from e - - # ============================================================================= - # Metric Job Results - # ============================================================================= - - async def delete_job_result(self, workspace: str, name: str) -> DeleteResponse: - try: - await self._entity_client.get(entities.MetricJobResult, workspace=workspace, name=name) - except EntityNotFoundError as e: - raise MetricDeletionError( - "METRIC_JOB_RESULT_NOT_FOUND", f"Metric job result '{workspace}/{name}' not found." - ) from e - await self._entity_client.delete(entities.MetricJobResult, name, workspace=workspace) - return DeleteResponse( - message="Resource deleted successfully", - id=f"{workspace}/{name}", - deleted_at=datetime.now(timezone.utc), - ) - - async def get_job_result( - self, workspace: str, name: str, aggregate_fields: frozenset[AggregateFieldName] | None = None - ) -> MetricJobResult: - """Get a metric job result.""" - try: - result: entities.MetricJobResult = await self._entity_client.get( - entities.MetricJobResult, workspace=workspace, name=name - ) - except EntityNotFoundError as e: - raise MetricRetrievalError( - "METRIC_JOB_RESULT_NOT_FOUND", f"Metric job result '{workspace}/{name}' not found." - ) from e - - job_result = self._mapper.entity_to_schema(result, MetricJobResult) - if aggregate_fields: - job_result.scores = [score.with_fields(aggregate_fields) for score in job_result.scores] - return job_result - - async def get_job_results( - self, - workspace: str, - aggregate_fields: frozenset[AggregateFieldName] | None = None, - page: int = 1, - page_size: int = 100, - sort: Literal["-created_at", "created_at", "-updated_at", "updated_at", "-name", "name"] = "-created_at", - parsed_filter: ParsedFilter | None = None, - ) -> MetricJobResultsListResponse: - """List metric job results with optional filtering, pagination, and sorting.""" - filter_op = parsed_filter.operation if parsed_filter else None - resp = await self._entity_client.list( - entities.MetricJobResult, - workspace=workspace, - sort=sort, - page=page, - page_size=page_size, - filter_operation=filter_op, - ) - - metrics = [self._mapper.entity_to_schema(result, MetricJobResult) for result in resp.data] - - if aggregate_fields: - for result in metrics: - result.scores = [score.with_fields(aggregate_fields) for score in result.scores] - - return MetricJobResultsListResponse( - data=metrics, - pagination=PaginationData(**resp.pagination.model_dump()), - sort=sort, - filter=parsed_filter.to_response() if parsed_filter else None, - ) - - # ============================================================================= - # System Metrics - # ============================================================================= - - @retry( - stop=stop_after_attempt(10), - wait=wait_exponential(multiplier=1, min=4, max=15), - ) - async def _get_registered_system_metrics(self) -> ListResponse[entities.SystemMetric]: - # Intentionally bypass get_all(): it returns API DTOs with optional entity metadata, - # while this internal startup/cleanup path needs concrete SystemMetric entities. - return await self._entity_client.list( - entities.SystemMetric, - workspace=SYSTEM_WORKSPACE, - page_size=1000, - ) - - @retry( - stop=stop_after_attempt(10), - wait=wait_exponential(multiplier=1, min=4, max=30), - ) - async def _ensure_system_workspace_exists(self) -> None: - # Use service principal if configured for startup/background tasks - _ = await get_async_platform_sdk(as_service=self._as_service, internal=True).workspaces.retrieve( - SYSTEM_WORKSPACE - ) - - async def delete_all_system_metrics(self) -> None: - registered_system_metrics_list = await self._get_registered_system_metrics() - tasks = [] - for metric in registered_system_metrics_list.data: - if metric.name is None: - _logger.warning("Skipping system metric deletion because the registered metric has no name") - continue - _logger.debug("Deleting system metric from entity service", extra={"metric": metric.name}) - tasks.append(self._entity_client.delete(entities.SystemMetric, metric.name, workspace=SYSTEM_WORKSPACE)) - await asyncio.gather(*tasks) - _logger.info("Deleted system metrics from the entity service", extra={"count": len(tasks)}) - - async def register_system_metrics(self, recreate_existing: bool = False) -> None: - # TODO: This is a temporary solution to ensure that the system metrics are registered in the entity service. - # We need to align on the right approach for seed data. - with scoped_otel_headers(MARK_INTERNAL_REQUEST_HEADERS): - await self._register_system_metrics_impl(recreate_existing) - - async def _register_system_metrics_impl(self, recreate_existing: bool) -> None: - await self._ensure_system_workspace_exists() - if recreate_existing: - _logger.info("Reregistering system metrics in the entity service...") - await self.delete_all_system_metrics() - else: - _logger.info("Registering system metrics in the entity service...") - registered_system_metrics_list = await self._get_registered_system_metrics() - registered_system_metrics = {metric.name: metric for metric in registered_system_metrics_list.data} - - tasks = [] - system_metrics = get_all_system_metrics() - metrics_warning = [] - - # Use service SDK for system metric registration (startup task) - service_sdk = get_async_platform_sdk(as_service=self._as_service, internal=True) - for metric in system_metrics: - metric_entity = entities.SystemMetric(**metric.model_dump(exclude_none=True)) - if metric.name not in registered_system_metrics: - _logger.debug("Creating system metric in entity service", extra={"metric": metric.name}) - tasks.append(self.create(metric_entity, sdk=service_sdk)) - elif not _metrics_equal(registered_system_metrics[metric.name], metric_entity): - metrics_warning.append(metric.name) - else: - _logger.debug("System metric is up to date in entity service", extra={"metric": metric.name}) - if metrics_warning: - _logger.warning("System metric is not up to date in entity service", extra={"metrics": metrics_warning}) - - await asyncio.gather(*tasks) - _logger.info("Registered new system metrics in the entity service", extra={"count": len(tasks)}) diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/mapper.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/mapper.py deleted file mode 100644 index d27e6b04cc..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/metrics/mapper.py +++ /dev/null @@ -1,103 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Mapper for converting between metric request DTOs and entity types.""" - -from typing import Type, TypeVar - -import nmp.evaluator.entities as entities -from nemo_evaluator_sdk.values import MetricBase -from nmp.common.entities import EntityBase -from nmp.evaluator.api.v2.common.model_resolution import ResolvableModels, resolve_model -from nmp.evaluator.api.v2.metrics.schemas.metrics import Metric -from pydantic import TypeAdapter - -# TypeAdapter for the discriminated Metric union - Pydantic automatically -# selects the correct type based on the 'type' field discriminator -_MetricEntityAdapter: TypeAdapter[entities.Metric] = TypeAdapter(entities.Metric) - -SchemaT = TypeVar("SchemaT", bound=EntityBase) - - -class MetricMapper: - """Maps between metric request DTOs and entity types.""" - - @staticmethod - async def request_to_entity(request: Metric | MetricBase, name: str, workspace: str) -> entities.Metric: - """Convert a metric request DTO to an entity. - - Handles model resolution (ModelRef -> Model) via the ResolvableModels - protocol and uses Pydantic's TypeAdapter to construct the appropriate - entity type based on the discriminated union. - - Args: - request: The metric request DTO - name: Metric name (from path parameter) - workspace: Workspace (from path parameter) - - Returns: - The constructed metric entity - """ - # Build the entity data from request, adding name/workspace - data = request.model_dump(exclude_none=True) - data["name"] = name - data["workspace"] = workspace - - # Resolve ModelRef fields to Model using the protocol - if isinstance(request, ResolvableModels): - resolved = await request.resolve_models(resolve_model) - data.update({k: v.model_dump(exclude_none=True) for k, v in resolved.items()}) - - # Pydantic automatically selects the correct entity type based on 'type' discriminator - return _MetricEntityAdapter.validate_python(data) - - @staticmethod - def entity_to_schema(entity: EntityBase, schema_cls: Type[SchemaT]) -> SchemaT: - """Validate an entity into a schema class, preserving base private attributes. - - Constructs the schema from the entity's model dump, then copies the private - attributes managed by the entity store (_id, timestamps, _parent) from the - source entity to the resulting schema. - - Args: - entity: Source entity to serialize. - schema_cls: Target schema class to validate into. - - Returns: - Schema instance with private attributes populated. - """ - data = entity.model_dump(exclude_none=True) - - resp = schema_cls.model_validate(data) - resp._id = entity._id - resp._created_at = entity._created_at - resp._created_by = entity._created_by - resp._updated_at = entity._updated_at - resp._updated_by = entity._updated_by - resp._parent = entity._parent - return resp - - @staticmethod - def entity_to_schema_via_adapter(entity: EntityBase, adapter: TypeAdapter[SchemaT]) -> SchemaT: - """Validate an entity into a schema using a TypeAdapter, preserving base private attributes. - - Constructs the schema from the entity's model dump, then copies the private - attributes managed by the entity store (_id, timestamps, _parent) from the - source entity to the resulting schema. - - Args: - entity: Source entity to serialize. - adapter: TypeAdapter whose target type is bound to EntityBase. - - Returns: - Schema instance with private attributes populated. - """ - data = entity.model_dump(exclude_none=True) - resp = adapter.validate_python(data) - resp._id = entity._id - resp._created_at = entity._created_at - resp._created_by = entity._created_by - resp._updated_at = entity._updated_at - resp._updated_by = entity._updated_by - resp._parent = entity._parent - return resp diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/__init__.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/evaluation.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/evaluation.py deleted file mode 100644 index bebe31b363..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/evaluation.py +++ /dev/null @@ -1,113 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import math -from typing import Annotated, Any, Self - -import nmp.evaluator.app.values as app -from nemo_evaluator_sdk.values import AggregateScore, DatasetRows, RowScore -from nmp.evaluator.api.v2.metrics.schemas.metrics import Metric -from nmp.evaluator.api.v2.metrics.schemas.metrics_resp import MetricResponse -from pydantic import BaseModel, ConfigDict, Discriminator, Field, Tag - - -class EvaluateDatasetRows(DatasetRows): - """Inline dataset for evaluation with a maximum of 10 rows.""" - - model_config = ConfigDict(extra="forbid") - - rows: list[dict[str, Any]] = Field( - min_length=1, - max_length=10, - description="Array of data rows. Each row can be any valid JSON value (object, string, array, etc.).", - ) - - -def _metric_discriminator(v: Any) -> str | None: - """Discriminate between MetricRef (string) and app.Metric (dict). - - Returns 'ref' for string references, 'inline' for dict/object definitions, - or None if the value type is not recognized. - """ - if isinstance(v, str): - return "ref" - if isinstance(v, dict): - return "inline" - # Handle already-validated instances (used during serialization) - if isinstance(v, app.MetricRef): - return "ref" - if hasattr(v, "type"): # app.Metric has a 'type' field - return "inline" - return None - - -# Union type with callable discriminator to handle MetricRef (string) vs app.Metric (dict) -EvaluationMetric = Annotated[ - Annotated[app.MetricRef, Tag("ref")] | Annotated[Metric, Tag("inline")], - Discriminator(_metric_discriminator), -] - - -class MetricEvaluationRequest(BaseModel): - """Request body for metric evaluation.""" - - model_config = ConfigDict(extra="forbid") - - metric: EvaluationMetric = Field( - description="The metric to use for evaluation. Can be a reference (workspace/metric_name) or an inline metric definition." - ) - dataset: EvaluateDatasetRows = Field(description="The dataset to evaluate with inline rows.") - - -class MetricEvaluationRowScore(BaseModel): - """Result for a single evaluated row. - - Contains either scores (on success) or error (on failure), facilitating - easy manipulation where each row represents one evaluation. - """ - - model_config = ConfigDict(extra="forbid") - - index: int = Field(description="Position of this row in the original input dataset (0-based).") - row: dict[str, Any] = Field(description="The original dataset row.") - scores: dict[str, float | None] | None = Field( - default=None, - description="Score name to value mapping for this row. Non-finite values are serialized as null. Null if evaluation failed.", - ) - error: str | None = Field( - default=None, - description="Error message if evaluation failed. Null if evaluation succeeded.", - ) - - @classmethod - def from_row_score(cls, row_score: RowScore, row: dict[str, Any], index: int) -> Self: - """Convert an SDK ``RowScore`` into the API response model. - - Non-finite values (NaN, inf) become ``None`` for JSON serialization. - Errored rows emit ``scores=null``; successful rows always emit a - ``scores`` dict (possibly empty) — the ``/metric-evaluate`` contract. - """ - if row_score.error is not None: - return cls(index=index, row=row, scores=None, error=row_score.error) - scores: dict[str, float | None] = {} - for metric_outputs in row_score.metrics.values(): - for output in metric_outputs: - if isinstance(output.value, bool): - scores[output.name] = 1.0 if output.value else 0.0 - elif isinstance(output.value, int | float): - scores[output.name] = float(output.value) if math.isfinite(output.value) else None - return cls(index=index, row=row, scores=scores, error=None) - - -class MetricEvaluationResponse(BaseModel): - """Response body for metric evaluation. - - Designed for easy loading into pandas DataFrames. See docs/evaluation-response-pandas.md - for examples of how to load `aggregate_scores` and `row_scores` into DataFrames. - """ - - model_config = ConfigDict(extra="forbid") - - metric: MetricResponse = Field(description="The metric definition that was used for evaluation.") - aggregate_scores: list[AggregateScore] = Field(description="Aggregated statistics per score.") - row_scores: list[MetricEvaluationRowScore] = Field(description="Per-row evaluation results with scores or errors.") diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/jobs.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/jobs.py deleted file mode 100644 index c388e3bc08..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/jobs.py +++ /dev/null @@ -1,168 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from __future__ import annotations - -from typing import Annotated, Any, ClassVar, Literal - -import nmp.evaluator.app.values as app -from nemo_evaluator_sdk.values import ( - RunConfig, - RunConfigOnline, - RunConfigOnlineModel, - SupportedJobTypes, -) -from nmp.evaluator.api.v2.common.inline_models import Agent -from nmp.evaluator.api.v2.metrics.schemas.metrics import ( - Metric, - WithEmbeddingsModel, - WithModel, -) -from nmp.evaluator.app.values.metrics_job import _discriminate_job_type_from_fields -from pydantic import BaseModel, ConfigDict, Discriminator, Field, Tag, TypeAdapter - - -class _MetricJobBase(BaseModel): - """A metric job.""" - - model_config = ConfigDict(extra="forbid", json_schema_mode_override="validation") - # SystemMetric is needed for job response but job types represent input+response - # We return 422 invalid payload when request contains inline system metrics until supported. - metric: app.MetricRef | Metric | app.SystemMetric = Field(description="The metric for evaluation.") - metric_params: dict = Field( - default_factory=dict, - description="Additional parameters for the metric. Required for system metrics, optional overrides for custom metrics.", - ) - field_mapping: app.FieldMapping | None = Field( - default=None, - description="Maps canonical evaluator fields such as 'input' and 'output' to dataset column paths for this job.", - ) - - -# TODO: Align optional_fields with template path semantics. -# Keep support for dataset-relative nested paths (for example "reference.text") -# and runtime sample paths (for example "sample.output_text"), while avoiding -# dependence on the "item." alias form (normalize "item.foo" -> "foo"). -OptionalFieldName = Annotated[str, Field(min_length=1)] - - -class MetricOfflineJob(_MetricJobBase): - """An offline metric job.""" - - __job_type__: ClassVar[Literal[SupportedJobTypes.OFFLINE]] = SupportedJobTypes.OFFLINE - - dataset: app.Dataset = Field( - description="The dataset to evaluate which may represent generated outputs from a model." - ) - params: RunConfig | None = Field(default_factory=RunConfig, description="Execution parameters for the metric job.") - - -class MetricOnlineJob(WithModel, _MetricJobBase): - """A online metric job.""" - - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - - dataset: app.Dataset = Field(description="The dataset to use for model prompts and evaluation.") - params: RunConfigOnlineModel | None = Field( - default_factory=RunConfigOnlineModel, description="Execution parameters for the metric job." - ) - prompt_template: str | dict = Field( - description="The jinja template to prompt the model for evaluation. Can be either a simple string or a structured object (e.g., OpenAI messages format). Use Jinja template variables like {{input}}, {{output}}, {{context}}, {{reference}} to reference input columns.", - examples=[ - {"type": "string", "content": "Question: {{input}}\nAnswer: "}, - { - "type": "object", - "content": { - "messages": [ - { - "role": "user", - "content": "Question: {{input}}\nAnswer: ", - }, - ] - }, - }, - ], - ) - optional_fields: list[OptionalFieldName] = Field( - default_factory=list, - description=( - "Prompt template fields that should remain available to the prompt template but not be " - "required by dataset schema validation." - ), - ) - - -class MetricOnlineAgentJob(_MetricJobBase): - """An online metric job that evaluates an agent.""" - - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - - agent: Agent = Field(description="The agent to evaluate.") - dataset: app.Dataset = Field(description="The dataset to use for agent prompts and evaluation.") - params: RunConfigOnline | None = Field( - default_factory=RunConfigOnline, description="Execution parameters for the metric job." - ) - prompt_template: str | dict = Field( - description="The jinja template to prompt the agent for evaluation. Can be either a simple string or a structured object (e.g., OpenAI messages format). Use Jinja template variables like {{input}}, {{output}}, {{context}}, {{reference}} to reference input columns.", - examples=[ - {"type": "string", "content": "Question: {{input}}\nAnswer: "}, - { - "type": "object", - "content": { - "messages": [ - { - "role": "user", - "content": "Question: {{input}}\nAnswer: ", - }, - ] - }, - }, - ], - ) - optional_fields: list[OptionalFieldName] = Field( - default_factory=list, - description=( - "Prompt template fields that should remain available to the prompt template but not be " - "required by dataset schema validation." - ), - ) - - -class RetrieverPipeline(WithEmbeddingsModel, BaseModel): - """Pipeline configuration for retriever-based evaluations.""" - - model_config = ConfigDict(extra="forbid") - - -class MetricRetrieverJob(_MetricJobBase): - """Evaluation with a retriever-based metric.""" - - __job_type__: ClassVar[Literal[SupportedJobTypes.RETRIEVER]] = SupportedJobTypes.RETRIEVER - - metric: app.MetricRef | app.SystemMetric = Field(description="The metric for evaluation.") - retriever_pipeline: RetrieverPipeline = Field( - description="The pipeline configuration for retriever-based evaluation." - ) - dataset: app.PipelineDataset = Field(description="The dataset to use for evaluation.") - params: RunConfigOnline | None = Field( - default_factory=RunConfigOnline, description="Execution parameters for the metric job." - ) - - -def _metric_job_input_discriminator(v: Any) -> str: - """Discriminator for MetricJob union types.""" - if isinstance(v, dict): - return _discriminate_job_type_from_fields(v) - if isinstance(v, MetricOnlineAgentJob): - return "online-agent" - return getattr(v, "__job_type__", SupportedJobTypes.OFFLINE).value - - -MetricJob = Annotated[ - Annotated[MetricOfflineJob, Tag("offline")] - | Annotated[MetricOnlineJob, Tag("online")] - | Annotated[MetricOnlineAgentJob, Tag("online-agent")] - | Annotated[MetricRetrieverJob, Tag("retriever")], - Discriminator(_metric_job_input_discriminator), -] -MetricJobAdapter = TypeAdapter(MetricJob) diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/metrics.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/metrics.py deleted file mode 100644 index 10877ff353..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/metrics.py +++ /dev/null @@ -1,302 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Request schemas for metric creation and inline metric jobs. - -These types inherit from app.* types and don't include name/workspace -(those come from path parameters). They're pure DTOs - model resolution -and entity construction happen in the service layer. -""" - -from typing import Annotated, Union - -import nmp.evaluator.app.values as app -from nemo_evaluator_sdk.values import metrics -from nmp.common.api.common import SecretRef as ApiSecretRef -from nmp.evaluator.api.v2.common.inline_models import Model -from nmp.evaluator.api.v2.common.model_resolution import ModelResolver, resolve_model_field -from pydantic import BaseModel, ConfigDict, Field - -# ============================================================================= -# Resolution Mixins - provide Model-typed fields and resolve_models() -# ============================================================================= - - -class _ResolvableBase(BaseModel): - """Base class that terminates the resolve_models() super() chain. - - All _With* mixins inherit from this to ensure the cooperative inheritance - chain has a proper termination point that returns an empty dict. - """ - - async def resolve_models(self, resolver: ModelResolver) -> dict[str, Model]: - """Terminate the super() chain with an empty dict.""" - return {} - - -class WithModel(_ResolvableBase): - """Mixin for types with a `model` field that needs resolution. - - Provides: - - model: Model field (shadows parent's Model field) - - resolve_models() implementation - - Place this mixin BEFORE the parent class that defines model: Model - in the inheritance list to ensure proper field shadowing. - """ - - model: Model | app.ModelRef = Field(description="The model configuration.") # noqa: F821 - - async def resolve_models(self, resolver: ModelResolver) -> dict[str, Model]: - """Resolve the model field.""" - result = await super().resolve_models(resolver) - resolved = await resolve_model_field(self.model, resolver) - if resolved is not None: - result["model"] = resolved - return result - - -class WithJudgeModel(_ResolvableBase): - """Mixin for types with a `judge_model` field that needs resolution. - - Provides: - - judge_model: Model field (shadows parent's Model field) - - resolve_models() implementation - - Place this mixin BEFORE the parent class that defines judge_model: Model - in the inheritance list to ensure proper field shadowing. - """ - - judge_model: Model | app.ModelRef = Field(description="The judge model configuration.") - - async def resolve_models(self, resolver: ModelResolver) -> dict[str, Model]: - """Resolve the judge_model field.""" - result = await super().resolve_models(resolver) - resolved = await resolve_model_field(self.judge_model, resolver) - if resolved is not None: - result["judge_model"] = resolved - return result - - -class WithEmbeddingsModel(_ResolvableBase): - """Mixin for types with an `embeddings_model` field that needs resolution. - - Provides: - - embeddings_model: Model field (shadows parent's Model field) - - resolve_models() implementation - - Place this mixin BEFORE the parent class that defines embeddings_model: Model - in the inheritance list to ensure proper field shadowing. - """ - - embeddings_model: Model | app.ModelRef = Field(description="The embeddings model configuration.") - - async def resolve_models(self, resolver: ModelResolver) -> dict[str, Model]: - """Resolve the embeddings_model field.""" - result = await super().resolve_models(resolver) - resolved = await resolve_model_field(self.embeddings_model, resolver) - if resolved is not None: - result["embeddings_model"] = resolved - return result - - -class WithApiKeySecret(BaseModel): - """Mixin that overrides SDK ``api_key_secret`` with the strict service ``ApiSecretRef``. - - The SDK's ``SecretRef`` allows mixed case; the service public API keeps the - original lowercase-only pattern. Service-layer schemas mix this in to - enforce the stricter pattern on ``api_key_secret`` fields. - """ - - api_key_secret: ApiSecretRef | None = Field( - default=None, - description=metrics.Remote.model_fields["api_key_secret"].description, - ) - - -# ============================================================================= -# LLM Judge Request - allows Model URN or inline and optional prompt_template and score parsers -# ============================================================================= - - -class LLMJudgeMetric(WithModel, metrics.LLMJudge): - """Request type for creating LLM Judge metrics.""" - - model_config = ConfigDict(extra="forbid") - prompt_template: str | dict = Field( - default_factory=lambda data: metrics.default_judge_prompt_template_for_model(data["model"]), - description=metrics.LLMJudge.model_fields["prompt_template"].description, - examples=metrics.LLMJudge.model_fields["prompt_template"].examples, - ) - - -# ============================================================================= -# RAGAS Metric Requests - allow Model URN or inline for judge/embeddings -# ============================================================================= - - -class TopicAdherenceMetric(WithJudgeModel, metrics.TopicAdherence): - """Request type for TopicAdherence metrics.""" - - pass - - -class AgentGoalAccuracyMetric(WithJudgeModel, metrics.AgentGoalAccuracy): - """Request type for AgentGoalAccuracy metrics.""" - - pass - - -class AnswerAccuracyMetric(WithJudgeModel, metrics.AnswerAccuracy): - """Request type for AnswerAccuracy metrics.""" - - pass - - -class ContextRelevanceMetric(WithJudgeModel, metrics.ContextRelevance): - """Request type for ContextRelevance metrics.""" - - pass - - -class ResponseGroundednessMetric(WithJudgeModel, metrics.ResponseGroundedness): - """Request type for ResponseGroundedness metrics.""" - - pass - - -class ContextRecallMetric(WithJudgeModel, metrics.ContextRecall): - """Request type for ContextRecall metrics.""" - - pass - - -class ContextPrecisionMetric(WithJudgeModel, metrics.ContextPrecision): - """Request type for ContextPrecision metrics.""" - - pass - - -class ContextEntityRecallMetric(WithJudgeModel, metrics.ContextEntityRecall): - """Request type for ContextEntityRecall metrics.""" - - pass - - -class ResponseRelevancyMetric(WithJudgeModel, WithEmbeddingsModel, metrics.ResponseRelevancy): - """Request type for ResponseRelevancy metrics.""" - - pass - - -class FaithfulnessMetric(WithJudgeModel, metrics.Faithfulness): - """Request type for Faithfulness metrics.""" - - pass - - -class NoiseSensitivityMetric(WithJudgeModel, metrics.NoiseSensitivity): - """Request type for NoiseSensitivity metrics.""" - - pass - - -class ToolCallAccuracyMetric(metrics.ToolCallAccuracy): - """Request type for ToolCallAccuracy metrics (no judge required).""" - - pass - - -# ============================================================================= -# Simple metric requests -# ============================================================================= - - -class BLEUMetric(metrics.BLEU): - """Request type for BLEUMetric.""" - - pass - - -class ExactMatchMetric(metrics.ExactMatch): - """Request type for ExactMatchMetric.""" - - pass - - -class F1Metric(metrics.F1): - """Request type for F1Metric.""" - - pass - - -class NumberCheckMetric(metrics.NumberCheck): - """Request type for NumberCheckMetric. Numeric-comparison metric with template-driven operands.""" - - pass - - -class RemoteMetric(WithApiKeySecret, metrics.Remote): - """Request type for RemoteMetric. A metric that computes scores via a remote endpoint.""" - - pass - - -class NemoAgentToolkitRemoteMetric(WithApiKeySecret, metrics.NemoAgentToolkitRemote): - """Request type for NemoAgentToolkitRemoteMetric. A remote metric that interfaces with NeMo Agent Toolkit evaluators.""" - - pass - - -class ROUGEMetric(metrics.ROUGE): - """Request type for ROUGEMetric. ROUGE metric for overlap-based summarization quality scoring.""" - - pass - - -class StringCheckMetric(metrics.StringCheck): - """Request type for StringCheckMetric. String-comparison metric with operator-based checks.""" - - pass - - -class ToolCallingMetric(metrics.ToolCalling): - """Request type for ToolCallingMetric. Tool-calling accuracy metric for structured function calls.""" - - pass - - -# ============================================================================= -# Union of all metric request types -# ============================================================================= - -Metric = Annotated[ - Union[ - # Metrics with models (may be ref or inline) - LLMJudgeMetric, - TopicAdherenceMetric, - AgentGoalAccuracyMetric, - AnswerAccuracyMetric, - ContextRelevanceMetric, - ResponseGroundednessMetric, - ContextRecallMetric, - ContextPrecisionMetric, - ContextEntityRecallMetric, - ResponseRelevancyMetric, - FaithfulnessMetric, - NoiseSensitivityMetric, - ToolCallAccuracyMetric, - # Simple metrics (no model resolution needed) - BLEUMetric, - ExactMatchMetric, - F1Metric, - NumberCheckMetric, - RemoteMetric, - NemoAgentToolkitRemoteMetric, - ROUGEMetric, - StringCheckMetric, - ToolCallingMetric, - # SystemMetric is not in input type for users via API - ], - Field(discriminator="type"), -] diff --git a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/metrics_resp.py b/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/metrics_resp.py deleted file mode 100644 index 3d2a11023f..0000000000 --- a/services/evaluator/src/nmp/evaluator/api/v2/metrics/schemas/metrics_resp.py +++ /dev/null @@ -1,279 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Response schemas for metric entities and metric jobs. - -These types have ref/inline unions and optional entity fields (workspace/name, etc). -""" - -from datetime import datetime -from typing import Annotated, Union - -import nmp.evaluator.app.values as app -import nmp.evaluator.entities as entities -from nemo_evaluator_sdk.enums import MetricType -from nmp.common.api.common import Page -from nmp.common.entities.values import DatetimeFilter, Filter, StringFilter, map_entity_field -from nmp.evaluator.api.v2.metrics.schemas import metrics as schema_metrics -from pydantic import BaseModel, ConfigDict, Field, TypeAdapter - -# ============================================================================= -# Metric response types can either be an app value (/metric-jobs) or entity (/metrics) -# ============================================================================= - - -class _OptionalEntity(BaseModel): - """ - Base class for optional entity fields to use with response types - """ - - name: str | None = Field(default=None, description="Entity name within the workspace") - workspace: str | None = Field(default=None, description="Workspace identifier") - project: str | None = Field(default=None, description="The name of the project associated with this entity.") - id: str | None = Field(default=None, description="Entity name within the workspace") - created_at: datetime | None = Field(default=None) - updated_at: datetime | None = Field(default=None) - parent: str | None = Field(default=None) - - -# ============================================================================= -# Metric response types -# ============================================================================= - - -class LLMJudgeMetricResponse(schema_metrics.LLMJudgeMetric, _OptionalEntity): - model_config = ConfigDict(extra="ignore") - - -# ============================================================================= -# RAGAS Metric Requests - allow Model URN or inline for judge/embeddings -# ============================================================================= - - -class TopicAdherenceMetricResponse(schema_metrics.TopicAdherenceMetric, _OptionalEntity): - """Response type for TopicAdherence metrics.""" - - pass - - -class AgentGoalAccuracyMetricResponse(schema_metrics.AgentGoalAccuracyMetric, _OptionalEntity): - """Response type for AgentGoalAccuracy metrics.""" - - pass - - -class AnswerAccuracyMetricResponse(schema_metrics.AnswerAccuracyMetric, _OptionalEntity): - """Response type for AnswerAccuracy metrics.""" - - pass - - -class ContextRelevanceMetricResponse(schema_metrics.ContextRelevanceMetric, _OptionalEntity): - """Response type for ContextRelevance metrics.""" - - pass - - -class ResponseGroundednessMetricResponse(schema_metrics.ResponseGroundednessMetric, _OptionalEntity): - """Response type for ResponseGroundedness metrics.""" - - pass - - -class ContextRecallMetricResponse(schema_metrics.ContextRecallMetric, _OptionalEntity): - """Response type for ContextRecall metrics.""" - - pass - - -class ContextPrecisionMetricResponse(schema_metrics.ContextPrecisionMetric, _OptionalEntity): - """Response type for ContextPrecision metrics.""" - - pass - - -class ContextEntityRecallMetricResponse(schema_metrics.ContextEntityRecallMetric, _OptionalEntity): - """Response type for ContextEntityRecall metrics.""" - - pass - - -class ResponseRelevancyMetricResponse(schema_metrics.ResponseRelevancyMetric, _OptionalEntity): - """Response type for ResponseRelevancy metrics.""" - - pass - - -class FaithfulnessMetricResponse(schema_metrics.FaithfulnessMetric, _OptionalEntity): - """Response type for Faithfulness metrics.""" - - pass - - -class NoiseSensitivityMetricResponse(schema_metrics.NoiseSensitivityMetric, _OptionalEntity): - """Response type for NoiseSensitivity metrics.""" - - pass - - -class ToolCallAccuracyMetricResponse(schema_metrics.ToolCallAccuracyMetric, _OptionalEntity): - """Response type for ToolCallAccuracy metrics (no judge required).""" - - pass - - -# ============================================================================= -# Simple metric requests - these don't have models, just use inline types directly -# ============================================================================= - - -# These are just aliases for the inline types since they don't need any changes -class BLEUMetricResponse(schema_metrics.BLEUMetric, _OptionalEntity): - """Response type for BLEUMetric.""" - - pass - - -class ExactMatchMetricResponse(schema_metrics.ExactMatchMetric, _OptionalEntity): - """Response type for ExactMatchMetric.""" - - pass - - -class F1MetricResponse(schema_metrics.F1Metric, _OptionalEntity): - """Response type for F1Metric.""" - - pass - - -class NumberCheckMetricResponse(schema_metrics.NumberCheckMetric, _OptionalEntity): - """Response type for NumberCheckMetric.""" - - pass - - -class RemoteMetricResponse(schema_metrics.RemoteMetric, _OptionalEntity): - """Response type for RemoteMetric.""" - - pass - - -class NemoAgentToolkitRemoteMetricResponse(schema_metrics.NemoAgentToolkitRemoteMetric, _OptionalEntity): - """Response type for NemoAgentToolkitRemoteMetric.""" - - pass - - -class ROUGEMetricResponse(schema_metrics.ROUGEMetric, _OptionalEntity): - """Response type for ROUGEMetric.""" - - pass - - -class StringCheckMetricResponse(schema_metrics.StringCheckMetric, _OptionalEntity): - """Response type for StringCheckMetric.""" - - pass - - -class ToolCallingMetricResponse(schema_metrics.ToolCallingMetric, _OptionalEntity): - """Response type for ToolCallingMetric.""" - - pass - - -class SystemMetricResponse(app.SystemMetric, _OptionalEntity): - """Response type for SystemMetric.""" - - pass - - -MetricResponse = Annotated[ - Union[ - # Metrics with models (may be ref or inline) - LLMJudgeMetricResponse, - TopicAdherenceMetricResponse, - AgentGoalAccuracyMetricResponse, - AnswerAccuracyMetricResponse, - ContextRelevanceMetricResponse, - ResponseGroundednessMetricResponse, - ContextRecallMetricResponse, - ContextPrecisionMetricResponse, - ContextEntityRecallMetricResponse, - ResponseRelevancyMetricResponse, - FaithfulnessMetricResponse, - NoiseSensitivityMetricResponse, - ToolCallAccuracyMetricResponse, - # Simple metrics (no model resolution needed) - BLEUMetricResponse, - ExactMatchMetricResponse, - F1MetricResponse, - NumberCheckMetricResponse, - RemoteMetricResponse, - NemoAgentToolkitRemoteMetricResponse, - ROUGEMetricResponse, - StringCheckMetricResponse, - ToolCallingMetricResponse, - SystemMetricResponse, - ], - Field(discriminator="type"), -] -MetricResponseAdapter = TypeAdapter(MetricResponse) - - -# ============================================================================= -# List Metrics -# ============================================================================= - - -class MetricsListFilter(Filter): - """Filter for list metrics query.""" - - name: StringFilter | str | None = Field(default=None, description="Filter metrics by name.") - description: StringFilter | str | None = Field(default=None, description="Filter metrics by description.") - type: MetricType | None = Field( - default=None, description="Filter metrics by metric type (e.g. llm-judge, exact-match, route, system)" - ) - project: str | None = Field(default=None, description="Filter metrics by project name.") - created_at: DatetimeFilter | None = Field(default=None, description="Filter metrics by creation date range.") - updated_at: DatetimeFilter | None = Field(default=None, description="Filter metrics by last update date range.") - labels: Annotated[dict[str, str] | None, map_entity_field("data.labels", namespace=True)] = Field( - default=None, - description="Filter by labels. Address an individual label as a sub-path, e.g. filter[labels.team]=eval.", - ) - - -# This is needed to ensure the generated OAS has a better name than UnionsPage. -class MetricsListResponse(Page[MetricResponse]): ... - - -# ============================================================================= -# List Job Results -# ============================================================================= - - -class MetricJobResultsListFilter(Filter): - """Filter for list metric job results.""" - - name: StringFilter | str | None = Field(default=None, description="Filter job results by name.") - metric: app.MetricRef | None = Field( - default=None, - description="Filter results by metric reference. Jobs with inline metric configuration will not be included when filtering by metric.", - ) - dataset: app.FilesetRef | None = Field( - default=None, - description="Filter results by dataset if the metric job is configured with the fileset reference.", - ) - model: app.ModelRef | None = Field( - default=None, description="Filter results by model if the metric job is configured with the model reference." - ) - created_at: DatetimeFilter | None = Field(default=None, description="Filter job results by creation date range.") - - -class MetricJobResult(entities.MetricJobResult): - """Response type for metric job result.""" - - pass - - -class MetricJobResultsListResponse(Page[MetricJobResult]): ... diff --git a/services/evaluator/src/nmp/evaluator/app/__init__.py b/services/evaluator/src/nmp/evaluator/app/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/app/agent_inference.py b/services/evaluator/src/nmp/evaluator/app/agent_inference.py deleted file mode 100644 index a5ef636a2d..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/agent_inference.py +++ /dev/null @@ -1,64 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Service-layer agent inference wrapper. - -Re-exports the SDK-level agent inference functions and adds service-specific -utilities such as ``verify_agent_reachable``. -""" - -from typing import Any - -from nemo_evaluator_sdk.agent_inference import make_agent_inference_request -from nemo_evaluator_sdk.enums import AgentFormat -from nemo_evaluator_sdk.values.agents import Agent -from nemo_platform import AsyncNeMoPlatform - - -async def verify_agent_reachable( - agent: Agent | dict[str, Any], - sdk: AsyncNeMoPlatform, - workspace: str, - api_key: str | None = None, - timeout: float | None = 10.0, -) -> dict: - """Verify if an agent endpoint is reachable by making a lightweight test request. - - For NAT agents, sends a minimal ``/generate/full`` request. - For generic agents, the check is skipped (no standard health endpoint). - - Args: - agent: An Agent object or dictionary containing agent configuration. - sdk: SDK instance with request-scoped user context. - workspace: Workspace for resolving api_key_secret. - api_key: Optional explicit API key. - timeout: Optional timeout in seconds. Defaults to 10 seconds. - - Returns: - The response from the agent endpoint, or a status dict if test was skipped. - """ - inline_agent = Agent.model_validate(agent) - - # Resolve api_key_secret if present - resolved_api_key = api_key - if inline_agent.api_key_secret: - secret_name = inline_agent.api_key_secret.root - secret = await sdk.secrets.access(secret_name, workspace=workspace) - resolved_api_key = secret.value - - if inline_agent.format == AgentFormat.GENERIC: - return {"status": "Test skipped for generic agent format (no standard health endpoint)"} - - # NAT agent: do a lightweight inference request - # TODO: Payload of format: payload = {"input_message": input_message} - # Check https://github.com/NVIDIA/NeMo-Agent-Toolkit/blob/develop/examples/evaluation_and_profiling/simple_web_query_eval/src/nat_simple_web_query_eval/scripts/evaluate_single_item_simple.py - # Check if there generic health check of NAT agents. - test_request = {"input_message": "ping"} - - return await make_agent_inference_request( - agent=inline_agent, - request=test_request, - max_retries=1, - api_key=resolved_api_key, - timeout=timeout, - ) diff --git a/services/evaluator/src/nmp/evaluator/app/dataset_schemas/__init__.py b/services/evaluator/src/nmp/evaluator/app/dataset_schemas/__init__.py deleted file mode 100644 index d1d80c4a1c..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/dataset_schemas/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Service-local dataset schema helpers for evaluator validation and fileset metadata.""" - -from __future__ import annotations - -from nemo_evaluator_sdk.dataset_schemas.common import ( - SchemaCompatibilityError, - TemplateSchemaInferenceError, - validate_json_schema, -) -from nemo_evaluator_sdk.dataset_schemas.compatibility import ( - apply_column_mapping_to_row, - check_dataset_schema_compatibility, - merge_metric_required_schemas, - project_dataset_schema_for_column_mapping, - prune_schema_properties, - validate_dataset_schema_requirement, - validate_prompt_template_against_dataset_schema, -) -from nemo_evaluator_sdk.dataset_schemas.templates import infer_required_schema_from_template -from nemo_evaluator_sdk.values.dataset_schemas import FieldMapping, InputSchema -from nmp.evaluator.app.dataset_schemas.filesets import ( - parse_fileset_ref_path, - resolve_schema_entry, - select_schema_for_path, -) -from nmp.evaluator.app.dataset_schemas.resolution import ( - group_schema_resolution_targets, - resolve_dataset_schema, - resolve_dataset_schema_targets, - runtime_available_evaluator_fields, -) - -__all__ = [ - "FieldMapping", - "InputSchema", - "SchemaCompatibilityError", - "TemplateSchemaInferenceError", - "apply_column_mapping_to_row", - "check_dataset_schema_compatibility", - "group_schema_resolution_targets", - "infer_required_schema_from_template", - "merge_metric_required_schemas", - "parse_fileset_ref_path", - "project_dataset_schema_for_column_mapping", - "prune_schema_properties", - "resolve_dataset_schema", - "resolve_dataset_schema_targets", - "resolve_schema_entry", - "runtime_available_evaluator_fields", - "select_schema_for_path", - "validate_dataset_schema_requirement", - "validate_json_schema", - "validate_prompt_template_against_dataset_schema", -] diff --git a/services/evaluator/src/nmp/evaluator/app/dataset_schemas/filesets.py b/services/evaluator/src/nmp/evaluator/app/dataset_schemas/filesets.py deleted file mode 100644 index 22d1e937f4..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/dataset_schemas/filesets.py +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Fileset metadata helpers for resolving dataset schemas by path or schema reference.""" - -from __future__ import annotations - - -def resolve_schema_entry(schema_entry: dict | str | None, schema_defs: dict[str, dict] | None = None) -> dict | None: - """Resolve an inline schema or schema-def reference to a concrete JSON Schema.""" - if schema_entry is None: - return None - if isinstance(schema_entry, dict): - return schema_entry - if isinstance(schema_entry, str): - resolved = (schema_defs or {}).get(schema_entry) - if resolved is None: - raise ValueError(f"unknown dataset schema reference '{schema_entry}'") - return resolved - raise TypeError(f"unsupported dataset schema entry type: {type(schema_entry).__name__}") - - -def select_schema_for_path( - default_schema: dict | str | None, - schemas_by_path: dict[str, dict | str], - path: str | None, - *, - schema_defs: dict[str, dict] | None = None, -) -> dict | None: - """Select a path-specific schema when an exact file path is available.""" - if path: - normalized = path.lstrip("/") - if normalized and normalized in schemas_by_path: - return resolve_schema_entry(schemas_by_path[normalized], schema_defs) - return resolve_schema_entry(default_schema, schema_defs) - - -def parse_fileset_ref_path(ref: str) -> tuple[str, str | None]: - """Split a fileset ref into its base ref and exact fragment path, if any. - - Fragment paths are preserved verbatim (after leading slash normalization). - """ - if "#" not in ref: - return ref, None - - base, fragment = ref.split("#", 1) - fragment = fragment.lstrip("/") - if not fragment: - return base, None - return base, fragment diff --git a/services/evaluator/src/nmp/evaluator/app/dataset_schemas/resolution.py b/services/evaluator/src/nmp/evaluator/app/dataset_schemas/resolution.py deleted file mode 100644 index b0dcf79666..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/dataset_schemas/resolution.py +++ /dev/null @@ -1,177 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Dataset schema resolution helpers for evaluator validation paths.""" - -from __future__ import annotations - -import json -from collections.abc import Iterable -from dataclasses import dataclass, replace - -from nemo_evaluator_sdk.values.common import SupportedJobTypes -from nemo_platform import AsyncNeMoPlatform -from nmp.evaluator.app.dataset_schemas.filesets import ( - parse_fileset_ref_path, - select_schema_for_path, -) -from nmp.evaluator.app.datasets.fileset_selectors import is_fileset_glob_pattern, list_matching_fileset_paths -from nmp.evaluator.app.values.common import Fileset, FilesetRef -from nmp.evaluator.app.values.datasets import Dataset, DatasetRows - -_MAX_WILDCARD_SCHEMA_VALIDATION_TARGETS = 5000 - - -@dataclass(frozen=True) -class SchemaResolutionTarget: - """A dataset schema plus the fileset paths it represents. - - `paths` contains fileset-relative paths that resolved to this effective - schema. Exact dataset refs and ungrouped wildcard matches have one path. - Grouped targets can contain several paths that share the same schema. - - An empty `paths` tuple means there is no file-specific path context, such - as when validating a fileset-level default schema without a fragment. - """ - - paths: tuple[str, ...] - schema: dict | None - - def path_context(self) -> str | None: - if not self.paths: - return None - if len(self.paths) == 1: - return self.paths[0] - return f"{self.paths[0]} (+{len(self.paths) - 1} more paths)" - - -def _validate_schema_supported_fileset_ref(ref: str) -> None: - if "/" not in ref.split("#", 1)[0]: - raise ValueError("FilesetRef must use 'workspace/fileset-name' format") - - -def _schema_cache_key(schema: dict | None) -> str: - return json.dumps(schema, sort_keys=True, separators=(",", ":"), default=str) - - -def group_schema_resolution_targets(targets: Iterable[SchemaResolutionTarget]) -> list[SchemaResolutionTarget]: - """Collapse targets with identical effective schemas while retaining path context.""" - grouped: dict[str, SchemaResolutionTarget] = {} - paths_by_key: dict[str, list[str]] = {} - - for target in targets: - key = _schema_cache_key(target.schema) - if key not in grouped: - grouped[key] = target - paths_by_key[key] = list(target.paths) - continue - - paths_by_key[key].extend(target.paths) - - return [replace(target, paths=tuple(paths_by_key[key])) for key, target in grouped.items()] - - -async def resolve_dataset_schema_targets( - dataset: Dataset | Fileset | FilesetRef | DatasetRows, - sdk: AsyncNeMoPlatform, -) -> list[SchemaResolutionTarget]: - """Resolve dataset schema targets for prechecks. - - Returns one target for exact dataset refs and many targets for wildcard refs. - """ - if isinstance(dataset, DatasetRows): - return [] - - if isinstance(dataset, Fileset): - metadata = dataset.metadata.dataset - if metadata is None: - return [] - return [ - SchemaResolutionTarget( - paths=(dataset.path,) if dataset.path else (), - schema=select_schema_for_path( - metadata.schema_, - metadata.schemas_by_path, - dataset.path, - schema_defs=metadata.schema_defs, - ), - ) - ] - - if not isinstance(dataset, FilesetRef): - return [] - - _validate_schema_supported_fileset_ref(dataset.root) - base_ref, fragment_path = parse_fileset_ref_path(dataset.root) - workspace, name = base_ref.split("/", 1) - fileset = await sdk.files.filesets.retrieve(name=name, workspace=workspace) - metadata = getattr(fileset, "metadata", None) - dataset_metadata = getattr(metadata, "dataset", None) - if dataset_metadata is None: - return [] - - default_schema = getattr(dataset_metadata, "schema_", None) - if default_schema is not None and not isinstance(default_schema, dict | str): - return [] - schema_defs = getattr(dataset_metadata, "schema_defs", {}) or {} - if not isinstance(schema_defs, dict): - schema_defs = {} - schemas_by_path = getattr(dataset_metadata, "schemas_by_path", {}) or {} - if not isinstance(schemas_by_path, dict): - schemas_by_path = {} - - if fragment_path and is_fileset_glob_pattern(fragment_path): - # TODO: If FilesetFileSystem grows resolved per-file dataset schema - # metadata, use it here instead of separately retrieving fileset metadata - # and applying schemas_by_path in evaluator. - matched_paths = await list_matching_fileset_paths( - sdk, - workspace=workspace, - fileset_name=name, - fragment_pattern=fragment_path, - max_validation_targets=_MAX_WILDCARD_SCHEMA_VALIDATION_TARGETS, - ) - if not matched_paths: - raise ValueError(f"no matching files found in fileset for pattern '{fragment_path}'") - return [ - SchemaResolutionTarget( - paths=(matched_path,), - schema=select_schema_for_path(default_schema, schemas_by_path, matched_path, schema_defs=schema_defs), - ) - for matched_path in matched_paths - ] - - return [ - SchemaResolutionTarget( - paths=(fragment_path,) if fragment_path else (), - schema=select_schema_for_path(default_schema, schemas_by_path, fragment_path, schema_defs=schema_defs), - ) - ] - - -async def resolve_dataset_schema( - dataset: Dataset | Fileset | FilesetRef | DatasetRows, - sdk: AsyncNeMoPlatform, -) -> dict | None: - """Resolve one dataset schema for legacy callers. - - Wildcard fileset references can resolve to several path-specific schemas. New - precheck callers should use resolve_dataset_schema_targets() so every matched - fileset path is considered. - """ - targets = await resolve_dataset_schema_targets(dataset, sdk) - if not targets: - # Expected when no first-class schema metadata is available, such as - # inline DatasetRows, filesets without dataset metadata, or unsupported - # schema metadata shapes. Preserve legacy behavior by skipping - # create-time schema validation; issues may still surface at runtime. - return None - # Single-schema compatibility helper for existing callers. - return targets[0].schema - - -def runtime_available_evaluator_fields(job_type: SupportedJobTypes) -> set[str]: - """Return canonical evaluator fields populated by runtime for the given job type.""" - if job_type == SupportedJobTypes.ONLINE: - return {"output", "output_text", "response"} - return set() diff --git a/services/evaluator/src/nmp/evaluator/app/datasets/__init__.py b/services/evaluator/src/nmp/evaluator/app/datasets/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/app/datasets/fileset_selectors.py b/services/evaluator/src/nmp/evaluator/app/datasets/fileset_selectors.py deleted file mode 100644 index c56f1e0555..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/datasets/fileset_selectors.py +++ /dev/null @@ -1,114 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Fileset selector helpers shared by dataset loading and schema prechecks. - -Fileset fragments such as ``workspace/fileset#validation/*.jsonl`` are used in -two places: runtime dataset loading and create-time schema validation. Keeping -the selector logic here gives both paths the same definition of which files are -selected, so prechecks validate the files that execution will actually load. - -Patterns are matched from the fileset root. For example, -``validation/*.jsonl`` matches ``validation/a.jsonl`` but not -``nested/validation/a.jsonl``. -""" - -from __future__ import annotations - -from fnmatch import fnmatchcase - -from nemo_platform import AsyncNeMoPlatform - -_GLOB_CHARS = {"*", "?", "["} - - -def is_fileset_glob_pattern(pattern: str) -> bool: - """Return True when a fileset fragment contains glob wildcards.""" - return any(char in pattern for char in _GLOB_CHARS) - - -def _match_path_parts(path_parts: tuple[str, ...], pattern_parts: tuple[str, ...]) -> bool: - if not pattern_parts: - return not path_parts - - pattern_part = pattern_parts[0] - remaining_pattern = pattern_parts[1:] - if pattern_part == "**": - return _match_path_parts(path_parts, remaining_pattern) or ( - bool(path_parts) and _match_path_parts(path_parts[1:], pattern_parts) - ) - - if not path_parts: - return False - return fnmatchcase(path_parts[0], pattern_part) and _match_path_parts(path_parts[1:], remaining_pattern) - - -def matches_fileset_glob(filepath: str, pattern: str) -> bool: - """Return True when a fileset-relative path matches a root-anchored glob pattern. - - Slash-containing patterns are evaluated from the fileset root so - validation does not consider files that runtime loading will not select. - """ - normalized_path = filepath.strip("/") - normalized_pattern = pattern.strip("/") - if not normalized_path or not normalized_pattern: - return False - return _match_path_parts(tuple(normalized_path.split("/")), tuple(normalized_pattern.split("/"))) - - -def fileset_glob_prefix_dir(pattern: str) -> str: - """Return the stable directory prefix before the first glob wildcard.""" - pattern = pattern.lstrip("/") - if not pattern or not is_fileset_glob_pattern(pattern): - return pattern - - first_wildcard = min(index for index, char in enumerate(pattern) if char in _GLOB_CHARS) - prefix = pattern[:first_wildcard] - if "/" not in prefix: - return "" - return prefix.rsplit("/", 1)[0] - - -async def list_matching_fileset_paths( - sdk: AsyncNeMoPlatform, - *, - workspace: str, - fileset_name: str, - fragment_pattern: str, - max_validation_targets: int | None = None, -) -> list[str]: - """List fileset paths matching a root-anchored glob fragment. - - Schema prechecks use this to expand wildcard dataset refs before validating - path-specific schema metadata. Runtime loading uses the same matcher when - filtering files to download, so this helper keeps create-time validation - aligned with execution. - - The optional max_validation_targets cap is applied after the files service - returns the stable-prefix listing. It limits how many matched files evaluator - prechecks validate, but it is not an upstream files-service pagination limit. - """ - pattern = fragment_pattern.lstrip("/") - has_glob = is_fileset_glob_pattern(pattern) - list_path = fileset_glob_prefix_dir(pattern) if has_glob else pattern - if has_glob and list_path: - list_path = list_path.rstrip("/") + "/" - list_response = await sdk.files.list(fileset=fileset_name, workspace=workspace, remote_path=list_path) - entries = getattr(list_response, "data", None) or [] - - matches: list[str] = [] - for entry in entries: - path = getattr(entry, "path", None) - if not isinstance(path, str): - continue - normalized = path.lstrip("/") - if has_glob and matches_fileset_glob(normalized, pattern): - matches.append(normalized) - if not has_glob and normalized == pattern: - matches.append(normalized) - if max_validation_targets is not None and len(matches) > max_validation_targets: - raise ValueError( - f"fileset pattern '{pattern}' matched more than {max_validation_targets} validation targets; " - "narrow the selector before running create-time schema validation" - ) - return sorted(matches) diff --git a/services/evaluator/src/nmp/evaluator/app/datasets/loader.py b/services/evaluator/src/nmp/evaluator/app/datasets/loader.py deleted file mode 100644 index 0a36df2f43..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/datasets/loader.py +++ /dev/null @@ -1,154 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. - -"""Dataset loader module for evaluator tasks. - -This module provides service-specific dataset reference adapters for downloaded -filesets while delegating core file loading/parsing to the SDK. - -Supported dataset reference formats: - - workspace/fileset: Load all parsable files in the fileset - - workspace/fileset#path/to/file.json: Load a specific file - - workspace/fileset#*.json: Load files matching a glob pattern - - workspace/fileset#**/*.parquet: Recursive glob pattern - -Note: Currently, the dataset-download job step downloads ALL files from a fileset, -and filtering happens at load time. A future optimization could parse the fragment -pattern during download to only fetch matching files. -""" - -from pathlib import Path - -import pyarrow as pa -from nemo_evaluator_sdk.datasets.loader import ( - DatasetLoadError, - discover_files, - is_glob_pattern, - load_dataset, - load_dataset_as_dicts, - load_file, -) - -# Backward-compatible aliases for previous private helper names. -_discover_files = discover_files -_is_glob_pattern = is_glob_pattern -_load_file = load_file - - -def _parse_dataset_ref(ref: str) -> tuple[str, str, str | None]: - """Parse a dataset reference into components. - - Args: - ref: Dataset reference string in format 'workspace/fileset[#pattern]' - - Returns: - Tuple of (workspace, fileset, pattern) where pattern is None if not specified. - - Raises: - ValueError: If the reference format is invalid. - - Examples: - >>> _parse_dataset_ref("my-workspace/my-fileset") - ("my-workspace", "my-fileset", None) - >>> _parse_dataset_ref("workspace/fileset#train.jsonl") - ("workspace", "fileset", "train.jsonl") - >>> _parse_dataset_ref("workspace/fileset#**/*.json") - ("workspace", "fileset", "**/*.json") - """ - if not ref: - raise ValueError("Dataset reference cannot be empty") - - # Split on first # to separate fileset path from pattern - if "#" in ref: - fileset_part, pattern = ref.split("#", 1) - pattern = pattern.lstrip("/") if pattern else None - else: - fileset_part = ref - pattern = None - - # Parse workspace/fileset - if "/" not in fileset_part: - raise ValueError(f"Dataset reference must include workspace: '{ref}' (expected 'workspace/fileset')") - - # Split on last / to handle potential edge cases - parts = fileset_part.split("/") - if len(parts) < 2: - raise ValueError(f"Dataset reference must include workspace: '{ref}'") - - workspace = parts[0] - fileset = "/".join(parts[1:]) - if not workspace or not fileset: - raise ValueError(f"Invalid dataset reference: '{ref}'") - - return workspace, fileset, pattern - - -def load_dataset_from_ref( - ref: str, - base_dir: Path | str, - pattern: str | None = None, -) -> pa.Table: - """Load a dataset from a FilesetRef-style reference. - - This function is designed to work with downloaded filesets where the - directory structure is: {base_dir}/{workspace}/{fileset}/ - - The reference can include a fragment for file selection: - - workspace/fileset: Uses the pattern parameter - - workspace/fileset#file.json: Loads specific file (overrides pattern) - - workspace/fileset#*.json: Uses glob pattern (overrides pattern) - - Args: - ref: Dataset reference in format 'workspace/fileset[#pattern]'. - base_dir: Base directory where filesets are downloaded. - pattern: Default pattern to use if not specified in ref. - - Returns: - PyArrow Table containing the dataset. - - Raises: - DatasetLoadError: If the dataset cannot be loaded. - """ - base_dir = Path(base_dir) - workspace, fileset, ref_pattern = _parse_dataset_ref(ref) - - # Pattern from ref takes precedence - effective_pattern = ref_pattern if ref_pattern is not None else pattern - - # Build the full path to the fileset directory - fileset_path = base_dir / workspace / fileset - - if not fileset_path.exists(): - raise DatasetLoadError(f"Fileset directory not found: {fileset_path}") - return load_dataset(fileset_path, effective_pattern) - - -def load_dataset_from_ref_as_dicts( - ref: str, - base_dir: Path | str, - pattern: str | None = None, -) -> list[dict]: - """Load a dataset from a FilesetRef and convert to list of dicts. - - Convenience function combining load_dataset_from_ref and to_pylist. - - Args: - ref: Dataset reference in format 'workspace/fileset[#pattern]'. - base_dir: Base directory where filesets are downloaded. - pattern: Default pattern to use if not specified in ref. - - Returns: - List of dictionaries, one per row. - """ - base_dir = Path(base_dir) - workspace, fileset, ref_pattern = _parse_dataset_ref(ref) - effective_pattern = ref_pattern if ref_pattern is not None else pattern - fileset_path = base_dir / workspace / fileset - return load_dataset_as_dicts(fileset_path, effective_pattern) diff --git a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/__init__.py b/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/__init__.py deleted file mode 100644 index ee0e4d0381..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from .utils import load_dataset - -__all__ = ["load_dataset"] diff --git a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/exceptions.py b/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/exceptions.py deleted file mode 100644 index ae6ca7d620..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/exceptions.py +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -class UnsupportedFileFormatException(Exception): - pass diff --git a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/fileset.py b/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/fileset.py deleted file mode 100644 index d6d232e394..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/fileset.py +++ /dev/null @@ -1,482 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import json -import logging -import os -import uuid -from contextlib import asynccontextmanager -from pathlib import Path -from typing import AsyncIterator - -import fsspec.asyn -from nemo_platform import AsyncNeMoPlatform, NeMoPlatform -from nemo_platform.filesets import FilesetFileSystem -from nemo_platform.types.files.fileset import Fileset as NMPFileset -from nmp.evaluator.app.datasets.fileset_selectors import ( - fileset_glob_prefix_dir, - is_fileset_glob_pattern, - matches_fileset_glob, -) -from nmp.evaluator.app.values import BuiltInDataset, Dataset, DatasetRows, Fileset, FilesetRef, PipelineDataset - -logger = logging.getLogger(__name__) - -DEFAULT_WORKSPACE_ID = "default" - - -def normalize_fileset_path(path: str) -> str: - """Normalize a fileset path for local filesystem usage. - - For `FilesetRef.root`, we support fragments via `#` to select a file or a glob. - For local path construction, we: - - keep the base fileset path (`workspace/fileset`) - - append a non-glob fragment (specific file / subpath) - - drop the glob portion (and keep only the stable directory prefix, if any) - - Examples: - "workspace/fileset#train.jsonl" -> "workspace/fileset/train.jsonl" - "workspace/fileset#data/train.jsonl" -> "workspace/fileset/data/train.jsonl" - "workspace/fileset#*.jsonl" -> "workspace/fileset" - "workspace/fileset#data/*.jsonl" -> "workspace/fileset/data" - """ - if "#" not in path: - return path - - base, fragment = path.split("#", 1) - fragment = fragment.lstrip("/") - if not fragment: - return base - - if is_fileset_glob_pattern(fragment): - # Keep only the directory prefix before the first wildcard. - dir_prefix = fileset_glob_prefix_dir(fragment) - return f"{base}/{dir_prefix}" if dir_prefix else base - - return f"{base}/{fragment}" - - -def get_local_dataset_path( - dataset: FilesetRef | Fileset | DatasetRows, - output_dir: str | None, - inline_filename: str = "dataset.json", -) -> str: - """Get the local filesystem path where a dataset will be stored. - - This function constructs the local path for different dataset types: - - FilesetRef: Normalizes # separator and joins with output_dir - - Fileset: Joins output_dir with the fileset path - - DatasetRows: Returns output_dir/inline_filename - - Args: - dataset: The dataset object (FilesetRef, Fileset, or DatasetRows). - output_dir: Base directory where datasets are stored. - inline_filename: Filename for inline datasets. Defaults to "dataset.json". - - Returns: - Full local path where the dataset will be stored. - - """ - if not output_dir: - raise ValueError("output_dir is required for dataset path resolution") - - if isinstance(dataset, DatasetRows): - return os.path.join(output_dir, inline_filename) - - if isinstance(dataset, FilesetRef): - local_path = normalize_fileset_path(dataset.root) - return os.path.join(output_dir, local_path) - - if isinstance(dataset, Fileset): - if not dataset.path: - return output_dir - return os.path.join(output_dir, dataset.path) - - raise ValueError(f"Unsupported dataset type: {type(dataset)}") - - -def _generate_fileset_name() -> str: - return f"fileset-{uuid.uuid4().hex[:8]}" - - -@asynccontextmanager -async def create_fileset( - sdk: AsyncNeMoPlatform, - name: str | None = None, - workspace: str = DEFAULT_WORKSPACE_ID, - **kwargs, -) -> AsyncIterator[NMPFileset]: - if name is None: - name = _generate_fileset_name() - - fileset = await sdk.files.filesets.create( - workspace=workspace, - name=name, - description="Test fileset", - **kwargs, - ) - try: - yield fileset - finally: - try: - await sdk.files.filesets.delete(name, workspace=workspace) - except Exception as e: - logger.warning(f"Fileset cleanup failed: {e}") - - -async def dataset_exists( - sdk: AsyncNeMoPlatform, - dataset: PipelineDataset, - workspace: str = DEFAULT_WORKSPACE_ID, -) -> bool: - """ - Check if a dataset exists. - - Handles different dataset types: - - DatasetRows: Always returns True (inline data is always available). - - FilesetRef: Checks if the reference path exists, supporting fragments (#) and glob patterns. - - Fileset: Creates a temporary fileset and checks if the path exists. - - For FilesetRef with fragments: - - `workspace/fileset` - checks if fileset exists and has files - - `workspace/fileset#file.json` - checks if specific file exists - - `workspace/fileset#*.json` - checks if any files match the glob pattern - - Args: - sdk: AsyncNeMoPlatform SDK instance. - dataset: Dataset object (DatasetRows, FilesetRef, or Fileset). - workspace: Workspace ID for the fileset (used for Fileset). - - Returns: - True if the dataset exists, False otherwise. - """ - # DatasetRows and BuiltInDataset - inline data is always available, BEIR/RAGAS downloaded at runtime - if isinstance(dataset, DatasetRows) or isinstance(dataset, BuiltInDataset): - return True - - # FilesetRef - check if the reference path exists, handling fragments and globs - if isinstance(dataset, FilesetRef): - fs = FilesetFileSystem(sdk=sdk) - ref = dataset.root - - # Check if there's a fragment pattern - if "#" in ref: - base_path, pattern = ref.split("#", 1) - pattern = pattern.lstrip("/") - - # First check if the base fileset exists - if not await fs._exists(base_path): - return False - - # For glob fragments, only verify that the base fileset and stable - # prefix dir exist. Schema prechecks do exact wildcard expansion - # when they need per-file validation. - if is_fileset_glob_pattern(pattern): - prefix_dir = fileset_glob_prefix_dir(pattern) - if prefix_dir: - return await fs._exists(f"{base_path}/{prefix_dir}") - return True - else: - # Specific file path - check if it exists - full_path = f"{base_path}/{pattern}" - return await fs._exists(full_path) - - # No fragment - just check if the fileset exists - return await fs._exists(ref) - - # Fileset - create temporary fileset and check - storage_config = dataset.storage.model_dump() - - async with create_fileset(sdk, workspace=workspace, storage=storage_config) as fileset: - if dataset.path is None: - # No specific path - check if fileset has any files - files_response = await sdk.files.list( - fileset=fileset.name, - workspace=fileset.workspace, - ) - return len(files_response.data) > 0 - else: - # Specific path - use FilesetFileSystem._exists - fs = FilesetFileSystem(sdk=sdk) - fileset_path = f"{fileset.workspace}/{fileset.name}/{dataset.path}" - return await fs._exists(fileset_path) - - -def _download_inline_dataset( - dataset: DatasetRows, - destination: str, - filename: str = "dataset.json", -) -> Path: - """ - Write inline dataset rows to a JSON file in the destination directory. - - Handles two formats: - - Row-based: List of dicts [{col: val}, ...] - written as-is - - Columnar (RAGAS/HF): Single dict with list values {col: [val, ...]} wrapped in a list - - Unwrapped to write just the dict for HuggingFace Dataset.from_dict() compatibility - - Args: - dataset: DatasetRows object containing row data. - destination: Local destination directory path. - filename: Name of the output file. Defaults to "dataset.json". - - Returns: - Path to the created file. - """ - output_file = Path(get_local_dataset_path(dataset, destination, inline_filename=filename)) - output_file.parent.mkdir(parents=True, exist_ok=True) - - # Detect columnar format: single-element list containing a dict with list values - # This is the format expected by RAGAS/HuggingFace datasets - data_to_write = dataset.rows - if ( - isinstance(dataset.rows, list) - and len(dataset.rows) == 1 - and isinstance(dataset.rows[0], dict) - and all(isinstance(v, list) for v in dataset.rows[0].values()) - ): - # Unwrap the columnar dict for Dataset.from_dict() compatibility - data_to_write = dataset.rows[0] - - with open(output_file, "w", encoding="utf-8") as f: - json.dump(data_to_write, f, indent=2) - - return output_file - - -async def _download_fileset_ref( - sdk: AsyncNeMoPlatform, - dataset: FilesetRef, - destination: str, - recursive: bool = True, -) -> Path: - """ - Download files from a Fileset reference using FilesetFileSystem. - - Supports three reference formats: - - 'workspace/fileset-name': Downloads all files - - 'workspace/fileset-name#file.json': Downloads a specific file - - 'workspace/fileset-name#*.json': Downloads files matching the glob pattern - - Args: - sdk: AsyncNeMoPlatform SDK instance. - dataset: FilesetRef object containing the reference path. - destination: Local destination directory path. - recursive: Whether to download recursively. Defaults to True. - - Returns: - Path to the downloaded directory (destination/workspace/fileset-name). - """ - fs = FilesetFileSystem(sdk=sdk) - ref = dataset.root - - # Parse the fragment if present - if "#" in ref: - base_path, pattern = ref.split("#", 1) - pattern = pattern.lstrip("/") - - if not pattern: - return await _download_fileset_ref( - sdk, - FilesetRef(root=base_path), - destination, - recursive=recursive, - ) - - # Determine base destination path - base_dest = Path(destination) / base_path - base_dest.mkdir(parents=True, exist_ok=True) - - if is_fileset_glob_pattern(pattern): - # Glob pattern - list files and download matching ones - # _find returns paths in format "workspace/fileset#relative_path" - all_files = await fs._find(base_path) - for file_path in all_files: - # Extract relative path: _find returns "workspace/fileset#path" - if "#" in file_path: - relative_path = file_path.split("#", 1)[1] - else: - relative_path = file_path.replace(base_path + "/", "", 1) - if matches_fileset_glob(relative_path, pattern): - file_dest = base_dest / relative_path - file_dest.parent.mkdir(parents=True, exist_ok=True) - await fs._get_file(file_path, str(file_dest)) - return base_dest - else: - # Specific file path - full_remote_path = f"{base_path}/{pattern}" - file_dest = base_dest / pattern - file_dest.parent.mkdir(parents=True, exist_ok=True) - await fs._get_file(full_remote_path, str(file_dest)) - return file_dest - - # No fragment - download all files - dest = Path(get_local_dataset_path(dataset, destination)) - # Directory download - use trailing slash on source to copy contents directly - # into dest, rather than creating an extra subdirectory - # (fs._get without trailing slash would create dest/fileset-name/files) - source = ref.rstrip("/") + "/" - await fs._get(source, str(dest), recursive=recursive) - return dest - - -def _download_fileset_ref_sync( - sdk: NeMoPlatform, - dataset: FilesetRef, - destination: str, - recursive: bool = True, -) -> Path: - """Sync bridge over `_download_fileset_ref`. - - Builds a sync-mode `FilesetFileSystem` from the sync SDK and schedules the - async download on its fsspec daemon loop (`fs.loop`) via - `fsspec.asyn.sync` — the same bridge pattern used by `FilesetFileManager` - in `nemo-platform-plugin`. Closes the per-call async client in `finally` to avoid - leaking the `httpx.AsyncClient` created by `FilesetFileSystem`. Test - transports (e.g. ASGI) are preserved by the FilesetFileSystem converter. - - Args: - sdk: NeMoPlatform SDK instance (sync). - dataset: FilesetRef object containing the reference path. - destination: Local destination directory path. - recursive: Whether to download recursively for the no-fragment case. Defaults to True. - - Returns: - Path to the downloaded file or directory (mirrors `_download_fileset_ref`). - """ - fs = FilesetFileSystem(sdk=sdk) - - async def _impl() -> Path: - try: - return await _download_fileset_ref(fs._sdk, dataset, destination, recursive=recursive) - finally: - await fs._sdk.close() - - return fsspec.asyn.sync(fs.loop, _impl) - - -async def _download_inline_fileset( - sdk: AsyncNeMoPlatform, - dataset: Fileset, - destination: str, - workspace: str = DEFAULT_WORKSPACE_ID, - recursive: bool = True, -) -> Path: - """ - Download files from an Fileset configuration. - - Creates a temporary fileset, downloads the files, then cleans up. - - Args: - sdk: AsyncNeMoPlatform SDK instance. - dataset: Fileset object containing storage config and optional path. - destination: Local destination directory path. - workspace: Workspace ID for the temporary fileset. - recursive: Whether to download recursively. Defaults to True. - """ - storage_config = dataset.storage.model_dump() - - async with create_fileset(sdk, workspace=workspace, storage=storage_config) as fileset: - fs = FilesetFileSystem(sdk=sdk) - remote_path = f"{fileset.workspace}/{fileset.name}/{dataset.path or ''}" - dest = Path(get_local_dataset_path(dataset, destination)) - await fs._get(remote_path, str(dest), recursive=recursive) - return dest - - -def _download_inline_fileset_sync( - sdk: NeMoPlatform, - dataset: Fileset, - destination: str, - workspace: str = DEFAULT_WORKSPACE_ID, - recursive: bool = True, -) -> Path: - """Sync bridge over `_download_inline_fileset`. - - Mirrors `_download_fileset_ref_sync`: builds a sync-mode - `FilesetFileSystem` and schedules the async inline-fileset download on - `fs.loop` via `fsspec.asyn.sync`, closing the per-call async client in - `finally`. Lets sync local evaluator execution handle storage-backed - Fileset configs without duplicating the async download algorithm. - """ - fs = FilesetFileSystem(sdk=sdk) - - async def _impl() -> Path: - try: - return await _download_inline_fileset( - fs._sdk, - dataset, - destination, - workspace=workspace, - recursive=recursive, - ) - finally: - await fs._sdk.close() - - return fsspec.asyn.sync(fs.loop, _impl) - - -async def download_dataset( - sdk: AsyncNeMoPlatform, - dataset: Dataset, - destination: str, - workspace: str = DEFAULT_WORKSPACE_ID, - recursive: bool = True, -) -> Path: - """ - Download a dataset to a local directory. - - Handles different dataset types: - - DatasetRows: Creates destination directory and writes rows to a JSON file. - - FilesetRef: Downloads all files from the fileset using FilesetFileSystem._get. - - Fileset: Creates a temporary fileset, downloads, then cleans up. - - Args: - sdk: AsyncNeMoPlatform SDK instance. - dataset: Dataset object (DatasetRows, FilesetRef, or Fileset). - destination: Local destination directory path. - workspace: Workspace ID for the fileset (used for Fileset). - recursive: Whether to download recursively. Defaults to True. - - Example: - # DatasetRows - inline = DatasetRows(rows=[{"a": 1}, {"a": 2}]) - await download_dataset(sdk, inline, "/local/destination/") - - # FilesetRef - ref = FilesetRef(root="default/my-fileset") - await download_dataset(sdk, ref, "/local/destination/") - - # Fileset - fileset = Fileset( - storage={"type": "huggingface", "repo_id": "my-org/my-repo", "repo_type": "dataset"}, - path="checkpoints/" - ) - await download_dataset(sdk, fileset, "/local/destination/") - """ - if isinstance(dataset, DatasetRows): - return _download_inline_dataset(dataset, destination) - elif isinstance(dataset, FilesetRef): - return await _download_fileset_ref(sdk, dataset, destination, recursive=recursive) - else: - return await _download_inline_fileset(sdk, dataset, destination, workspace=workspace, recursive=recursive) - - -def download_dataset_sync( - sdk: NeMoPlatform, - dataset: Dataset, - destination: str, - workspace: str = DEFAULT_WORKSPACE_ID, - recursive: bool = True, -) -> Path: - """ - Download a dataset to a local directory using the sync SDK where supported. - - Sync local evaluator execution supports inline rows, persisted FilesetRef - datasets, and inline Fileset storage configs through async bridges. - """ - if isinstance(dataset, DatasetRows): - return _download_inline_dataset(dataset, destination) - if isinstance(dataset, FilesetRef): - return _download_fileset_ref_sync(sdk, dataset, destination, recursive=recursive) - return _download_inline_fileset_sync(sdk, dataset, destination, workspace=workspace, recursive=recursive) diff --git a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/hf.py b/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/hf.py deleted file mode 100644 index c3515ce8a1..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/hf.py +++ /dev/null @@ -1,75 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import os -from typing import Tuple - -from huggingface_hub import HfApi - -hf_dataset_prefix = "hf://datasets/" - - -async def download_dataset( - hf_path: str, local_dir: str, hf_endpoint: str | None = None, hf_token: str | None = None -) -> Tuple[str, str | None]: - """ - Download a file from HuggingFace Hub to a local directory. - - Args: - hf_path: The HuggingFace path in format hf://datasets/owner/repo/path/to/file - local_dir: The local directory where the file should be downloaded - hf_endpoint: Optional HuggingFace endpoint URL - hf_token: Optional HuggingFace token - - Returns: - str: The directory path where the dataset downloaded to - str | None: The relative path to the downloaded file or a subdirectory within the repo - """ - if not hf_path.startswith(hf_dataset_prefix): - raise ValueError(f"Invalid dataset path: {hf_path}. Must start with '{hf_dataset_prefix}'") - - # If no HF endpoint is provided, use default - hf_endpoint = hf_endpoint or os.environ.get("DATA_STORE_URL") - if not hf_endpoint: - raise ValueError("DATA_STORE_URL is not defined and no HuggingFace endpoint provided for downloading dataset.") - - # For the token, we put a fake one when using Data Store - hf_token = hf_token or os.environ.get("DATA_STORE_TOKEN") - is_file = "." in hf_path.split("/")[-1] - - hf_api = HfApi(endpoint=hf_endpoint, token=hf_token) - - # Parse repo_id namespace/name and relative path to file or dataset subdirectory if included - hf_dataset_uri = hf_path.removeprefix(hf_dataset_prefix) - if hf_dataset_uri.count("/") == 1: - repo_id = hf_dataset_uri - relative_repo_path = None - else: - ( - repo_ns, - repo_name, - relative_repo_path, - ) = hf_dataset_uri.split("/", maxsplit=2) - repo_id = f"{repo_ns}/{repo_name}" - - if is_file: - # Download only the specified file - assert relative_repo_path is not None - local_dir = os.path.join(local_dir, repo_id) - await asyncio.to_thread( - hf_api.hf_hub_download, - repo_id=repo_id, - filename=relative_repo_path, - local_dir=local_dir, - repo_type="dataset", - ) - else: - # Download the entire repo when the URI is namespace/name or includes a subdirectory of the repo - # e.g. namespace/name/subdirectory_path - local_dir = os.path.join(local_dir, repo_id) - local_dir = await asyncio.to_thread( - hf_api.snapshot_download, repo_id=repo_id, repo_type="dataset", local_dir=local_dir - ) - - return local_dir, relative_repo_path diff --git a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/utils.py b/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/utils.py deleted file mode 100644 index e551502309..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/datasets/nmp_datasets/utils.py +++ /dev/null @@ -1,259 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import json -import logging -import os -import shutil -import tempfile -from contextvars import ContextVar -from enum import Enum -from typing import Dict, List - -import aiohttp -from datasets import Dataset as HFDataset -from datasets import DatasetDict, exceptions -from datasets import load_dataset as hf_load_dataset -from nmp.common.api.common import URN -from nmp.common.files.deprecated_datastore.datasets import Dataset -from nmp.evaluator.app.datasets.nmp_datasets.exceptions import UnsupportedFileFormatException -from nmp.evaluator.app.datasets.nmp_datasets.hf import download_dataset -from pydantic import AnyUrl - -# We use a context variable for the name of the logger to use -logger_var = ContextVar("logger_name") - - -def get_logger() -> logging.Logger: - return logging.getLogger(logger_var.get(__name__)) - - -class LoadingMode(str, Enum): - DATASETS = "datasets" # load dataset using "datasets" package (with pyarrow) - SIMPLE = "simple" # load dataset using JSON / JSONL reading - - -async def to_dataset(dataset: str | URN | Dataset | None) -> Dataset: - """ - Convert a dataset into URN format into Dataset structure. - """ - if isinstance(dataset, Dataset): - return dataset - elif isinstance(dataset, URN) or isinstance(dataset, str): - # entity_store_url = app_config.ENTITY_STORE_URL - entity_store_url = None - if entity_store_url is None: - raise ValueError(f"ENTITY_STORE_URL environment variable is not set, cannot fetch dataset {dataset}") - - async with aiohttp.ClientSession() as session: - async with session.get(f"{entity_store_url}/v1/datasets/{dataset}") as response: - response.raise_for_status() - return Dataset.model_validate(await response.json()) - else: - raise ValueError(f"Unsupported dataset type: {type(dataset)}") - - -def extract_path(dataset_files_url: str) -> str: - """ - Function to extract directory path from files_url. - """ - parts = dataset_files_url.replace("hf://", "").split("/") - if parts[0] != "datasets": - raise ValueError(f"Invalid dataset path: {dataset_files_url}. It does not start with hf://datasets.") - directory_path = "/".join(parts[1:]) - return directory_path - - -async def load_dataset(dataset: str | URN | Dataset, loading_mode: LoadingMode = LoadingMode.DATASETS) -> List[Dict]: - """ - Load a dataset from a URN (string) or a Dataset object. - - Args: - dataset: The dataset to load. - - Returns: - (List[Dict]) The list of rows. Each row is an object with a property for each column. - """ - log = get_logger() - log.debug(f"Loading dataset {dataset}") - dataset = await to_dataset(dataset) - return await _load_hf_dataset(dataset, loading_mode) - - -async def _load_hf_dataset(dataset: Dataset, loading_mode: LoadingMode) -> List[Dict]: - """Loads a dataset from the given path. - - Supports loading from a specific file, or from a full dataset / folder. - - Args - path_or_url: The path to the dataset. - hf_endpoint: The endpoint to use for the dataset. - split: The split of the dataset to load. - limit: The maximum number of items to load. - """ - log = get_logger() - path_or_url: str - - files_url = str(dataset.files_url) - # Supported schemas: file:// and hf:// - if files_url.startswith("file://"): - # Remove the file:// prefix - path_or_url = files_url[len("file://") :] - elif files_url.startswith("hf://"): - path_or_url = files_url - else: - raise ValueError(f"Unsupported files_url schema: {files_url}") - - hf_endpoint = dataset.hf_endpoint - limit = dataset.limit - split = dataset.split - - # Make sure we're not dealing with AnyUrl instances - path_or_url = str(path_or_url) - hf_endpoint = str(hf_endpoint) if hf_endpoint else None - - # To determine if it's a single file, we check if there's a "." in the last segment - # TODO: make this more robust by checking explicitly for the file extensions supported by HF datasets library - is_file = "." in path_or_url.split("/")[-1] - is_url = "://" in path_or_url - - # To use the `datasets.load_dataset` from HF, we heed to have the file(s) in a single folder - with tempfile.TemporaryDirectory() as temp_dir: - # If it's an HF URL, we download the file/dataset otherwise, we copy - if is_url: - url = AnyUrl(path_or_url) - - if url.scheme != "hf": - raise ValueError( - f"Invalid URL for dataset ({path_or_url}). " - f"The {url.scheme} scheme is not supported. " - f"Only 'hf' scheme is currently supported." - ) - - log.debug(f"Downloading dataset {path_or_url} to {temp_dir}") - # For the token, we put a fake one when using Data Store - hf_token = "token" if os.environ.get("DATA_STORE_URL") else os.environ.get("HF_TOKEN") - dataset_path, relative_repo_path = await download_dataset(path_or_url, temp_dir, hf_endpoint, hf_token) - - else: - # If it's a file, we copy it to the temp dir - dataset_path = temp_dir - if is_file: - relative_repo_path = path_or_url.split("/")[-1] - shutil.copy(path_or_url, temp_dir) - else: - relative_repo_path = None - shutil.copytree(path_or_url, temp_dir, dirs_exist_ok=True) - - log.debug(f"Loading dataset from {dataset_path}") - if loading_mode == LoadingMode.DATASETS: - # Load the dataset; this also involves File IO, so we run in separate thread - rows = await asyncio.to_thread( - _load_dataset_with_hf, dataset_path=dataset_path, relative_repo_path=relative_repo_path, split=split - ) - else: - rows = await asyncio.to_thread( - _load_dataset_with_json, dataset_path=dataset_path, relative_repo_path=relative_repo_path - ) - log.info(f"Loaded dataset from {path_or_url}") - - # Return a maximum of `limit` items - return rows[:limit] - - -def _load_dataset_with_hf(dataset_path: str, relative_repo_path: str | None, split: str | None = None) -> list: - """ - Load content of dataset using hf_load_dataset from directory - """ - log = get_logger() - try: - dataset = hf_load_dataset(path=dataset_path, split=split) - - if isinstance(dataset, DatasetDict): - dataset = dataset[split or list(dataset.keys())[0]] - return dataset.to_list() - else: - assert isinstance(dataset, HFDataset) - return dataset.to_list() - - except exceptions.DatasetGenerationError: - # This branch of code is for cases when the dataset cannot be parsed with 'datasets' - # because the pyarrow that 'datasets' use in the background is too strict and requires the JSON - # to conform to a consistent schema (that pyarrow determines on the fly). - # This particularly breaks for the cases when the args of same names in the tool_calls contain - # values of different types (eg. some function arg named limit refers to int for one function - # but float or even string for another) and pyarrow throws exception wrapped into - # the datasets.exceptions.DatasetGenerationError (eg limit has been used with type X but now with type Y). - # - # To work around this restriction - the code switches back to a simplified json/jsonl reading - - log.exception("Error when parsing the dataset. Switching to simplified dataset loading.") - return _load_dataset_with_json(dataset_path, relative_repo_path) - - -def _load_dataset_with_json(dataset_path: str, relative_repo_path: str | None) -> list: - """ - Load content of dataset files using json.load or json.loads from path. `relative_repo_path` can be the - relative path from dataset_path to a single file or a subdirectory. - """ - log = get_logger() - full_contents: list = [] - - file_paths = [] - if relative_repo_path: - full_dataset_path = os.path.join(dataset_path, relative_repo_path) - if os.path.isfile(full_dataset_path): - # Single file to read only - file_paths = [full_dataset_path] - else: - # Subdirectory to read - file_paths = walk_directory_for_files(full_dataset_path) - else: - # Whole dataset - file_paths = walk_directory_for_files(dataset_path) - - for filename in file_paths: - if os.path.isfile(filename): - log.debug(f"Reading from {filename}") - if filename.endswith(".json"): - full_contents.extend(_read_json(filename)) - elif filename.endswith(".jsonl"): - full_contents.extend(_read_jsonl(filename)) - else: - raise UnsupportedFileFormatException( - f"Unable to parse the dataset. Files either need to follow strict typing within columns or be in JSON / JSONL format: {dataset_path} {filename}" - ) - - return full_contents - - -def walk_directory_for_files(dataset_path: str) -> List[str]: - """Walk through directory and subdirectories and return a list of all files""" - file_paths = [] - for root, _, files in os.walk(dataset_path): - for file in files: - full_path = os.path.join(root, file) - if os.path.isfile(full_path): - file_paths.append(full_path) - return file_paths - - -def _read_json(file_path) -> list: - """Reads a JSON file and returns a list of JSON objects.""" - with open(file_path, "r", encoding="utf-8") as file: - loaded_json = json.load(file) - if isinstance(loaded_json, list): - return loaded_json - else: - return [loaded_json] - - -def _read_jsonl(file_path) -> list: - """Reads a JSONL file and returns a list of JSON objects.""" - data = [] - with open(file_path, "r", encoding="utf-8") as file: - for line in file: - json_object = json.loads(line.strip()) - data.append(json_object) - return data diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/agentic_eval.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/agentic_eval.py deleted file mode 100644 index 3e13167371..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/agentic_eval.py +++ /dev/null @@ -1,166 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nemo_evaluator_sdk.values import SecretRef, SupportedJobTypes -from nmp.evaluator.app.evalfactory.convert import _convert_config_params, _setup_adapter_config -from nmp.evaluator.app.evalfactory.handler import ( - BaseSystemHandler, - JudgeModelParamsInput, -) -from nmp.evaluator.app.evalfactory.labels import LABEL_AGENTIC, new_labels -from nmp.evaluator.app.values import MetricJob, MetricOfflineJob, Parameter, SystemMetric -from nmp.evaluator.config import settings -from pydantic import model_validator -from typing_extensions import Self - - -class AgenticEvalJudgeModelParamsInput(JudgeModelParamsInput): - """Judge model params for agentic evaluation with additional endpoint validation.""" - - @model_validator(mode="after") - def completions_endpoint(self) -> Self: - if "/v1/chat/completions" not in self.model.url: - raise ValueError( - f"The path for job.metric_params.judge.model.url must end in '/v1/chat/completions' for agentic judge: {self.model.model_dump_json(exclude_none=True)}" - ) - return self - - -trajectory_judge_param = Parameter( - name="judge", - type="object", - description="The LLM judge to use for trajectory evaluation.", - schema_=AgenticEvalJudgeModelParamsInput.model_json_schema(), -) -trajectory_used_tools_param = Parameter( - name="trajectory_used_tools", - type="string", - description="Comma-separated list of tool names that were available to the agent during execution. This helps the evaluator understand what tools the agent had at its disposal. Example: 'wikipedia_search,current_datetime,code_generation,dummy_custom_tool'", -) -trajectory_custom_tools_param = Parameter( - name="trajectory_custom_tools", - type="object", - description="""Required for any tools that are not part of the Nemo agent toolkit default functions. This helps the judge LLM understand the purpose of each custom tool. Example: -{ - "dummy_custom_tool": "Do nothing. This tool is for test only", - "code_generation": "Useful to generate Python code. For any questions about code generation, you must only use this tool!", - "wikipedia_search": "Tool that retrieves relevant contexts from wikipedia search for the given question.\n\n Args:\n _type (str): The type of the object.\n max_results (int): Description unavailable. Defaults to 2." -} -""", -) - - -class AgenticEvalHandler(BaseSystemHandler): - @classmethod - def docker_image(cls) -> str: - return settings.evalfactory.agentic_eval - - @classmethod - def system_metrics(self) -> list[SystemMetric]: - return self._system_metrics - - def metric_job_secrets(self, job: MetricJob) -> dict[str, SecretRef]: - """Job secrets for the metric. Returns a dictionary of environment variables to the secret reference""" - assert isinstance(job, MetricOfflineJob) - assert isinstance(job.metric, SystemMetric) - # Special handling for agentic_eval where judge.model.api_key_secret can't be easily represented - # by Parameter - secrets = super().metric_job_secrets(job) - judge_raw_param = job.metric_params.get("judge") - if judge_raw_param: - judge = AgenticEvalJudgeModelParamsInput.model_validate(judge_raw_param) - if judge.model.api_key_secret: - secrets["judge_api_key_secret"] = judge.model.api_key_secret - # OpenAI Python client expects OPENAI_API_KEY environment variable - if judge.model.format == "openai": - secrets["OPENAI_API_KEY"] = judge.model.api_key_secret - return secrets - - def augment_metric_job(self, job: MetricJob, output_dir: str) -> ef.EvaluationJob: - self.validate_supported_metric_job_types(job) - assert isinstance(job, MetricOfflineJob) - assert isinstance(job.metric, SystemMetric) - self.validate_params(job.metric_params, job.metric.required_params, job.metric.optional_params) - - judge: AgenticEvalJudgeModelParamsInput | None = None - - # Validate judge model - if job.metric.name in self._require_judge: - judge_raw_param = job.metric_params.get("judge") - if not judge_raw_param: - raise ValueError( - f"job.metric_params.judge.model is required for evaluation with metric {job.metric.name}" - ) - judge = AgenticEvalJudgeModelParamsInput.model_validate(judge_raw_param) - - # Merge judge parameters - judge_model_args = job.metric_params.get("judge_model_args", {}) - if judge.inference: - judge_inference_params = judge.inference.model_dump(mode="json", exclude_none=True) - if judge_inference_params: - judge_model_args.update(judge_inference_params) - if judge.max_retries: - judge_model_args["max_retries"] = judge.max_retries - job.metric_params["judge_model_args"] = judge_model_args - job.metric_params["judge_model_type"] = "openai" if judge.model.format == "openai" else "nvidia-nim" - - # EvalFactory expects metric names with 'agentic_eval_' prefix and underscores instead of hyphens - metric_name = "agentic_eval_" + job.metric.name.replace("-", "_") - - # can't use augment_job like other handlers because AgenticEval is a special snowflake - # that shims judge model as target.model - if judge is not None: - return ef.EvaluationJob( - target=ef.EvaluationTarget( - api_endpoint=ef.APIEndpoint( - url=judge.model.url, - model_id=judge.model.name, - # Use the env var name (must match key in secrets() method) - the Jinja template adds the $ prefix - api_key="judge_api_key_secret" if judge.model.api_key_secret else None, - # api_key_name does not work for agentic_eval:26.01 - api_key_name="judge_api_key_secret" if judge.model.api_key_secret else None, - type="chat" if "/chat" in judge.model.url else "completions", - adapter_config=_setup_adapter_config(job, output_dir, judge.system_prompt, judge.reasoning), - ) - ), - config=ef.RunConfig( - type=metric_name, # Evaluator system metric name is the EF config name - params=_convert_config_params(job, exclude={"judge"}), - ), - output_dir=output_dir, - ) - - # Metrics without a judge - # These metrics don't call an external model, but the container command still needs - # model_id, url, and type - we provide placeholders that EvalFactory will ignore - return ef.EvaluationJob( - target=ef.EvaluationTarget( - api_endpoint=ef.APIEndpoint( - url="none", # Placeholder - no target endpoint for non-judge metrics - model_id="none", # Placeholder - type="chat", # Placeholder - required by container_command - adapter_config=_setup_adapter_config(job, output_dir, None, None), - ) - ), - config=ef.RunConfig( - type=metric_name, - params=_convert_config_params(job, exclude=set()), - ), - output_dir=output_dir, - ) - - _require_judge = { - "trajectory-evaluation", - } - - _system_metrics = [ - SystemMetric( - name="trajectory-evaluation", - description="Evaluates agent decision-making by analyzing the sequence of actions taken to accomplish a goal", - labels=new_labels("agentic_eval", LABEL_AGENTIC), - supported_job_types=[SupportedJobTypes.OFFLINE], - required_params=[trajectory_judge_param, trajectory_used_tools_param], - optional_params=[trajectory_custom_tools_param], - ), - ] diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/bfcl.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/bfcl.py deleted file mode 100644 index b3b7f834bd..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/bfcl.py +++ /dev/null @@ -1,216 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import itertools - -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.convert import augment_online_job -from nmp.evaluator.app.evalfactory.handler import BaseSystemHandler -from nmp.evaluator.app.evalfactory.labels import LABEL_AGENTIC, new_labels -from nmp.evaluator.app.values import ( - Parameter, - SystemBenchmark, - SystemBenchmarkJob, - SystemBenchmarkOnlineJob, -) -from nmp.evaluator.config import settings - -# BFCL harness limitations (params passed but ignored by the harness): -# - temperature: Always 0.001 (BFCL ignores params.inference.temperature entirely) -# - max_tokens: NOT passed to the model (BFCL handles generation internally) -# - max_retries: NOT used by BFCL (no retry mechanism) -# -# Working params: -# - parallelism: Works, maps to --num-threads -# - limit_samples: Works, applies to the single task category for per-task metrics - -# API keys required for executable test categories (exec_*, rest) -_api_key_params = [ - Parameter( - name="rapid_api_key", - type="secret", - description="Secret reference to an API key for RapidAPI (free tier supported; subscription required).", - ), - Parameter( - name="exchangerate_api_key", - type="secret", - description="Secret reference to an API key for ExchangeRate-API.", - ), - Parameter( - name="omdb_api_key", - type="secret", - description="Secret reference to an API key for OMDb.", - ), - Parameter( - name="geocode_api_key", - type="secret", - description="Secret reference to an API key for Geocode.", - ), -] - - -class BFCLHandler(BaseSystemHandler): - @classmethod - def docker_image(cls) -> str: - return settings.evalfactory.bfcl - - @classmethod - def system_benchmarks(cls) -> list[SystemBenchmark]: - return cls._system_benchmarks - - def augment_benchmark_job(self, job: SystemBenchmarkJob, output_dir: str) -> ef.EvaluationJob: - self.validate_supported_benchmark_job_types(job) - self.validate_params(job.benchmark_params, job.benchmark.required_params, job.benchmark.optional_params) - assert isinstance(job, SystemBenchmarkOnlineJob) - - # Extract task category from benchmark name: "bfclv3-parallel-multiple" → "parallel_multiple" - task_category = job.benchmark.name.removeprefix("bfclv3-").replace("-", "_") - - # Create a copy to avoid mutating the shared SystemBenchmark object - job.benchmark = job.benchmark.model_copy(update={"name": "bfclv3"}) - - ef_job = augment_online_job(job, output_dir) - - # Override the config type to use the BFCL harness name, and set the task category - # Note: We don't mutate job.benchmark.name as it's a shared SystemBenchmark object - if ef_job.config: - ef_job.config.type = "bfclv3" - if ef_job.config.params: - ef_job.config.params.task = task_category - - return ef_job - - def benchmark_job_secrets(self, job: SystemBenchmarkJob) -> dict[str, SecretRef]: - """BFCL secrets mapping: parameter name (uppercase) → secret reference.""" - secrets = {} - for param in itertools.chain(job.benchmark.required_params, job.benchmark.optional_params): - if param.type == "secret": - secret_ref = job.benchmark_params.get(param.name) - if secret_ref: - secrets[param.name.upper()] = SecretRef(secret_ref) - return secrets - - _system_benchmarks = [ - # === Single-turn AST (no API keys) === - SystemBenchmark( - name="bfclv3-simple", - description="BFCL v3 simple single-turn function calling. Tests basic function call generation.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-parallel", - description="BFCL v3 parallel single-turn function calling. Tests multiple parallel function calls.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-multiple", - description="BFCL v3 multiple single-turn function calling. Tests sequential function calls.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-parallel-multiple", - description="BFCL v3 parallel-multiple single-turn function calling. Tests complex call patterns.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - # === Language-specific AST (no API keys) === - SystemBenchmark( - name="bfclv3-java", - description="BFCL v3 Java function calling. Tests function calls with Java-style APIs.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-javascript", - description="BFCL v3 JavaScript function calling. Tests function calls with JavaScript-style APIs.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - # === Irrelevance detection (no API keys) === - SystemBenchmark( - name="bfclv3-irrelevance", - description="BFCL v3 irrelevance detection. Tests ability to detect when no function call is needed.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - # === Live AST (no API keys) === - SystemBenchmark( - name="bfclv3-live-simple", - description="BFCL v3 live simple. Tests function calling with real-world API schemas.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-live-multiple", - description="BFCL v3 live multiple. Tests sequential calls with real-world API schemas.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-live-parallel", - description="BFCL v3 live parallel. Tests parallel calls with real-world API schemas.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-live-parallel-multiple", - description="BFCL v3 live parallel-multiple. Tests complex patterns with real-world API schemas.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-live-irrelevance", - description="BFCL v3 live irrelevance. Tests irrelevance detection with real-world API schemas.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-live-relevance", - description="BFCL v3 live relevance. Tests relevance detection with real-world API schemas.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - # === Multi-turn AST (no API keys) === - SystemBenchmark( - name="bfclv3-multi-turn-base", - description="BFCL v3 multi-turn base. Tests multi-turn conversation with function calling.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-multi-turn-miss-func", - description="BFCL v3 multi-turn missing function. Tests handling of unavailable functions.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-multi-turn-miss-param", - description="BFCL v3 multi-turn missing parameter. Tests handling of incomplete information.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - SystemBenchmark( - name="bfclv3-multi-turn-long-context", - description="BFCL v3 multi-turn long context. Tests function calling with extended context.", - labels=new_labels("bfcl", LABEL_AGENTIC), - ), - # === Executable (require API keys) === - SystemBenchmark( - name="bfclv3-exec-simple", - description="BFCL v3 executable simple. Executes function calls against real APIs. Requires API keys.", - labels=new_labels("bfcl", LABEL_AGENTIC), - required_params=_api_key_params, - ), - SystemBenchmark( - name="bfclv3-exec-parallel", - description="BFCL v3 executable parallel. Executes parallel function calls against real APIs. Requires API keys.", - labels=new_labels("bfcl", LABEL_AGENTIC), - required_params=_api_key_params, - ), - SystemBenchmark( - name="bfclv3-exec-multiple", - description="BFCL v3 executable multiple. Executes sequential function calls against real APIs. Requires API keys.", - labels=new_labels("bfcl", LABEL_AGENTIC), - required_params=_api_key_params, - ), - SystemBenchmark( - name="bfclv3-exec-parallel-multiple", - description="BFCL v3 executable parallel-multiple. Executes complex call patterns against real APIs. Requires API keys.", - labels=new_labels("bfcl", LABEL_AGENTIC), - required_params=_api_key_params, - ), - SystemBenchmark( - name="bfclv3-rest", - description="BFCL v3 REST API. Tests REST API call generation and execution. Requires API keys.", - labels=new_labels("bfcl", LABEL_AGENTIC), - required_params=_api_key_params, - ), - ] diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/bigcode.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/bigcode.py deleted file mode 100644 index f9d57b1ad8..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/bigcode.py +++ /dev/null @@ -1,268 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nmp.evaluator.app.evalfactory.convert import augment_online_job -from nmp.evaluator.app.evalfactory.handler import ( - BaseSystemHandler, - harness_model_type_param, - hf_token_param, -) -from nmp.evaluator.app.evalfactory.labels import LABEL_CODE, new_labels -from nmp.evaluator.app.jobs.evalfactory.constants import EvalFactoryModelType -from nmp.evaluator.app.values import Parameter, SystemBenchmark, SystemBenchmarkJob, SystemBenchmarkOnlineJob -from nmp.evaluator.config import settings - -# Common parameters for code generation benchmarks -n_samples_param = Parameter( - name="n_samples", - type="integer", - description="Number of code samples to generate per problem for pass@k benchmarks (default: 10).", - default=10, -) - -do_sample_param = Parameter( - name="do_sample", - type="boolean", - description="Whether to use sampling (True) or greedy decoding (False) for code generation (default: True).", - default=True, -) - -# Shared params for all BigCode benchmarks -bigcode_eval_harness_params = [hf_token_param, harness_model_type_param, n_samples_param, do_sample_param] - -_benchmark_name_map = { - "humaneval-instruct": "humaneval_instruct", - "mbppplus-nemo": "mbppplus_nemo", -} - - -class BigCodeEvaluationHarnessHandler(BaseSystemHandler): - @classmethod - def docker_image(cls) -> str: - return settings.evalfactory.bigcode_evaluation_harness - - @classmethod - def system_benchmarks(cls) -> list[SystemBenchmark]: - return cls._system_benchmarks - - def augment_benchmark_job(self, job: SystemBenchmarkJob, output_dir: str) -> ef.EvaluationJob: - self.validate_supported_benchmark_job_types(job) - self.validate_params(job.benchmark_params, job.benchmark.required_params, job.benchmark.optional_params) - self.augment_harness_supported_model_types(job, self.SUPPORTED_MODEL_TYPE.get(job.benchmark.name)) - - if not isinstance(job, SystemBenchmarkOnlineJob): - raise ValueError( - f"BigCode benchmarks require a SystemBenchmarkOnlineJob (with model), " - f"but got {type(job).__name__}. Use an online benchmark spec for '{job.benchmark.name}'." - ) - ef_job = augment_online_job(job, output_dir) - - # BigCode config type may need name mapping - # Note: We set this on the EF job config, not on the original benchmark to avoid mutating shared state - if ef_job.config: - ef_job.config.type = _benchmark_name_map.get(job.benchmark.name, job.benchmark.name) - - return ef_job - - _system_benchmarks = [ - SystemBenchmark( - name="humaneval", - description="HumanEval is used to measure functional correctness for synthesizing programs from docstrings. It consists of 164 original programming problems, assessing language comprehension, algorithms, and simple mathematics, with some comparable to simple software interview questions. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="humaneval-instruct", - description="InstructHumanEval is a modified version of OpenAI HumanEval. For a given prompt, we extracted its signature, its docstring as well as its header to create a flexing setting which would allow to evaluation instruction-tuned LLM. The delimiters used in the instruction-tuning procedure can be use to build and instruction that would allow the model to elicit its best capabilities. Compatible with chat model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="humanevalplus", - description="HumanEvalPlus is a modified version of HumanEval containing 80x more test cases. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="mbpp", - description="MBPP consists of Python programming problems, designed to be solvable by entry level programmers, covering programming fundamentals, standard library functionality, and so on. Each problem consists of a task description, code solution and 3 automated test cases. Compatible with both chat and completions model endpoints.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="mbppplus", - description="MBPP+ is a modified version of MBPP containing 35x more test cases. Compatible with both chat and completions model endpoints.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="mbppplus-nemo", - description="MBPP+NeMo is a modified version of MBPP+ that uses the NeMo alignment prompt template. Compatible with chat model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-clj", - description="MultiPL-E Clojure coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-cpp", - description="MultiPL-E C++ coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-cs", - description="MultiPL-E C# coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-d", - description="MultiPL-E D coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-elixir", - description="MultiPL-E Elixir coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-go", - description="MultiPL-E Go coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-hs", - description="MultiPL-E Haskell coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-java", - description="MultiPL-E Java coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-jl", - description="MultiPL-E Julia coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-js", - description="MultiPL-E JavaScript coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-lua", - description="MultiPL-E Lua coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-ml", - description="MultiPL-E ML/OCaml coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-php", - description="MultiPL-E PHP coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-pl", - description="MultiPL-E Perl coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-r", - description="MultiPL-E R coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-rb", - description="MultiPL-E Ruby coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-rkt", - description="MultiPL-E Racket coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-rs", - description="MultiPL-E Rust coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-scala", - description="MultiPL-E Scala coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-sh", - description="MultiPL-E Bash/Shell coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - SystemBenchmark( - name="multiple-swift", - description="MultiPL-E Swift coding tasks translated from HumanEval. Compatible with completions model endpoint.", - labels=new_labels("bigcode_eval_harness", LABEL_CODE), - optional_params=bigcode_eval_harness_params, - ), - # SystemBenchmark( - # name="multiple-ts", - # description="MultiPL-E TypeScript coding tasks translated from HumanEval. Compatible with completions model endpoint.", - # labels=new_labels("bigcode_eval_harness", LABEL_CODE), - # optional_params=bigcode_eval_harness_params, - # ), - ] - - SUPPORTED_MODEL_TYPE: dict[str, set[EvalFactoryModelType]] = { - "humaneval": {EvalFactoryModelType.COMPLETIONS}, - "humaneval-instruct": {EvalFactoryModelType.CHAT}, - "humanevalplus": {EvalFactoryModelType.COMPLETIONS}, - "mbpp": {EvalFactoryModelType.CHAT, EvalFactoryModelType.COMPLETIONS}, - "mbppplus": {EvalFactoryModelType.CHAT, EvalFactoryModelType.COMPLETIONS}, - "mbppplus-nemo": {EvalFactoryModelType.CHAT}, - "multiple-clj": {EvalFactoryModelType.COMPLETIONS}, - "multiple-cpp": {EvalFactoryModelType.COMPLETIONS}, - "multiple-cs": {EvalFactoryModelType.COMPLETIONS}, - "multiple-d": {EvalFactoryModelType.COMPLETIONS}, - "multiple-elixir": {EvalFactoryModelType.COMPLETIONS}, - "multiple-go": {EvalFactoryModelType.COMPLETIONS}, - "multiple-hs": {EvalFactoryModelType.COMPLETIONS}, - "multiple-java": {EvalFactoryModelType.COMPLETIONS}, - "multiple-jl": {EvalFactoryModelType.COMPLETIONS}, - "multiple-js": {EvalFactoryModelType.COMPLETIONS}, - "multiple-lua": {EvalFactoryModelType.COMPLETIONS}, - "multiple-ml": {EvalFactoryModelType.COMPLETIONS}, - "multiple-php": {EvalFactoryModelType.COMPLETIONS}, - "multiple-pl": {EvalFactoryModelType.COMPLETIONS}, - "multiple-r": {EvalFactoryModelType.COMPLETIONS}, - "multiple-rb": {EvalFactoryModelType.COMPLETIONS}, - "multiple-rkt": {EvalFactoryModelType.COMPLETIONS}, - "multiple-rs": {EvalFactoryModelType.COMPLETIONS}, - "multiple-scala": {EvalFactoryModelType.COMPLETIONS}, - "multiple-sh": {EvalFactoryModelType.COMPLETIONS}, - "multiple-swift": {EvalFactoryModelType.COMPLETIONS}, - # "multiple-ts": {EvalFactoryModelType.COMPLETIONS}, - } diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/convert.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/convert.py deleted file mode 100644 index 3b6f7bb4d5..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/convert.py +++ /dev/null @@ -1,241 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nemo_evaluator_sdk.values import DatasetRows, ReasoningParams, RunConfig, RunConfigOnlineModel -from nmp.common.config import get_platform_config -from nmp.evaluator.app.datasets.nmp_datasets.fileset import get_local_dataset_path -from nmp.evaluator.app.jobs.progress_tracking import ( - get_progress_tracking_interval, - get_progress_tracking_url, -) -from nmp.evaluator.app.values import ( - BuiltInDataset, - Fileset, - FilesetRef, - MetricOfflineJob, - MetricOnlineJob, - SystemBenchmarkJob, - SystemBenchmarkOnlineJob, - SystemMetric, -) -from nmp.evaluator.config import settings - -# Filename for inline dataset written by the download_fileset task -INLINE_DATASET_FILENAME = "dataset.json" - - -def get_dataset_config( - dataset: DatasetRows | Fileset | FilesetRef | BuiltInDataset, - dataset_format: str | None = None, - output_dir: str | None = None, -) -> ef.Dataset: - """Extract dataset configuration from the job dataset. - - This function converts metric job dataset specifications to EvalFactory dataset configs. - BuiltInDataset uses the dataset name directly (downloaded at runtime). - All other types resolve to a local path via get_local_dataset_path. - - Args: - dataset: The dataset from the job (DatasetRows, Fileset, FilesetRef, or BuiltInDataset). - dataset_format: The format of the dataset (e.g., "beir", "ragas"). Optional. - output_dir: Directory where datasets are stored. Required for non-BuiltInDataset types. - - Returns: - EvalFactory Dataset config. - """ - # BuiltInDataset - well-known datasets (BEIR, RAGAS) downloaded at runtime - if isinstance(dataset, BuiltInDataset): - if dataset.root == "ragas/amnesty_qa": - return ef.Dataset( - format="ragas", - path="explodinggradients/amnesty_qa", - dataset_name="english_v2", - split="eval", - ) - return ef.Dataset(format=dataset.format, path=dataset.name) - - # All other types (DatasetRows, Fileset, FilesetRef) resolve to local path - config = ef.Dataset(path=get_local_dataset_path(dataset, output_dir)) - if dataset_format: - config.format = dataset_format - return config - - -def augment_online_job(job: MetricOnlineJob | SystemBenchmarkOnlineJob, output_dir: str) -> ef.EvaluationJob: - """ - Converts Evaluator MS metric job to EvalFactory job. - """ - params = job.params or RunConfigOnlineModel() - # Evaluator system metric/benchmark name is the EF config name - if isinstance(job, MetricOnlineJob): - assert isinstance(job.metric, SystemMetric) - config_type = job.metric.name - else: - config_type = job.benchmark.name - - return ef.EvaluationJob( - target=ef.EvaluationTarget( - api_endpoint=ef.APIEndpoint( - url=job.model.url, - model_id=job.model.name, - # api_key is an environment variable, where - is an unsupported character. - api_key_name=job.model.api_key_env if job.model.api_key_secret else None, - type="completions" if "/v1/completions" in job.model.url else "chat", - adapter_config=_setup_adapter_config(job, output_dir, params.system_prompt, params.reasoning), - ) - ), - config=ef.RunConfig( - type=config_type, - params=_convert_config_params(job), - ), - output_dir=output_dir, - ) - - -def _convert_config_params( - job: MetricOfflineJob | MetricOnlineJob | SystemBenchmarkJob, - exclude: set | None = None, -) -> ef.RunParams: - """ - Convert Evaluator MS metric parameters to EvalFactory job parameters - """ - if not exclude: - exclude = set() - exclude.add("inference") - params = job.params or RunConfig() - - inference_params = {} - if isinstance(params, RunConfigOnlineModel) and params.inference: - inference_params = params.inference.model_dump( - exclude_none=True, exclude_defaults=True, exclude={"max_tokens", "max_completion_tokens"} - ) - # Use "max_tokens" key because RunParams.max_new_tokens has alias="max_tokens" - # and Value.model_config has extra="ignore", so max_new_tokens gets silently dropped - inference_params["max_tokens"] = params.inference.max_tokens or params.inference.max_completion_tokens - - # Build extra params from metric_params - if isinstance(job, SystemBenchmarkJob): - extra_params = dict(job.benchmark_params) - else: - extra_params = dict(job.metric_params) - - # For offline jobs, add the dataset_path pointing to where the download step writes the file - if isinstance(job, MetricOfflineJob): - extra_params["dataset_path"] = get_local_dataset_path(job.dataset, settings.jobs.dataset_dir) - - return ef.RunParams( - # exclude_unset=True preserves user-specified values even if they match defaults, - # while still excluding fields the user never set - **params.model_dump(exclude_none=True, exclude_unset=True, exclude=exclude), - **inference_params, - extra=extra_params, - ) - - -def _setup_adapter_config( - job: MetricOfflineJob | MetricOnlineJob | SystemBenchmarkJob, - output_dir: str, - system_prompt: str | None, - reasoning_params: ReasoningParams | None, -) -> ef.AdapterConfig: - """ - Configure all appropriate EvalFactory adapter config for the job - """ - adapter = ef.AdapterConfig() - # Configure 25.07+ - # Order matters: request interceptors must occur before response interceptors - request_interceptors = [ - ef.InterceptorConfig( - name="request_logging", - config={ - "output_dir": output_dir, - "log_failed_requests": True, - }, - ), - ] - response_interceptors = [ - ef.InterceptorConfig( - name="caching", - config={ - "cache_dir": output_dir, - "reuse_cached_responses": True, - "save_requests": True, - "save_responses": True, - }, - ), - ef.InterceptorConfig( - name="endpoint", - config={}, - ), - ef.InterceptorConfig( - name="response_logging", - config={"output_dir": output_dir}, - ), - ef.InterceptorConfig( - name="raise_client_errors", - ), - ] - adapter.post_eval_hooks = [ - ef.PostEvalHookConfig( - name="post_eval_report", - config={"report_types": ["json"]}, - ), - ] - - # Configure callback for progress tracking - if get_platform_config().get_service_url("jobs"): - request_method = "PATCH" - params = job.params or RunConfig() - num_samples = params.limit_samples - callback_interval = get_progress_tracking_interval(num_samples) - callback_url = get_progress_tracking_url() - - response_interceptors.append( - ef.InterceptorConfig( - name="progress_tracking", - config={ - "progress_tracking_interval_seconds": 60, - "progress_tracking_interval": callback_interval, - "progress_tracking_url": callback_url, - "request_method": request_method, - }, - ) - ) - adapter.post_eval_hooks.append( - ef.PostEvalHookConfig( - name="progress_tracking", - config={ - "progress_tracking_interval_seconds": 60, - "progress_tracking_interval": callback_interval, - "progress_tracking_url": callback_url, - "request_method": request_method, - }, - ) - ) - - # Configure reasoning context handling and system message - if reasoning_params: - reasoning = ef.InterceptorConfig( - name="reasoning", - config={}, - ) - if reasoning_params.end_token: - reasoning.config["end_reasoning_token"] = reasoning_params.end_token - if reasoning_params.include_if_not_finished is not None: - reasoning.config["include_if_not_finished"] = reasoning_params.include_if_not_finished - response_interceptors.append(reasoning) - - if system_prompt: - # Must be added to beginning of list organized request -> response - request_interceptors.append( - ef.InterceptorConfig( - name="system_message", - config={"system_message": system_prompt}, - ) - ) - - adapter.interceptors = request_interceptors - adapter.interceptors.extend(response_interceptors) - - return adapter diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/handler.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/handler.py deleted file mode 100644 index 0e292eac42..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/handler.py +++ /dev/null @@ -1,242 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import itertools -from typing import Any - -import jsonschema -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nemo_evaluator_sdk.values import ( - Model, - ReasoningParams, - SecretRef, - SupportedJobTypes, -) -from nmp.common.inference import InferenceParams -from nmp.evaluator.app.jobs.evalfactory.constants import EvalFactoryModelType -from nmp.evaluator.app.values import ( - MetricJob, - MetricOfflineJob, - MetricOnlineJob, - MetricRetrieverJob, - Parameter, - SystemBenchmarkJob, - SystemBenchmarkOfflineJob, - SystemBenchmarkOnlineJob, - SystemMetric, -) -from pydantic import BaseModel, Field - -hf_token_param = Parameter( - name="hf_token", - type="secret", - description="Hugging Face token for accessing datasets and tokenizers. Required for tasks that fetch from Hugging Face.", -) - -harness_model_type_param = Parameter( - name="model_type", - type="string", - description=f"Specify the model type for evaluation: [{EvalFactoryModelType.CHAT.value}, {EvalFactoryModelType.COMPLETIONS.value}] (default detected from job.model.url or {EvalFactoryModelType.CHAT.value}).", -) - - -class JudgeModelParamsInput(BaseModel): - """Base input for judge model parameters. - - Note: ModelRef values (URN strings) are resolved to Model before this - validation runs via resolve_param_models in the job compilation flow. - """ - - model: Model = Field(description="The LLM judge model configuration.") - request_timeout: int | None = Field( - default=None, description="Request timeout (seconds) for inference requests to the judge model." - ) - max_retries: int | None = Field( - default=None, description="Maximum number of retries for failed inference requests to the judge model." - ) - inference: InferenceParams | None = Field(default=None, description="Parameters for judge model inference.") - system_prompt: str | None = Field( - default=None, - description="Initial instructions that define the model's role and behavior for the conversation.", - ) - reasoning: ReasoningParams | None = Field( - default=None, description="Custom settings that control the judge model's reasoning behavior." - ) - - -class BaseSystemHandler: - def image_env_var_name(self) -> str: - raise NotImplementedError - - def container_command(self, job: ef.EvaluationJob, config_file_path: str) -> list[str]: - assert isinstance(job.target, ef.EvaluationTarget) - assert isinstance(job.target.api_endpoint, ef.APIEndpoint) - assert job.config is not None - assert job.config.type is not None - assert job.output_dir is not None - assert job.target.api_endpoint.type is not None - - cmd = [ - "nemo-evaluator", - "run_eval", - "--run_config", - config_file_path, - "--output_dir", - job.output_dir, - "--eval_type", - job.config.type, - ] - - # Only include model arguments if they have non-empty values - # For retriever evaluations, these are empty since there's no target model - if job.target.api_endpoint.model_id: - cmd.extend(["--model_id", job.target.api_endpoint.model_id]) - if job.target.api_endpoint.url: - cmd.extend(["--model_url", job.target.api_endpoint.url]) - if job.target.api_endpoint.type: - cmd.extend(["--model_type", job.target.api_endpoint.type]) - - return cmd - - def validate_supported_metric_job_types(self, job: MetricJob): - metric_name = job.metric.name if isinstance(job.metric, SystemMetric) else job.metric.type - # Validate job type against metric's supported job types - if isinstance(job, MetricRetrieverJob): - if SupportedJobTypes.RETRIEVER not in job.metric.supported_job_types: - raise ValueError( - f"{metric_name} metric does not support retriever evaluations. Check metric's supported_job_types." - ) - elif isinstance(job, MetricOnlineJob): - if SupportedJobTypes.ONLINE not in job.metric.supported_job_types: - raise ValueError( - f"{metric_name} metric does not support online evaluations with a model. Remove the model and specify a dataset." - ) - elif isinstance(job, MetricOfflineJob): - if SupportedJobTypes.OFFLINE not in job.metric.supported_job_types: - raise ValueError( - f"{metric_name} metric does not support offline evaluations and a model is required. Specify a model to evaluate." - ) - else: - raise Exception(f"unexpected MetricJob for evalfactory metric handlers: {type(job)}") - - def validate_supported_benchmark_job_types(self, job: SystemBenchmarkJob): - # Validate job type against metric's supported job types - if isinstance(job, SystemBenchmarkOnlineJob): - if SupportedJobTypes.ONLINE not in job.benchmark.supported_job_types: - raise ValueError( - f"{job.benchmark.name} benchmark does not support online evaluations with a model. Remove the model and specify a dataset." - ) - elif isinstance(job, SystemBenchmarkOfflineJob): - if SupportedJobTypes.OFFLINE not in job.benchmark.supported_job_types: - raise ValueError( - f"{job.benchmark.name} benchmark does not support offline evaluations and a model is required. Specify a model to evaluate." - ) - else: - raise Exception(f"unexpected SystemBenchmarkJob for evalfactory benchmark handlers: {type(job)}") - - def validate_params(self, params: dict, required_params: list[Parameter], optional_params: list[Parameter]): - errs: list[str] = [] - try: - self.validate_required_params(params, required_params) - except ValueError as e: - errs.append(str(e)) - - for opt_param in optional_params: - param = params.get(opt_param.name) - if param: - try: - self._validate_param_type(opt_param, param) - except ValueError as e: - errs.append(str(e)) - if errs: - raise ValueError("\n".join(errs)) - - def _validate_param_type(self, param_def: Parameter, input_param: Any): - """ - Validates the user-input parameter value type for the defined parameter of the system metric or benchmark. - """ - if param_def.type == "secret": - if not isinstance(input_param, str): - raise ValueError( - f"unexpected type for parameter {param_def.name} {param_def.model_dump_json(exclude_none=True)}: type({input_param}) {type(input_param)}" - ) - else: - try: - jsonschema.validate(input_param, {"type": param_def.type}) - except jsonschema.ValidationError: - raise ValueError( - f"unexpected type for parameter {param_def.name} {param_def.model_dump_json(exclude_none=True)}: type({input_param}) {type(input_param)}" - ) - - def validate_required_params(self, params: dict, required_params: list[Parameter]): - """ - Validate required parameters for a given system metric or benchmark are set in job.*_params. - """ - errs: list[str] = [] - for req_param in required_params: - param = params.get(req_param.name) - if not param: - errs.append( - f"missing required parameter {req_param.name}: {req_param.model_dump_json(exclude_none=True)}" - ) - continue - try: - self._validate_param_type(req_param, param) - except ValueError as e: - errs.append(str(e)) - if errs: - raise ValueError("\n".join(errs)) - - def augment_harness_supported_model_types( - self, job: SystemBenchmarkJob, supported_model_types: set[EvalFactoryModelType] | None - ): - # Validate chat/completions model with benchmark type - assert isinstance(job, SystemBenchmarkOnlineJob) - if not supported_model_types: - raise Exception(f"Unexpected benchmark for {self.__class__.__name__}: {job.benchmark.name}") - - endpoint_type = ( - EvalFactoryModelType.COMPLETIONS if "/v1/completions" in job.model.url else EvalFactoryModelType.CHAT - ) - if endpoint_type not in supported_model_types: - raise ValueError( - f"{endpoint_type.value} detected from job.model.url but is not supported for job {job.benchmark.name}, expected {[mt.value for mt in supported_model_types]}" - ) - - model_type = job.benchmark_params.get("model_type") - if not model_type: - model_type = endpoint_type # Default to endpoint type - job.benchmark_params["model_type"] = model_type - else: - model_type = EvalFactoryModelType(model_type) - if model_type not in supported_model_types: - raise ValueError( - f"model type {model_type.value} is not supported for benchmark {job.benchmark.name}, expected {[mt.value for mt in supported_model_types]}. Set job.benchmark_params.model_type with the correct type or update the job.model.url path to '/v1/chat/completions' for 'chat' or '/v1/completions' for 'completions'." - ) - - if endpoint_type != model_type: - raise ValueError( - f"mismatch model endpoint with configured model type {model_type.value} for benchmark {job.benchmark.name}, job.benchmark_params.model_type {model_type.value} does not match detected {endpoint_type.value} from job.model.url." - ) - - def _secrets(self, params: dict, required_params: list[Parameter], optional_params: list[Parameter]): - secrets = {} - for param in itertools.chain(required_params, optional_params): - if param.type == "secret": - secret_ref = params.get(param.name) - if secret_ref: - secret_env = secret_ref - if param.name == hf_token_param.name: - # special handling of HF_TOKEN env for EvalFactory - secret_env = "HF_TOKEN" - secrets[secret_env] = SecretRef(secret_ref) - return secrets - - def metric_job_secrets(self, job: MetricJob) -> dict[str, SecretRef]: - """Job secrets for the metric. Returns a dictionary of environment variables to the secret reference""" - assert isinstance(job.metric, SystemMetric) - return self._secrets(job.metric_params, job.metric.required_params, job.metric.optional_params) - - def benchmark_job_secrets(self, job: SystemBenchmarkJob) -> dict[str, SecretRef]: - """Job secrets for the benchmark. Returns a dictionary of environment variables to the secret reference""" - return self._secrets(job.benchmark_params, job.benchmark.required_params, job.benchmark.optional_params) diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/labels.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/labels.py deleted file mode 100644 index e070b11502..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/labels.py +++ /dev/null @@ -1,18 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Labels for system metrics to use across handlers -LABEL_AGENTIC = "agentic" -LABEL_ADVANCED_REASONING = "advanced_reasoning" -LABEL_QUESTION_ANSWERING = "question_answering" -LABEL_INSTRUCTION_FOLLOWING = "instruction_following" -LABEL_LANGUAGE_UNDERSTANDING = "language_understanding" -LABEL_MATH = "math" -LABEL_CONTENT_SAFETY = "content_safety" -LABEL_CODE = "code" -LABEL_RAG = "rag" -LABEL_RETRIEVAL = "retrieval" - - -def new_labels(harness: str, category: str) -> dict: - return {"eval_harness": harness, "eval_category": category} diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/lm_eval_harness.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/lm_eval_harness.py deleted file mode 100644 index dc8197917b..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/lm_eval_harness.py +++ /dev/null @@ -1,275 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import nmp.evaluator.app.evalfactory.labels as ef_labels -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nmp.evaluator.app.evalfactory.convert import augment_online_job -from nmp.evaluator.app.evalfactory.handler import ( - BaseSystemHandler, - harness_model_type_param, - hf_token_param, -) -from nmp.evaluator.app.jobs.evalfactory.constants import EvalFactoryModelType -from nmp.evaluator.app.values import Parameter, SystemBenchmark, SystemBenchmarkJob, SystemBenchmarkOnlineJob -from nmp.evaluator.config import settings - -# Required tokenizer param for completions-based loglikelihood tasks -tokenizer_param = Parameter( - name="tokenizer", - type="string", - description=( - "HuggingFace tokenizer for computing context lengths in loglikelihood tasks " - "(e.g. meta-llama/Llama-3.2-3B-Instruct). Required for completions-based benchmarks." - ), -) - -# Optional params for all LM Eval Harness benchmarks -lm_eval_harness_params = [ - harness_model_type_param, - Parameter( - name="tokenizer_backend", type="string", description="The backend to fetch the tokenizer (e.g. huggingface)" - ), - Parameter(name="tokenized_requests", type="boolean"), - Parameter(name="downsampling_ratio", type="number"), -] - - -class LMEvalHarnessHandler(BaseSystemHandler): - @classmethod - def docker_image(cls) -> str: - return settings.evalfactory.lm_eval_harness - - @classmethod - def system_benchmarks(cls) -> list[SystemBenchmark]: - return cls._system_benchmarks - - def augment_benchmark_job(self, job: SystemBenchmarkJob, output_dir: str) -> ef.EvaluationJob: - self.validate_supported_benchmark_job_types(job) - self.validate_params(job.benchmark_params, job.benchmark.required_params, job.benchmark.optional_params) - self.augment_harness_supported_model_types(job, self.SUPPORTED_MODEL_TYPE.get(job.benchmark.name)) - - if not isinstance(job, SystemBenchmarkOnlineJob): - raise ValueError( - f"LM Eval Harness benchmarks require a SystemBenchmarkOnlineJob (with model), " - f"but got {type(job).__name__}. Use an online benchmark spec for '{job.benchmark.name}'." - ) - ef_job = augment_online_job(job, output_dir) - - # LM Eval Harness config type uses underscores instead of hyphens - # Note: We set this on the EF job config, not on the original benchmark to avoid mutating shared state - if ef_job.config: - ef_job.config.type = job.benchmark.name.replace("-", "_") - - return ef_job - - _system_benchmarks = [ - SystemBenchmark( - name="gpqa", - description="Advanced Reasoning. The GPQA (Graduate-Level Google-Proof Q&A) benchmark is a challenging dataset of 448 multiple-choice questions in biology, physics, and chemistry. It is designed to be extremely difficult for both humans and AI, ensuring that questions cannot be easily answered using web searches. Compatible with completions model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param, tokenizer_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="gpqa-diamond-cot", - description="Advanced Reasoning (GPQA-Diamond-CoT). The GPQA (Graduate-Level Google-Proof Q&A) benchmark is a challenging dataset of 448 multiple-choice questions in biology, physics, and chemistry. It is designed to be extremely difficult for both humans and AI, ensuring that questions cannot be easily answered using web searches. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="ifeval", - description='Instruction Following: IFEval is a dataset designed to test a model\'s ability to follow explicit instructions, such as "include keyword x" or "use format y." The focus is on the model\'s adherence to formatting instructions rather than the content generated, allowing for the use of strict and rigorous benchmarks. Compatible with chat model endpoint.', - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_INSTRUCTION_FOLLOWING), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="mmlu", - description="The MMLU (Massive Multitask Language Understanding) benchmark is designed to measure the knowledge acquired during pretraining by evaluating models in zero-shot and few-shot settings. It covers 57 subjects across various fields, testing both world knowledge and problem-solving abilities. Compatible with completions model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param, tokenizer_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="mmlu-instruct", - description="The MMLU (Massive Multitask Language Understanding) benchmark is designed to measure the knowledge acquired during pretraining by evaluating models in zero-shot and few-shot settings. It covers 57 subjects across various fields, testing both world knowledge and problem-solving abilities. This variant defaults to zero-shot evaluation and instructs the model to produce a single letter response. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="mmlu-pro", - description="MMLU-Pro: MMLU-Pro is a refined version of the MMLU dataset, which has been a standard for multiple-choice knowledge assessment. Recent research identified issues with the original MMLU, such as noisy data (some unanswerable questions) and decreasing difficulty due to advances in model capabilities and increased data contamination. MMLU-Pro addresses these issues by presenting models with 10 choices instead of 4, requiring reasoning on more questions, and undergoing expert review to reduce noise. As a result, MMLU-Pro is of higher quality and currently more challenging than the original. Compatible with completions model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param, tokenizer_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="mmlu-pro-instruct", - description="MMLU-Pro-instruct: MMLU-Pro is a refined version of the MMLU dataset, which has been a standard for multiple-choice knowledge assessment. Recent research identified issues with the original MMLU, such as noisy data (some unanswerable questions) and decreasing difficulty due to advances in model capabilities and increased data contamination. MMLU-Pro addresses these issues by presenting models with 10 choices instead of 4, requiring reasoning on more questions, and undergoing expert review to reduce noise. As a result, MMLU-Pro is of higher quality and currently more challenging than the original. This variant applies a chat template and defaults to zero-shot evaluation. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="mmlu-redux", - description="MMLU-Redux is a subset of 3,000 manually re-annotated questions across 30 MMLU subjects. Compatible with completions model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param, tokenizer_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="mmlu-redux-instruct", - description="MMLU-Redux is a subset of 3,000 manually re-annotated questions across 30 MMLU subjects. This variant applies a chat template and defaults to zero-shot evaluation. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="gsm8k", - description="GSM8K: The GSM8K benchmark evaluates the arithmetic reasoning of large language models using 1,319 grade school math word problems. Compatible with completions model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_MATH), - required_params=[hf_token_param, tokenizer_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="gsm8k-cot-instruct", - description="GSM8K-instruct: The GSM8K benchmark evaluates the arithmetic reasoning of large language models using 1,319 grade school math word problems. This variant defaults to chain-of-thought zero-shot evaluation with custom instructions. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_MATH), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="mgsm", - description="MGSM: The Multilingual Grade School Math (MGSM) benchmark evaluates the reasoning abilities of large language models in multilingual settings. It consists of 250 grade-school math problems from the GSM8K dataset, translated into ten diverse languages, and tests models using chain-of-thought prompting. Compatible with completions model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_MATH), - required_params=[hf_token_param, tokenizer_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="mgsm-cot", - description="MGSM-CoT: The Multilingual Grade School Math (MGSM) benchmark evaluates the reasoning abilities of large language models in multilingual settings. It consists of 250 grade-school math problems from the GSM8K dataset, translated into ten diverse languages, and tests models using chain-of-thought prompting. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_MATH), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="wikilingua", - description="The WikiLingua benchmark is a large-scale, multilingual dataset designed for evaluating cross-lingual abstractive summarization systems. It includes approximately 770,000 article-summary pairs in 18 languages, extracted from WikiHow, with gold-standard alignments created by matching images used to describe each how-to step in an article. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - # Exclude benchmarks until NIM supports logprobs or we identify hosted models that support it for testing and documentation - # SystemBenchmark( - # name="winogrande", - # description="WinoGrande is a collection of 44k problems, inspired by Winograd Schema Challenge (Levesque, Davis, and Morgenstern 2011), but adjusted to improve the scale and robustness against the dataset-specific bias. Formulated as a fill-in-a-blank task with binary options, the goal is to choose the right option for a given sentence which requires commonsense reasoning. Compatible with completions model endpoint.", - # labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - # required_params=[hf_token_param, tokenizer_param], - # optional_params=[ - # *lm_eval_harness_params, - # Parameter(name="num_fewshot", type="integer", description="Number of examples in few-shot context."), - # ], - # ), - # SystemBenchmark( - # name="arc-challenge", - # description='The ARC dataset consists of 7,787 science exam questions drawn from a variety of sources, including science questions provided under license by a research partner affiliated with AI2. These are text-only, English language exam questions that span several grade levels as indicated in the files. Each question has a multiple choice structure (typically 4 answer options). The questions are sorted into a Challenge Set of 2,590 "hard" questions (those that both a retrieval and a co-occurrence method fail to answer correctly) and an Easy Set of 5,197 questions. Compatible with completions model endpoint.', - # labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - # required_params=[hf_token_param, tokenizer_param], - # optional_params=lm_eval_harness_params, - # ), - # SystemBenchmark( - # name="arc-challenge-chat", - # description='ARC Challenge-instruct: The ARC dataset consists of 7,787 science exam questions drawn from a variety of sources, including science questions provided under license by a research partner affiliated with AI2. These are text-only, English language exam questions that span several grade levels as indicated in the files. Each question has a multiple choice structure (typically 4 answer options). The questions are sorted into a Challenge Set of 2,590 "hard" questions (those that both a retrieval and a co-occurrence method fail to answer correctly) and an Easy Set of 5,197 questions. This variant applies a chat template and defaults to zero-shot evaluation. Compatible with chat model endpoint.', - # labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - # required_params=[hf_token_param], - # optional_params=lm_eval_harness_params, - # ), - # SystemBenchmark( - # name="hellaswag", - # description="The HellaSwag benchmark tests a language model's commonsense reasoning by having it choose the most logical ending for a given story. Compatible with completions model endpoint.", - # labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - # required_params=[hf_token_param, tokenizer_param], - # optional_params=[ - # *lm_eval_harness_params, - # Parameter(name="num_fewshot", type="integer", description="Number of examples in few-shot context."), - # ], - # ), - # SystemBenchmark( - # name="truthfulqa", - # description="The TruthfulQA benchmark measures the truthfulness of language models in generating answers to questions. It consists of 817 questions across 38 categories, such as health, law, finance, and politics, designed to test whether models can avoid generating false answers that mimic common human misconceptions. Compatible with completions model endpoint.", - # labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_QUESTION_ANSWERING), - # required_params=[hf_token_param, tokenizer_param], - # optional_params=lm_eval_harness_params, - # ), - SystemBenchmark( - name="bbh", - description="The BIG-Bench Hard (BBH) benchmark is a part of the BIG-Bench evaluation suite, focusing on 23 particularly difficult tasks that current language models struggle with. These tasks require complex, multi-step reasoning, and the benchmark evaluates models using few-shot learning and chain-of-thought prompting techniques. Compatible with completions model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param, tokenizer_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="bbh-instruct", - description="The BIG-Bench Hard (BBH) benchmark is a part of the BIG-Bench evaluation suite, focusing on 23 particularly difficult tasks that current language models struggle with. These tasks require complex, multi-step reasoning, and the benchmark evaluates models using few-shot learning and chain-of-thought prompting techniques. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="musr", - description="The MuSR (Multistep Soft Reasoning) benchmark evaluates the reasoning capabilities of large language models through complex, multistep tasks specified in natural language narratives. It introduces sophisticated natural language and complex reasoning challenges to test the limits of chain-of-thought prompting. Compatible with completions model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param, tokenizer_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="frames-naive", - description="Frames Naive uses the prompt as input without additional context. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_RAG), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="frames-naive-with-links", - description="Frames Naive with Links provides the prompt and relevant Wikipedia article links. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_RAG), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - SystemBenchmark( - name="frames-oracle", - description='Frames Oracle (long context) provides prompts and relevant text from curated and processed Wikipedia articles from "parasail-ai/frames-benchmark-wikipedia. Compatible with chat model endpoint.', - labels=ef_labels.new_labels("lm_eval_harness", ef_labels.LABEL_RAG), - required_params=[hf_token_param], - optional_params=lm_eval_harness_params, - ), - ] - - SUPPORTED_MODEL_TYPE: dict[str, set[EvalFactoryModelType]] = { - "mmlu": {EvalFactoryModelType.COMPLETIONS}, - "mmlu-instruct": {EvalFactoryModelType.CHAT}, - "ifeval": {EvalFactoryModelType.CHAT}, - "mmlu-pro": {EvalFactoryModelType.COMPLETIONS}, - "mmlu-pro-instruct": {EvalFactoryModelType.CHAT}, - "mmlu-redux": {EvalFactoryModelType.COMPLETIONS}, - "mmlu-redux-instruct": {EvalFactoryModelType.CHAT}, - "gsm8k": {EvalFactoryModelType.COMPLETIONS}, - "gsm8k-cot-instruct": {EvalFactoryModelType.CHAT}, - "mgsm": {EvalFactoryModelType.COMPLETIONS}, - "mgsm-cot": {EvalFactoryModelType.CHAT}, - "wikilingua": {EvalFactoryModelType.CHAT}, - # Exclude benchmarks until NIM supports logprobs or we identify hosted models that support it for testing and documentation - # "winogrande": {EvalFactoryModelType.COMPLETIONS}, - # "arc-challenge": {EvalFactoryModelType.COMPLETIONS}, - # "arc-challenge-chat": {EvalFactoryModelType.CHAT}, - # "hellaswag": {EvalFactoryModelType.COMPLETIONS}, - # "truthfulqa": {EvalFactoryModelType.COMPLETIONS}, - "bbh": {EvalFactoryModelType.COMPLETIONS}, - "bbh-instruct": {EvalFactoryModelType.CHAT}, - "musr": {EvalFactoryModelType.COMPLETIONS}, - "gpqa": {EvalFactoryModelType.COMPLETIONS}, - "gpqa-diamond-cot": {EvalFactoryModelType.CHAT}, - "frames-naive": {EvalFactoryModelType.CHAT}, - "frames-naive-with-links": {EvalFactoryModelType.CHAT}, - "frames-oracle": {EvalFactoryModelType.CHAT}, - } diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/retriever.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/retriever.py deleted file mode 100644 index 85df37cf7a..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/retriever.py +++ /dev/null @@ -1,601 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import nmp.evaluator.app.evalfactory.labels as ef_labels -import nmp.evaluator.app.jobs.evalfactory.models as ef -import nmp.evaluator.constants as constants -from nemo_evaluator_sdk.enums import MetricType -from nemo_evaluator_sdk.values import SecretRef, SupportedJobTypes -from nmp.evaluator.app.evalfactory.convert import get_dataset_config -from nmp.evaluator.app.evalfactory.handler import BaseSystemHandler -from nmp.evaluator.app.values import ( - MetricJob, - MetricRetrieverJob, - Parameter, - RetrieverPipeline, - SystemMetric, -) -from nmp.evaluator.config import settings -from nmp.evaluator.utils import milvus - -# Mapping from registered retriever metric names to EvalFactory metric names -# EvalFactory uses pytrec_eval metric names (without retriever_ prefix, with mixed case) -RETRIEVER_METRIC_MAPPING: dict[str, str] = { - # Fixed metrics (no cutoff) - "retriever-map": "map", - "retriever-gm-map": "gm_map", - "retriever-gm-bpref": "gm_bpref", - "retriever-rprec": "Rprec", - "retriever-bpref": "bpref", - "retriever-recip-rank": "recip_rank", - "retriever-infap": "infAP", - "retriever-ndcg": "ndcg", - "retriever-ndcg-rel": "ndcg_rel", - "retriever-bing": "binG", - "retriever-g": "G", - "retriever-rndcg": "Rndcg", - "retriever-11pt-avg": "11pt_avg", - "retriever-set-p": "set_P", - "retriever-set-map": "set_map", - "retriever-set-recall": "set_recall", - "retriever-set-relative-p": "set_relative_P", - "retriever-set-f": "set_F", - # Cutoff-based metrics (P@k) - "retriever-p-5": "P_5", - "retriever-p-10": "P_10", - "retriever-p-20": "P_20", - "retriever-p-100": "P_100", - # Cutoff-based metrics (recall@k) - "retriever-recall-5": "recall_5", - "retriever-recall-10": "recall_10", - "retriever-recall-20": "recall_20", - "retriever-recall-100": "recall_100", - # Cutoff-based metrics (ndcg_cut@k) - "retriever-ndcg-cut-5": "ndcg_cut_5", - "retriever-ndcg-cut-10": "ndcg_cut_10", - "retriever-ndcg-cut-20": "ndcg_cut_20", - "retriever-ndcg-cut-100": "ndcg_cut_100", - # Cutoff-based metrics (map_cut@k) - "retriever-map-cut-5": "map_cut_5", - "retriever-map-cut-10": "map_cut_10", - "retriever-map-cut-20": "map_cut_20", - "retriever-map-cut-100": "map_cut_100", - # Cutoff-based metrics (success@k) - "retriever-success-5": "success_5", - "retriever-success-10": "success_10", - "retriever-success-20": "success_20", - "retriever-success-100": "success_100", -} - - -def get_retriever_evalfactory_metric_name(metric_name: str) -> str: - """Get the EvalFactory metric name for a retriever metric.""" - if metric_name not in RETRIEVER_METRIC_MAPPING: - raise ValueError(f"Unknown retriever metric: {metric_name}") - return RETRIEVER_METRIC_MAPPING[metric_name] - - -def build_retriever_pipeline( - retriever_pipeline: RetrieverPipeline, - metric_params: dict, - collection_name: str = "metric_eval", -) -> ef.RetrieverPipeline: - """Build the retriever pipeline config from a retriever pipeline definition. - - This is a shared utility used by both Retriever and RAG metrics handlers. - - Args: - retriever_pipeline: The pipeline configuration with embedding model. - metric_params: Additional parameters including top_k and truncate_long_documents. - collection_name: Milvus collection name for the evaluation. - - Returns: - Configured RetrieverPipeline for eval factory. - """ - embedding_model = retriever_pipeline.embeddings_model - - # Use host_url (direct NIM endpoint) when available, falling back to the model URL. - # EvalFactory's Haystack NvidiaDocumentEmbedder only accepts http://host:port format - # and rejects URLs with path components (like IGW-proxied URLs). - # host_url is populated when the model was resolved from a ModelRef. - embedding_url = embedding_model.host_url or embedding_model.url - - # Build embedding model endpoint - embedding_endpoint = ef.APIEndpoint( - url=embedding_url, - model_id=embedding_model.name, - format=embedding_model.format, - ) - # Keep api_key explicit for EvalFactory/Haystack embedders: - # if omitted, some versions require NVIDIA_API_KEY env and fail hard. - # api_key_name is not supported in 26.01 - embedding_endpoint.api_key = ( - "$QUERY_API_KEY" - if embedding_model.api_key_secret - else (embedding_model.api_key or constants.PLACEHOLDER_INFERENCE_API_KEY) - ) - - # Both query and index use the same embedding model - query_model = ef.RetrieverModel(api_endpoint=embedding_endpoint) - index_model = ef.RetrieverModel( - api_endpoint=ef.APIEndpoint( - url=embedding_url, - model_id=embedding_model.name, - format=embedding_model.format, - # api_key_name is not supported in 26.01 - api_key=( - "$INDEX_API_KEY" - if embedding_model.api_key_secret - else (embedding_model.api_key or constants.PLACEHOLDER_INFERENCE_API_KEY) - ), - ) - ) - - # Build retriever pipeline - pipeline = ef.RetrieverPipeline( - query_embedding_model=query_model, - index_embedding_model=index_model, - top_k=metric_params.get("top_k", 10), - ) - - # Build pipeline params (milvus config, yaml files, etc.) - pipeline.params = { - "index_pipeline_yaml_file": "/workspace/tests/retriever/templates/dense_only/milvus_index_nim.yaml", - "query_pipeline_yaml_file": "/workspace/tests/retriever/templates/dense_only/milvus_query_nim.yaml", - "component_inputs_template": '{"embedder": {"text": "${query}"} }', - "milvus_collection_name": collection_name, - "retriever_name": "nim-retriever", - "retriever_type": "nvidia-nemo-nim", - } - - # Handle truncate_long_documents param - if metric_params.get("truncate_long_documents"): - pipeline.params["truncate_long_documents"] = metric_params["truncate_long_documents"] - - # Configure milvus - if settings.evalfactory.milvus_url: - milvus_config = milvus.get_milvus_configs( - milvus_url=settings.evalfactory.milvus_url, collection_name=collection_name - ) - pipeline.params.update(milvus_config) - else: - # Use file based local milvus if milvus server is not specified - pipeline.params["milvus_uri"] = "/workspace/milvus.db" - - return pipeline - - -top_k_param = Parameter( - name="top_k", - type="integer", - default=10, - description="Number of top results to retrieve for evaluation.", -) -truncate_long_documents_param = Parameter( - name="truncate_long_documents", - type="string", - description="Handle documents exceeding 65k characters. 'start': keep last 65k chars, 'end': keep first 65k chars.", -) - -dataset_format_param = Parameter( - name="dataset_format", - type="string", - default="beir", - description="The dataset format for retriever evaluation. Supported format: beir.", -) - -# Common optional params for retriever metrics -retriever_common_optional_params = [ - dataset_format_param, - top_k_param, - truncate_long_documents_param, -] - - -class RetrieverHandler(BaseSystemHandler): - @classmethod - def docker_image(cls) -> str: - return settings.evalfactory.rag_retriever - - @classmethod - def system_metrics(cls) -> list[SystemMetric]: - return cls._system_metrics - - def metric_job_secrets(self, job: MetricJob) -> dict[str, SecretRef]: - """Job secrets for the metric. Returns a dictionary of environment variables to the secret reference. - - The env var names must match what's used in the pipeline config: - - QUERY_API_KEY: for query embedding model - - INDEX_API_KEY: for index embedding model - """ - assert isinstance(job, MetricRetrieverJob), ( - f"{getattr(job.metric, 'name', '')} is not supported with {type(job).__name__}, expected MetricRetrieverJob" - ) - secrets: dict[str, SecretRef] = {} - if job.retriever_pipeline.embeddings_model.api_key_secret: - # Both query and index use the same embedding model/secret - secrets["QUERY_API_KEY"] = job.retriever_pipeline.embeddings_model.api_key_secret - secrets["INDEX_API_KEY"] = job.retriever_pipeline.embeddings_model.api_key_secret - return secrets - - def augment_metric_job(self, job: MetricJob, output_dir: str) -> ef.EvaluationJob: - self.validate_supported_metric_job_types(job) - assert isinstance(job, MetricRetrieverJob) - assert isinstance(job.metric, SystemMetric) - metric = job.metric - self.validate_params(job.metric_params, metric.required_params, metric.optional_params) - - # Build retriever pipeline config - pipeline = self._build_retriever_pipeline(job) - - # Build task config with the metric - # Get EvalFactory metric name from mapping - metric_name = get_retriever_evalfactory_metric_name(metric.name) - dataset_format = job.metric_params.get("dataset_format", "beir") - task_config = ef.TaskConfig( - type=dataset_format, - metrics={metric_name: ef.MetricConfig(type="pytrec_eval", params={})}, - dataset=get_dataset_config(job.dataset, dataset_format, settings.jobs.dataset_dir), - ) - - # Build RetrieverConfig with task and pipeline - retriever_config = ef.RetrieverConfig( - tasks={"retriever": task_config}, - pipeline=pipeline, - ) - - return ef.EvaluationJob( - target=ef.EvaluationTarget( - api_endpoint=ef.APIEndpoint( - url="", # Retriever doesn't evaluate a target model directly - model_id="", - type="embedding", - ) - ), - config=ef.RunConfig( - type="retriever", - params=ef.RunParams( - extra=retriever_config.model_dump(mode="json", exclude_none=True, exclude_unset=True) - ), - ), - output_dir=output_dir, - ) - - def _build_retriever_pipeline(self, job: MetricRetrieverJob) -> ef.RetrieverPipeline: - """Build the retriever pipeline config from the metric job.""" - return build_retriever_pipeline( - retriever_pipeline=job.retriever_pipeline, - metric_params=job.metric_params, - collection_name="metric_eval", - ) - - # Fixed pytrec_eval metrics (no cutoff parameter) - _fixed_metrics = [ - "retriever-map", - "retriever-gm-map", - "retriever-gm-bpref", - "retriever-rprec", - "retriever-bpref", - "retriever-recip-rank", - "retriever-infap", - "retriever-ndcg", - "retriever-ndcg-rel", - "retriever-bing", - "retriever-g", - "retriever-rndcg", - "retriever-11pt-avg", - "retriever-set-p", - "retriever-set-map", - "retriever-set-recall", - "retriever-set-relative-p", - "retriever-set-f", - ] - - _system_metrics = [ - # Fixed metrics (no cutoff) - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-map", - description="Mean Average Precision (MAP) - measures the mean of average precision scores across all queries.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-gm-map", - description="Geometric Mean of Average Precision - geometric mean variant of MAP.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-gm-bpref", - description="Geometric Mean of Binary Preference - geometric mean variant of bpref.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-rprec", - description="R-Precision - precision at R, where R is the number of relevant documents for a query.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-bpref", - description="Binary Preference - measures preference of relevant documents over non-relevant ones.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-recip-rank", - description="Reciprocal Rank - the multiplicative inverse of the rank of the first relevant document.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-infap", - description="Inferred Average Precision - average precision adjusted for incomplete relevance judgments.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-ndcg", - description="Normalized Discounted Cumulative Gain - measures ranking quality with graded relevance.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-ndcg-rel", - description="NDCG with relevance - NDCG variant that considers relevance levels.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-bing", - description="Binary Gain - cumulative gain using binary relevance.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-g", - description="Gain - cumulative gain using graded relevance.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-rndcg", - description="Rank-biased NDCG - NDCG variant with rank-based weighting.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-11pt-avg", - description="11-point interpolated average precision - precision averaged at 11 recall levels.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-set-p", - description="Set-based Precision - precision calculated over unique documents.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-set-map", - description="Set-based Mean Average Precision - MAP calculated over unique documents.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-set-recall", - description="Set-based Recall - recall calculated over unique documents.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-set-relative-p", - description="Set-based Relative Precision - relative precision over unique documents.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-set-f", - description="Set-based F-measure - harmonic mean of precision and recall over unique documents.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - # Cutoff-based metrics - common cutoff values (5, 10, 20, 100) - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-p-5", - description="Precision at 5 - the fraction of the top 5 retrieved documents that are relevant.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-p-10", - description="Precision at 10 - the fraction of the top 10 retrieved documents that are relevant.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-p-20", - description="Precision at 20 - the fraction of the top 20 retrieved documents that are relevant.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-p-100", - description="Precision at 100 - the fraction of the top 100 retrieved documents that are relevant.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-recall-5", - description="Recall at 5 - the fraction of relevant documents retrieved in the top 5 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-recall-10", - description="Recall at 10 - the fraction of relevant documents retrieved in the top 10 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-recall-20", - description="Recall at 20 - the fraction of relevant documents retrieved in the top 20 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-recall-100", - description="Recall at 100 - the fraction of relevant documents retrieved in the top 100 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-ndcg-cut-5", - description="NDCG at cutoff 5 - Normalized Discounted Cumulative Gain for top 5 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-ndcg-cut-10", - description="NDCG at cutoff 10 - Normalized Discounted Cumulative Gain for top 10 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-ndcg-cut-20", - description="NDCG at cutoff 20 - Normalized Discounted Cumulative Gain for top 20 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-ndcg-cut-100", - description="NDCG at cutoff 100 - Normalized Discounted Cumulative Gain for top 100 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-map-cut-5", - description="Mean Average Precision at cutoff 5 - MAP calculated for top 5 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-map-cut-10", - description="Mean Average Precision at cutoff 10 - MAP calculated for top 10 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-map-cut-20", - description="Mean Average Precision at cutoff 20 - MAP calculated for top 20 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-map-cut-100", - description="Mean Average Precision at cutoff 100 - MAP calculated for top 100 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-success-5", - description="Success at 5 - whether at least one relevant document is in the top 5 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-success-10", - description="Success at 10 - whether at least one relevant document is in the top 10 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-success-20", - description="Success at 20 - whether at least one relevant document is in the top 20 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - SystemMetric( - type=MetricType.SYSTEM_RETRIEVER, - name="retriever-success-100", - description="Success at 100 - whether at least one relevant document is in the top 100 results.", - labels=ef_labels.new_labels("retriever", ef_labels.LABEL_RETRIEVAL), - supported_job_types=[SupportedJobTypes.RETRIEVER], - optional_params=retriever_common_optional_params, - ), - ] diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/safety_harness.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/safety_harness.py deleted file mode 100644 index 838c35b1a9..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/safety_harness.py +++ /dev/null @@ -1,123 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.convert import augment_online_job -from nmp.evaluator.app.evalfactory.handler import ( - BaseSystemHandler, - JudgeModelParamsInput, - hf_token_param, -) -from nmp.evaluator.app.evalfactory.labels import LABEL_CONTENT_SAFETY, new_labels -from nmp.evaluator.app.values import ( - Parameter, - SystemBenchmark, - SystemBenchmarkJob, - SystemBenchmarkOnlineJob, -) -from nmp.evaluator.config import settings -from pydantic import BaseModel, Field, model_validator -from typing_extensions import Self - - -class _BaseSafetyHarnessJudgeModelParams(BaseModel): - parallelism: int | None = Field(default=None, description="") - request_timeout: int | None = Field(default=None, description="") - max_retries: int | None = Field(default=None, description="") - - -class SafetyHarnessJudgeModelParamsInput(JudgeModelParamsInput): - # Safety harness specific judge params - parallelism: int | None = Field(default=None, description="Concurrency for judge model requests.") - - @model_validator(mode="after") - def completions_endpoint(self) -> Self: - if "/v1/completions" not in self.model.url: - raise ValueError( - f"job.benchmark_params.judge.model.url must end in '/v1/completions' for safety judge: {self.model.model_dump_json(exclude_none=True)}" - ) - return self - - -class SafetyHarnessJudgeModelParams(_BaseSafetyHarnessJudgeModelParams): - url: str - model_id: str - api_key: str | None - api_key_name: str | None - - -safety_harness_judge_param = Parameter( - name="judge", - type="object", - description="The LLM safety judge for the evaluation.", - schema_=SafetyHarnessJudgeModelParamsInput.model_json_schema(), -) - - -class SafetyHarnessHandler(BaseSystemHandler): - @classmethod - def docker_image(cls) -> str: - return settings.evalfactory.safety_harness - - @classmethod - def system_benchmarks(cls) -> list[SystemBenchmark]: - return cls._system_benchmarks - - def benchmark_job_secrets(self, job: SystemBenchmarkJob) -> dict[str, SecretRef]: - """Job secrets for the metric. Returns a dictionary of environment variables to the secret reference""" - # Special handling for Safety Harness where judge.model.api_key_secret can't be easily represented - # by MetricParameter - secrets = super().benchmark_job_secrets(job) - judge_raw_param = job.benchmark_params.get("judge") - if judge_raw_param: - judge = SafetyHarnessJudgeModelParamsInput.model_validate(judge_raw_param) - if judge.model.api_key_secret: - secrets["judge_api_key_secret"] = judge.model.api_key_secret - return secrets - - def augment_benchmark_job(self, job: SystemBenchmarkJob, output_dir: str) -> ef.EvaluationJob: - self.validate_supported_benchmark_job_types(job) - self.validate_params(job.benchmark_params, job.benchmark.required_params, job.benchmark.optional_params) - assert isinstance(job, SystemBenchmarkOnlineJob) - - # Validate judge model - judge_raw_param = job.benchmark_params.get("judge") - if not judge_raw_param: - raise ValueError( - f"job.benchmark_params.judge.model is required for evaluation with metric {job.benchmark.name}" - ) - judge = SafetyHarnessJudgeModelParamsInput.model_validate(judge_raw_param) - augmented_judge = SafetyHarnessJudgeModelParams( - **judge.model_dump(exclude_none=True, exclude={"model"}), - url=judge.model.url, - model_id=judge.model.name, - # Use the env var name (must match key in secrets() method) - the Jinja template adds the $ prefix - api_key="judge_api_key_secret" if judge.model.api_key_secret else None, - api_key_name="judge_api_key_secret" if judge.model.api_key_secret else None, - ) - job.benchmark_params["judge"] = augmented_judge.model_dump(exclude_none=True) - - ef_job = augment_online_job(job, output_dir) - - # Safety Harness config type uses underscores instead of hyphens - # Note: We set this on the EF job config, not on the original metric to avoid mutating shared state - if ef_job.config: - ef_job.config.type = job.benchmark.name.replace("-", "_") - - return ef_job - - _system_benchmarks = [ - SystemBenchmark( - name="aegis-v2", - description="Nemotron Content Safety V2: Evaluates model safety risks based on 12 top-level hazard categories.", - labels=new_labels("safety_harness", LABEL_CONTENT_SAFETY), - required_params=[hf_token_param, safety_harness_judge_param], - ), - SystemBenchmark( - name="wildguard", - description="WildGuard (allenai/wildguard): Evaluates model safety risks based on the following top-level categories: privacy, misinformation, harmful language, and malicious uses.", - labels=new_labels("safety_harness", LABEL_CONTENT_SAFETY), - required_params=[hf_token_param, safety_harness_judge_param], - ), - ] diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/simple_evals.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/simple_evals.py deleted file mode 100644 index 62bc6cda7d..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/simple_evals.py +++ /dev/null @@ -1,526 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Literal - -import nmp.evaluator.app.evalfactory.labels as ef_labels -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.convert import augment_online_job -from nmp.evaluator.app.evalfactory.handler import ( - BaseSystemHandler, - JudgeModelParamsInput, - hf_token_param, -) -from nmp.evaluator.app.jobs.evalfactory.constants import EvalFactoryModelType -from nmp.evaluator.app.values import ( - Parameter, - SystemBenchmark, - SystemBenchmarkJob, - SystemBenchmarkOnlineJob, -) -from nmp.evaluator.config import settings -from pydantic import BaseModel, Field - - -class SimpleEvalsJudgeModelParamsInput(JudgeModelParamsInput): - """Input class for Simple Evals judge params with additional fields.""" - - backend: Literal["generic", "openai"] | None = Field( - default=None, description="'openai' for OpenAI compatible judges; 'generic' for direct calls via aiohttp" - ) - temperature: float | None = Field(default=None, description="Sampling temperature for judge generation.") - top_p: float | None = Field(default=None, description="Nucleus sampling parameter for judge.") - max_tokens: int | None = Field(default=None, description="Maximum number of output tokens for judge.") - max_concurrent_requests: int | None = Field( - default=None, description="Only used with generic backend, defaults to job.params.parallelism" - ) - - -class _BaseSimpleEvalsJudgeModelParams(BaseModel): - backend: Literal["generic", "openai"] = Field( - default="generic", description="'openai' for OpenAI compatible judges; 'generic' for direct calls via aiohttp" - ) - request_timeout: int | None = Field(default=None, description="Request timeout (seconds) for judge model requests.") - max_retries: int | None = Field(default=None, description="Maximum number of retries for failed judge requests.") - temperature: float | None = Field(default=None, description="Sampling temperature for generation.") - top_p: float | None = Field(default=None, description="Nucleus sampling parameter.") - max_tokens: int | None = Field(default=None, description="Maximum number of output sequence tokens.") - max_concurrent_requests: int | None = Field( - default=None, description="Only used with generic backend, defaults to job.params.parallelism" - ) - - -class SimpleEvalsJudgeModelParams(_BaseSimpleEvalsJudgeModelParams): - url: str - model_id: str - api_key: str | None - api_key_name: str | None - - -simple_evals_judge_param = Parameter( - name="judge", - type="object", - description="The LLM judge to use for the evaluation.", - schema_=SimpleEvalsJudgeModelParamsInput.model_json_schema(), -) - - -class SimpleEvalsHandler(BaseSystemHandler): - @classmethod - def docker_image(cls) -> str: - return settings.evalfactory.simple_evals - - @classmethod - def system_benchmarks(cls) -> list[SystemBenchmark]: - return cls._system_benchmarks - - def benchmark_job_secrets(self, job: SystemBenchmarkJob) -> dict[str, SecretRef]: - """Job secrets for the benchmark. Returns a dictionary of environment variables to the secret reference""" - # Special handling for Simple Evals where judge.model.api_key_secret can't be easily represented - # by Parameter - secrets = super().benchmark_job_secrets(job) - judge_raw_param = job.benchmark_params.get("judge") - if judge_raw_param: - judge = SimpleEvalsJudgeModelParamsInput.model_validate(judge_raw_param) - if judge.model.api_key_secret: - secrets["judge_api_key_secret"] = judge.model.api_key_secret - return secrets - - def augment_benchmark_job(self, job: SystemBenchmarkJob, output_dir: str) -> ef.EvaluationJob: - self.validate_supported_benchmark_job_types(job) - self.validate_params(job.benchmark_params, job.benchmark.required_params, job.benchmark.optional_params) - assert isinstance(job, SystemBenchmarkOnlineJob) - self.augment_harness_supported_model_types(job, self.SUPPORTED_MODEL_TYPE.get(job.benchmark.name)) - - # Validate judge model - if job.benchmark.name in self._require_judge: - judge_raw_param = job.benchmark_params.get("judge") - if not judge_raw_param: - raise ValueError( - f"job.benchmark_params.judge.model is required for evaluation with benchmark {job.benchmark.name}" - ) - judge = SimpleEvalsJudgeModelParamsInput.model_validate(judge_raw_param) - augmented_judge = SimpleEvalsJudgeModelParams( - **judge.model_dump(exclude_none=True, exclude={"model", "inference", "system_prompt", "reasoning"}), - url=judge.model.url, - model_id=judge.model.name, - # Use the env var name (must match key in secrets() method) - the Jinja template adds the $ prefix - api_key="judge_api_key_secret" if judge.model.api_key_secret else None, - api_key_name="judge_api_key_secret" if judge.model.api_key_secret else None, - ) - job.benchmark_params["judge"] = augmented_judge.model_dump(exclude_none=True) - - ef_job = augment_online_job(job, output_dir) - - # Simple Evals config type uses underscores and special casing - # Note: We set this on the EF job config, not on the original benchmark to avoid mutating shared state - if ef_job.config: - config_type = job.benchmark.name.replace("-", "_") - _benchmark_name_map = { - "aa_aime_2024": "AA_AIME_2024", - "aa_math_test_500": "AA_math_test_500", - "aime_2024": "AIME_2024", - "aime_2025": "AIME_2025", - } - ef_job.config.type = _benchmark_name_map.get(config_type, config_type) - - return ef_job - - _require_judge = { - "aa-aime-2024", - "aa-math-test-500", - "aime-2024", - "aime-2025", - "math-test-500", - "simpleqa", - } - - _system_benchmarks = [ - SystemBenchmark( - name="aa-aime-2024", - description="AIME 2024 questions, math, using Artificial Analysis's setup. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_MATH), - required_params=[simple_evals_judge_param], - optional_params=[hf_token_param], - ), - SystemBenchmark( - name="aa-math-test-500", - description="Open AI math test 500, using Artificial Analysis's setup. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_MATH), - required_params=[simple_evals_judge_param], - optional_params=[hf_token_param], - ), - SystemBenchmark( - name="aime-2024", - description="AIME 2024 questions, math. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_MATH), - required_params=[simple_evals_judge_param], - optional_params=[hf_token_param], - ), - SystemBenchmark( - name="aime-2025", - description="AIME 2025 questions, math. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_MATH), - required_params=[simple_evals_judge_param], - optional_params=[hf_token_param], - ), - SystemBenchmark( - name="gpqa-diamond", - description="gpqa_diamond 0-shot CoT. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="gpqa-extended", - description="gpqa_extended 0-shot CoT. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="gpqa-main", - description="gpqa_main 0-shot CoT. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="math-test-500", - description="Open AI math test 500. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_MATH), - required_params=[simple_evals_judge_param], - optional_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-am", - description="Global-MMLU 0-shot CoT in Amharic (am). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ar", - description="Global-MMLU 0-shot CoT in Arabic (ar). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-bn", - description="Global-MMLU 0-shot CoT in Bengali (bn). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-cs", - description="Global-MMLU 0-shot CoT in Czech (cs). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-de", - description="Global-MMLU 0-shot CoT in German (de). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-el", - description="Global-MMLU 0-shot CoT in Greek (el). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-en", - description="Global-MMLU 0-shot CoT in English (en). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-es", - description="Global-MMLU 0-shot CoT in Spanish (es). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-fa", - description="Global-MMLU 0-shot CoT in Persian (fa). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-fil", - description="Global-MMLU 0-shot CoT in Filipino (fil). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-fr", - description="Global-MMLU 0-shot CoT in French (fr). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ha", - description="Global-MMLU 0-shot CoT in Hausa (ha). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-he", - description="Global-MMLU 0-shot CoT in Hebrew (he). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-hi", - description="Global-MMLU 0-shot CoT in Hindi (hi). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-id", - description="Global-MMLU 0-shot CoT in Indonesian (id). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ig", - description="Global-MMLU 0-shot CoT in Igbo (ig). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-it", - description="Global-MMLU 0-shot CoT in Italian (it). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ja", - description="Global-MMLU 0-shot CoT in Japanese (ja). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ko", - description="Global-MMLU 0-shot CoT in Korean (ko). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ky", - description="Global-MMLU 0-shot CoT in Kyrgyz (ky). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-lt", - description="Global-MMLU 0-shot CoT in Lithuanian (lt). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-mg", - description="Global-MMLU 0-shot CoT in Malagasy (mg). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ms", - description="Global-MMLU 0-shot CoT in Malay (ms). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ne", - description="Global-MMLU 0-shot CoT in Nepali (ne). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-nl", - description="Global-MMLU 0-shot CoT in Dutch (nl). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ny", - description="Global-MMLU 0-shot CoT in Nyanja (ny). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-pl", - description="Global-MMLU 0-shot CoT in Polish (pl). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-pt", - description="Global-MMLU 0-shot CoT in Portuguese (pt). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ro", - description="Global-MMLU 0-shot CoT in Romanian (ro). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-ru", - description="Global-MMLU 0-shot CoT in Russian (ru). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-si", - description="Global-MMLU 0-shot CoT in Sinhala (si). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-sn", - description="Global-MMLU 0-shot CoT in Shona (sn). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-so", - description="Global-MMLU 0-shot CoT in Somali (so). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-sr", - description="Global-MMLU 0-shot CoT in Serbian (sr). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-sv", - description="Global-MMLU 0-shot CoT in Swedish (sv). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-sw", - description="Global-MMLU 0-shot CoT in Swahili (sw). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-te", - description="Global-MMLU 0-shot CoT in Telugu (te). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-tr", - description="Global-MMLU 0-shot CoT in Turkish (tr). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-uk", - description="Global-MMLU 0-shot CoT in Ukrainian (uk). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-vi", - description="Global-MMLU 0-shot CoT in Vietnamese (vi). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="mmlu-yo", - description="Global-MMLU 0-shot CoT in Yoruba (yo). Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_LANGUAGE_UNDERSTANDING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="aime-2025-nemo", - description="AIME 2025 questions, math, using NeMo's alignment template. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_MATH), - optional_params=[hf_token_param], - ), - SystemBenchmark( - name="aime-2024-nemo", - description="AIME 2024 questions, math, using NeMo's alignment template. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_MATH), - optional_params=[hf_token_param], - ), - SystemBenchmark( - name="math-test-500-nemo", - description="math_test_500 questions, math, using NeMo's alignment template. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_MATH), - optional_params=[hf_token_param], - ), - SystemBenchmark( - name="gpqa-diamond-nemo", - description="gpqa_diamond questions, reasoning, using NeMo's alignment template. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_ADVANCED_REASONING), - required_params=[hf_token_param], - ), - SystemBenchmark( - name="simpleqa", - description="A factuality benchmark called SimpleQA that measures the ability for language models to answer short, fact-seeking questions. Compatible with chat model endpoint.", - labels=ef_labels.new_labels("simple_evals", ef_labels.LABEL_QUESTION_ANSWERING), - optional_params=[hf_token_param], - ), - ] - - SUPPORTED_MODEL_TYPE: dict[str, set[EvalFactoryModelType]] = { - "aa-aime-2024": {EvalFactoryModelType.CHAT}, # passes. Uses judge. - "aa-math-test-500": {EvalFactoryModelType.CHAT}, # passes. Uses judge. - "aime-2024": {EvalFactoryModelType.CHAT}, # passes. Uses judge. - "aime-2025": {EvalFactoryModelType.CHAT}, # passes. Uses judge. - "gpqa-diamond": {EvalFactoryModelType.CHAT}, # gated dataset 'Idavidrein/gpqa'. passes. - "gpqa-extended": {EvalFactoryModelType.CHAT}, # gated dataset 'Idavidrein/gpqa'. passes. - "gpqa-main": {EvalFactoryModelType.CHAT}, # gated dataset 'Idavidrein/gpqa'. passes. - "math-test-500": {EvalFactoryModelType.CHAT}, # passes. Uses judge. - "mmlu-am": {EvalFactoryModelType.CHAT}, # passes. No judge. - "mmlu-ar": {EvalFactoryModelType.CHAT}, - "mmlu-bn": {EvalFactoryModelType.CHAT}, - "mmlu-cs": {EvalFactoryModelType.CHAT}, - "mmlu-de": {EvalFactoryModelType.CHAT}, - "mmlu-el": {EvalFactoryModelType.CHAT}, - "mmlu-en": {EvalFactoryModelType.CHAT}, - "mmlu-es": {EvalFactoryModelType.CHAT}, - "mmlu-fa": {EvalFactoryModelType.CHAT}, - "mmlu-fil": {EvalFactoryModelType.CHAT}, - "mmlu-fr": {EvalFactoryModelType.CHAT}, - "mmlu-ha": {EvalFactoryModelType.CHAT}, - "mmlu-he": {EvalFactoryModelType.CHAT}, - "mmlu-hi": {EvalFactoryModelType.CHAT}, - "mmlu-id": {EvalFactoryModelType.CHAT}, - "mmlu-ig": {EvalFactoryModelType.CHAT}, - "mmlu-it": {EvalFactoryModelType.CHAT}, - "mmlu-ja": {EvalFactoryModelType.CHAT}, - "mmlu-ko": {EvalFactoryModelType.CHAT}, - "mmlu-ky": {EvalFactoryModelType.CHAT}, - "mmlu-lt": {EvalFactoryModelType.CHAT}, - "mmlu-mg": {EvalFactoryModelType.CHAT}, - "mmlu-ms": {EvalFactoryModelType.CHAT}, - "mmlu-ne": {EvalFactoryModelType.CHAT}, - "mmlu-nl": {EvalFactoryModelType.CHAT}, - "mmlu-ny": {EvalFactoryModelType.CHAT}, - "mmlu-pl": {EvalFactoryModelType.CHAT}, - "mmlu-pt": {EvalFactoryModelType.CHAT}, - "mmlu-ro": {EvalFactoryModelType.CHAT}, - "mmlu-ru": {EvalFactoryModelType.CHAT}, - "mmlu-si": {EvalFactoryModelType.CHAT}, - "mmlu-sn": {EvalFactoryModelType.CHAT}, - "mmlu-so": {EvalFactoryModelType.CHAT}, - "mmlu-sr": {EvalFactoryModelType.CHAT}, - "mmlu-sv": {EvalFactoryModelType.CHAT}, - "mmlu-sw": {EvalFactoryModelType.CHAT}, - "mmlu-te": {EvalFactoryModelType.CHAT}, - "mmlu-tr": {EvalFactoryModelType.CHAT}, - "mmlu-uk": {EvalFactoryModelType.CHAT}, - "mmlu-vi": {EvalFactoryModelType.CHAT}, - "mmlu-yo": {EvalFactoryModelType.CHAT}, - "aime-2025-nemo": {EvalFactoryModelType.CHAT}, # passes. No judge. - "aime-2024-nemo": {EvalFactoryModelType.CHAT}, # passes. No judge. - "math-test-500-nemo": {EvalFactoryModelType.CHAT}, # passes. No judge. - "gpqa-diamond-nemo": {EvalFactoryModelType.CHAT}, # gated dataset 'Idavidrein/gpqa' - "simpleqa": {EvalFactoryModelType.CHAT}, # passes. Uses judge. - } diff --git a/services/evaluator/src/nmp/evaluator/app/evalfactory/system.py b/services/evaluator/src/nmp/evaluator/app/evalfactory/system.py deleted file mode 100644 index 9e4c853925..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/evalfactory/system.py +++ /dev/null @@ -1,154 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Protocol, runtime_checkable - -import nmp.evaluator.app.jobs.evalfactory.models as ef -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.agentic_eval import AgenticEvalHandler -from nmp.evaluator.app.evalfactory.bfcl import BFCLHandler -from nmp.evaluator.app.evalfactory.bigcode import BigCodeEvaluationHarnessHandler -from nmp.evaluator.app.evalfactory.lm_eval_harness import LMEvalHarnessHandler -from nmp.evaluator.app.evalfactory.retriever import RetrieverHandler -from nmp.evaluator.app.evalfactory.safety_harness import SafetyHarnessHandler -from nmp.evaluator.app.evalfactory.simple_evals import SimpleEvalsHandler -from nmp.evaluator.app.values import MetricJob, SystemBenchmark, SystemBenchmarkJob, SystemMetric - - -@runtime_checkable -class SystemMetricsHandler(Protocol): - """ - Handles system metrics for EvalFactory containers. - """ - - @classmethod - def container_command(cls, job: ef.EvaluationJob, config_file_path: str) -> list[str]: - """The container command to run the evaluation with EvalFactory.""" - ... - - @classmethod - def docker_image(cls) -> str: - """The Docker image to use to run the EvalFactory container.""" - ... - - @classmethod - def system_metrics(cls) -> list[SystemMetric]: - """List of system metrics available to run evaluation jobs.""" - ... - - def augment_metric_job(self, job: MetricJob, output_dir: str) -> ef.EvaluationJob: - """Converts Evaluator MS metrics job to EvalFactory job""" - ... - - def metric_job_secrets(self, job: MetricJob) -> dict[str, SecretRef]: - """Job secrets for the metric. Returns a dictionary of environment variables to the secret reference""" - ... - - -@runtime_checkable -class SystemBenchmarkHandler(Protocol): - """ - Handles system metrics for EvalFactory containers. - """ - - @classmethod - def container_command(cls, job: ef.EvaluationJob, config_file_path: str) -> list[str]: - """The container command to run the evaluation with EvalFactory.""" - ... - - @classmethod - def docker_image(cls) -> str: - """The Docker image to use to run the EvalFactory container.""" - ... - - @classmethod - def system_benchmarks(cls) -> list[SystemBenchmark]: - """List of system benchmarks available to run evaluation jobs.""" - ... - - def augment_benchmark_job(self, job: SystemBenchmarkJob, output_dir: str) -> ef.EvaluationJob: - """Converts Evaluator MS benchmark job to EvalFactory job""" - ... - - def benchmark_job_secrets(self, job: SystemBenchmarkJob) -> dict[str, SecretRef]: - """Job secrets for the metric. Returns a dictionary of environment variables to the secret reference""" - ... - - -_METRIC_HANDLERS: list[SystemMetricsHandler] = [ - AgenticEvalHandler(), - RetrieverHandler(), -] - -_METRIC_HANDLERS_BY_SYSTEM_METRIC_NAME: dict[str, SystemMetricsHandler] = {} -_SYSTEM_METRICS_BY_NAME: dict[str, SystemMetric] = {} -system_metrics_count = 0 -for handler in _METRIC_HANDLERS: - isinstance(handler, SystemMetricsHandler) - system_metrics = handler.system_metrics() - system_metrics_count += len(system_metrics) - for metric in system_metrics: - _METRIC_HANDLERS_BY_SYSTEM_METRIC_NAME[metric.name] = handler - _SYSTEM_METRICS_BY_NAME[metric.name] = metric - -assert len(_SYSTEM_METRICS_BY_NAME) == system_metrics_count, "duplicate system metric name" - - -def get_system_metric(name: str) -> SystemMetric: - metric = _SYSTEM_METRICS_BY_NAME.get(name) - if not metric: - raise ValueError( - f"Unknown system metric '{name}'. Supported system metrics: {list(_SYSTEM_METRICS_BY_NAME.keys())}" - ) - return metric - - -def get_system_metric_handler(name: str) -> SystemMetricsHandler: - handler = _METRIC_HANDLERS_BY_SYSTEM_METRIC_NAME.get(name) - - if not handler: - raise ValueError( - f"Unknown system metric '{name}'. Supported system metrics: {list(_SYSTEM_METRICS_BY_NAME.keys())}" - ) - - return handler - - -def get_all_system_metrics() -> list[SystemMetric]: - return list(_SYSTEM_METRICS_BY_NAME.values()) - - -_BENCHMARK_HANDLERS: list[SystemBenchmarkHandler] = [ - BFCLHandler(), - BigCodeEvaluationHarnessHandler(), - LMEvalHarnessHandler(), - SafetyHarnessHandler(), - SimpleEvalsHandler(), -] -_BENCHMARK_HANDLERS_BY_SYSTEM_BENCHMARK_NAME: dict[str, SystemBenchmarkHandler] = {} -_SYSTEM_BENCHMARKS_BY_NAME: dict[str, SystemBenchmark] = {} -system_benchmarks_count = 0 -for handler in _BENCHMARK_HANDLERS: - isinstance(handler, SystemBenchmarkHandler) - system_benchmarks = handler.system_benchmarks() - system_benchmarks_count += len(system_benchmarks) - for benchmark in system_benchmarks: - _BENCHMARK_HANDLERS_BY_SYSTEM_BENCHMARK_NAME[benchmark.name] = handler - _SYSTEM_BENCHMARKS_BY_NAME[benchmark.name] = benchmark - -assert len(_SYSTEM_BENCHMARKS_BY_NAME) == system_benchmarks_count, "duplicate system benchmark name" - - -def get_system_benchmark_handler(name: str) -> SystemBenchmarkHandler: - handler = _BENCHMARK_HANDLERS_BY_SYSTEM_BENCHMARK_NAME.get(name) - - if not handler: - raise ValueError( - f"Unknown system benchmark '{name}'. Supported system benchmarks: {list(_SYSTEM_BENCHMARKS_BY_NAME.keys())}" - ) - - return handler - - -def get_all_system_benchmarks() -> list[SystemBenchmark]: - return list(_SYSTEM_BENCHMARKS_BY_NAME.values()) diff --git a/services/evaluator/src/nmp/evaluator/app/inference.py b/services/evaluator/src/nmp/evaluator/app/inference.py deleted file mode 100644 index 3d74231ac1..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/inference.py +++ /dev/null @@ -1,85 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Any -from urllib.parse import urlparse - -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.inference import make_inference_request -from nemo_evaluator_sdk.values import Model -from nemo_platform import AsyncNeMoPlatform -from nmp.common.config import get_platform_config - - -async def verify_model_reachable( - model: Model | dict[str, Any], - sdk: AsyncNeMoPlatform, - workspace: str, - api_key: str | None = None, - timeout: float | None = 10.0, -) -> dict: - """Verify if a model is reachable by making a test request. - - Only supports 'nim' and 'openai' formats. Other formats will skip the check. - - Args: - model: A Model object or dictionary containing model configuration (url, name, etc.). - sdk: SDK instance with request-scoped user context. - workspace: Workspace for resolving api_key_secret. Required. - api_key: Optional explicit API key. If provided, overrides model.api_key. - If not provided, uses model.api_key or placeholder. - timeout: Optional timeout in seconds for the test request. Defaults to 10 seconds. - - Returns: - The response from the model endpoint, or a status dict if test was skipped. - - Raises: - Exception: If model validation fails or model is unreachable. - """ - # Model.model_validate() handles both dict and Model instances - inline_model = Model.model_validate(model) - - inline_model = inline_model.with_default_headers(get_platform_headers(inline_model.url)) - - # Resolve api_key_secret if present - resolved_api_key = api_key - if inline_model.api_key_secret: - secret_name = inline_model.api_key_secret.root - secret = await sdk.secrets.access(secret_name, workspace=workspace) - resolved_api_key = secret.value - - # Only check nim and openai formats - if inline_model.format not in (ModelFormat.NVIDIA_NIM, ModelFormat.OPEN_AI): - return {"status": f"Test skipped for unsupported format: {inline_model.format}"} - - # Create a simple test payload with minimal tokens to reduce cost - test_payload: dict = { - "messages": [{"role": "user", "content": "Ping!. Answer only in one word"}], - } - - # Check if the endpoint is a completions endpoint (not chat completions). - # This is important to not have dependency on api version and accommodate query params. - parsed_url = urlparse(inline_model.url) - if parsed_url.path.endswith("/completions") and not parsed_url.path.endswith("/chat/completions"): - test_payload = {"prompt": "Ping"} - - if inline_model.format == ModelFormat.NVIDIA_NIM: - test_payload["max_tokens"] = 100 - - # Make inference request with 2 retries, passing resolved API key - return await make_inference_request( - model=inline_model, - request=test_payload, - max_retries=3, - api_key=resolved_api_key, - timeout=timeout, - ) - - -def get_platform_headers(url: str) -> dict[str, str] | None: - """Return evaluator service-principal headers for platform-local URLs.""" - platform_netloc = urlparse(get_platform_config().base_url).netloc - if platform_netloc and urlparse(url).netloc == platform_netloc: - # Include service principal header so NeMo Platform inference gateway auto-authorizes - # this request without requiring a valid JWT Bearer token. - return {"X-NMP-Principal-Id": "service:evaluator"} diff --git a/services/evaluator/src/nmp/evaluator/app/inference_hooks.py b/services/evaluator/src/nmp/evaluator/app/inference_hooks.py deleted file mode 100644 index 2f68e2aca7..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/inference_hooks.py +++ /dev/null @@ -1,35 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import logging - -import nemo_evaluator_sdk.inference as sdk_inference -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.inference import PostprocessResponse, PreprocessRequest -from nemo_evaluator_sdk.metrics.llm_judge import LLMJudgeMetric -from nemo_evaluator_sdk.values.params import RunConfig, RunConfigOnlineModel -from nmp.evaluator.app.jobs.progress_tracking import ProgressTracking - - -class ProgressTrackingHook(PostprocessResponse): - """ - Increment the samples_processed count for progress tracking - """ - - def __init__(self, progress_tracking: ProgressTracking): - self.progress_tracking = progress_tracking - - def postprocess(self, response, id=None) -> dict: - self.progress_tracking.increment_samples_processed() - return response - - -def new_hooks( - params: RunConfig | LLMJudgeMetric | None, - model_format: ModelFormat | None = ModelFormat.NVIDIA_NIM, - logger: logging.Logger | None = None, -) -> tuple[list[PreprocessRequest], list[PostprocessResponse]]: - """Initialize preprocess and postprocess hooks for the inference.""" - if isinstance(params, (RunConfigOnlineModel, LLMJudgeMetric)): - return sdk_inference.new_hooks(params, model_format=model_format, logger=logger) - return sdk_inference.new_hooks(None, model_format=model_format, logger=logger) diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/__init__.py b/services/evaluator/src/nmp/evaluator/app/jobs/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/benchmarks.py b/services/evaluator/src/nmp/evaluator/app/jobs/benchmarks.py deleted file mode 100644 index 4460bad004..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/benchmarks.py +++ /dev/null @@ -1,206 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Job compiler for benchmark evaluation jobs. - -Compiles BenchmarkJob to PlatformJobSpec for execution by the Jobs service. -""" - -import shlex - -import nmp.evaluator.app.values as app -import yaml -from nemo_platform_plugin.jobs.api_factory import ( - ContainerSpec, - CPUExecutionProviderSpec, - EnvironmentVariable, - EnvironmentVariableFromSecret, - PlatformJobSpec, - PlatformJobStep, -) -from nemo_platform_plugin.jobs.image import get_qualified_image -from nmp.common.jobs.constants import PERSISTENT_JOB_STORAGE_PATH_ENVVAR -from nmp.evaluator.app.evalfactory.system import get_system_benchmark_handler -from nmp.evaluator.app.jobs.constants import NEMO_EVAL_FACTORY_JOB_CONFIG, resolve_eval_harness -from nmp.evaluator.app.jobs.fileset import get_fileset_step -from nmp.evaluator.app.jobs.metrics import generate_config_file_from_env_command_str, get_results_step -from nmp.evaluator.app.jobs.progress_tracking import get_progress_tracking_url -from nmp.evaluator.app.metrics.metric import MetricWithSecrets, new_metric -from nmp.evaluator.config import settings -from nmp.evaluator.tasks.evaluate_benchmark import ( - benchmark_evaluation_entrypoint, - benchmark_evaluation_entrypoint_args, -) - - -async def compile_benchmark_job(job: app.BenchmarkJob) -> PlatformJobSpec: - """Compile a benchmark job input to a platform job spec. - - Args: - job: The benchmark job input. - benchmark: The resolved benchmark entity. - - Returns: - Platform job specification ready for execution. - """ - steps: list[PlatformJobStep] = [] - - if isinstance(job.benchmark, app.SystemBenchmark): - assert isinstance(job, app.SystemBenchmarkOfflineJob | app.SystemBenchmarkOnlineJob) - if isinstance(job, app.SystemBenchmarkOfflineJob): - # Some system benchmarks support offline evaluation - steps.append(get_fileset_step(job.dataset, step_name="dataset-download")) - # System benchmarks have dataset download step included in the container, no need to explicit fileset step. - steps.append(get_evalfactory_step(job)) - # Handle results after EvalFactory container exits - # TODO Jobs MS needs to support continuing if prev step fails to process artifacts for failed evaluations. - steps.append(get_results_step(job, eval_harness=resolve_eval_harness(job.benchmark.labels))) - - else: - # Add fileset download step for the benchmark's dataset - steps.append(get_fileset_step(job.benchmark.dataset, step_name="dataset-download")) - steps.append(await _get_benchmark_evaluation_step(job)) - - return PlatformJobSpec(steps=steps) - - -async def _get_benchmark_evaluation_step(job: app.BenchmarkJob) -> PlatformJobStep: - """Create the step for a benchmark job for evaluation and results handling. - - Args: - job: The benchmark job input. - benchmark: The resolved benchmark entity. - - Returns: - Platform job step for benchmark evaluation. - """ - # Determine job type for metric instantiation - job_type = job.__job_type__ - if isinstance(job.benchmark, app.SystemBenchmark): - raise TypeError("System benchmarks are handled by EvalFactory and should not use benchmark evaluation step") - benchmark = job.benchmark - - # Collect secrets from all metrics in the benchmark using the MetricWithSecrets protocol - secret_envs: list[EnvironmentVariable] = [] - - for benchmark_metric in benchmark.metrics: - metric_config = benchmark_metric.metric - # Create metric instance without resolving secrets (they'll be injected at runtime) - metric = await new_metric(metric_config, job_type, secret_resolver=None) - - # Extract secrets using the MetricWithSecrets protocol - if isinstance(metric, MetricWithSecrets): - for secret_env, secret in metric.secrets().items(): - secret_envs.append( - EnvironmentVariable( - name=secret_env, - from_secret=EnvironmentVariableFromSecret(name=secret.root), - ) - ) - - # Handle target model secret for online jobs - if isinstance(job, app.BenchmarkOnlineJob) or isinstance(job, app.SystemBenchmarkOnlineJob): - if job.model.api_key_secret: - env_var_name = job.model.api_key_env - assert env_var_name is not None - secret_envs.append( - EnvironmentVariable( - name=env_var_name, - from_secret=EnvironmentVariableFromSecret(name=job.model.api_key_secret.root), - ) - ) - - # Deduplicate secrets by name - seen_secrets: set[str] = set() - unique_secret_envs: list[EnvironmentVariable] = [] - for env in secret_envs: - if env["name"] not in seen_secrets: - seen_secrets.add(env["name"]) - unique_secret_envs.append(env) - - return PlatformJobStep( - name="evaluation", - executor=CPUExecutionProviderSpec( - provider="cpu", - container=ContainerSpec( - image=get_qualified_image("nmp-cpu-tasks"), - entrypoint=benchmark_evaluation_entrypoint(), - command=benchmark_evaluation_entrypoint_args( - progress_tracking_url=get_progress_tracking_url(), - ), - ), - ), - config=job.model_dump(mode="json", exclude_none=True), - environment=[ - # Override default shared volume env for steps - EnvironmentVariable(name=PERSISTENT_JOB_STORAGE_PATH_ENVVAR, value=settings.jobs.volume_path), - # Use JSON log format for cleaner OTLP log output - EnvironmentVariable(name="LOG_FORMAT", value="json"), - *unique_secret_envs, - ], - ) - - -def get_evalfactory_step( - job: app.SystemBenchmarkOfflineJob | app.SystemBenchmarkOnlineJob, -) -> PlatformJobStep: - """Create the evaluation step for a system benchmark job that runs an EvalFactory container. - - Args: - job: The benchmark job input. - benchmark: The resolved benchmark entity. - - Returns: - Platform job step for benchmark evaluation. - """ - handler = get_system_benchmark_handler(job.benchmark.name) - - # Transform Evaluator API to EvalFactory configuration - ef_job_config = handler.augment_benchmark_job(job.model_copy(deep=True), settings.jobs.results_dir) - evaluation_config_dict = ef_job_config.model_dump(mode="json", exclude_unset=True, exclude_defaults=True) - - # Prepare evaluation container command - config_file_command_str, config_file_path = generate_config_file_from_env_command_str() - container_command = handler.container_command(ef_job_config, config_file_path) - # Use `exec` so /bin/sh is replaced by eval-factory command as the process-group leader. - # Otherwise, SIGTERM terminates the /bin/sh before eval-factory finishes graceful shutdown. - # Once /bin/sh is killed, launcher exits killing the eval-factory process. - command = ["/bin/sh", "-c", config_file_command_str + " && exec " + shlex.join(container_command)] - - # Prepare any secrets - secret_envs: list[EnvironmentVariable] = [] - # Handle target model secret for online jobs - if isinstance(job, app.SystemBenchmarkOnlineJob) and job.model.api_key_secret: - env_var_name = job.model.api_key_env - assert env_var_name is not None - secret_envs.append( - EnvironmentVariable( - name=env_var_name, - from_secret=EnvironmentVariableFromSecret(name=job.model.api_key_secret.root), - ) - ) - for secret_env, secret in handler.benchmark_job_secrets(job).items(): - secret_envs.append( - EnvironmentVariable( - name=secret_env, - from_secret=EnvironmentVariableFromSecret(name=secret.root), - ) - ) - - return PlatformJobStep( - name="evaluation", - executor=CPUExecutionProviderSpec( - provider="cpu", - container=ContainerSpec( - image=handler.docker_image(), - command=command, - ), - ), - config=evaluation_config_dict, - environment=[ - # Override default shared volume env for steps - EnvironmentVariable(name=PERSISTENT_JOB_STORAGE_PATH_ENVVAR, value=settings.jobs.volume_path), - EnvironmentVariable(name=NEMO_EVAL_FACTORY_JOB_CONFIG, value=yaml.safe_dump(evaluation_config_dict)), - *secret_envs, - ], - ) diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/constants.py b/services/evaluator/src/nmp/evaluator/app/jobs/constants.py deleted file mode 100644 index 5188a7f8e4..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/constants.py +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Literal, cast, get_args - -# Used as the env name to serialize EvalFactory YAML configuration -# whereas NEMO_JOB_STEP_CONFIG expects JSON -NEMO_EVAL_FACTORY_JOB_CONFIG = "NEMO_EVAL_FACTORY_JOB_CONFIG" -NEMO_EVAL_HARNESS = "NEMO_EVAL_HARNESS" -EVALUATOR_HARNESS = "evaluator" -EvalHarness = Literal[ - "evaluator", - "retriever", - "agentic_eval", - "safety_harness", - "simple_evals", - "lm_eval_harness", - "bigcode_eval_harness", - "bfcl", -] -VALID_EVAL_HARNESSES = frozenset(get_args(EvalHarness)) - -# File name of the EvalFactory configuration -EVALFACTORY_EVALUATION_JOB_FILE_NAME = "evaluation_job_file.yaml" - -# Results file names - match the result entity names for consistency -EVALUATION_RESULTS_AGG_SCORES_FILE_NAME = "aggregate-scores.json" -EVALUATION_RESULTS_ROW_SCORES_FILE_NAME = "row-scores.jsonl" - -# Results file name from EvalFactory -EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME = "results.yml" - -JOBS_RESULTS_ARTIFACTS = "artifacts" # archived job directory -JOB_RESULTS_AGGREGATE_SCORES = "aggregate-scores" # aggregated scores -JOB_RESULTS_ROW_SCORES = "row-scores" # per-row scores - - -def resolve_eval_harness(labels: dict | None) -> EvalHarness: - if isinstance(labels, dict) and isinstance(labels.get("eval_harness"), str): - return normalize_eval_harness(labels["eval_harness"]) - return EVALUATOR_HARNESS - - -def normalize_eval_harness(eval_harness: str | None) -> EvalHarness: - normalized = ( - eval_harness.strip().lower() if isinstance(eval_harness, str) and eval_harness.strip() else EVALUATOR_HARNESS - ) - if normalized not in VALID_EVAL_HARNESSES: - raise ValueError(f"Unsupported eval harness '{eval_harness}'. Expected one of: {sorted(VALID_EVAL_HARNESSES)}") - return cast(EvalHarness, normalized) diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/evalfactory/__init__.py b/services/evaluator/src/nmp/evaluator/app/jobs/evalfactory/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/evalfactory/constants.py b/services/evaluator/src/nmp/evaluator/app/jobs/evalfactory/constants.py deleted file mode 100644 index 15a486b0f1..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/evalfactory/constants.py +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from enum import Enum - - -class ModelFormat(str, Enum): - NIM = "nvidia-nim" - OPENAI = "openai" - - -# Different metrics have different supported model types. "vlm" also exists as a supported type but not used. -class EvalFactoryModelType(str, Enum): - CHAT = "chat" - COMPLETIONS = "completions" diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/evalfactory/models.py b/services/evaluator/src/nmp/evaluator/app/jobs/evalfactory/models.py deleted file mode 100644 index 33549e0718..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/evalfactory/models.py +++ /dev/null @@ -1,240 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. - -from typing import Any, Dict - -from nmp.evaluator.app.jobs.evalfactory.constants import ModelFormat -from pydantic import BaseModel, Field - - -class Value(BaseModel): - """The base class for all value types. - - This also helps avoid confusion since Model and BaseModel in Pydantic - mean something different. - """ - - model_config = {"arbitrary_types_allowed": True, "protected_namespaces": (), "extra": "ignore"} - - -class CachedOutputs(Value): - path: str = Field() - - -class InterceptorConfig(Value): - """Configuration for a single interceptor""" - - name: str = Field(description="Name of the interceptor to use") - enabled: bool = Field(description="Whether this interceptor is enabled", default=True) - config: dict[str, Any] = Field(description="Configuration for the interceptor", default_factory=dict) - - -class PostEvalHookConfig(Value): - """Configuration for a single post-evaluation hook""" - - name: str = Field(description="Name of the post-evaluation hook to use") - enabled: bool = Field(description="Whether this post-evaluation hook is enabled", default=True) - config: dict[str, Any] = Field(description="Configuration for the post-evaluation hook", default_factory=dict) - - -class AdapterConfig(Value): - interceptors: list[InterceptorConfig] = Field( - description="List of interceptors to use with their configurations", - default_factory=list, - ) - post_eval_hooks: list[PostEvalHookConfig] = Field( - description="List of post-evaluation hooks to use with their configurations", - default_factory=list, - ) - - -class APIEndpoint(Value): - url: str | None = Field(default=None) - model_id: str | None = Field(default=None) - # This field is REQUIRED for LM Eval Harness. We make sure it gets set in that handler's augment_config - # method. If the user does not supply a value we do our best/safest guess but the ultimate - # underlying default is 'completions', which is used in the total absence of anything better. - type: str | None = Field(default=None) - api_key: str | None = Field( - default=None, - description="Contains env var name pointing to secret, not the raw secret itself. Deprecated field used for EvalFactory 25.11 and earlier, still used by agentic_eval:26.01. Will be removed 26.03", - ) - api_key_name: str | None = Field( - default=None, description="Contains env var name pointing to secret, not the raw secret itself (25.12+)." - ) - # If absent, underlying default is False - stream: bool | None = Field(default=None) - # Evaluator reasoning options are mapped from Config to EvalFactory target.api_endpoint.adapter_config - adapter_config: AdapterConfig | None = Field(default=None) - format: str | None = Field(default=None) - - -class EvaluationTarget(Value): - api_endpoint: APIEndpoint | None = Field(default=None) - cached_outputs: CachedOutputs | None = Field(default=None) - - -class Dataset(Value): - format: str | None = Field(default=None) - namespace: str | None = Field(default=None) - dataset_name: str | None = Field(default=None) - path: str = Field() - split: str | None = Field(default=None) - limit: int | None = Field(default=None) - - -class MetricConfig(Value): - """A metric that is computed as part of the evaluation.""" - - type: str = Field( - description="The type of the metric.", - ) - - # NOTE: we can spec this in detail as well, but not for the initial implementation - params: dict[str, Any] | None = Field(default=None, description="Specific parameters for the metric.") - - -class TaskConfig(Value): - """Configuration object for a task which is part of an evaluation.""" - - type: str = Field( - description="The type of the task within a benchmark. Example 'mmlu_high_school', etc.", - ) - - params: dict[str, Any] | None = Field(default=None, description="Additional parameters related to the task.") - - metrics: dict[str, MetricConfig] | None = Field(default=None, description="Metrics to be computed for the task.") - - dataset: Dataset | None = Field( - None, - description="Optional dataset reference." - "Typically, if not specified, means that the type of task has an implicit dataset.", - ) - - -class RunParams(Value): - """Global parameters for an evaluation.""" - - # General parameters that control the execution of an evaluation - - parallelism: int | None = Field( - description="Parallelism to be used for the evaluation job. " - "Typically, this represents the maximum number of concurrent requests made to the model.", - default=None, - ) - request_timeout: int | None = Field( - description="The timeout to be used for requests made to the model.", - default=None, - ) - max_retries: int | None = Field(description="Maximum number of retries for failed requests.", default=None) - - # Parameters related to the LLM request params - - limit_samples: int | None = Field(description="Limit number of evaluation samples", default=None) - max_new_tokens: int | None = Field(description="Max tokens to generate", default=None, alias="max_tokens") - temperature: float | None = Field( - description="Float value between 0 and 1. temp of 0 indicates greedy decoding, " - "where the token with highest prob is chosen. Temperature can't be set to 0.0 currently", - default=None, - ) - top_p: float | None = Field( - description="Float value between 0 and 1; limits to the top tokens within a certain " - "probability. top_p=0 means the model will only consider the single most likely " - "token for the next prediction", - default=None, - ) - extra: dict[str, Any] | None = Field(description="Any other custom parameters.", default_factory=dict) - - # BFCL - task: str | None = Field(default=None) - - -class RunConfig(Value): - type: str = Field() - params: RunParams | None = Field() - - -class EvaluationJob(Value): - id: str | None = Field(default=None) - target: EvaluationTarget | None = Field(default=None) - config: RunConfig | None = Field(default=None) - output_dir: str | None = Field(default=None) - - -class AgenticParams(Value): - dataset_path: str = Field(description="Path to the dataset file") - metric_mode: str | None = Field( - default=None, description="Specific mode for `topic_adherence` (precision, recall, f1. default f1)" - ) - judge_model_type: ModelFormat | None = Field( - default=None, description="The type of judge model to use (e.g., openai or nvidia-nim)" - ) - judge_model_args: dict[str, Any] | None = Field(default=None, description="Configuration for judge model") - judge_sanity_check: bool | None = Field(default=None, description="Enable/disable judge model sanity checks") - trajectory_used_tools: str | None = Field( - default=None, description="Comma-separated list of tools used in trajectory evaluation" - ) - trajectory_custom_tools: dict[str, str] | None = Field( - default=None, - description="Dictionary mapping tool names to descriptions for trajectory evaluation", - ) - - -class RetrieverParams(Value): - index_pipeline_yaml_file: str - query_pipeline_yaml_file: str - component_inputs_template: str - milvus_uri: str | None = Field(None) - milvus_host: str | None = Field(None) - milvus_port: str | None = Field(None) - milvus_password: str | None = Field(None) - milvus_collection_name: str | None = Field(None) - retriever_name: str | None - retriever_type: str | None - - -class RetrieverModel(Value): - api_endpoint: APIEndpoint | None = Field(default=None) - - -class RetrieverPipeline(Value): - top_k: int | None = Field(default=None) - query_embedding_model: RetrieverModel | None = Field(default=None) - index_embedding_model: RetrieverModel | None = Field(default=None) - reranker_model: RetrieverModel | None = Field(default=None) - params: dict[str, Any] | None = Field(default=None) - - -class RAGPipeline(Value): - context_ordering: str | None - params: dict[str, Any] | None = Field(default=None) - retriever: dict[str, RetrieverPipeline | None] | None - - -class JudgeTaskParams(Value): - judge_llm: str - judge_llm_url: str - judge_llm_api_key: str | None - judge_embeddings: str - judge_embeddings_url: str - judge_embeddings_api_key: str | None - judge_request_timeout: int - judge_max_retries: int - judge_max_workers: int - - -class RAGConfig(Value): - tasks: Dict[str, TaskConfig] - pipeline: RAGPipeline - - -class RetrieverConfig(Value): - tasks: Dict[str, TaskConfig] - pipeline: RetrieverPipeline diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/fileset.py b/services/evaluator/src/nmp/evaluator/app/jobs/fileset.py deleted file mode 100644 index 86dc39850b..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/fileset.py +++ /dev/null @@ -1,86 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Fileset download job step utilities.""" - -from nemo_evaluator_sdk.values import DatasetRows -from nemo_platform_plugin.jobs.api_factory import ( - ContainerSpec, - CPUExecutionProviderSpec, - EnvironmentVariable, - PlatformJobStep, -) -from nemo_platform_plugin.jobs.image import get_qualified_image -from nmp.common.jobs.constants import ( - DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH, - EPHEMERAL_TASK_STORAGE_PATH_ENVVAR, - PERSISTENT_JOB_STORAGE_PATH_ENVVAR, -) -from nmp.evaluator.app.values import Dataset, Fileset, FilesetRef -from nmp.evaluator.config import settings - - -def fileset_entrypoint() -> list[str]: - """Python task entrypoint for fileset download commands.""" - return ["python", "-m", "nmp.evaluator.tasks.download_fileset"] - - -def fileset_entrypoint_args(dataset: Dataset, target_download_dir: str, scratch_path: str) -> list[str]: - """ - Entrypoint args to download fileset using the NeMo Platform SDK. - - Downloads to local scratch first then moves to shared storage to avoid - issues with file locking on shared filesystems. - - Args: - dataset: Dataset object (FilesetRef, DatasetRows, or Fileset). - target_download_dir: Final destination directory on shared storage. - scratch_path: Temporary local scratch directory (may contain env var references). - - Returns: - CLI args list for the download_fileset task. - """ - args = ["--local-dir", scratch_path, "--target-dir", target_download_dir] - - if isinstance(dataset, FilesetRef) or isinstance(dataset, Fileset): - args.extend(["--dataset", dataset.model_dump_json()]) - elif isinstance(dataset, DatasetRows): - args.extend(["--dataset-file", DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH]) - else: - raise TypeError(f"Unexpected dataset type to configure entrypoint args {type(dataset)}") - return args - - -def get_fileset_step(dataset: Dataset, step_name: str) -> PlatformJobStep: - """ - Create a job step to download a fileset from NeMo Platform. - - Args: - dataset: Dataset object (FilesetRef, DatasetRows, or Fileset). - step_name: Unique name for the step. - - Returns: - PlatformJobStep configured to download the fileset. - """ - scratch_path = "${" + EPHEMERAL_TASK_STORAGE_PATH_ENVVAR + "}" - target_download_dir = "${" + PERSISTENT_JOB_STORAGE_PATH_ENVVAR + "}/datasets" - - command = fileset_entrypoint_args(dataset, target_download_dir, scratch_path) - - job_step = PlatformJobStep( - name=step_name, - executor=CPUExecutionProviderSpec( - provider="cpu", - container=ContainerSpec( - image=get_qualified_image("nmp-cpu-tasks"), - entrypoint=fileset_entrypoint(), - command=command, - ), - ), - environment=[ - EnvironmentVariable(name=PERSISTENT_JOB_STORAGE_PATH_ENVVAR, value=settings.jobs.volume_path), - ], - ) - if isinstance(dataset, DatasetRows): - job_step["config"] = dataset.model_dump(mode="json", exclude_none=True) - return job_step diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/metric_results.py b/services/evaluator/src/nmp/evaluator/app/jobs/metric_results.py deleted file mode 100644 index 823a26132d..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/metric_results.py +++ /dev/null @@ -1,194 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import json -import logging -from typing import cast - -import nmp.evaluator.app.values as app -import nmp.evaluator.entities as entities -from nemo_evaluator_sdk.values import AggregatedMetricResult -from nemo_platform import AsyncNeMoPlatform -from nmp.common.entities import SYSTEM_WORKSPACE, EntityClient -from nmp.common.jobs.result_manager import result_manager_factory -from nmp.evaluator.app.jobs.constants import ( - JOB_RESULTS_AGGREGATE_SCORES, - JOB_RESULTS_ROW_SCORES, - JOBS_RESULTS_ARTIFACTS, - EvalHarness, - normalize_eval_harness, -) -from nmp.evaluator.app.jobs.result_parsers.base import ResultsParser -from nmp.evaluator.app.jobs.result_parsers.custom import CustomResultsParser -from nmp.evaluator.app.jobs.result_parsers.evalfactory import EvalFactoryResultsParser -from pydantic import Field -from pydantic_settings import BaseSettings - -log = logging.getLogger(__name__) - -ignore_patterns = [ - "cache.db", # EvalFactory 25.08.1+ cache adapter - "cache/", # EvalFactory 25.07.1 cache adapter -] - - -class ResultsHandlerConfig(BaseSettings): - # Jobs MS environment variable - NEMO_JOB_ID: str = Field(description="Jobs MS job ID") - NEMO_JOB_WORKSPACE: str = Field(description="Jobs MS job workspace") - NEMO_EVAL_HARNESS: str | None = Field(default=None, description="Evaluation harness name") - - -def handle_results( - job: app.MetricJob | app.BenchmarkJob, - config: ResultsHandlerConfig, - local_results_dir_path: str, - sdk: AsyncNeMoPlatform, -): - """ - Handle results for an evaluation. Runs async operations via asyncio.run(). - - Args: - config: Configuration containing job ID and workspace. - local_results_dir_path: Path to directory containing evaluation results. - sdk: Async SDK instance for API operations. Useful for testing. - - Steps: - 1. Select results parser from the configured eval harness. - 2. Normalize aggregate/row outputs into evaluator schema when needed. - 3. Upload artifacts, aggregate-scores, and optional row-scores to Jobs API. - """ - asyncio.run(handle_results_async(job, config, local_results_dir_path, sdk)) - - -async def handle_results_async( - job: app.MetricJob | app.BenchmarkJob, - config: ResultsHandlerConfig, - local_results_dir_path: str, - sdk: AsyncNeMoPlatform, -): - """Async implementation of handle_results with parallel uploads. - - Args: - config: Configuration containing job ID and workspace. - local_results_dir_path: Path to directory containing evaluation results. - sdk: Async SDK instance for API operations. If provided, used for both - files and jobs operations. Useful for testing with in-memory services. - """ - manager = result_manager_factory( - job_name=config.NEMO_JOB_ID, - workspace=config.NEMO_JOB_WORKSPACE, - is_async=True, - files_sdk=sdk, - jobs_sdk=sdk, - ) - - parser = _get_results_parser(config.NEMO_JOB_ID, local_results_dir_path, eval_harness=config.NEMO_EVAL_HARNESS) - prepared_results = parser.prepare_results(local_results_dir_path) - - # Build list of tasks to run in parallel - tasks = [ - manager.create_result( - JOBS_RESULTS_ARTIFACTS, - artifact_local_path=local_results_dir_path, - ignore_patterns=ignore_patterns, - ), - manager.create_result(JOB_RESULTS_AGGREGATE_SCORES, artifact_local_path=prepared_results.aggregate_scores_path), - register_result_entity(prepared_results.aggregate_scores_path, job, config, sdk), - ] - - if prepared_results.row_scores_path is not None: - tasks.append( - manager.create_result(JOB_RESULTS_ROW_SCORES, artifact_local_path=prepared_results.row_scores_path) - ) - - await asyncio.gather(*tasks) - - -def _get_results_parser(job_id: str, local_results_dir_path: str, *, eval_harness: str | None = None) -> ResultsParser: - normalized_harness: EvalHarness = normalize_eval_harness(eval_harness) - if normalized_harness == "evaluator": - return CustomResultsParser() - log.info( - "Using EvalFactory parser from configured harness", - extra={ - "job_id": job_id, - "results_dir": local_results_dir_path, - "eval_harness": normalized_harness, - }, - ) - return EvalFactoryResultsParser(job_id, normalized_harness) - - -async def register_result_entity( - aggregate_scores_path: str, - job: app.MetricJob | app.BenchmarkJob, - config: ResultsHandlerConfig, - sdk: AsyncNeMoPlatform, -) -> entities.BenchmarkJobResult | entities.MetricJobResult: - log.info("Registering result entity", extra={"aggregate_scores_path": aggregate_scores_path}) - - if getattr(job, "metric", None): - result_entity = load_metric_result_entity( - aggregate_scores_path, - cast("app.MetricJob", job), - config, - ) - elif getattr(job, "benchmark", None): - result_entity = load_benchmark_result_entity( - aggregate_scores_path, - cast("app.BenchmarkJob", job), - config, - ) - else: - raise ValueError(f"unsupported job {type(job)}") - - entity_client = EntityClient(sdk.entities) - return await entity_client.create(result_entity) - - -def load_metric_result_entity( - aggregate_scores_path: str, job: app.MetricJob, config: ResultsHandlerConfig -) -> entities.MetricJobResult: - with open(aggregate_scores_path, "r") as f: - scores = json.load(f) - - return entities.MetricJobResult( - name=config.NEMO_JOB_ID, - workspace=config.NEMO_JOB_WORKSPACE, - metric=job.metric_ref, - dataset=job.dataset_ref, - model=getattr(job, "model_ref", None), - labels=job.metric.labels, - scores=AggregatedMetricResult.model_validate(scores).scores, - ) - - -def load_benchmark_result_entity( - aggregate_scores_path: str, job: app.BenchmarkJob, config: ResultsHandlerConfig -) -> entities.BenchmarkJobResult: - with open(aggregate_scores_path, "r") as f: - scores = json.load(f) - - metric_refs = None - dataset_ref = None - if isinstance(job.benchmark, app.Benchmark): - metric_refs = [metric.metric_ref for metric in job.benchmark.metrics] - dataset_ref = job.benchmark.dataset - benchmark_ref = app.BenchmarkRef(root=job.benchmark.name) - elif isinstance(job.benchmark, app.SystemBenchmark): - benchmark_ref = app.BenchmarkRef(root=f"{SYSTEM_WORKSPACE}/{job.benchmark.name}") - else: - raise ValueError(f"Unsupported benchmark type: {type(job.benchmark).__name__}") - - return entities.BenchmarkJobResult( - name=config.NEMO_JOB_ID, - workspace=config.NEMO_JOB_WORKSPACE, - benchmark=benchmark_ref, - metrics=metric_refs, - dataset=dataset_ref, - model=getattr(job, "model_ref", None), - labels=job.benchmark.labels, - results=app.BenchmarkEvaluationResult.model_validate(scores).results, - ) diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/metrics.py b/services/evaluator/src/nmp/evaluator/app/jobs/metrics.py deleted file mode 100644 index b0a36e3cd7..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/metrics.py +++ /dev/null @@ -1,222 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -import shlex -from typing import Tuple - -import nmp.evaluator.app.values as app -import yaml -from nemo_evaluator_sdk.enums import MetricType -from nemo_evaluator_sdk.values import Model -from nemo_platform_plugin.jobs.api_factory import ( - ContainerSpec, - CPUExecutionProviderSpec, - EnvironmentVariable, - EnvironmentVariableFromSecret, - PlatformJobSpec, - PlatformJobStep, -) -from nemo_platform_plugin.jobs.image import get_qualified_image -from nmp.common.jobs.constants import PERSISTENT_JOB_STORAGE_PATH_ENVVAR -from nmp.evaluator.app.evalfactory.system import get_system_metric_handler -from nmp.evaluator.app.jobs.constants import ( - EVALFACTORY_EVALUATION_JOB_FILE_NAME, - NEMO_EVAL_FACTORY_JOB_CONFIG, - NEMO_EVAL_HARNESS, - EvalHarness, - resolve_eval_harness, -) -from nmp.evaluator.app.jobs.fileset import get_fileset_step -from nmp.evaluator.app.jobs.progress_tracking import get_progress_tracking_url -from nmp.evaluator.app.metrics.metric import MetricWithSecrets, new_metric -from nmp.evaluator.config import settings -from nmp.evaluator.tasks.evaluate_metric import ( - metric_evaluation_entrypoint, - metric_evaluation_entrypoint_args, -) - -# System metric types that require EvalFactory execution -_SYSTEM_METRIC_TYPES = (MetricType.SYSTEM, MetricType.SYSTEM_RETRIEVER) - - -async def compile_metric_job(job: app.MetricJob) -> PlatformJobSpec: - steps: list[PlatformJobStep] = [] - - # Dispatch based on metric type, not job type - # System metrics (SYSTEM, SYSTEM_RETRIEVER) run in EvalFactory containers - is_system_metric = job.metric.type in _SYSTEM_METRIC_TYPES - - if is_system_metric: - # EvalFactory execution - system metrics run in specialized containers - dataset = getattr(job, "dataset", None) - if dataset is not None and not isinstance(dataset, app.BuiltInDataset): - steps.append(get_fileset_step(dataset, step_name="dataset-download")) - steps.append(await get_evalfactory_step(job)) - steps.append(get_results_step(job, eval_harness=resolve_eval_harness(job.metric.labels))) - else: - # Local execution - custom metrics run in the CPU tasks container - dataset = getattr(job, "dataset", None) - if isinstance(dataset, (app.FilesetRef, app.Fileset)): - steps.append(get_fileset_step(dataset, step_name="dataset-download")) - steps.append(await get_metric_step(job)) - - return PlatformJobSpec(steps=steps) - - -async def get_metric_step(job: app.MetricJob) -> PlatformJobStep: - # Don't resolve secrets during job compilation - they'll be injected as - # environment variables into the container at runtime - metric = await new_metric(job.metric, job.__job_type__, secret_resolver=None) - - # Prepare any secrets - secret_envs = [] - model_secret_env = _get_model_env_secret(job) - if model_secret_env: - secret_envs.append(model_secret_env) - if isinstance(metric, MetricWithSecrets): - for secret_env, secret in metric.secrets().items(): - secret_envs.append( - EnvironmentVariable(name=secret_env, from_secret=EnvironmentVariableFromSecret(name=secret.root)) - ) - - return PlatformJobStep( - name="evaluation", - executor=CPUExecutionProviderSpec( - provider="cpu", - container=ContainerSpec( - image=get_qualified_image("nmp-cpu-tasks"), - entrypoint=metric_evaluation_entrypoint(), - command=metric_evaluation_entrypoint_args( - progress_tracking_url=get_progress_tracking_url(), - ), - ), - ), - config=job.model_dump(mode="json", exclude_none=True), - environment=[ - # Override default shared volume env for steps - EnvironmentVariable(name=PERSISTENT_JOB_STORAGE_PATH_ENVVAR, value=settings.jobs.volume_path), - # Use JSON log format for cleaner OTLP log output - EnvironmentVariable(name="LOG_FORMAT", value="json"), - *secret_envs, - ], - ) - - -async def get_evalfactory_step(job: app.MetricJob) -> PlatformJobStep: - """Prepare evaluation container for EvalFactory. - - This handles any job with a system metric (type=SYSTEM, SYSTEM_RETRIEVER). - The metric type determines which EvalFactory handler to use. - """ - if not isinstance(job.metric, app.SystemMetric): - raise ValueError( - f"Expected a SystemMetric for EvalFactory execution, but got {type(job.metric).__name__} " - f"(type={getattr(job.metric, 'type', 'unknown')}). " - f"This can happen if the metric reference failed to resolve to a system metric." - ) - handler = get_system_metric_handler(job.metric.name) - - # Transform Evaluator API to EvalFactory configuration - ef_job_config = handler.augment_metric_job(job, settings.jobs.results_dir) - evaluation_config_dict = ef_job_config.model_dump(mode="json", exclude_unset=True, exclude_defaults=True) - - # Prepare evaluation container command - config_file_command_str, config_file_path = generate_config_file_from_env_command_str() - container_command = handler.container_command(ef_job_config, config_file_path) - # Use `exec` so /bin/sh is replaced by eval-factory command as the process-group leader. - # Otherwise, SIGTERM terminates the /bin/sh before eval-factory finishes graceful shutdown. - # Once /bin/sh is killed, launcher exits killing the eval-factory process. - command = ["/bin/sh", "-c", config_file_command_str + " && exec " + shlex.join(container_command)] - - # Prepare any secrets - secret_envs = [] - model_secret_env = _get_model_env_secret(job) - if model_secret_env: - secret_envs.append(model_secret_env) - for secret_env, secret in handler.metric_job_secrets(job).items(): - secret_envs.append( - EnvironmentVariable( - name=secret_env, - from_secret=EnvironmentVariableFromSecret(name=secret.root), - ) - ) - - return PlatformJobStep( - name="evaluation", - executor=CPUExecutionProviderSpec( - provider="cpu", - container=ContainerSpec( - image=handler.docker_image(), - command=command, - ), - ), - config=evaluation_config_dict, - environment=[ - # Override default shared volume env for steps - EnvironmentVariable(name=PERSISTENT_JOB_STORAGE_PATH_ENVVAR, value=settings.jobs.volume_path), - EnvironmentVariable(name=NEMO_EVAL_FACTORY_JOB_CONFIG, value=yaml.safe_dump(evaluation_config_dict)), - *secret_envs, - ], - ) - - -def get_results_step(job: app.MetricJob | app.BenchmarkJob, eval_harness: EvalHarness) -> PlatformJobStep: - return PlatformJobStep( - name="results", - executor=CPUExecutionProviderSpec( - provider="cpu", - container=ContainerSpec( - image=get_qualified_image("nmp-cpu-tasks"), - entrypoint=["python", "-m", "nmp.evaluator.tasks.metric_results"], - command=[ - "--progress-tracking-url", # Update progress % for EvalFactory jobs - get_progress_tracking_url(), - ], - ), - ), - config=job.model_dump(mode="json", exclude_none=True), - environment=[ - # Override default shared volume env for steps - EnvironmentVariable(name=PERSISTENT_JOB_STORAGE_PATH_ENVVAR, value=settings.jobs.volume_path), - # Use JSON log format for cleaner OTLP log output - EnvironmentVariable(name="LOG_FORMAT", value="json"), - EnvironmentVariable(name=NEMO_EVAL_HARNESS, value=eval_harness), - ], - ) - - -def _get_model_env_secret(job: app.MetricJob) -> EnvironmentVariable | None: - """Create an environment variable secret for target model API key if it exists. - - Checks for model field on jobs that have one (online and RAG jobs). - """ - # Check if job has a model field with an API key secret - model = getattr(job, "model", None) - if model is None or not model.api_key_secret: - return None - - # Env var name uses underscores (launcher converts hyphens to underscores) - assert isinstance(model, Model) - api_key_env = model.api_key_env - # api_key_env is computed from api_key_secret and must exist when a secret exists. - if api_key_env is None: - raise ValueError("model.api_key_env must be set when model.api_key_secret is configured") - return EnvironmentVariable( - name=api_key_env, - from_secret=EnvironmentVariableFromSecret(name=model.api_key_secret.root), - ) - - -def generate_config_file_from_env_command_str() -> Tuple[str, str]: - """ - Command to inject for converting NEMO_EVALUATOR_JOB_CONFIG env with serialized job YAML configuration to file: - mkdir -p /configs && echo \"$NEMO_EVALUATOR_JOB_CONFIG\" > /configs/evaluation_job_file.yaml - - Workaround until config file is supported natively, like K8s ConfigMap. - """ - config_file_path = os.path.join(settings.jobs.configs_dir, EVALFACTORY_EVALUATION_JOB_FILE_NAME) - # evaluator image does not have bash and uses shell - # echo -e is only supported with bash, wrap with double quote to preserve \n instead for shell - command_str = f'mkdir -p {settings.jobs.configs_dir} && echo "${NEMO_EVAL_FACTORY_JOB_CONFIG}" > {config_file_path}' - return command_str, config_file_path diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/progress_tracking.py b/services/evaluator/src/nmp/evaluator/app/jobs/progress_tracking.py deleted file mode 100644 index 4604670f3d..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/progress_tracking.py +++ /dev/null @@ -1,186 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import logging -import os -import threading -from typing import Optional - -import requests -import requests.exceptions -from nemo_evaluator_sdk.enums import TaskStatus -from nmp.evaluator.app.values import EvaluationStatusDetails -from nmp.evaluator.constants import DEFAULT_PROGRESS_TRACKING_INTERVAL -from requests.adapters import HTTPAdapter -from urllib3.exceptions import MaxRetryError -from urllib3.util.retry import Retry - -log = logging.getLogger(__name__) - -retry_strategy = Retry(total=5, backoff_factor=0.25, status_forcelist=[409, 429], allowed_methods=["PATCH"]) - - -def get_progress_tracking_url() -> str: - """ - Returns a URL string which includes job ID and workspace env variables that are expanded at runtime. - Use the NMP_JOBS_URL set by Jobs MS for each step instead nmp.common.config.Configuration - which is local to the API server. - """ - return "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details" - - -def get_progress_tracking_interval(num_samples: Optional[int], interval: Optional[int] = None) -> int: - interval = interval or DEFAULT_PROGRESS_TRACKING_INTERVAL - if num_samples and num_samples < interval: - interval = num_samples - # Set interval to a fraction of samples for more frequent updates. - if num_samples >= 4: - interval = num_samples // 4 - return interval - - -class ProgressTracking: - def __init__( - self, - progress_tracking_url: str, - progress_tracking_interval: Optional[int] = None, - progress_tracking_interval_seconds: Optional[float] = None, - request_method: str = "PATCH", - total_samples: Optional[int] = None, - total_work: Optional[int] = None, - logger: logging.Logger | None = None, - ): - self._progress_tracking_url = os.path.expandvars(progress_tracking_url) - self._request_method = request_method - - # total_samples tracks the inference requests and is updated to job.status_details - # job.progress is derived from samples_processed and _total_samples. - self._total_samples = total_samples - - # _completed and _total_work tracks any work and only updates job.progress. - self._total_work = total_work - self._completed = 0 - - self._progress_tracking_interval = get_progress_tracking_interval( - total_samples, progress_tracking_interval or 50 - ) - self._last_updated_status_details = EvaluationStatusDetails(samples_processed=0, progress=0.0) - self._status_details = EvaluationStatusDetails(samples_processed=0, progress=0.0) - self._lock = threading.Lock() - self.log = logger or log - - self._update_on_timer_task = None - if progress_tracking_interval_seconds: - self._update_on_timer_task = asyncio.create_task(self._update_on_timer(progress_tracking_interval_seconds)) - - @property - def interval(self) -> int: - """The getter method for 'total_samples'.""" - return self._progress_tracking_interval - - @property - def total_samples(self) -> int: - """The getter method for 'total_samples'.""" - assert self._total_samples is not None - return self._total_samples - - @total_samples.setter - def total_samples(self, num_samples: int): - """The setter method for 'total_samples'.""" - if num_samples < 0: - raise ValueError("num_samples cannot be negative.") - self._total_samples = num_samples - self._progress_tracking_interval = get_progress_tracking_interval(num_samples, self._progress_tracking_interval) - - @property - def total_work(self) -> int | None: - """The getter method for 'total_work'.""" - with self._lock: - return self._total_work - - @total_work.setter - def total_work(self, total_work: int): - """The setter method for 'total_work'.""" - if total_work < 0: - raise ValueError("total_work cannot be negative.") - with self._lock: - self._total_work = total_work - - async def _update_on_timer(self, interval_seconds: float): - assert interval_seconds > 0 - while True: - await asyncio.sleep(interval_seconds) - self.update_progress() - - def stop(self): - if self._update_on_timer_task: - self._update_on_timer_task.cancel() - - def update_task_status( - self, task_name: str, status: str | TaskStatus, message: Optional[str] = None - ) -> requests.Response | None: - task_status = status if isinstance(status, TaskStatus) else TaskStatus(status) - status_detail = EvaluationStatusDetails(task_status={task_name: task_status}, message=message) - return self._send_progress(status_detail) - - def increment_work(self, increment: int = 1) -> requests.Response | None: - with self._lock: - self._completed += increment - completed = self._completed - if not self._total_work: - return - self._status_details.progress = (self._completed / self._total_work) * 100 - - if (completed % self._progress_tracking_interval) == 0: - return self.update_progress() - - def increment_samples_processed(self, increment: int = 1) -> requests.Response | None: - assert increment > 0 - status_details = EvaluationStatusDetails() - with self._lock: - self._status_details.samples_processed = (self._status_details.samples_processed or 0) + increment - status_details.samples_processed = self._status_details.samples_processed - - if self._total_samples is not None: - # If total samples are set, also update progress % - progress = (self._status_details.samples_processed / self._total_samples) * 100 - self._status_details.progress = progress - status_details.progress = progress - - if (status_details.samples_processed % self._progress_tracking_interval) == 0: - return self._send_progress(status_details) - - def update_progress(self, progress: Optional[float] = None) -> requests.Response | None: - with self._lock: - status_detail = EvaluationStatusDetails(progress=progress or self._status_details.progress) - if self._status_details.samples_processed: - status_detail.samples_processed = self._status_details.samples_processed - if self._last_updated_status_details == status_detail: - # update_progress is called on a timer. Skip if there has been no change since last update. - return - return self._send_progress(status_detail) - - def _send_progress(self, status_details: EvaluationStatusDetails) -> requests.Response | None: - self.log.debug(f"Sending request to {self._progress_tracking_url}: {status_details}") - try: - adapter = HTTPAdapter(max_retries=retry_strategy) - with requests.Session() as session: - session.mount("https://", adapter) - session.mount("http://", adapter) - resp = session.request( - self._request_method, - self._progress_tracking_url, - json=status_details.model_dump(mode="json", exclude_unset=True), - ) - if resp.status_code > 299 or resp.status_code < 200: - self.log.warning( - f"Failed to update job progress to {self._progress_tracking_url} {status_details}: {resp.status_code} {resp.text}" - ) - except (requests.exceptions.RequestException, requests.exceptions.RetryError, MaxRetryError): - self.log.exception("Failed to communicate with progress tracking server") - else: - with self._lock: - if status_details.samples_processed: - self._last_updated_status_details = status_details - return resp diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/base.py b/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/base.py deleted file mode 100644 index 28b396e88c..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/base.py +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from __future__ import annotations - -from dataclasses import dataclass -from typing import Protocol - - -@dataclass(frozen=True) -class PreparedResults: - aggregate_scores_path: str - row_scores_path: str | None - - -class ResultsParser(Protocol): - def prepare_results(self, local_results_dir_path: str) -> PreparedResults: - """Prepare normalized result artifacts and return their paths.""" - ... diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/custom.py b/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/custom.py deleted file mode 100644 index f37f1d6d1d..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/custom.py +++ /dev/null @@ -1,29 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os - -from nmp.evaluator.app.jobs.constants import ( - EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_ROW_SCORES_FILE_NAME, -) -from nmp.evaluator.app.jobs.result_parsers.base import PreparedResults, ResultsParser - - -class CustomResultsParser(ResultsParser): - def prepare_results(self, local_results_dir_path: str) -> PreparedResults: - aggregate_scores_path = os.path.join(local_results_dir_path, EVALUATION_RESULTS_AGG_SCORES_FILE_NAME) - if not os.path.isfile(aggregate_scores_path): - raise FileNotFoundError( - f"No custom evaluation results file '{EVALUATION_RESULTS_AGG_SCORES_FILE_NAME}' " - f"found in {local_results_dir_path}" - ) - - row_scores_path = os.path.join(local_results_dir_path, EVALUATION_RESULTS_ROW_SCORES_FILE_NAME) - if not os.path.isfile(row_scores_path): - with open(row_scores_path, "w"): - pass - return PreparedResults( - aggregate_scores_path=aggregate_scores_path, - row_scores_path=row_scores_path, - ) diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/evalfactory.py b/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/evalfactory.py deleted file mode 100644 index 6ee3479597..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/result_parsers/evalfactory.py +++ /dev/null @@ -1,513 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import csv -import json -import logging -import math -import os -from pathlib import Path - -from nemo_evaluator_sdk.values import ( - AggregatedMetricResult, - AggregateRangeScore, - AggregateRubricScore, - Histogram, - MetricScore, - Percentiles, - RowScore, -) -from nmp.evaluator.app.jobs.constants import ( - EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_ROW_SCORES_FILE_NAME, - EvalHarness, -) -from nmp.evaluator.app.jobs.result_parsers.base import PreparedResults, ResultsParser -from nmp.evaluator.app.jobs.results import load_evaluation_result -from nmp.evaluator.app.values import ( - BenchmarkEvaluationResult, - BenchmarkMetricResult, -) - -logger = logging.getLogger(__name__) - - -class EvalFactoryResultsParser(ResultsParser): - def __init__(self, job_id: str, eval_harness: EvalHarness): - self.job_id = job_id - self.eval_harness = eval_harness - - def prepare_results(self, local_results_dir_path: str) -> PreparedResults: - evalfactory_results_filepath = resolve_evalfactory_results_file_path(local_results_dir_path) - if evalfactory_results_filepath is None: - raise FileNotFoundError( - f"No EvalFactory results file '{EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME}' " - f"found in {local_results_dir_path}" - ) - - scores = _parse_evalfactory_scores(self.job_id, evalfactory_results_filepath) - normalized_aggregate = _scores_to_aggregated_result(scores) - - # serialize to benchmark result or metric result by harness type - if self.eval_harness in ["agentic_eval", "retriever"]: - aggregate_result: AggregatedMetricResult = normalized_aggregate - else: - aggregate_result = BenchmarkEvaluationResult( - results=[BenchmarkMetricResult(scores=normalized_aggregate.scores)] - ) - - aggregate_scores_path = os.path.join(local_results_dir_path, EVALUATION_RESULTS_AGG_SCORES_FILE_NAME) - with open(aggregate_scores_path, "w") as f: - f.write(aggregate_result.model_dump_json(indent=2, exclude_none=True)) - - row_scores_path = os.path.join(local_results_dir_path, EVALUATION_RESULTS_ROW_SCORES_FILE_NAME) - # Always regenerate normalized row scores from source artifacts. - # Some EvalFactory containers emit an empty row-scores.jsonl placeholder. - _write_evalfactory_row_scores(local_results_dir_path, row_scores_path, self.eval_harness) - - return PreparedResults(aggregate_scores_path=aggregate_scores_path, row_scores_path=row_scores_path) - - -def resolve_evalfactory_results_file_path(local_results_dir_path: str) -> str | None: - candidate_paths = [ - os.path.join(local_results_dir_path, "results.yml"), - os.path.join(local_results_dir_path, "artifacts", "results.yml"), - os.path.join(local_results_dir_path, "results", "results.yml"), - ] - for path in candidate_paths: - if os.path.isfile(path): - return path - - root_dir = Path(local_results_dir_path) - if root_dir.is_dir(): - for path in sorted(root_dir.rglob("results.yml")): - if path.is_file(): - return str(path) - return None - - -def _parse_evalfactory_scores(job_id: str, results_filepath: str) -> list[MetricScore]: - evaluation_result = load_evaluation_result(job_id, results_filepath, name="", workspace="") - scores_by_name: dict[str, MetricScore] = {} - - if evaluation_result.tasks: - for task in evaluation_result.tasks.values(): - for metric in task.metrics.values(): - for score_name, score in metric.scores.items(): - scores_by_name[score_name] = MetricScore(name=score_name, value=score.value, stats=score.stats) - - if evaluation_result.groups: - for group in evaluation_result.groups.values(): - if group.metrics: - for metric in group.metrics.values(): - for score_name, score in metric.scores.items(): - if score_name not in scores_by_name: - scores_by_name[score_name] = MetricScore( - name=score_name, value=score.value, stats=score.stats - ) - - scores = list(scores_by_name.values()) - - # Some system metrics can legitimately emit NaN values while still producing - # a valid score payload. Only fail when no scores were emitted at all. - if not scores: - raise ValueError( - f"Job {job_id} completed but no evaluation results detected. Job marked as failed: {evaluation_result}" - ) - - return scores - - -def _scores_to_aggregated_result(scores: list[MetricScore]) -> AggregatedMetricResult: - aggregate_scores: list[AggregateRangeScore | AggregateRubricScore] = [] - for score in scores: - stats = score.stats - is_nan = math.isnan(score.value) - count = stats.count if stats and stats.count is not None else (0 if is_nan else 1) - nan_count = stats.nan_count if stats and stats.nan_count is not None else (1 if is_nan else 0) - mean = stats.mean if stats and stats.mean is not None else (None if is_nan else score.value) - sum_value = stats.sum if stats and stats.sum is not None else (None if mean is None else (mean * count)) - min_value = stats.min if stats and stats.min is not None else mean - max_value = stats.max if stats and stats.max is not None else mean - variance = stats.variance if stats and stats.variance is not None else (None if is_nan else 0.0) - std_dev = stats.stddev if stats and stats.stddev is not None else (None if is_nan else 0.0) - - # Some harnesses emit placeholder zeros for aggregate stats even when no - # valid values contributed to the score. Treat these stats as undefined. - if count == 0 and nan_count > 0: - mean = None - sum_value = None - min_value = None - max_value = None - variance = None - std_dev = None - - if stats and stats.rubric_distribution: - mode_category = max(stats.rubric_distribution, key=lambda item: item.count).label - aggregate_scores.append( - AggregateRubricScore( - name=score.name, - count=count, - nan_count=nan_count, - sum=sum_value, - mean=mean, - min=min_value, - max=max_value, - variance=variance, - std_dev=std_dev, - rubric_distribution=stats.rubric_distribution, - mode_category=mode_category, - ) - ) - continue - - percentiles = ( - None - if mean is None - else Percentiles( - p10=mean, - p20=mean, - p30=mean, - p40=mean, - p50=mean, - p60=mean, - p70=mean, - p80=mean, - p90=mean, - p100=mean, - ) - ) - aggregate_scores.append( - AggregateRangeScore( - name=score.name, - count=count, - nan_count=nan_count, - sum=sum_value, - mean=mean, - min=min_value, - max=max_value, - variance=variance, - std_dev=std_dev, - percentiles=percentiles, - histogram=Histogram(bins=[]), - ) - ) - - return AggregatedMetricResult(scores=aggregate_scores) - - -def _write_evalfactory_row_scores(local_results_dir_path: str, row_scores_path: str, eval_harness: EvalHarness) -> None: - """Write normalized row-scores.jsonl from EvalFactory row artifacts when available.""" - row_source = _select_evalfactory_row_source(local_results_dir_path, eval_harness) - if row_source is None: - # Some EvalFactory jobs do not provide row-level scores; normalize to an empty JSONL artifact. - logger.debug( - "No EvalFactory row source found; writing empty row-scores", extra={"results_dir": local_results_dir_path} - ) - with open(row_scores_path, "w"): - pass - return - - source_kind, source_path, source_subkind = row_source - logger.debug( - "Selected EvalFactory row source", - extra={ - "results_dir": local_results_dir_path, - "source_kind": source_kind, - "source_path": source_path, - "source_subkind": source_subkind, - }, - ) - if source_kind == "retriever": - rows = _parse_evalfactory_retriever_rows(source_path) - elif source_kind == "benchmark": - rows = _parse_evalfactory_benchmark_rows(source_path, source_subkind) - else: - rows = _parse_evalfactory_cached_outputs_rows(source_path) - - with open(row_scores_path, "w") as f: - for row in rows: - normalized = RowScore.model_validate(row) - f.write(normalized.model_dump_json() + "\n") - - -def _select_evalfactory_row_source( - local_results_dir_path: str, - eval_harness: EvalHarness, -) -> tuple[str, str, str | None] | None: - if eval_harness == "retriever": - retriever_artifact_path = _resolve_evalfactory_retriever_rows_path(local_results_dir_path) - return ("retriever", retriever_artifact_path, None) if retriever_artifact_path is not None else None - if eval_harness == "bfcl": - bfcl_path = _resolve_evalfactory_bfcl_rows_path(local_results_dir_path) - return ("benchmark", bfcl_path, "bfcl-ndjson") if bfcl_path is not None else None - if eval_harness == "safety_harness": - csv_path = _resolve_evalfactory_aegis_rows_path(local_results_dir_path) - return ("benchmark", csv_path, "aegis-csv") if csv_path is not None else None - if eval_harness == "bigcode_eval_harness": - predictions_path = _resolve_evalfactory_predictions_rows_path(local_results_dir_path) - return ("benchmark", predictions_path, "predictions-json") if predictions_path is not None else None - if eval_harness in {"agentic_eval", "simple_evals", "lm_eval_harness"}: - cached_outputs_path = _resolve_evalfactory_cached_outputs_rows_path(local_results_dir_path) - return ("cached-outputs", cached_outputs_path, None) if cached_outputs_path is not None else None - logger.debug("Unknown eval_harness type; no row source resolver available", extra={"eval_harness": eval_harness}) - return None - - -def _resolve_evalfactory_retriever_rows_path(local_results_dir_path: str) -> str | None: - candidate_paths = [ - os.path.join(local_results_dir_path, "results", "retriever_cached_outputs.json"), - os.path.join(local_results_dir_path, "artifacts", "retriever_cached_outputs.json"), - os.path.join(local_results_dir_path, "retriever_cached_outputs.json"), - ] - for candidate_path in candidate_paths: - if os.path.isfile(candidate_path): - return candidate_path - - root_dir = Path(local_results_dir_path) - if root_dir.is_dir(): - for path in sorted(root_dir.rglob("retriever_cached_outputs.json")): - if path.is_file(): - return str(path) - return None - - -def _parse_evalfactory_retriever_rows(retriever_artifact_path: str) -> list[dict]: - with open(retriever_artifact_path) as f: - artifact = json.load(f) - - if not isinstance(artifact, dict): - raise ValueError( - f"Expected EvalFactory retriever row artifact to be a JSON object at {retriever_artifact_path}, " - f"got {type(artifact).__name__}" - ) - - rows: list[dict] = [] - for query_id, cached_output in artifact.items(): - if not isinstance(cached_output, dict): - raise ValueError( - "Invalid EvalFactory retriever row artifact entry type at " - f"{retriever_artifact_path} for query '{query_id}': expected object, " - f"got {type(cached_output).__name__}" - ) - - rows.append( - { - "item": {"query_id": query_id}, - "sample": {}, - "metrics": {}, - "requests": [], - "retriever": cached_output, - } - ) - - return rows - - -def _resolve_evalfactory_aegis_rows_path(local_results_dir_path: str) -> str | None: - candidate_paths = [ - os.path.join(local_results_dir_path, "results", "output.csv"), - os.path.join(local_results_dir_path, "artifacts", "output.csv"), - os.path.join(local_results_dir_path, "output.csv"), - ] - for candidate_path in candidate_paths: - if os.path.isfile(candidate_path): - return candidate_path - - root_dir = Path(local_results_dir_path) - if root_dir.is_dir(): - for path in sorted(root_dir.rglob("output.csv")): - if path.is_file(): - return str(path) - return None - - -def _resolve_evalfactory_predictions_rows_path(local_results_dir_path: str) -> str | None: - candidate_paths = [ - os.path.join(local_results_dir_path, "results", "predictions.json"), - os.path.join(local_results_dir_path, "artifacts", "predictions.json"), - os.path.join(local_results_dir_path, "predictions.json"), - ] - for candidate_path in candidate_paths: - if os.path.isfile(candidate_path): - return candidate_path - - root_dir = Path(local_results_dir_path) - if root_dir.is_dir(): - for path in sorted(root_dir.rglob("predictions.json")): - if path.is_file(): - return str(path) - return None - - -def _resolve_evalfactory_bfcl_rows_path(local_results_dir_path: str) -> str | None: - results_dir = Path(local_results_dir_path) / "results" - artifacts_dir = Path(local_results_dir_path) / "artifacts" - if results_dir.is_dir(): - for path in sorted(results_dir.glob("result/**/*.json")): - if path.is_file(): - return str(path) - if artifacts_dir.is_dir(): - for path in sorted(artifacts_dir.glob("result/**/*.json")): - if path.is_file(): - return str(path) - - root_dir = Path(local_results_dir_path) - if root_dir.is_dir(): - for path in sorted(root_dir.rglob("result/**/*.json")): - if path.is_file(): - return str(path) - return None - - -def _parse_evalfactory_benchmark_rows(rows_path: str, rows_kind: str | None) -> list[dict]: - if rows_kind == "aegis-csv": - return _parse_evalfactory_csv_rows(rows_path) - if rows_kind == "predictions-json": - return _parse_evalfactory_predictions_rows(rows_path) - if rows_kind == "bfcl-ndjson": - return _parse_evalfactory_bfcl_rows(rows_path) - raise ValueError(f"Unknown EvalFactory benchmark rows kind '{rows_kind}' for {rows_path}") - - -def _parse_evalfactory_csv_rows(rows_path: str) -> list[dict]: - rows: list[dict] = [] - with open(rows_path, newline="") as f: - reader = csv.DictReader(f) - for index, row in enumerate(reader): - rows.append( - { - "item": {"row_index": index}, - "sample": {}, - "metrics": {}, - "requests": [], - "benchmark": row, - } - ) - return rows - - -def _parse_evalfactory_predictions_rows(rows_path: str) -> list[dict]: - with open(rows_path) as f: - payload = json.load(f) - - if not isinstance(payload, list): - raise ValueError( - f"Invalid EvalFactory predictions artifact at {rows_path}: expected list, got {type(payload).__name__}" - ) - - rows: list[dict] = [] - for index, prediction in enumerate(payload): - rows.append( - { - "item": {"row_index": index}, - "sample": {}, - "metrics": {}, - "requests": [], - "prediction": prediction, - } - ) - return rows - - -def _parse_evalfactory_bfcl_rows(rows_path: str) -> list[dict]: - rows: list[dict] = [] - with open(rows_path) as f: - for line_num, line in enumerate(f, start=1): - stripped_line = line.strip() - if not stripped_line: - continue - row = json.loads(stripped_line) - if not isinstance(row, dict): - raise ValueError( - f"Invalid EvalFactory BFCL row at {rows_path}:{line_num}: expected object, got {type(row).__name__}" - ) - rows.append( - { - "item": row, - "sample": {}, - "metrics": {}, - "requests": [], - } - ) - return rows - - -def _resolve_evalfactory_cached_outputs_rows_path(local_results_dir_path: str) -> str | None: - known_cached_output_filenames = { - "answer_acc.jsonl", - "dataset_with_retrieved_context.jsonl", - "dataset_with_retrieved_context_and_generated_answer.jsonl", - "trajectory_eval_input.jsonl", - } - candidate_dirs = [ - Path(local_results_dir_path) / "results", - Path(local_results_dir_path) / "artifacts", - Path(local_results_dir_path), - ] - - for candidate_dir in candidate_dirs: - if not candidate_dir.is_dir(): - continue - for path in sorted(candidate_dir.rglob("*.jsonl")): - if not path.is_file(): - continue - if path.name == EVALUATION_RESULTS_ROW_SCORES_FILE_NAME: - continue - if ( - path.name in known_cached_output_filenames - or path.name.startswith("samples_") - or "cached_output" in path.name - ): - return str(path) - return None - - -def _parse_evalfactory_cached_outputs_rows(cached_outputs_path: str) -> list[dict]: - rows: list[dict] = [] - with open(cached_outputs_path) as f: - for line_num, line in enumerate(f, start=1): - stripped_line = line.strip() - if not stripped_line: - continue - row = json.loads(stripped_line) - if not isinstance(row, dict): - raise ValueError( - f"Invalid EvalFactory cached-outputs row at {cached_outputs_path}:{line_num}: " - f"expected object, got {type(row).__name__}" - ) - rows.append(_normalize_cached_outputs_row(row)) - return rows - - -def _normalize_cached_outputs_row(row: dict) -> dict: - if "item" in row and "sample" in row: - normalized_row = dict(row) - normalized_row["metrics"] = _normalize_row_metrics(normalized_row.get("metrics")) - normalized_row.setdefault("requests", []) - return normalized_row - - return { - "item": row, - "sample": {}, - "metrics": {}, - "requests": [], - } - - -def _normalize_row_metrics(raw_metrics: object) -> dict[str, list[MetricScore]]: - if raw_metrics is None: - return {} - if not isinstance(raw_metrics, dict): - raise ValueError(f"Invalid row metrics payload: expected object, got {type(raw_metrics).__name__}") - normalized: dict[str, list[MetricScore]] = {} - for metric_name, metric_scores in raw_metrics.items(): - if not isinstance(metric_name, str): - raise ValueError("Invalid row metrics payload: metric key must be a string") - if not isinstance(metric_scores, list): - raise ValueError( - f"Invalid row metrics payload for '{metric_name}': expected list, got {type(metric_scores).__name__}" - ) - normalized[metric_name] = [MetricScore.model_validate(score) for score in metric_scores] - return normalized diff --git a/services/evaluator/src/nmp/evaluator/app/jobs/results.py b/services/evaluator/src/nmp/evaluator/app/jobs/results.py deleted file mode 100644 index 6b7dac47a1..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/jobs/results.py +++ /dev/null @@ -1,143 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import json -import logging -import math -import os -from typing import Dict, List, Optional - -import yaml -from nmp.evaluator.app.values import EvaluationResult, GroupResult, TaskResult -from pydantic import TypeAdapter - -log = logging.getLogger(__name__) - - -def load_evaluation_result(job_id: str, results_filepath: str, name: str, workspace: str) -> EvaluationResult: - if not os.path.isfile(results_filepath): - raise FileNotFoundError(f"No evaluation results file '{results_filepath}' from evaluation step") - - # Read evaluation results file - with open(results_filepath, "r") as file: - if results_filepath.endswith("json"): - results = json.load(file) - elif results_filepath.endswith("yaml") or results_filepath.endswith("yml"): - results = yaml.safe_load(file) - else: - raise ValueError(f"Unsupported results file {results_filepath}!") - - # Convert results / handle any discrepancies - tasks: Optional[Dict[str, TaskResult]] = None - result_tasks = results.get("tasks") or results.get("results", {}).get("tasks") - if result_tasks: - filtered_task_results = filter_empty_scores(result_tasks) - tasks = TypeAdapter(Optional[Dict[str, TaskResult]]).validate_python(filtered_task_results) - else: - log.warning("Tasks are missing in results of the job %s.", job_id) - - groups: Optional[Dict[str, GroupResult]] = None - result_groups = results.get("groups") or results.get("results", {}).get("groups") - if result_groups: - filtered_group_results = filter_empty_scores(result_groups) - groups = TypeAdapter(Optional[Dict[str, GroupResult]]).validate_python(filtered_group_results) - else: - log.warning("Groups are missing in results of the job %s.", job_id) - - return EvaluationResult(workspace=workspace, job=job_id, tasks=tasks, groups=groups) - - -def no_metrics(evaluation_result: EvaluationResult) -> bool: - """Traverse results to see if no metric is populated""" - if not (evaluation_result.tasks or evaluation_result.groups): - return True - - if evaluation_result.tasks: - for task in evaluation_result.tasks.values(): - if not task.metrics: - continue - for metric in task.metrics.values(): - if metric.scores: - return False - - if evaluation_result.groups: - for group in evaluation_result.groups.values(): - if not group.metrics: - continue - for metric in group.metrics.values(): - if metric.scores: - return False - return True - - -def _extract_nan_metrics(items: Dict) -> List[str]: - """Helper function to extract NaN metrics from tasks or groups. - - Args: - items: Dictionary of tasks or groups - - Returns: - List of metric identifiers that contain NaN values - """ - nan_metrics: List[str] = [] - - for item_name, item in items.items(): - if not item.metrics: - continue - for metric_name, metric in item.metrics.items(): - if not metric.scores: - continue - for score_name, score in metric.scores.items(): - if not (hasattr(score, "value") and score.value is not None): - continue - if math.isnan(score.value): - nan_metrics.append(f"{item_name}.{metric_name}.{score_name}") - - return nan_metrics - - -def nan_metrics_present(evaluation_result: EvaluationResult) -> List[str]: - """Traverse results to identify metrics with NaN values. - - Returns: - List of metric names that contain NaN values. Empty list if no NaN values found. - """ - nan_metrics: List[str] = [] - - if evaluation_result.tasks: - nan_metrics.extend(_extract_nan_metrics(evaluation_result.tasks)) - - if evaluation_result.groups: - nan_metrics.extend(_extract_nan_metrics(evaluation_result.groups)) - - return nan_metrics - - -def filter_empty_scores(task_results: dict) -> dict: - filtered: dict = {} - - if task_results: - for task_name, task_result in task_results.items(): - filtered_metrics: dict = {} - - if task_result.get("metrics"): - for metric_name, metric_result in task_result["metrics"].items(): - filtered_scores = {} - - if metric_result.get("scores"): - for score_name, score in metric_result["scores"].items(): - if score.get("value") is not None: - filtered_scores[score_name] = score - - metric_result["scores"] = filtered_scores - - if metric_result["scores"]: - filtered_metrics[metric_name] = metric_result - - if filtered_metrics: - task_result["metrics"] = filtered_metrics - - if task_result: - filtered[task_name] = task_result - - return filtered diff --git a/services/evaluator/src/nmp/evaluator/app/metrics/metric.py b/services/evaluator/src/nmp/evaluator/app/metrics/metric.py deleted file mode 100644 index 1bb8de7b5b..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/metrics/metric.py +++ /dev/null @@ -1,142 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Protocol, cast, runtime_checkable - -from nemo_evaluator_sdk import ( - BLEUMetric, - ExactMatchMetric, - F1Metric, - LLMJudgeMetric, - Model, - NumberCheckMetric, - ROUGEMetric, - StringCheckMetric, - ToolCallingMetric, -) -from nemo_evaluator_sdk.enums import MetricType -from nemo_evaluator_sdk.inference import InferenceFn -from nemo_evaluator_sdk.metrics.protocol import Metric, MetricWithPreflight, MetricWithSecrets, SecretResolver -from nemo_evaluator_sdk.metrics.ragas.metrics import RAGAS_METRIC_CLASSES -from nemo_evaluator_sdk.values import MetricBase, SupportedJobTypes -from nmp.evaluator.app import inference as app_inference -from nmp.evaluator.app.metrics.remote import NemoAgentToolkitRemoteMetric, RemoteMetric -from nmp.evaluator.app.values.metrics import Metric as MetricParams - -# Map of Metric enum values to class. -# Keep this registry explicit -_METRIC_CLASSES: dict[MetricType, type[MetricBase]] = { - MetricType.BLEU: BLEUMetric, - MetricType.EXACT_MATCH: ExactMatchMetric, - MetricType.F1: F1Metric, - MetricType.LLM_JUDGE: LLMJudgeMetric, - MetricType.NUMBER_CHECK: NumberCheckMetric, - MetricType.REMOTE: RemoteMetric, - MetricType.NEMO_AGENT_TOOLKIT_REMOTE: NemoAgentToolkitRemoteMetric, - MetricType.ROUGE: ROUGEMetric, - MetricType.STRING_CHECK: StringCheckMetric, - MetricType.TOOL_CALLING: ToolCallingMetric, -} - -# Combined map including RAGAS metrics (for type checking purposes) -_ALL_METRIC_CLASSES: dict[MetricType, type[MetricBase]] = { - **_METRIC_CLASSES, - **cast(dict[MetricType, type[MetricBase]], RAGAS_METRIC_CLASSES), -} - - -@runtime_checkable -class MetricWithInference(Protocol): - """Protocol for metrics that require an inference function (e.g., LLM Judge).""" - - def set_inference_fn(self, inference_fn: InferenceFn) -> None: - """ - Set the inference function to use for LLM calls. - Called before the metric is used for evaluation. - """ - ... - - -def metric_runtime_kwargs(metric_params: MetricParams, metric_cls: type[MetricBase]) -> dict[str, object]: - """Project a service metric config down to the runtime metric constructor. - - Service value/entity models may contain persistence-only fields like - `name`, `workspace`, `id`, or timestamps. Direct SDK runtime metrics only - accept their declared runtime/config fields, so filter the dumped config to - the target runtime model schema before construction. - - Args: - metric_params: The metric parameters object from nmp.evaluator.app.values.metrics. - metric_cls: The SDK runtime metric class from nmp.nemo_evaluator_sdk.metrics. - - Returns: - A dictionary of runtime keyword arguments. - """ - - config_dict = metric_params.model_dump(mode="python", exclude_none=True) - runtime_kwargs = { - field_name: value for field_name, value in config_dict.items() if field_name in metric_cls.model_fields - } - - if metric_params.type == MetricType.LLM_JUDGE and "prompt_template" not in metric_params.model_fields_set: - runtime_kwargs.pop("prompt_template", None) - - return runtime_kwargs - - -async def new_metric( - metric_params: MetricParams, - job_type: SupportedJobTypes = SupportedJobTypes.ONLINE, - secret_resolver: SecretResolver | None = None, - *, - inference_fn: InferenceFn | None = None, - run_preflight: bool = False, -) -> Metric: - """Create a new metric instance. - - All metrics are initialized the same way. If a metric implements - MetricWithSecrets and a secret_resolver is provided, resolve_secrets - is called after construction. - - Args: - metric_config: The metric configuration. - job_type: The job type (online or offline). - secret_resolver: Async function to resolve secret names to values. - For jobs running in containers, pass None to skip resolution - (secrets are injected as environment variables at runtime). - For API calls, this fetches from the secrets service. - Defaults to reading from environment variables. - inference_fn: Optional function to make inference requests. If provided, - it will be used by metrics that require LLM inference (e.g., LLMJudgeMetric). - Defaults to the global inference.make_inference_request. - run_preflight: Whether to run one-time metric preflight after setup. - Intended for execution paths (not compilation/setup-only paths). - """ - metric_cls = _ALL_METRIC_CLASSES.get(metric_params.type) - if not metric_cls: - raise ValueError(f"Unknown metric type: {metric_params.type}") - - # Most service metrics now instantiate the SDK runtime models directly from - # field-based config data. The remaining exception is BaseRAGASMetric, - # whose runtime base still exposes the older `params=...` constructor, so - # keep this compatibility branch until those metrics are migrated to the - # direct runtime-class pattern as well. - metric_kwargs = metric_runtime_kwargs(metric_params, metric_cls) - if "job_type" in metric_cls.model_fields: - metric_kwargs["job_type"] = job_type - metric_model = metric_cls(**metric_kwargs) - - metric = cast(Metric, metric_model) - - if isinstance(metric, LLMJudgeMetric) and isinstance(metric.model, Model): - custom_headers = app_inference.get_platform_headers(metric.model.url) - metric.model = metric.model.with_default_headers(headers=custom_headers) - - if secret_resolver is not None and isinstance(metric, MetricWithSecrets): - await metric.resolve_secrets(secret_resolver) - if inference_fn is not None and isinstance(metric, MetricWithInference): - metric.set_inference_fn(inference_fn) - if run_preflight and isinstance(metric, MetricWithPreflight): - await metric.preflight() - - return metric diff --git a/services/evaluator/src/nmp/evaluator/app/metrics/remote.py b/services/evaluator/src/nmp/evaluator/app/metrics/remote.py deleted file mode 100644 index 196dc98b7f..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/metrics/remote.py +++ /dev/null @@ -1,55 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Compatibility wrappers for remote metric runtime implementations.""" - -from __future__ import annotations - -from typing import Any - -import httpx -import nemo_evaluator_sdk.metrics.remote as _sdk_remote -from nemo_evaluator_sdk import inference -from nemo_evaluator_sdk.resilience.api import run_with_resilience -from nemo_evaluator_sdk.values import MetricInput, MetricResult - - -def _sync_sdk_remote_bindings() -> None: - """Mirror patchable service symbols into SDK module globals.""" - _sdk_remote.requests_log_var = inference.requests_log_var - setattr(_sdk_remote, "httpx", httpx) - _sdk_remote.run_with_resilience = run_with_resilience - - -async def _post_to_remote_endpoint( - url: str, - payload: dict[str, Any], - api_key: str | None = None, - timeout: float = 30.0, - max_retries: int = 0, - log=_sdk_remote._logger, -) -> dict[str, Any]: - _sync_sdk_remote_bindings() - return await _sdk_remote._post_to_remote_endpoint( - url=url, - payload=payload, - api_key=api_key, - timeout=timeout, - max_retries=max_retries, - log=log, - ) - - -class RemoteMetric(_sdk_remote.RemoteMetric): - async def compute_scores(self, input: MetricInput) -> MetricResult: - _sync_sdk_remote_bindings() - return await super().compute_scores(input) - - -class NemoAgentToolkitRemoteMetric(_sdk_remote.NemoAgentToolkitRemoteMetric): - async def compute_scores(self, input: MetricInput) -> MetricResult: - _sync_sdk_remote_bindings() - return await super().compute_scores(input) - - -__all__ = ["NemoAgentToolkitRemoteMetric", "RemoteMetric", "_post_to_remote_endpoint", "httpx", "run_with_resilience"] diff --git a/services/evaluator/src/nmp/evaluator/app/tasks/__init__.py b/services/evaluator/src/nmp/evaluator/app/tasks/__init__.py deleted file mode 100644 index 1a8431c3e3..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/tasks/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 diff --git a/services/evaluator/src/nmp/evaluator/app/tasks/benchmark/__init__.py b/services/evaluator/src/nmp/evaluator/app/tasks/benchmark/__init__.py deleted file mode 100644 index 1a8431c3e3..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/tasks/benchmark/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 diff --git a/services/evaluator/src/nmp/evaluator/app/tasks/termination.py b/services/evaluator/src/nmp/evaluator/app/tasks/termination.py deleted file mode 100644 index 67a4be3930..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/tasks/termination.py +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import logging -import signal -import threading -from types import FrameType - -log = logging.getLogger(__name__) - - -def _handle_termination_signal(signum: int, _frame: FrameType | None) -> None: - signal_name = signal.Signals(signum).name - log.info("Received %s. Exiting task gracefully.", signal_name) - raise KeyboardInterrupt - - -def register_task_signal_handlers() -> None: - """Register SIGTERM/SIGINT handlers for task entrypoints. - - In task-harness tests, task `run()` may execute on a background thread. - Python only permits signal registration on the main thread, so this - function is a no-op outside the main thread. - """ - if threading.current_thread() is not threading.main_thread(): - log.debug("Skipping signal handler registration outside main thread") - return - - signal.signal(signal.SIGTERM, _handle_termination_signal) - signal.signal(signal.SIGINT, _handle_termination_signal) diff --git a/services/evaluator/src/nmp/evaluator/app/values/__init__.py b/services/evaluator/src/nmp/evaluator/app/values/__init__.py deleted file mode 100644 index 529dcb5269..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/__init__.py +++ /dev/null @@ -1,232 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Value types for the evaluator service. - -This module re-exports all value types for backwards compatibility. -Import from here for a stable API, or import from submodules for -explicit dependencies. -""" - -from nemo_evaluator_sdk.metrics.llm_judge import ( - default_judge_prompt_template_chat, - default_judge_prompt_template_completions, -) -from nemo_evaluator_sdk.metrics.ragas.metrics import ( - AgentGoalAccuracyMetric, - AnswerAccuracyMetric, - BaseRAGASMetric, - ContextEntityRecallMetric, - ContextPrecisionMetric, - ContextRecallMetric, - ContextRelevanceMetric, - FaithfulnessMetric, - NoiseSensitivityMetric, - ResponseGroundednessMetric, - ResponseRelevancyMetric, - ToolCallAccuracyMetric, - TopicAdherenceMetric, -) -from nemo_evaluator_sdk.values import ( - Agent, - AggregatedMetricResult, - AggregateFieldName, - AggregateRangeScore, - AggregateRubricScore, - AggregateScore, - AggregateScoreBase, - DefaultAggregateFieldName, - FieldMapping, - Histogram, - HistogramBin, - InputSchema, - JSONScoreParser, - MetricResult, - MetricScore, - Model, - Percentiles, - RangeScore, - ReasoningParams, - RegexScoreParser, - RemoteScore, - RowScore, - Rubric, - RubricScore, - RubricScoreStat, - RubricScoreValue, - SampleResult, - Score, - ScoreStats, - SecretRef, - SupportedJobTypes, - score_discriminator, -) -from nemo_evaluator_sdk.values.metrics import ( - _RAGASEmbeddingsConfig as RAGASEmbeddingsConfig, -) -from nemo_evaluator_sdk.values.metrics import ( - _RAGASJudgeConfig as RAGASJudgeConfig, -) -from nmp.evaluator.app.values.benchmarks import Benchmark, BenchmarkMetric, SystemBenchmark -from nmp.evaluator.app.values.benchmarks_job import ( - BenchmarkEvaluationResult, - BenchmarkJob, - BenchmarkJobAdapter, - BenchmarkMetricResult, - BenchmarkOfflineJob, - BenchmarkOnlineAgentJob, - BenchmarkOnlineJob, - SystemBenchmarkJob, - SystemBenchmarkOfflineJob, - SystemBenchmarkOnlineJob, -) -from nmp.evaluator.app.values.common import ( - BenchmarkRef, - Fileset, - FilesetRef, - MetricRef, - ModelRef, - StorageConfig, - StorageConfigField, -) -from nmp.evaluator.app.values.datasets import ( - BuiltInDataset, - BuiltInDatasetID, - Dataset, - DatasetRows, - PipelineDataset, -) -from nmp.evaluator.app.values.jobs import ( - EvaluationStatusDetails, - RetrieverPipeline, -) -from nmp.evaluator.app.values.metrics import ( - Metric, - MetricAdapter, - MetricBase, - Parameter, - SystemMetric, -) -from nmp.evaluator.app.values.metrics_job import ( - MetricJob, - MetricJobAdapter, - MetricOfflineJob, - MetricOnlineAgentJob, - MetricOnlineJob, - MetricRetrieverJob, -) -from nmp.evaluator.app.values.results import ( - DeprecatedMetricResult, - DeprecatedScoreValue, - EvaluationResult, - GroupResult, - TaskResult, -) - -__all__ = [ - # Agent - "Agent", - # Common - "BenchmarkRef", - "FilesetRef", - "Fileset", - "MetricRef", - "ModelRef", - "SecretRef", - "StorageConfig", - "StorageConfigField", - "SupportedJobTypes", - "FieldMapping", - "InputSchema", - # Datasets - "BuiltInDataset", - "BuiltInDatasetID", - "Dataset", - "DatasetRows", - "PipelineDataset", - # Jobs - "EvaluationStatusDetails", - "RetrieverPipeline", - # Benchmarks - "Benchmark", - "BenchmarkMetric", - "SystemBenchmark", - # Benchmarks Job - "BenchmarkEvaluationResult", - "BenchmarkJob", - "BenchmarkJobAdapter", - "BenchmarkMetricResult", - "BenchmarkOfflineJob", - "BenchmarkOnlineAgentJob", - "BenchmarkOnlineJob", - "SystemBenchmarkJob", - "SystemBenchmarkOfflineJob", - "SystemBenchmarkOnlineJob", - # Metrics Job - "MetricJob", - "MetricJobAdapter", - "MetricOfflineJob", - "MetricOnlineAgentJob", - "MetricOnlineJob", - "MetricRetrieverJob", - # Metrics - "Metric", - "MetricAdapter", - "MetricBase", - "Parameter", - "SystemMetric", - # Metrics LLM-Judge - "default_judge_prompt_template_chat", - "default_judge_prompt_template_completions", - # Metrics (RAGAS) - "BaseRAGASMetric", - "AgentGoalAccuracyMetric", - "AnswerAccuracyMetric", - "ContextEntityRecallMetric", - "ContextPrecisionMetric", - "ContextRecallMetric", - "ContextRelevanceMetric", - "FaithfulnessMetric", - "NoiseSensitivityMetric", - "RAGASJudgeConfig", - "RAGASEmbeddingsConfig", - "ResponseGroundednessMetric", - "ResponseRelevancyMetric", - "ToolCallAccuracyMetric", - "TopicAdherenceMetric", - # Models - "Model", - "ReasoningParams", - # Results - "AggregateFieldName", - "AggregatedMetricResult", - "AggregateRangeScore", - "AggregateRubricScore", - "AggregateScore", - "AggregateScoreBase", - "DefaultAggregateFieldName", - "DeprecatedMetricResult", - "DeprecatedScoreValue", - "EvaluationResult", - "GroupResult", - "Histogram", - "HistogramBin", - "RowScore", - "MetricResult", - "MetricScore", - "Percentiles", - "RubricScoreStat", - "RubricScoreValue", - "SampleResult", - "ScoreStats", - "TaskResult", - # Scores - "JSONScoreParser", - "RangeScore", - "RegexScoreParser", - "RemoteScore", - "Rubric", - "RubricScore", - "Score", - "score_discriminator", -] diff --git a/services/evaluator/src/nmp/evaluator/app/values/benchmarks.py b/services/evaluator/src/nmp/evaluator/app/values/benchmarks.py deleted file mode 100644 index 508abcabf9..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/benchmarks.py +++ /dev/null @@ -1,65 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import Literal - -from nemo_evaluator_sdk.values import FieldMapping, SupportedJobTypes -from nmp.evaluator.app.values.common import FilesetRef, MetricRef -from nmp.evaluator.app.values.metrics import Metric, Parameter -from pydantic import BaseModel, Field, model_validator -from typing_extensions import Self - - -class BenchmarkMetric(BaseModel): - """Benchmark metric with stable reference identity.""" - - metric_ref: MetricRef = Field(description="Reference to the metric (format: workspace/metric_name).") - metric: Metric = Field(description="Resolved metric definition.") - - -class Benchmark(BaseModel): - """Inline custom benchmark for grouping metrics.""" - - name: str = Field(description="Benchmark name") - description: str | None = Field(default=None, description="Human-readable description of the benchmark.") - metrics: list[BenchmarkMetric] = Field(min_length=1, description="List of metrics that comprise this benchmark.") - dataset: FilesetRef = Field( - description="Reference to a Fileset in the Files API (format: workspace/fileset-name). The fileset contains the test cases for this benchmark." - ) - field_mapping: FieldMapping | None = Field( - default=None, - description="Maps canonical evaluator fields such as 'input' and 'output' to dataset column paths for this benchmark.", - ) - labels: dict[str, str] = Field( - default_factory=dict, description="Labels are key-value pairs that can be used for grouping and filtering." - ) - - @model_validator(mode="after") - def unique_metric_refs(self) -> Self: - if type(self) is not Benchmark: - return self - refs = [metric.metric_ref.root for metric in self.metrics] - if len(refs) != len(set(refs)): - raise ValueError("benchmark metric references must be unique") - return self - - -class SystemBenchmark(BaseModel): - """Inline system benchmarks""" - - name: str = Field(description="Benchmark name") - - description: str | None = Field(default=None, description="Human-readable description of the benchmark.") - labels: dict[str, str] = Field( - default_factory=dict, description="Labels are key-value pairs that can be used for grouping and filtering." - ) - required_params: list[Parameter] = Field( - default_factory=list, description="List of required parameters for running an evaluation with the benchmark." - ) - optional_params: list[Parameter] = Field( - default_factory=list, description="List of required parameters for running an evaluation with the benchmark." - ) - supported_job_types: list[Literal[SupportedJobTypes.ONLINE, SupportedJobTypes.OFFLINE]] = Field( - default=[SupportedJobTypes.ONLINE], - description="A benchmark can evaluate model outputs for online evaluations or pre-generated outputs for offline evaluations.", - ) diff --git a/services/evaluator/src/nmp/evaluator/app/values/benchmarks_job.py b/services/evaluator/src/nmp/evaluator/app/values/benchmarks_job.py deleted file mode 100644 index e7bdf87f63..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/benchmarks_job.py +++ /dev/null @@ -1,244 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from __future__ import annotations - -from collections.abc import Sequence -from typing import Annotated, Any, ClassVar, Literal - -from nemo_evaluator_sdk.values import ( - Agent, - AggregatedMetricResult, - AggregateScore, - Model, - RunConfig, - RunConfigOnline, - RunConfigOnlineModel, - SupportedJobTypes, -) -from nemo_evaluator_sdk.values.multi_metric_results import ( - BenchmarkEvaluationResult as SDKBenchmarkEvaluationResult, -) -from nmp.evaluator.app.values.benchmarks import Benchmark, BenchmarkMetric, SystemBenchmark -from nmp.evaluator.app.values.common import FilesetRef, MetricRef, ModelRef -from nmp.evaluator.app.values.datasets import Dataset -from pydantic import BaseModel, ConfigDict, Discriminator, Field, Tag, TypeAdapter - -# ============================================================================= -# Benchmark Job Types -# ============================================================================= - - -class _BenchmarkJob(BaseModel): - model_config = ConfigDict(extra="forbid") - benchmark: Benchmark = Field(description="The benchmark for evaluation.") - - -OptionalFieldName = Annotated[str, Field(min_length=1)] - - -class BenchmarkOfflineJob(_BenchmarkJob): - __job_type__: ClassVar[Literal[SupportedJobTypes.OFFLINE]] = SupportedJobTypes.OFFLINE - params: RunConfig | None = Field( - default_factory=RunConfig, description="Execution parameters for the benchmark job." - ) - - -class BenchmarkOnlineJob(_BenchmarkJob): - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - model: Model = Field(description="The model to evaluate.") - model_ref: ModelRef | None = Field(default=None, description="Reference to the model") - params: RunConfigOnlineModel | None = Field( - default_factory=RunConfigOnlineModel, description="Execution parameters for the benchmark job." - ) - prompt_template: str | dict - optional_fields: list[OptionalFieldName] = Field( - default_factory=list, - description=( - "Prompt template fields that should remain available to the prompt template but not be " - "required by dataset schema validation." - ), - ) - - -class BenchmarkOnlineAgentJob(_BenchmarkJob): - """Online benchmark job targeting an agent.""" - - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - agent: Agent = Field(description="The agent to evaluate.") - params: RunConfigOnline | None = Field( - default_factory=RunConfigOnline, description="Execution parameters for the benchmark job." - ) - prompt_template: str | dict - optional_fields: list[OptionalFieldName] = Field( - default_factory=list, - description=( - "Prompt template fields that should remain available to the prompt template but not be " - "required by dataset schema validation." - ), - ) - - -class _SystemBenchmarkJob(BaseModel): - model_config = ConfigDict(extra="forbid") - benchmark: SystemBenchmark = Field(description="The benchmark for evaluation.") - benchmark_params: dict = Field(default_factory=dict, description="Additional parameters specific to the benchmark.") - - -class SystemBenchmarkOfflineJob(_SystemBenchmarkJob): - __job_type__: ClassVar[Literal[SupportedJobTypes.OFFLINE]] = SupportedJobTypes.OFFLINE - - dataset: Dataset = Field( - description="The dataset to evaluate which may represent generated outputs from a model or agent trace." - ) - dataset_ref: FilesetRef | None = Field(default=None) - params: RunConfig | None = Field( - default_factory=RunConfig, description="Execution parameters for the benchmark job." - ) - - -class SystemBenchmarkOnlineJob(_SystemBenchmarkJob): - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - - model: Model = Field(description="The model to evaluate.") - model_ref: ModelRef | None = Field(default=None) - params: RunConfigOnlineModel | None = Field( - default_factory=RunConfigOnlineModel, description="Execution parameters for the benchmark job." - ) - - -SystemBenchmarkJob = SystemBenchmarkOfflineJob | SystemBenchmarkOnlineJob - - -def _is_system_benchmark(benchmark: Any) -> bool: - """Check whether the benchmark value represents a system benchmark. - - The benchmark can arrive as a ``SystemBenchmark`` instance, a plain dict, - or a ``Benchmark`` model instance – depending on whether the caller already - converted it. - - Custom benchmarks are distinguished by having a ``metrics`` field - (a list of metric configurations), which system benchmarks lack. - """ - if isinstance(benchmark, SystemBenchmark): - return True - if isinstance(benchmark, Benchmark): - return False - if isinstance(benchmark, dict): - return "metrics" not in benchmark - # Unknown model instance – fall back to checking for the metrics attribute - return not hasattr(benchmark, "metrics") - - -def _benchmark_job_discriminator(data: Any) -> str: - """ - Discriminate union type specifically for internal job spec which has benchmark reference resolved. - """ - benchmark = data.get("benchmark", {}) if isinstance(data, dict) else getattr(data, "benchmark", {}) - - if isinstance(data, dict): - has_model = "model" in data - has_agent = "agent" in data - else: - has_model = hasattr(data, "model") - has_agent = hasattr(data, "agent") - - if has_agent and has_model: - raise ValueError("Only one of 'model' or 'agent' may be specified, not both.") - - if has_agent: - return "online-agent" - - if has_model: - if _is_system_benchmark(benchmark): - return "system-online" - return "online" - - if _is_system_benchmark(benchmark): - return "system-offline" - return "offline" - - -BenchmarkJob = Annotated[ - ( - Annotated[BenchmarkOfflineJob, Tag("offline")] - | Annotated[BenchmarkOnlineJob, Tag("online")] - | Annotated[BenchmarkOnlineAgentJob, Tag("online-agent")] - | Annotated[SystemBenchmarkOfflineJob, Tag("system-offline")] - | Annotated[SystemBenchmarkOnlineJob, Tag("system-online")] - ), - Discriminator(_benchmark_job_discriminator), -] -BenchmarkJobAdapter = TypeAdapter(BenchmarkJob) - - -# ============================================================================= -# Results Schema -# ============================================================================= - - -class BenchmarkMetricResult(AggregatedMetricResult): - """Aggregated results for a single metric within a benchmark.""" - - metric: MetricRef | None = Field( - default=None, description="The metric used for the evaluation job to generate the result." - ) - - -def _strip_metric_namespace(metric_ref: str, scores: Sequence[AggregateScore]) -> list[AggregateScore]: - """Remove the ``{metric_ref}.`` prefix added by SDK-level score namespacing.""" - prefix = f"{metric_ref}." - stripped: list[AggregateScore] = [] - for score in scores: - if score.name.startswith(prefix): - stripped.append(score.model_copy(update={"name": score.name[len(prefix) :]})) - else: - stripped.append(score) - return stripped - - -class BenchmarkEvaluationResult(BaseModel): - """Aggregated results for a benchmark evaluation.""" - - results: list[BenchmarkMetricResult] = Field(description="Results for each metric in the benchmark.") - - @classmethod - def from_sdk_results( - cls, - sdk_result: SDKBenchmarkEvaluationResult, - benchmark_metrics: Sequence[BenchmarkMetric], - ) -> BenchmarkEvaluationResult: - """Project the SDK benchmark result onto the service REST wire shape. - - Example: - SDK input shape: - ``per_metric["default/exact-match"].aggregate_scores.scores[0].name == "default/exact-match.score"`` - - Service output shape: - ``results[0].metric.root == "default/exact-match"`` - ``results[0].scores[0].name == "score"`` - - The transformation keeps the per-metric aggregate payload but converts - the outer container from SDK ``per_metric`` mapping form into the - service ``results`` list form, while stripping the ``{metric_ref}.`` - namespace prefix from each aggregate score name. - """ - by_ref = { - benchmark_metric.metric_ref.root: benchmark_metric.metric_ref for benchmark_metric in benchmark_metrics - } - results: list[BenchmarkMetricResult] = [] - for metric_ref, evaluation_result in sdk_result.per_metric.items(): - if metric_ref not in by_ref: - raise ValueError( - f"SDK returned result for unknown metric_ref {metric_ref!r} " - "while projecting benchmark results; " - f"expected one of {sorted(by_ref)!r}" - ) - metric = by_ref[metric_ref] - results.append( - BenchmarkMetricResult( - metric=metric, - scores=_strip_metric_namespace(metric_ref, evaluation_result.aggregate_scores.scores), - ) - ) - return cls(results=results) diff --git a/services/evaluator/src/nmp/evaluator/app/values/common.py b/services/evaluator/src/nmp/evaluator/app/values/common.py deleted file mode 100644 index 6583db7145..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/common.py +++ /dev/null @@ -1,111 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Common value types used throughout the evaluator service.""" - -from __future__ import annotations - -from typing import Annotated, Any - -from nmp.common.files.metadata import FilesetMetadata -from nmp.common.files.storage_config import ( - HuggingfaceStorageConfig, - NGCStorageConfig, -) -from pydantic import BaseModel, ConfigDict, Field, RootModel - - -class MetricRef(RootModel): - """Reference to a metric in the Metrics API. - - A reference is a string with format 'workspace/metric-name' that points to a - persisted metric entity. See [Entity references](docs/get-started/concepts/entity-references.md) for the - general entity reference pattern used across the platform. - """ - - root: str = Field( - description="Reference to a metric (format: workspace/metric-name).", - pattern=r"^[a-z0-9_-]+/[a-z0-9_-]+$", - examples=[ - "workspace/metric-name", - ], - ) - - -class BenchmarkRef(RootModel): - """Reference to a benchmark in the Benchmarks API. - - A reference is a string with format 'workspace/benchmark-name' that points to a - persisted benchmark entity. See [Entity references](docs/get-started/concepts/entity-references.md) for the - general entity reference pattern used across the platform. - """ - - root: str = Field( - description="Reference to a benchmark (format: workspace/benchmark-name).", - pattern=r"^[a-z0-9_-]+/[a-z0-9_-]+$", - examples=[ - "workspace/benchmark-name", - ], - ) - - -class ModelRef(RootModel): - """Reference to a Model in the Models API. - - See [Entity references](docs/get-started/concepts/entity-references.md) for the general entity reference - pattern used across the platform. - """ - - root: str = Field( - description="Reference to a model (format: workspace/name).", - pattern=r"^[a-z0-9_-]+/[a-z0-9_-]+$", - examples=[ - "workspace/model_name", - ], - ) - - -StorageConfig = NGCStorageConfig | HuggingfaceStorageConfig - -StorageConfigField = Annotated[StorageConfig, Field(discriminator="type")] - - -class Fileset(BaseModel): - """Fileset definition for use without persisting to the Files API.""" - - model_config = ConfigDict(extra="forbid") - - path: str | None = Field( - default=None, min_length=1, description="The relative path to file/directory in the storage." - ) - storage: StorageConfig = Field(description="The storage configuration for the fileset.") - metadata: FilesetMetadata = Field( - default_factory=FilesetMetadata, - description="Purpose-specific metadata for the fileset.", - ) - custom_fields: dict[str, Any] = Field(default_factory=dict, description="Custom fields for the fileset.") - - -class FilesetRef(RootModel): - """Reference to a Fileset in the Files API. - - A reference is a string with format 'workspace/fileset-name' that points to a - persisted fileset entity. When used as a dataset source, all files within the - fileset will be downloaded to the job container. - - See [Entity references](docs/get-started/concepts/entity-references.md) for the general entity reference - pattern used across the platform. - """ - - root: str = Field(description="Reference to a Fileset (format: workspace/fileset-name).") - - def with_fragment(self, fragment: str) -> FilesetRef: - """Return a new fileset reference with a file path fragment appended.""" - normalized_fragment = fragment.lstrip("/") - if not normalized_fragment: - raise ValueError("FilesetRef fragment cannot be empty.") - if "#" in normalized_fragment: - raise ValueError("FilesetRef fragment cannot contain '#'.") - if "#" in self.root: - raise ValueError("FilesetRef already includes a fragment.") - return FilesetRef(root=f"{self.root}#{normalized_fragment}") diff --git a/services/evaluator/src/nmp/evaluator/app/values/datasets.py b/services/evaluator/src/nmp/evaluator/app/values/datasets.py deleted file mode 100644 index 2dcd6d5658..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/datasets.py +++ /dev/null @@ -1,103 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Dataset-related value types.""" - -from __future__ import annotations - -from typing import Annotated, Any, Literal, get_args - -from nemo_evaluator_sdk.values import DatasetRows -from nmp.evaluator.app.values.common import Fileset, FilesetRef -from pydantic import BeforeValidator, RootModel - -# Define the strictly allowed dataset identifiers -# This includes the 22 BEIR datasets and the 1 Ragas dataset -# Known BEIR academic datasets are downloaded from https://public.ukp.informatik.tu-darmstadt.de/thakur/BEIR/datasets/ -# and RAGAS amnesty_qa downloaded from huggingface. - -BuiltInDatasetID = Literal[ - "beir/climate-fever", - "beir/cqadupstack", - "beir/dbpedia-entity", - "beir/fever", - "beir/fiqa", - "beir/germanquad", - "beir/hotpotqa", - "beir/mmarco", - "beir/mrtydi", - "beir/msmarco-v2", - "beir/msmarco", - "beir/nfcorpus", - "beir/nq-train", - "beir/nq", - "beir/quora", - "beir/scidocs", - "beir/scifact", - "beir/trec-covid-beir", - "beir/trec-covid-v2", - "beir/trec-covid", - "beir/vihealthqa", - "beir/webis-touche2020", - "ragas/amnesty_qa", -] - - -class BuiltInDataset(RootModel): - """Well-known dataset (BEIR or RAGAS) referenced by its identifier.""" - - root: BuiltInDatasetID - - @property - def format(self) -> str: - """Extracts the format (e.g., 'beir' or 'ragas'). - - If there's no slash in the identifier, returns an empty string. - """ - parts = self.root.split("/") - return parts[0] if len(parts) > 1 else "" - - @property - def name(self) -> str: - """Extracts the dataset name (e.g., 'fiqa' or 'amnesty_qa'). - - If there's no slash in the identifier, returns the entire root string. - """ - parts = self.root.split("/") - return parts[1] if len(parts) > 1 else self.root - - -def _coerce_string_to_fileset_ref(v: Any) -> Any: - """Convert plain strings to FilesetRef for proper deserialization. - - When a FilesetRef is serialized to JSON, it becomes a plain string. - This validator ensures that plain strings are parsed back as FilesetRef - when validating a Dataset union type. - """ - if isinstance(v, str): - return FilesetRef(root=v) - return v - - -Dataset = Annotated[DatasetRows | FilesetRef | Fileset, BeforeValidator(_coerce_string_to_fileset_ref)] - - -def _coerce_string_to_pipeline_dataset(v: Any) -> Any: - """Convert plain strings to FilesetRef or BuiltInDataset for proper deserialization. - - When a FilesetRef is serialized to JSON, it becomes a plain string. - This validator ensures that plain strings are parsed back as FilesetRef - when validating a PipelineDataset union type. BuiltInDataset identifiers (e.g., "beir/fiqa") - are recognized and converted to BuiltInDataset instead. - """ - if isinstance(v, str): - # Check if string matches a known built-in dataset identifier - if v in get_args(BuiltInDatasetID): - return BuiltInDataset(root=v) - return FilesetRef(root=v) - return v - - -# BuiltInDataset must come first so strings like "beir/fiqa" are validated -# against it before Dataset's BeforeValidator converts them to FilesetRef. -PipelineDataset = Annotated[BuiltInDataset | Dataset, BeforeValidator(_coerce_string_to_pipeline_dataset)] diff --git a/services/evaluator/src/nmp/evaluator/app/values/jobs.py b/services/evaluator/src/nmp/evaluator/app/values/jobs.py deleted file mode 100644 index 4307c474fc..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/jobs.py +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Job-related value types.""" - -from __future__ import annotations - -from nemo_evaluator_sdk.enums import TaskStatus -from nemo_evaluator_sdk.values import Model -from pydantic import BaseModel, Field - - -class RetrieverPipeline(BaseModel): - """Pipeline configuration for retriever-based evaluations.""" - - embeddings_model: Model = Field(description="The embeddings model used for retrieval.") - - -class EvaluationStatusDetails(BaseModel): - """Details about the status of the evaluation.""" - - message: str | None = Field( - default=None, - description="A message about the status of the evaluation.", - ) - task_status: dict[str, TaskStatus] = Field( - default_factory=dict, - description="Information about the status of every task.", - ) - progress: float | None = Field( - default=None, - description="The progress of the evaluation, between 0.0 and 100.0.", - ) - samples_processed: int | None = Field( - default=None, description="The number of samples from the dataset that have been processed for evaluation." - ) diff --git a/services/evaluator/src/nmp/evaluator/app/values/metrics.py b/services/evaluator/src/nmp/evaluator/app/values/metrics.py deleted file mode 100644 index dd4e8bec93..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/metrics.py +++ /dev/null @@ -1,58 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Compatibility re-exports for metric value types. - -Metric value models now live in ``nemo_evaluator_sdk.values.metrics``. -This module is kept for backward compatibility with existing service imports. -""" - -from typing import Annotated, Literal - -from nemo_evaluator_sdk.enums import MetricType -from nemo_evaluator_sdk.metrics.types import MetricVariants -from nemo_evaluator_sdk.values import MetricBase, SupportedJobTypes -from pydantic import BaseModel, ConfigDict, Field, TypeAdapter - - -class Parameter(BaseModel): - # This allows validation using both 'schema_' and 'schema' - model_config = ConfigDict(populate_by_name=True) - - name: str = Field(description="Name of the parameter.") - type: Literal["boolean", "string", "number", "integer", "object", "secret"] = Field( - description="The value type of the parameter." - ) - description: str | None = Field(default=None, description="Description of the parameter.") - default: bool | str | float | int | None = Field(default=None, description="The default value of the parameter.") - # Use schema_ internally, but 'schema' externally to avoid shadowing BaseModel.schema() - schema_: dict | None = Field( - default=None, alias="schema", description="The JSON schema for parameters with object type." - ) - - -class SystemMetric(MetricBase): - """Metric entity for system metric that have pre-defined dataset.""" - - type: Literal[MetricType.SYSTEM, MetricType.SYSTEM_RETRIEVER] = MetricType.SYSTEM - name: str = Field("Metric name") - required_params: list[Parameter] = Field( - default_factory=list, description="List of required parameters for running an evaluation with the metric." - ) - optional_params: list[Parameter] = Field( - default_factory=list, description="List of optional parameters for running an evaluation with the metric." - ) - supported_job_types: list[ - Literal[SupportedJobTypes.ONLINE, SupportedJobTypes.OFFLINE, SupportedJobTypes.RETRIEVER] - ] = Field( - default=[SupportedJobTypes.ONLINE], - description="A metric can evaluate model outputs for online evaluations or pre-generated outputs for offline evaluations.", - ) - - -Metric = Annotated[ - MetricVariants | SystemMetric, - Field(discriminator="type"), -] - -MetricAdapter = TypeAdapter(Metric) diff --git a/services/evaluator/src/nmp/evaluator/app/values/metrics_job.py b/services/evaluator/src/nmp/evaluator/app/values/metrics_job.py deleted file mode 100644 index 9b7a145d5f..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/metrics_job.py +++ /dev/null @@ -1,182 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from __future__ import annotations - -from typing import Annotated, Any, ClassVar, Literal - -from nemo_evaluator_sdk.values import ( - Agent, - FieldMapping, - Model, - RunConfig, - RunConfigOnline, - RunConfigOnlineModel, - SupportedJobTypes, -) -from nmp.evaluator.app.values.common import FilesetRef, MetricRef, ModelRef -from nmp.evaluator.app.values.datasets import Dataset, PipelineDataset -from nmp.evaluator.app.values.jobs import RetrieverPipeline -from nmp.evaluator.app.values.metrics import Metric -from pydantic import BaseModel, ConfigDict, Discriminator, Field, Tag, TypeAdapter - - -class _MetricJob(BaseModel): - """Job to run a metric evaluation.""" - - model_config = ConfigDict(extra="forbid") - metric: Metric = Field(description="The metric for evaluation.") - metric_ref: MetricRef | None = Field(default=None) - metric_params: dict = Field( - default_factory=dict, - description="Additional parameters for the metric. Required for system metrics, optional overrides for custom metrics.", - ) - field_mapping: FieldMapping | None = Field( - default=None, - description="Maps canonical evaluator fields such as 'input' and 'output' to dataset column paths for this job.", - ) - - -OptionalFieldName = Annotated[str, Field(min_length=1)] - - -class MetricOfflineJob(_MetricJob): - __job_type__: ClassVar[Literal[SupportedJobTypes.OFFLINE]] = SupportedJobTypes.OFFLINE - - dataset: Dataset = Field(description="The dataset to evaluate which may represent generated outputs from a model.") - dataset_ref: FilesetRef | None = Field(default=None) - params: RunConfig = Field(default_factory=RunConfig, description="Execution parameters for the metric job.") - - -class MetricOnlineJob(_MetricJob): - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - - model: Model = Field(description="The model to evaluate.") - model_ref: ModelRef | None = Field(default=None) - dataset: Dataset = Field(description="The dataset to use for model prompts and evaluation.") - dataset_ref: FilesetRef | None = Field(default=None) - params: RunConfigOnlineModel = Field( - default_factory=RunConfigOnlineModel, description="Execution parameters for the metric job." - ) - prompt_template: str | dict[str, Any] = Field( - description="The jinja template to prompt the model for evaluation. Can be either a simple string or a structured object (e.g., OpenAI messages format). Use Jinja template variables like {{input}}, {{output}}, {{context}}, {{reference}} to reference input columns.", - examples=[ - {"type": "string", "content": "Question: {{input}}\nAnswer: "}, - { - "type": "object", - "content": { - "messages": [ - { - "role": "user", - "content": "Question: {{input}}\nAnswer: ", - }, - ] - }, - }, - ], - ) - optional_fields: list[OptionalFieldName] = Field( - default_factory=list, - description=( - "Prompt template fields that should remain available to the prompt template but not be " - "required by dataset schema validation." - ), - ) - - -class MetricOnlineAgentJob(_MetricJob): - """Online metric job targeting an agent.""" - - __job_type__: ClassVar[Literal[SupportedJobTypes.ONLINE]] = SupportedJobTypes.ONLINE - - agent: Agent = Field(description="The agent to evaluate.") - dataset: Dataset = Field(description="The dataset to use for agent prompts and evaluation.") - dataset_ref: FilesetRef | None = Field(default=None) - params: RunConfigOnline = Field( - default_factory=RunConfigOnline, description="Execution parameters for the metric job." - ) - prompt_template: str | dict[str, Any] = Field( - description="The jinja template to prompt the agent for evaluation. Can be either a simple string or a structured object (e.g., OpenAI messages format). Use Jinja template variables like {{input}}, {{output}}, {{context}}, {{reference}} to reference input columns.", - examples=[ - {"type": "string", "content": "Question: {{input}}\nAnswer: "}, - { - "type": "object", - "content": { - "messages": [ - { - "role": "user", - "content": "Question: {{input}}\nAnswer: ", - }, - ] - }, - }, - ], - ) - optional_fields: list[OptionalFieldName] = Field( - default_factory=list, - description=( - "Prompt template fields that should remain available to the prompt template but not be " - "required by dataset schema validation." - ), - ) - - -class MetricRetrieverJob(_MetricJob): - """Job for evaluation with a retriever-based metric.""" - - __job_type__: ClassVar[Literal[SupportedJobTypes.RETRIEVER]] = SupportedJobTypes.RETRIEVER - - retriever_pipeline: RetrieverPipeline = Field( - description="The pipeline configuration for retriever-based evaluation." - ) - dataset: PipelineDataset = Field(description="The dataset to use for evaluation.") - dataset_ref: FilesetRef | None = Field(default=None) - params: RunConfigOnline = Field( - default_factory=RunConfigOnline, description="Execution parameters for the metric job." - ) - - -def _discriminate_job_type_from_fields(data: dict) -> str: - """Determine job type from field presence in a dict. - - Logic: - - retriever_pipeline (no model/agent) -> Retriever job - - agent only (no model) -> Online agent job - - model or agent (with or without prompt_template) -> Online job - - otherwise -> Offline job - - Note: Routing 'model'/'agent' without 'prompt_template' to Online gives a - better validation error ("missing prompt_template") vs Offline ("extra field model"). - """ - has_retriever = "retriever_pipeline" in data - has_model = "model" in data - has_agent = "agent" in data - - if has_agent and has_model: - raise ValueError("Only one of 'model' or 'agent' may be specified, not both.") - if has_retriever: - return "retriever" - if has_agent: - return "online-agent" - if has_model: - return "online" - return "offline" - - -def _metric_job_discriminator(v: Any) -> str: - """Discriminator for MetricJob union types.""" - if isinstance(v, dict): - return _discriminate_job_type_from_fields(v) - if isinstance(v, MetricOnlineAgentJob): - return "online-agent" - return getattr(v, "__job_type__", SupportedJobTypes.OFFLINE).value - - -MetricJob = Annotated[ - Annotated[MetricOfflineJob, Tag("offline")] - | Annotated[MetricOnlineJob, Tag("online")] - | Annotated[MetricOnlineAgentJob, Tag("online-agent")] - | Annotated[MetricRetrieverJob, Tag("retriever")], - Discriminator(_metric_job_discriminator), -] -MetricJobAdapter = TypeAdapter(MetricJob) diff --git a/services/evaluator/src/nmp/evaluator/app/values/results.py b/services/evaluator/src/nmp/evaluator/app/values/results.py deleted file mode 100644 index 22bc0fb606..0000000000 --- a/services/evaluator/src/nmp/evaluator/app/values/results.py +++ /dev/null @@ -1,118 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Compatibility result types for the evaluator service. - -Shared result-domain models are sourced from ``nemo_evaluator_sdk.values.results``. -Only legacy evaluator-only result types remain defined in this module. -""" - -from __future__ import annotations - -import math -from typing import Any - -from nemo_evaluator_sdk.values.results import ScoreStats -from pydantic import AnyUrl, BaseModel, Field, field_serializer, field_validator - -# --------------------------------------------------------------------------- -# Deprecated result types from v1 -# --------------------------------------------------------------------------- - - -class DeprecatedScoreValue(BaseModel): - """A score computed for a metric, as part of an evaluation.""" - - value: float - stats: ScoreStats | None = Field( - default=None, - description="Computed score statistics for the score.", - ) - - @field_validator("value", mode="before") - @classmethod - def convert_value(cls, v: Any) -> Any: - """If incoming object is string with value "nan", it is converted to float nan.""" - if isinstance(v, str): - if v.strip().lower() == "nan": - return float("nan") - raise ValueError("The only string value allowed for value is NaN") - return v - - @field_serializer("value") - def serialize_nan(self, v: float) -> float | str: - """Float NaN are not accepted by postgres json structure. - - So they are serialized to string 'NaN' as suggested by postgres. - https://www.postgresql.org/docs/9.3/datatype-numeric.html - """ - if isinstance(v, float) and math.isnan(v): - return "NaN" - return v - - -class DeprecatedMetricResult(BaseModel): - """The result coming from a metric, as part of an evaluation. - - It contains a mapping of score names to their value - """ - - scores: dict[str, DeprecatedScoreValue] = Field( - default_factory=dict, - description="The value for all the scores computed for the metric.", - ) - - -class TaskResult(BaseModel): - """The evaluation results for a task.""" - - metrics: dict[str, DeprecatedMetricResult] = Field( - default_factory=dict, - description="The value for all the metrics computed for the task.", - ) - - data: dict | None = Field(default=None, description="Additional data from the task") - - -class GroupResult(BaseModel): - """The evaluation results for a group.""" - - groups: dict[str, "GroupResult"] | None = Field(default=None, description="The results for the subgroups.") - metrics: dict[str, DeprecatedMetricResult] = Field( - default_factory=dict, - description="The value for all the metrics computed for the group.", - ) - - -class EvaluationResult(BaseModel): - """Result of an evaluation job. - - Contains task results, group results, and aggregate metrics. - """ - - # Override workspace to have a default for inline results - workspace: str = Field(default="default", description="Workspace identifier") - - job: str = Field( - description="The evaluation job associated with this results instance.", - ) - - # Results by task and group - tasks: dict[str, TaskResult] | None = Field( - default_factory=dict, - description="The results at the task-level.", - ) - groups: dict[str, GroupResult] | None = Field( - default_factory=dict, - description="The results at the group-level.", - ) - - # Output files - files_url: AnyUrl | None = Field( - default=None, - description="The place for the output files, if any.", - ) - - @field_serializer("files_url") - def serialize_url(self, value: AnyUrl | None) -> str | None: - return str(value) if value else None diff --git a/services/evaluator/src/nmp/evaluator/config.py b/services/evaluator/src/nmp/evaluator/config.py deleted file mode 100644 index 454608b65d..0000000000 --- a/services/evaluator/src/nmp/evaluator/config.py +++ /dev/null @@ -1,107 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -"""Configuration for the Evaluator service.""" - -import logging -from pathlib import Path -from urllib.parse import urlparse - -from nmp.common.config import create_service_config_class, get_service_config -from pydantic import BaseModel, Field, model_validator -from pydantic_settings import SettingsConfigDict - -log = logging.getLogger(__name__) - - -class JobsConfig(BaseModel): - configs_dir: str = Field( - default="/configs", description="Directory path in job container for evaluation configuration." - ) - volume_path: str = Field( - default="/jobs", - description="Directory path of the shared volume mount for job steps to persist artifacts for a job.", - ) - results_dir: str = Field( - default="/jobs/results", description="Directory path in the job container for results to be output." - ) - dataset_dir: str = Field( - default="/jobs/datasets", - description="Directory path in the job container for dataset files to be downloaded to and loaded from.", - ) - - @model_validator(mode="after") - def validate_directories(self): - """Validate that all provider names are unique across types.""" - if not Path(self.results_dir).is_relative_to(Path(self.volume_path)): - raise ValueError( - f"job.results_dir {self.results_dir} is not a subpath of job.volume_path {self.volume_path}" - ) - if not Path(self.dataset_dir).is_relative_to(Path(self.volume_path)): - raise ValueError( - f"job.dataset_dir {self.dataset_dir} is not a subpath of job.volume_path {self.volume_path}" - ) - return self - - -class EvalFactoryConfig(BaseModel): - """ - Configuration for EvalFactory integration with NeMo Platform. - """ - - agentic_eval: str = Field(default="nvcr.io/nvidia/eval-factory/agentic_eval:26.01") - bfcl: str = Field(default="nvcr.io/nvidia/eval-factory/bfcl:26.01") - lm_eval_harness: str = Field(default="nvcr.io/nvidia/eval-factory/lm-evaluation-harness:26.01") - bigcode_evaluation_harness: str = Field(default="nvcr.io/nvidia/eval-factory/bigcode-evaluation-harness:26.01") - rag_retriever: str = Field(default="nvcr.io/nvidia/eval-factory/rag_retriever_eval:26.01") - safety_harness: str = Field(default="nvcr.io/nvidia/eval-factory/safety-harness:26.01") - simple_evals: str = Field(default="nvcr.io/nvidia/eval-factory/simple-evals:26.01") - - milvus_url: str | None = Field( - default=None, description="Connect to a hosted Milvus server for retrieval evaluations" - ) - - @model_validator(mode="after") - def validate_milvus_url(self): - if not self.milvus_url: - return self - - parsed_url = urlparse(self.milvus_url) - if not parsed_url.hostname: - raise ValueError( - f"milvus_url is not properly configured, URL {self.milvus_url} is in incorrect format and missing the hostname." - ) - - return self - - -class EvaluatorSettings(create_service_config_class("evaluator")): # type: ignore[unsupported-base] - """ - Configuration for the Evaluator service. - - Environment variables use the NMP_EVALUATOR_ prefix. - """ - - jobs: JobsConfig = Field( - default_factory=JobsConfig, description="Configuration for jobs created with Evaluator service." - ) - evalfactory: EvalFactoryConfig = Field( - default_factory=EvalFactoryConfig, description="Configuration for EvalFactory integration with NeMo Platform." - ) - recreate_existing_system_entities: bool = Field( - default=False, description="Upsert system metrics and benchmarks on app startup" - ) - - # model_config is merged with inherited class - # Without env_nested_max_split=1 set, NMP_EVALUATOR_EVALFACTORY_AGENTIC_EVAL would be parsed as - # nemo_platform_evaluator.evaluator.agentic.eval instead of nemo_platform_evaluator.evaluator.agentic_eval - model_config = SettingsConfigDict(env_nested_max_split=1) - - -settings = get_service_config(EvaluatorSettings) diff --git a/services/evaluator/src/nmp/evaluator/constants.py b/services/evaluator/src/nmp/evaluator/constants.py deleted file mode 100644 index 77ca8ee411..0000000000 --- a/services/evaluator/src/nmp/evaluator/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -import os - -PROJECT_HOME_DIR = os.getcwd() -DEFAULT_ENTITY_NAMESPACE = "default" # default namespace will be "default" -DEFAULT_PROGRESS_TRACKING_INTERVAL = 50 - -PLACEHOLDER_INFERENCE_API_KEY = "XXX" - -# secret keys -SECRET_KEY_TARGET_MODEL_API_TOKEN = "target.model.api_endpoint.api_key" -SECRET_KEY_ACADEMIC_BENCHMARK_HF_TOKEN = "config.params.extra.hf_token" -SECRET_KEY_RAG_JUDGE_API_KEY = "config.tasks.beir.params.judge_llm.api_endpoint.api_key" -SECRET_KEY_RAG_JUDGE_EMBEDDING_API_KEY = "config.tasks.beir.params.judge_embeddings.api_endpoint.api_key" -SECRET_KEY_LLM_AS_A_JUDGE_API_KEY = "config.tasks.metrics.params.model.api_endpoint.api_key" -SECRET_KEY_AGENTIC_EVAL_JUDGE_API_KEY = "config.tasks.judge.model.api_key" -SECRET_KEY_BFCL_RAPID_API_KEY = "config.params.extra.rapid_api_key" -SECRET_KEY_BFCL_EXCHANGERATE_API_KEY = "config.params.extra.exchangerate_api_key" -SECRET_KEY_BFCL_OMDB_API_KEY = "config.params.extra.omdb_api_key" -SECRET_KEY_BFCL_GEOCODE_API_KEY = "config.params.extra.geocode_api_key" -SECRET_KEY_SAFETY_HARNESS_JUDGE_API_KEY = "config.params.extra.judge.model.api_endpoint.api_key" -SECRET_KEY_TARGET_RETRIEVER_QUERY_API_TOKEN = "target.retriever.pipeline.query_embedding_model.api_endpoint.api_key" -SECRET_KEY_TARGET_RETRIEVER_INDEX_API_TOKEN = "target.retriever.pipeline.index_embedding_model.api_endpoint.api_key" -SECRET_KEY_TARGET_RAG_QUERY_API_TOKEN = ( - "target.rag.pipeline.retriever.pipeline.query_embedding_model.api_endpoint.api_key" -) -SECRET_KEY_TARGET_RAG_INDEX_API_TOKEN = ( - "target.rag.pipeline.retriever.pipeline.index_embedding_model.api_endpoint.api_key" -) -SECRET_KEY_TARGET_RAG_MODEL_API_TOKEN = "target.rag.pipeline.model.api_endpoint.api_key" -SECRET_KEY_SIMPLE_EVALS_JUDGE_API_KEY = "config.params.extra.judge.api_key" diff --git a/services/evaluator/src/nmp/evaluator/entities/__init__.py b/services/evaluator/src/nmp/evaluator/entities/__init__.py deleted file mode 100644 index 9dd5062098..0000000000 --- a/services/evaluator/src/nmp/evaluator/entities/__init__.py +++ /dev/null @@ -1,78 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Benchmarks -from nmp.evaluator.entities.benchmarks import ( - Benchmark, - SystemBenchmark, -) - -# Metrics -from nmp.evaluator.entities.metrics import ( - AgentGoalAccuracyMetric, - AnswerAccuracyMetric, - BLEUMetric, - ContextEntityRecallMetric, - ContextPrecisionMetric, - ContextRecallMetric, - ContextRelevanceMetric, - ExactMatchMetric, - F1Metric, - FaithfulnessMetric, - LLMJudgeMetric, - Metric, - NemoAgentToolkitRemoteMetric, - NoiseSensitivityMetric, - NumberCheckMetric, - RemoteMetric, - ResponseGroundednessMetric, - ResponseRelevancyMetric, - ROUGEMetric, - StringCheckMetric, - SystemMetric, - ToolCallAccuracyMetric, - ToolCallingMetric, - TopicAdherenceMetric, -) - -# Results -from nmp.evaluator.entities.results import ( - BenchmarkJobResult, - MetricJobResult, -) - -__all__ = [ - # Benchmarks - "Benchmark", - "SystemBenchmark", - # Metrics - "Metric", - # System Metric Types (still needed for metric definitions) - "SystemMetric", - # Custom Metric Types - "BLEUMetric", - "ExactMatchMetric", - "F1Metric", - "LLMJudgeMetric", - "NumberCheckMetric", - "RemoteMetric", - "NemoAgentToolkitRemoteMetric", - "ROUGEMetric", - "StringCheckMetric", - "ToolCallingMetric", - "TopicAdherenceMetric", - "ToolCallAccuracyMetric", - "AgentGoalAccuracyMetric", - "AnswerAccuracyMetric", - "ContextRelevanceMetric", - "ResponseGroundednessMetric", - "ContextRecallMetric", - "ContextPrecisionMetric", - "ContextEntityRecallMetric", - "ResponseRelevancyMetric", - "FaithfulnessMetric", - "NoiseSensitivityMetric", - # Results - "BenchmarkJobResult", - "MetricJobResult", -] diff --git a/services/evaluator/src/nmp/evaluator/entities/benchmarks.py b/services/evaluator/src/nmp/evaluator/entities/benchmarks.py deleted file mode 100644 index 12aad9db7e..0000000000 --- a/services/evaluator/src/nmp/evaluator/entities/benchmarks.py +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from typing import ClassVar - -import nmp.evaluator.app.values as app -from nmp.common.entities import SYSTEM_WORKSPACE -from nmp.common.entities.client import EntityBase -from nmp.evaluator.entities.metrics import Metric -from nmp.evaluator.entities.utils import EmbeddedEntityMixin -from pydantic import Field - - -class Benchmark(EmbeddedEntityMixin, app.Benchmark, EntityBase): - """Benchmark entity for grouping metrics.""" - - __embedded_entity_fields__: ClassVar[dict[str, type]] = {"metrics": Metric} # ty: ignore[invalid-assignment] - metrics: list[Metric] = Field(min_length=1, description="List of metrics that comprise this benchmark.") - - -class SystemBenchmark(app.SystemBenchmark, EntityBase): - """Base class for inline system benchmarks""" - - __entity_type__: ClassVar[str] = "benchmark" - - workspace: str = Field(default=SYSTEM_WORKSPACE) diff --git a/services/evaluator/src/nmp/evaluator/entities/metrics.py b/services/evaluator/src/nmp/evaluator/entities/metrics.py deleted file mode 100644 index 3e10d6a35c..0000000000 --- a/services/evaluator/src/nmp/evaluator/entities/metrics.py +++ /dev/null @@ -1,252 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Metric entity types for the evaluator service. - -This module contains the persisted metric types that inherit from EntityBase. -The inline metric types (no workspace/name) are defined in values/app.py. -""" - -from __future__ import annotations - -from typing import Annotated, Union - -import nmp.evaluator.app.values as app -from nemo_evaluator_sdk.values import metrics -from nmp.common.api.common import SecretRef as ApiSecretRef -from nmp.common.entities import SYSTEM_WORKSPACE -from nmp.common.entities.client import EntityBase -from nmp.evaluator.api.v2.common.inline_models import Model -from pydantic import BaseModel, Field - -# ============================================================================= -# System Metric Types -# ============================================================================= - - -class SystemMetric(app.SystemMetric, EntityBase): - workspace: str = Field(default=SYSTEM_WORKSPACE) - - -# ============================================================================= -# Field-override mixins -# -# Entity types appear in the public OpenAPI surface (for example via -# Benchmark.metrics). They must use the strict service `ApiSecretRef` and the -# wrapper `Model` from `inline_models`, not the relaxed SDK types — otherwise -# the SDK's broader `SecretRef` pattern leaks into the spec. Mixins (rather -# than per-class re-annotations) preserve the parent's field metadata -# (`description`, `examples`) which Pydantic v2 does not inherit on -# annotation-only overrides. -# ============================================================================= - - -class WithModel(BaseModel): - model: Model = Field( - description=metrics.LLMJudge.model_fields["model"].description, - examples=metrics.LLMJudge.model_fields["model"].examples, - ) - - -class WithJudgeModel(BaseModel): - judge_model: Model = Field(description=metrics.TopicAdherence.model_fields["judge_model"].description) - - -class WithEmbeddingsModel(BaseModel): - embeddings_model: Model = Field(description=metrics.ResponseRelevancy.model_fields["embeddings_model"].description) - - -class WithApiKeySecret(BaseModel): - api_key_secret: ApiSecretRef | None = Field( - default=None, - description=metrics.Remote.model_fields["api_key_secret"].description, - ) - - -# ============================================================================= -# Persisted Metric Types (with workspace/name from EntityBase) -# -# These inherit from the SDK types + EntityBase to add persistence fields. -# Each `With*` mixin must come BEFORE the SDK base in the MRO so its field -# annotation shadows the parent's. -# ============================================================================= - - -class BLEUMetric(metrics.BLEU, EntityBase): - """Persisted BLEU metric.""" - - pass - - -class ExactMatchMetric(metrics.ExactMatch, EntityBase): - """Persisted Exact Match metric.""" - - pass - - -class F1Metric(metrics.F1, EntityBase): - """Persisted F1 metric.""" - - pass - - -class LLMJudgeMetric(WithModel, metrics.LLMJudge, EntityBase): - """Persisted LLM-as-a-Judge metric.""" - - prompt_template: str | dict = Field( - default_factory=lambda data: metrics.default_judge_prompt_template_for_model(data["model"]), - description=metrics.LLMJudge.model_fields["prompt_template"].description, - examples=metrics.LLMJudge.model_fields["prompt_template"].examples, - ) - - -class NumberCheckMetric(metrics.NumberCheck, EntityBase): - """Persisted number check metric.""" - - pass - - -class RemoteMetric(WithApiKeySecret, metrics.Remote, EntityBase): - """Persisted Remote metric.""" - - pass - - -class NemoAgentToolkitRemoteMetric(WithApiKeySecret, metrics.NemoAgentToolkitRemote, EntityBase): - """Persisted NeMo Agent Toolkit Remote metric.""" - - pass - - -class ROUGEMetric(metrics.ROUGE, EntityBase): - """Persisted ROUGE metric.""" - - pass - - -class StringCheckMetric(metrics.StringCheck, EntityBase): - """Persisted string check metric.""" - - pass - - -class ToolCallingMetric(metrics.ToolCalling, EntityBase): - """Persisted Tool Calling metric.""" - - pass - - -# ============================================================================= -# RAGAS Metrics - Persisted versions of SDK types + EntityBase -# ============================================================================= - - -class TopicAdherenceMetric(WithJudgeModel, metrics.TopicAdherence, EntityBase): - """RAGAS metric for measuring topic adherence.""" - - pass - - -class ToolCallAccuracyMetric(metrics.ToolCallAccuracy, EntityBase): - """RAGAS metric for measuring tool call accuracy.""" - - pass - - -class AgentGoalAccuracyMetric(WithJudgeModel, metrics.AgentGoalAccuracy, EntityBase): - """RAGAS metric for measuring agent goal accuracy.""" - - pass - - -class AnswerAccuracyMetric(WithJudgeModel, metrics.AnswerAccuracy, EntityBase): - """RAGAS metric for measuring answer accuracy.""" - - pass - - -class ContextRelevanceMetric(WithJudgeModel, metrics.ContextRelevance, EntityBase): - """RAGAS metric for measuring context relevance.""" - - pass - - -class ResponseGroundednessMetric(WithJudgeModel, metrics.ResponseGroundedness, EntityBase): - """RAGAS metric for measuring response groundedness.""" - - pass - - -class ContextRecallMetric(WithJudgeModel, metrics.ContextRecall, EntityBase): - """RAGAS metric for measuring context recall.""" - - pass - - -class ContextPrecisionMetric(WithJudgeModel, metrics.ContextPrecision, EntityBase): - """RAGAS metric for measuring context precision.""" - - pass - - -class ContextEntityRecallMetric(WithJudgeModel, metrics.ContextEntityRecall, EntityBase): - """RAGAS metric for measuring context entity recall.""" - - pass - - -class ResponseRelevancyMetric(WithJudgeModel, WithEmbeddingsModel, metrics.ResponseRelevancy, EntityBase): - """RAGAS metric for measuring response relevancy.""" - - pass - - -class FaithfulnessMetric(WithJudgeModel, metrics.Faithfulness, EntityBase): - """RAGAS metric for measuring faithfulness.""" - - pass - - -class NoiseSensitivityMetric(WithJudgeModel, metrics.NoiseSensitivity, EntityBase): - """RAGAS metric for measuring noise sensitivity.""" - - pass - - -# ============================================================================= -# Union of all persisted metric types (with workspace/name) -# ============================================================================= - -Metric = Annotated[ - Union[ - BLEUMetric, - ExactMatchMetric, - F1Metric, - LLMJudgeMetric, - NumberCheckMetric, - RemoteMetric, - NemoAgentToolkitRemoteMetric, - ROUGEMetric, - StringCheckMetric, - ToolCallingMetric, - # RAGAS Agentic Metrics - TopicAdherenceMetric, - ToolCallAccuracyMetric, - AgentGoalAccuracyMetric, - # RAGAS NVIDIA Metrics - AnswerAccuracyMetric, - ContextRelevanceMetric, - ResponseGroundednessMetric, - # RAGAS RAG Metrics - ContextRecallMetric, - ContextPrecisionMetric, - ContextEntityRecallMetric, - ResponseRelevancyMetric, - FaithfulnessMetric, - NoiseSensitivityMetric, - # EvalFactory System Metrics - SystemMetric, - ], - Field(discriminator="type"), -] -setattr(Metric, "__entity_type__", "metric") diff --git a/services/evaluator/src/nmp/evaluator/entities/results.py b/services/evaluator/src/nmp/evaluator/entities/results.py deleted file mode 100644 index 75c5a86540..0000000000 --- a/services/evaluator/src/nmp/evaluator/entities/results.py +++ /dev/null @@ -1,67 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -""" -Job Result entity types for the evaluator service. - -This module contains the persisted results reflecting job results from file artifacts. -These entities can be natively queried from Entity service. -""" - -from __future__ import annotations - -from typing import ClassVar - -import nmp.evaluator.app.values as app -from nemo_evaluator_sdk.values import AggregateScore -from nmp.common.entities.client import EntityBase -from pydantic import BaseModel, Field - - -class BaseJobResult(BaseModel): - dataset: app.FilesetRef | None = Field( - default=None, - description="The dataset used for the evaluation job to generate the result. This field is only populated when the job specifies a FilesetRef.", - ) - model: app.ModelRef | None = Field( - default=None, - description="The model evaluated for the job to generate the result. This field is only populated when the job specifies a ModelRef.", - ) - labels: dict[str, str] = Field( - default_factory=dict, description="Labels are key-value pairs that can be used for grouping and filtering." - ) - - -# ============================================================================= -# Metric Job Result -# ============================================================================= - - -class MetricJobResult(BaseJobResult, EntityBase): - """ - Result for Metric Job - """ - - __entity_type__: ClassVar[str] = "metric_job_result" - - metric: app.MetricRef | None = Field( - default=None, description="The metric used for the evaluation job to generate the result." - ) - scores: list[AggregateScore] = Field(description="The list of aggregated scores.") - - -# ============================================================================= -# Benchmark Job Result -# ============================================================================= - - -class BenchmarkJobResult(BaseJobResult, EntityBase): - """Aggregated results for a benchmark evaluation.""" - - __entity_type__: ClassVar[str] = "benchmark_job_result" - - benchmark: app.BenchmarkRef = Field(description="The benchmark used for the evaluation job to generate the result.") - metrics: list[app.MetricRef] | None = Field( - default=None, description="The list of metrics used for the evaluation job to generate the result." - ) - results: list[app.BenchmarkMetricResult] = Field(description="Results for each metric in the benchmark.") diff --git a/services/evaluator/src/nmp/evaluator/entities/utils.py b/services/evaluator/src/nmp/evaluator/entities/utils.py deleted file mode 100644 index 38b338fda3..0000000000 --- a/services/evaluator/src/nmp/evaluator/entities/utils.py +++ /dev/null @@ -1,110 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from datetime import datetime -from typing import Any, ClassVar - -from pydantic import TypeAdapter, model_validator - - -class EmbeddedEntityMixin: - """Mixin for entities that contain embedded EntityBase instances. - - This mixin overrides serialization and deserialization behavior to preserve - computed fields (id, created_at, updated_at) on nested EntityBase instances. - - Without this mixin, nested entities lose their IDs and timestamps when stored - because EntityBase uses computed fields backed by PrivateAttr, and the default - _get_data_fields() uses exclude_computed_fields=True which strips these from - ALL nested models. - - Usage: - class MyEntity(EmbeddedEntityMixin, EntityBase): - __embedded_entity_fields__: ClassVar[dict[str, type]] = { - 'items': ItemType, # field_name -> union type or entity type - } - items: list[ItemType] - """ - - # Subclasses must define this mapping of field_name -> type for embedded entities - __embedded_entity_fields__: ClassVar[dict[str, type]] = {} - - def _get_data_fields(self) -> dict[str, Any]: - """Override to preserve nested entity computed fields during serialization. - - Uses exclude_computed_fields=False but explicitly excludes top-level computed - fields by name, so nested entity IDs/timestamps are preserved. - """ - model_dump = getattr(self, "model_dump", None) - if not callable(model_dump): - return {} - - base_fields = getattr(self, "__base_fields__", set()) - private_attributes = getattr(self, "__private_attributes__", {}) - base_private_attrs = getattr(self, "__base_private_attrs__", set()) - - # Exclude top-level computed fields by name instead of using exclude_computed_fields=True - exclude_set = set(base_fields) | {"id", "created_at", "updated_at", "entity_id", "parent"} - data = {k: v for k, v in model_dump(exclude=exclude_set, exclude_computed_fields=False, mode="json").items()} - # Include non-base PrivateAttr fields - for field_name in private_attributes: - if field_name not in base_private_attrs: - data[field_name] = getattr(self, field_name) - return data - - @model_validator(mode="before") - @classmethod - def _restore_embedded_entity_ids(cls, data: dict[str, Any]) -> dict[str, Any]: - """Restore IDs and timestamps to embedded entities during deserialization. - - When data comes back from the entity store, nested entities are dicts with - id/created_at/updated_at fields. This validator extracts those fields, - validates the entity, then sets the private attrs so the computed fields work. - """ - if not isinstance(data, dict): - return data - - embedded_fields = getattr(cls, "__embedded_entity_fields__", {}) - if not embedded_fields: - return data - - for field_name, field_type in embedded_fields.items(): - if field_name not in data: - continue - - field_value = data[field_name] - if not isinstance(field_value, list): - continue - - restored_items = [] - for item in field_value: - if isinstance(item, dict): - # Extract entity fields before validation - entity_id = item.pop("id", None) - created_at = item.pop("created_at", None) - updated_at = item.pop("updated_at", None) - - # Validate the entity using TypeAdapter (works with Annotated unions) - adapter = TypeAdapter(field_type) - entity = adapter.validate_python(item) - - # Restore the entity fields to private attrs - if entity_id: - entity._id = entity_id - if created_at: - entity._created_at = ( - datetime.fromisoformat(created_at) if isinstance(created_at, str) else created_at - ) - if updated_at: - entity._updated_at = ( - datetime.fromisoformat(updated_at) if isinstance(updated_at, str) else updated_at - ) - - restored_items.append(entity) - else: - # Already an entity instance, pass through - restored_items.append(item) - - data[field_name] = restored_items - - return data diff --git a/services/evaluator/src/nmp/evaluator/main.py b/services/evaluator/src/nmp/evaluator/main.py deleted file mode 100644 index d29098d878..0000000000 --- a/services/evaluator/src/nmp/evaluator/main.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -"""Evaluator service entry point.""" - -import uvicorn -from nmp.evaluator.service import EvaluatorService - -# Global service instance for platform integration -service = EvaluatorService() - -# Expose the FastAPI app for uvicorn -app = service.app - - -def run_standalone(): - """Run the evaluator service as a standalone server.""" - uvicorn.run(service.app, host="0.0.0.0", port=7331) - - -if __name__ == "__main__": - run_standalone() diff --git a/services/evaluator/src/nmp/evaluator/service.py b/services/evaluator/src/nmp/evaluator/service.py deleted file mode 100644 index 58168adcf3..0000000000 --- a/services/evaluator/src/nmp/evaluator/service.py +++ /dev/null @@ -1,146 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -"""Evaluator service implementation.""" - -import logging -from typing import Any, Callable, ClassVar, List - -from fastapi import FastAPI, Request, Response, status -from fastapi.openapi.utils import get_openapi -from nmp.common.api.utils import IDConvertor, register_query_param_schemas, tweak_spec -from nmp.common.entities import EntityConflictError -from nmp.common.service import RouterConfig, Service -from nmp.evaluator.api.v2.benchmarks import endpoints as benchmarks -from nmp.evaluator.api.v2.metrics import endpoints as metrics -from opentelemetry import trace -from pydantic_core import ValidationError -from starlette.convertors import register_url_convertor -from starlette.middleware.base import BaseHTTPMiddleware -from starlette.responses import JSONResponse - -logger = logging.getLogger(__name__) - -tags_metadata = [ - {"name": "Evaluator", "description": "Operations related to evaluation."}, - { - "name": "Health Checks", - "description": "Operations related to NeMo Platform health.", - }, - {"name": "Internal API", "description": "Internal endpoints for job status updates."}, -] - - -class CaptureTraceId(BaseHTTPMiddleware): - """Middleware to capture and return trace ID in response headers.""" - - async def dispatch(self, request: Request, call_next: Callable) -> Response: - trace_id = trace.get_current_span().get_span_context().trace_id - response = await call_next(request) - response.headers["X-Trace-Id"] = format(trace_id, "x") - return response - - -class EvaluatorService(Service): - """Evaluation service for NeMo Platform.""" - - dependencies: ClassVar[List[str]] = ["entities", "auth", "secrets", "jobs", "files"] - - def __init__(self): - """Initialize the evaluation service.""" - super().__init__(name="evaluation", module_name="nmp.evaluator") - - @property - def title(self) -> str: - return "NeMo Evaluator Microservice" - - @property - def description(self) -> str: - return "The NeMo Evaluator is the one-stop shop for evaluation needs as part of the NeMo Platform ecosystem." - - def get_routers(self) -> List[RouterConfig]: - """Return routers for the evaluator service.""" - return [ - RouterConfig( - benchmarks.router, - tag="Evaluator", - description="Evaluation benchmark endpoints", - ), - RouterConfig( - metrics.router, - tag="Evaluator", - description="Evaluation metric endpoints", - ), - ] - - async def on_startup(self) -> None: - """Initialize service on startup.""" - # Register URL convertor - register_url_convertor("id", IDConvertor()) - - def create_app(self) -> FastAPI: - """Create and return the FastAPI application with custom middleware and handlers.""" - # Call parent to create base app - app = super().create_app() - - # Add trace ID middleware - app.add_middleware(CaptureTraceId) # ty: ignore[invalid-argument-type] - - # Register exception handlers - self._register_exception_handlers(app) - - # Custom OpenAPI schema - def custom_openapi() -> dict[str, Any]: - return self._custom_openapi(app) - - setattr(app, "openapi", custom_openapi) - - return app - - def _register_exception_handlers(self, app: FastAPI) -> None: - """Register custom exception handlers.""" - - @app.exception_handler(ValidationError) - async def validation_error_handler(request: Request, ex: ValidationError): - return JSONResponse( - status_code=status.HTTP_422_UNPROCESSABLE_CONTENT, - content={"detail": str(ex)}, - ) - - @app.exception_handler(EntityConflictError) - async def resource_already_exists_handler(request: Request, ex: EntityConflictError): - return JSONResponse( - status_code=status.HTTP_409_CONFLICT, - content={"detail": str(ex)}, - ) - - @app.exception_handler(Exception) - async def global_exception_handler(request: Request, exc: Exception): - return JSONResponse( - status_code=500, - content={"detail": "Internal Server Error"}, - ) - - def _custom_openapi(self, app: FastAPI) -> dict[str, Any]: - """Generate custom OpenAPI schema.""" - if app.openapi_schema: - return app.openapi_schema - - openapi_schema = get_openapi( - title=self.title, - version=self.version, - summary=self.description, - description="", - routes=app.routes, - tags=tags_metadata, - ) - openapi_schema = register_query_param_schemas(openapi_schema) - openapi_schema = tweak_spec(openapi_schema) - app.openapi_schema = openapi_schema - return app.openapi_schema diff --git a/services/evaluator/src/nmp/evaluator/tasks/__init__.py b/services/evaluator/src/nmp/evaluator/tasks/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/src/nmp/evaluator/tasks/download_fileset/__init__.py b/services/evaluator/src/nmp/evaluator/tasks/download_fileset/__init__.py deleted file mode 100644 index c7e255d899..0000000000 --- a/services/evaluator/src/nmp/evaluator/tasks/download_fileset/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Download fileset task package. - -This task downloads datasets from filesets to the local filesystem. -""" - -from nmp.evaluator.tasks.download_fileset.__main__ import run - -__all__ = ["run"] diff --git a/services/evaluator/src/nmp/evaluator/tasks/download_fileset/__main__.py b/services/evaluator/src/nmp/evaluator/tasks/download_fileset/__main__.py deleted file mode 100644 index 8681052ab6..0000000000 --- a/services/evaluator/src/nmp/evaluator/tasks/download_fileset/__main__.py +++ /dev/null @@ -1,148 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import argparse -import asyncio -import json -import logging -import os -import shutil -from collections.abc import Sequence -from pathlib import Path - -from nemo_platform import AsyncNeMoPlatform -from nmp.common.sdk_factory import get_async_platform_sdk -from nmp.evaluator.app.datasets.nmp_datasets.fileset import download_dataset -from nmp.evaluator.app.tasks.termination import register_task_signal_handlers -from nmp.evaluator.app.values import Dataset -from pydantic import TypeAdapter - -log = logging.getLogger(__name__) - -DatasetAdapter = TypeAdapter(Dataset) - - -def move_to_target(local_dir: str, target_dir: str) -> None: - """Move downloaded files from scratch to shared storage.""" - target = Path(target_dir) - target.mkdir(parents=True, exist_ok=True) - for item in Path(local_dir).iterdir(): - dest = target / item.name - try: - # If the destination file or directory already exists, remove it - # and replace it with the new fileset. - if dest.exists(): - if dest.is_dir(): - shutil.rmtree(dest) - log.warning( - f"Removed existing directory when copying from local_dir to target_dir due to name collision: {dest}" - ) - else: - dest.unlink() - log.warning( - f"Removed existing file when copying from local_dir to target_dir due to name collision: {dest}" - ) - shutil.move(item, dest) - except OSError as e: - log.error(f"Failed to move {item} to {dest}: {e}") - raise - - -async def main( - args: Sequence[str] | None = None, - *, - sdk: AsyncNeMoPlatform | None = None, -) -> int: - """Async implementation of the download_fileset task. - - Args: - args: Optional list of CLI arguments (for testing). If None, uses sys.argv. - sdk: Optional SDK instance for dependency injection (for testing). - If None, uses get_async_platform_sdk(). - - Returns: - Exit code (0 for success, 1 for failure). - """ - parser = argparse.ArgumentParser(description="Download a fileset from NeMo Platform") - parser.add_argument( - "--dataset", - help="JSON string representing the dataset (FilesetRef or Fileset)", - ) - parser.add_argument( - "--dataset-file", - type=str, - help="Dataset file path to load DatasetRows.", - ) - parser.add_argument("--local-dir", required=True, help="Local directory to download the fileset to") - parser.add_argument( - "--target-dir", - required=False, - help="Optional target directory on shared storage to move downloaded files into", - ) - - parsed_args = parser.parse_args(args) - - if parsed_args.dataset is None and parsed_args.dataset_file is None: - parser.error("--dataset or --dataset-file is required") - elif parsed_args.dataset and parsed_args.dataset_file: - parser.error("--dataset and --dataset-file cannot both be set") - - try: - effective_sdk = sdk or get_async_platform_sdk() - local_dir = os.path.expandvars(parsed_args.local_dir) - target_dir = os.path.expandvars(parsed_args.target_dir) if parsed_args.target_dir else None - - if parsed_args.dataset: - dataset_json = json.loads(parsed_args.dataset) - else: - with open(parsed_args.dataset_file, "r") as f: - dataset_json = json.load(f) - - dataset = DatasetAdapter.validate_python(dataset_json) - - await download_dataset( - sdk=effective_sdk, - dataset=dataset, - destination=local_dir, - ) - - if target_dir and Path(local_dir).resolve() != Path(target_dir).resolve(): - move_to_target(local_dir, target_dir) - log.info(f"Fileset moved successfully from {local_dir} to {target_dir}") - else: - log.info(f"Fileset downloaded successfully to: {local_dir}") - - return 0 - except Exception: - log.exception("Error downloading fileset") - return 1 - - -def run( - args: Sequence[str] | None = None, - *, - sdk: AsyncNeMoPlatform | None = None, -) -> int: - """Synchronous entry point for the download_fileset task. - - Args: - args: Optional list of CLI arguments (for testing). If None, uses sys.argv. - sdk: Optional SDK instance for dependency injection (for testing). - If None, uses get_async_platform_sdk(). - - Returns: - Exit code (0 for success, 1 for failure). - """ - register_task_signal_handlers() - try: - return asyncio.run(main(args, sdk=sdk)) - except KeyboardInterrupt: - log.info("Received termination signal. Exiting task gracefully.") - return 0 - except Exception: - log.exception("Error in download_fileset task") - return 1 - - -if __name__ == "__main__": - raise SystemExit(run()) diff --git a/services/evaluator/src/nmp/evaluator/tasks/evaluate_benchmark/__init__.py b/services/evaluator/src/nmp/evaluator/tasks/evaluate_benchmark/__init__.py deleted file mode 100644 index f516be53ae..0000000000 --- a/services/evaluator/src/nmp/evaluator/tasks/evaluate_benchmark/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -"""Evaluate a benchmark with NeMo Evaluator. - -This module provides the containerized task for running benchmark evaluations, -which evaluate all metrics in a benchmark against a dataset. -""" - -from nmp.evaluator.tasks.evaluate_benchmark.__main__ import ( - benchmark_evaluation_entrypoint, - benchmark_evaluation_entrypoint_args, - evaluate_benchmark, - run, -) - -__all__ = [ - "benchmark_evaluation_entrypoint", - "benchmark_evaluation_entrypoint_args", - "evaluate_benchmark", - "run", -] diff --git a/services/evaluator/src/nmp/evaluator/tasks/evaluate_benchmark/__main__.py b/services/evaluator/src/nmp/evaluator/tasks/evaluate_benchmark/__main__.py deleted file mode 100644 index 1786d5aae3..0000000000 --- a/services/evaluator/src/nmp/evaluator/tasks/evaluate_benchmark/__main__.py +++ /dev/null @@ -1,497 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. - -import asyncio -import json -import logging -import os -from collections.abc import Sequence -from pathlib import Path -from typing import Any, cast - -from nemo_evaluator_sdk.agent_inference import AgentInferenceFn, make_agent_inference_request -from nemo_evaluator_sdk.execution.benchmark_execution import evaluate_benchmark as sdk_evaluate_benchmark -from nemo_evaluator_sdk.execution.values import EvaluationError -from nemo_evaluator_sdk.inference import InferenceFn, make_inference_request -from nemo_evaluator_sdk.resilience.errors import first_failure_cause -from nemo_evaluator_sdk.values import ( - Agent, - Model, - RowScore, - RunConfig, - RunConfigOnline, - RunConfigOnlineModel, -) -from nemo_platform import AsyncNeMoPlatform -from nmp.common.jobs.constants import ( - DEFAULT_JOB_STORAGE_PATH, - DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH, - NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, - PERSISTENT_JOB_STORAGE_PATH_ENVVAR, -) -from nmp.common.observability.otel import initialize_logging -from nmp.common.sdk_factory import get_async_platform_sdk -from nmp.evaluator.app.dataset_schemas import apply_column_mapping_to_row -from nmp.evaluator.app.datasets.loader import DatasetLoadError, load_dataset_from_ref_as_dicts -from nmp.evaluator.app.inference import get_platform_headers -from nmp.evaluator.app.inference_hooks import ProgressTrackingHook, new_hooks - -# Use the same file naming convention as metrics for consistency -from nmp.evaluator.app.jobs.constants import ( - EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_ROW_SCORES_FILE_NAME, -) -from nmp.evaluator.app.jobs.metric_results import ResultsHandlerConfig, handle_results_async -from nmp.evaluator.app.jobs.progress_tracking import ProgressTracking -from nmp.evaluator.app.metrics.metric import new_metric -from nmp.evaluator.app.tasks.termination import register_task_signal_handlers -from nmp.evaluator.app.values import ( - BenchmarkEvaluationResult, - BenchmarkJobAdapter, - BenchmarkOfflineJob, - BenchmarkOnlineAgentJob, - BenchmarkOnlineJob, -) - -log = logging.getLogger(__name__) - - -_BenchmarkJob = BenchmarkOfflineJob | BenchmarkOnlineJob | BenchmarkOnlineAgentJob - - -def _apply_optional_fields_to_row(row: dict, optional_fields: set[str]) -> dict: - normalized = dict(row) - for field in optional_fields: - normalized.setdefault(field, "") - return normalized - - -# ============================================================================= -# Artifacts -# ============================================================================= - - -def job_artifacts_dump( - job: _BenchmarkJob, - evaluation_result: BenchmarkEvaluationResult, - row_scores: list[RowScore], - results_dir: str, -): - """Write job artifacts to file. - - * job.json: job configuration - * benchmark_row_scores.jsonl: row-level scores for each item - * benchmark_results.json: aggregated evaluation for all metrics - """ - os.makedirs(results_dir, exist_ok=True) - - with open(f"{results_dir}/job.json", "w") as f: - f.write(job.model_dump_json(indent=2, exclude_none=True)) - - with open(f"{results_dir}/{EVALUATION_RESULTS_ROW_SCORES_FILE_NAME}", "w") as f: - for row in row_scores: - f.write(row.model_dump_json() + "\n") - - with open(os.path.join(results_dir, EVALUATION_RESULTS_AGG_SCORES_FILE_NAME), "w") as f: - f.write(evaluation_result.model_dump_json(indent=2, exclude_none=True)) - - -# ============================================================================= -# Entrypoint -# ============================================================================= - - -def benchmark_evaluation_entrypoint() -> list[str]: - """Entrypoint for benchmark evaluation job.""" - return ["python", "-m", "nmp.evaluator.tasks.evaluate_benchmark"] - - -def benchmark_evaluation_entrypoint_args( - progress_tracking_url: str | None = None, - progress_tracking_interval: int | None = None, -) -> list[str]: - """Command args to run benchmark evaluation job.""" - command: list[str] = [] - if progress_tracking_url: - command.extend(["--progress-tracking-url", progress_tracking_url]) - if progress_tracking_interval: - command.extend(["--progress-tracking-interval", str(progress_tracking_interval)]) - return command - - -def _default_results_dir() -> str: - return str(Path(os.environ.get(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, DEFAULT_JOB_STORAGE_PATH)) / "results") - - -def _default_dataset_dir() -> str: - return str(Path(os.environ.get(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, DEFAULT_JOB_STORAGE_PATH)) / "datasets") - - -def _default_config_file() -> str: - return os.environ.get(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH) - - -def _build_results_handler_config(skip_upload_results: bool) -> ResultsHandlerConfig: - """Build result-upload configuration from env or no-op placeholders. - - When uploads are enabled, this relies on ``BaseSettings`` environment - resolution to populate the required Jobs MS fields. - """ - if skip_upload_results: - return ResultsHandlerConfig(NEMO_JOB_ID="", NEMO_JOB_WORKSPACE="") - results_handler_config = cast(Any, ResultsHandlerConfig)() - return results_handler_config - - -def _resolve_effective_params( - job: _BenchmarkJob, -) -> RunConfig | RunConfigOnline | RunConfigOnlineModel: - """Return a concrete params object for the benchmark job type. - - Benchmark jobs allow ``params=None`` in their schemas, but the execution - path expects a concrete params model when reading fields like - ``limit_samples`` or forwarding params into the SDK runtime. - """ - if isinstance(job, BenchmarkOnlineAgentJob): - return job.params or RunConfigOnline() - if isinstance(job, BenchmarkOnlineJob): - return job.params or RunConfigOnlineModel() - return job.params or RunConfig() - - -# ============================================================================= -# Dataset Loading -# ============================================================================= - - -def _load_dataset_items(job: _BenchmarkJob, dataset_dir: str | None = None) -> list[dict]: - """Load dataset items from the benchmark's dataset (downloaded file). - - Benchmark datasets are always FilesetRefs that should have been downloaded - by a prior dataset-download step. The download step places files at: - {dataset_dir}/{workspace}/{fileset-name}/ - - The FilesetRef can include a fragment to specify which files to load: - - workspace/fileset: Load all parsable files - - workspace/fileset#file.json: Load a specific file - - workspace/fileset#*.jsonl: Load files matching a glob pattern - - Args: - job: The benchmark job containing the benchmark configuration. - dataset_dir: Base directory for downloaded datasets. Defaults to the job runtime storage dataset directory. - - Returns: - List of dataset items for evaluation. - """ - effective_dir = dataset_dir or _default_dataset_dir() - optional_fields = { - field - for benchmark_metric in job.benchmark.metrics - for field in getattr(benchmark_metric.metric, "optional_fields", []) - } - - # FilesetRef downloads to {dataset_dir}/{workspace}/{fileset-name}/ - # The dataset.root is in format "workspace/fileset-name[#pattern]" - dataset_ref = job.benchmark.dataset.root - - try: - items = load_dataset_from_ref_as_dicts(dataset_ref, base_dir=effective_dir) - except DatasetLoadError as e: - raise ValueError( - f"Failed to load benchmark dataset '{dataset_ref}': {e}. " - f"The dataset should have been downloaded by the dataset-download step." - ) from e - - if not items: - raise ValueError(f"Benchmark dataset '{dataset_ref}' is empty") - - log.info(f"Loaded {len(items)} items from benchmark dataset '{dataset_ref}'") - return [ - _apply_optional_fields_to_row(apply_column_mapping_to_row(item, job.benchmark.field_mapping), optional_fields) - for item in items - ] - - -# ============================================================================= -# Evaluation Logic -# ============================================================================= - - -async def evaluate_benchmark( - job: _BenchmarkJob, - results_dir: str, - progress_tracking: ProgressTracking | None = None, - *, - dataset_dir: str | None = None, - inference_fn: InferenceFn | None = None, -) -> BenchmarkEvaluationResult: - """Entrypoint to run benchmark evaluation with Jobs MS. - - Evaluates all metrics in the benchmark against the dataset. - - Args: - job: The benchmark job configuration. - results_dir: Directory to write evaluation results. - progress_tracking: Optional progress tracking for job updates. - dataset_dir: Directory containing downloaded dataset files. - inference_fn: Function to make inference requests. - - Returns: - BenchmarkEvaluationResult with aggregated results per metric. - """ - judge_inference_fn: InferenceFn = inference_fn or make_inference_request - effective_params = _resolve_effective_params(job) - - benchmark = job.benchmark - log.info( - "Starting benchmark evaluation", - extra={ - "benchmark_name": benchmark.name, - "metric_count": len(benchmark.metrics), - }, - ) - - # Load dataset items - items = _load_dataset_items(job, dataset_dir=dataset_dir) - - if effective_params.limit_samples: - log.debug("Limiting samples", extra={"limit": effective_params.limit_samples}) - items = items[: effective_params.limit_samples] - - log.debug("Evaluation configuration", extra={"results_dir": results_dir, "total_rows": len(items)}) - - # Prepare target (model or agent) for online evaluation - target: Model | Agent | None = None - target_inference_fn: InferenceFn | AgentInferenceFn | None = None - preprocess_hooks, postprocess_hooks = [], [] - default_headers: dict[str, str] | None = None - - # TODO: Hooks to be aware of agents as well. - if isinstance(job, BenchmarkOnlineAgentJob): - target = job.agent - target_inference_fn = make_agent_inference_request - default_headers = get_platform_headers(job.agent.url) - preprocess_hooks, postprocess_hooks = new_hooks(effective_params) - elif isinstance(job, BenchmarkOnlineJob): - target = job.model - target_inference_fn = judge_inference_fn - default_headers = get_platform_headers(job.model.url) - preprocess_hooks, postprocess_hooks = new_hooks(effective_params, target.format) - - if progress_tracking: - progress_tracking.total_samples = len(items) - progress_tracking.total_work = len(items) * len(benchmark.metrics) - # Setup progress tracking as a hook - postprocess_hooks.append(ProgressTrackingHook(progress_tracking)) - log.debug("Progress tracking configured", extra={"interval": progress_tracking.interval}) - - metric_instances = [] - for bm in benchmark.metrics: - metric = await new_metric( - bm.metric, - job.__job_type__, - inference_fn=judge_inference_fn, - run_preflight=True, - ) - metric_instances.append(metric) - - metrics_built = [ - (bm.metric_ref.root, metric) for bm, metric in zip(benchmark.metrics, metric_instances, strict=True) - ] - - try: - sdk_result = await sdk_evaluate_benchmark( - metrics=metrics_built, - rows=items, - target=target, - inference_fn=target_inference_fn, - params=effective_params, - prompt_template=getattr(job, "prompt_template", None), - preprocess_hooks=preprocess_hooks, - postprocess_hooks=postprocess_hooks, - default_headers=default_headers, - progress=progress_tracking, - logger=log, - ) - except EvaluationError as exc: - log.exception( - "Benchmark evaluation failed", - extra={ - "phase": exc.phase.value, - "metric_key": exc.metric_key, - "row_index": exc.index, - "error": exc.message, - }, - ) - raise - except Exception as exc: - # Anything here is not a structured row-level benchmark failure. Keep - # the raw exception for unexpected SDK pipeline or aggregation errors. - root = first_failure_cause(exc) - log.exception( - "Benchmark execution failed with an unexpected pipeline error", - extra={ - "root_error_type": type(root).__name__, - "root_error": str(root), - "raw_error_type": type(exc).__name__, - }, - ) - raise - - row_scores: list[RowScore] = list(sdk_result.row_scores) - evaluation_result = BenchmarkEvaluationResult.from_sdk_results(sdk_result, benchmark.metrics) - - for metric_result in evaluation_result.results: - log.info( - "Metric evaluation completed", - extra={ - "metric_ref": metric_result.metric.root if metric_result.metric is not None else None, - "scores": {s.name: (round(s.mean, 4) if s.mean is not None else None) for s in metric_result.scores}, - }, - ) - - log.debug("Writing job artifacts to disk") - job_artifacts_dump(job, evaluation_result, row_scores, results_dir) - - log.info("Benchmark evaluation completed", extra={"benchmark_name": benchmark.name}) - - if progress_tracking: - if isinstance(job, BenchmarkOfflineJob): - # This is a placeholder until we resolve conflict with benchmark pipeline refactor - progress_tracking.increment_samples_processed(len(items)) - progress_tracking.update_progress(100) - - return evaluation_result - - -# ============================================================================= -# CLI Entry Point -# ============================================================================= - - -async def main( - args: Sequence[str] | None = None, - *, - sdk: AsyncNeMoPlatform | None = None, -) -> int: - """Main entry point for the evaluate_benchmark task. - - Args: - args: Optional list of CLI arguments (for testing). If None, uses sys.argv. - sdk: Optional SDK instance for dependency injection (for testing). - - Returns: - Exit code (0 for success, non-zero for failure). - """ - import argparse - - initialize_logging() - - parser = argparse.ArgumentParser(description="Evaluate a benchmark") - parser.add_argument( - "--progress-tracking-url", - type=str, - default=os.getenv("EVALUATIONS_CALLBACK_URL"), - help="Optional callback URL to update progress tracking details.", - ) - parser.add_argument( - "--progress-tracking-interval", - type=int, - default=50, - help="Interval to update progress tracking details.", - ) - parser.add_argument( - "--progress-tracking-interval-seconds", - type=int, - default=60, - help="Time interval (seconds) to update progress tracking details.", - ) - parser.add_argument( - "--skip-upload-results", - action="store_true", - default=False, - help="Skip uploading results to Jobs MS", - ) - parsed_args = parser.parse_args(args) - results_dir = _default_results_dir() - config_file = _default_config_file() - - results_handler_config = _build_results_handler_config(parsed_args.skip_upload_results) - - with open(config_file, "r") as f: - job_config = json.load(f) - - job: _BenchmarkJob = BenchmarkJobAdapter.validate_python(job_config) - - progress_tracking = None - try: - if parsed_args.progress_tracking_url: - progress_tracking = ProgressTracking( - parsed_args.progress_tracking_url, - parsed_args.progress_tracking_interval, - parsed_args.progress_tracking_interval_seconds, - ) - else: - log.warning("Progress tracking is not configured.") - - evaluation_result = await evaluate_benchmark(job, results_dir, progress_tracking) - - if not parsed_args.skip_upload_results: - effective_sdk = sdk or get_async_platform_sdk() - await handle_results_async(job, results_handler_config, results_dir, sdk=effective_sdk) - - # Check if any metrics have results - has_results = any( - any(score.count > 0 for score in metric_result.scores) for metric_result in evaluation_result.results - ) - - if not has_results: - raise ValueError( - f"Job {results_handler_config.NEMO_JOB_ID} completed but no evaluation results detected. " - f"Job marked as failed." - ) - - return 0 - finally: - if progress_tracking: - progress_tracking.stop() - - -def run( - args: Sequence[str] | None = None, - *, - sdk: AsyncNeMoPlatform | None = None, -) -> int: - """Synchronous wrapper for main() - for task_harness compatibility. - - Args: - args: Optional list of CLI arguments (for testing). If None, uses sys.argv. - sdk: Optional SDK instance for dependency injection (for testing). - - Returns: - Exit code (0 for success, non-zero for failure). - """ - register_task_signal_handlers() - try: - return asyncio.run(main(args, sdk=sdk)) - except KeyboardInterrupt: - log.info("Received termination signal. Exiting task gracefully.") - return 0 - except BaseException as exc: - root = first_failure_cause(exc) - log.exception( - "Error in evaluate_benchmark task", - extra={"root_error_type": type(root).__name__, "root_error": str(root)}, - ) - return 1 - - -if __name__ == "__main__": - raise SystemExit(run()) diff --git a/services/evaluator/src/nmp/evaluator/tasks/evaluate_metric/__init__.py b/services/evaluator/src/nmp/evaluator/tasks/evaluate_metric/__init__.py deleted file mode 100644 index 67a3baef91..0000000000 --- a/services/evaluator/src/nmp/evaluator/tasks/evaluate_metric/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -"""Evaluate a metric with NeMo Evaluator. - -This module provides the containerized task for running custom evaluations. -""" - -from nmp.evaluator.tasks.evaluate_metric.__main__ import ( - evaluate_metric, - metric_evaluation_entrypoint, - metric_evaluation_entrypoint_args, - run, -) - -__all__ = [ - "metric_evaluation_entrypoint", - "metric_evaluation_entrypoint_args", - "evaluate_metric", - "run", -] diff --git a/services/evaluator/src/nmp/evaluator/tasks/evaluate_metric/__main__.py b/services/evaluator/src/nmp/evaluator/tasks/evaluate_metric/__main__.py deleted file mode 100644 index 1e63a53911..0000000000 --- a/services/evaluator/src/nmp/evaluator/tasks/evaluate_metric/__main__.py +++ /dev/null @@ -1,508 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -import asyncio -import json -import logging -import os -from collections.abc import Sequence -from pathlib import Path -from typing import Any, cast - -from nemo_evaluator_sdk.agent_inference import make_agent_inference_request, new_agent_inference_client -from nemo_evaluator_sdk.dataset_schemas.compatibility import apply_column_mapping_to_row -from nemo_evaluator_sdk.execution.metric_execution import ( - ComputeMetricPipeline, - run_generated_sample_scoring_pipeline, -) -from nemo_evaluator_sdk.execution.scoring import finalize_evaluation_result -from nemo_evaluator_sdk.execution.values import EvaluationError -from nemo_evaluator_sdk.inference import InferenceFn, make_inference_request, new_inference_client -from nemo_evaluator_sdk.metrics.utils import metric_type_name -from nemo_evaluator_sdk.resilience.errors import get_evaluation_error -from nemo_evaluator_sdk.values import ( - AggregatedMetricResult, - DatasetRows, - RowScore, -) -from nemo_platform import AsyncNeMoPlatform -from nmp.common.jobs.constants import ( - DEFAULT_JOB_STORAGE_PATH, - DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH, - NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, - PERSISTENT_JOB_STORAGE_PATH_ENVVAR, -) -from nmp.common.observability.otel import initialize_logging -from nmp.common.sdk_factory import get_async_platform_sdk -from nmp.evaluator.app import inference_hooks -from nmp.evaluator.app.datasets.loader import DatasetLoadError, load_dataset_from_ref_as_dicts -from nmp.evaluator.app.inference import get_platform_headers -from nmp.evaluator.app.jobs.constants import ( - EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_ROW_SCORES_FILE_NAME, -) -from nmp.evaluator.app.jobs.metric_results import ResultsHandlerConfig, handle_results_async -from nmp.evaluator.app.jobs.progress_tracking import ProgressTracking -from nmp.evaluator.app.metrics.metric import new_metric -from nmp.evaluator.app.tasks.termination import register_task_signal_handlers -from nmp.evaluator.app.values import ( - FilesetRef, - MetricJob, - MetricJobAdapter, - MetricOnlineAgentJob, - MetricOnlineJob, -) - -log = logging.getLogger(__name__) - - -def _apply_optional_fields_to_row(row: dict, optional_fields: Sequence[str] | None) -> dict: - normalized = dict(row) - for field in optional_fields or (): - normalized.setdefault(field, "") - return normalized - - -def _json_default(obj): - """Default serializer for json.dumps to handle non-serializable objects. - - Handles LangChain messages, Pydantic models, and other objects with common serialization methods. - """ - # Try common serialization methods in order of preference - if hasattr(obj, "dict"): # LangChain messages, Pydantic v1 - return obj.dict() - if hasattr(obj, "model_dump"): # Pydantic v2 - return obj.model_dump() - if hasattr(obj, "to_dict"): # Other objects - return obj.to_dict() - # Fallback to string representation - return str(obj) - - -def job_artifacts_dump( - job: MetricJob, evaluation_result: AggregatedMetricResult, logs: list[RowScore], results_dir: str -): - """ - Write job artifacts to file - - * job.json: job entity - * results.jsonl: raw evaluation for each row - * evaluation_results.json: aggregated evaluation for the job - """ - os.makedirs(results_dir, exist_ok=True) - - with open(f"{results_dir}/job.json", "w") as f: - f.write(job.model_dump_json(indent=2, exclude_none=True)) - with open(f"{results_dir}/{EVALUATION_RESULTS_ROW_SCORES_FILE_NAME}", "w") as f: - for log_entry in logs: - f.write(json.dumps(log_entry.model_dump(mode="json"), default=_json_default) + "\n") - with open(os.path.join(results_dir, EVALUATION_RESULTS_AGG_SCORES_FILE_NAME), "w") as f: - f.write(evaluation_result.model_dump_json(indent=2, exclude_none=True)) - - -def no_aggregated_metric_scores(evaluation_result: AggregatedMetricResult) -> bool: - """Check if aggregated result has no valid metric scores. - - Returns True if all scores have count=0 (all values were NaN). - """ - if not evaluation_result.scores: - return True - - for score in evaluation_result.scores: - if score.count > 0: - return False - - return True - - -def metric_evaluation_entrypoint() -> list[str]: - """ - Entrypoint for custom eval job. - """ - return ["python", "-m", "nmp.evaluator.tasks.evaluate_metric"] - - -def metric_evaluation_entrypoint_args( - progress_tracking_url: str | None = None, - progress_tracking_interval: int | None = None, -) -> list[str]: - """ - Command args to run custom job. - """ - command: list[str] = [] - if progress_tracking_url: - command.extend(["--progress-tracking-url", progress_tracking_url]) - if progress_tracking_interval: - command.extend(["--progress-tracking-interval", str(progress_tracking_interval)]) - return command - - -def _default_results_dir() -> str: - return str(Path(os.environ.get(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, DEFAULT_JOB_STORAGE_PATH)) / "results") - - -def _default_dataset_dir() -> str: - return str(Path(os.environ.get(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, DEFAULT_JOB_STORAGE_PATH)) / "datasets") - - -def _default_config_file() -> str: - return os.environ.get(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH) - - -def _load_dataset_items(job: MetricJob, dataset_dir: str | None = None) -> list[dict[str, Any]]: - """Load dataset items from inline rows or downloaded fileset. - - For FilesetRef datasets, the data should have been downloaded to the - dataset_dir by a prior dataset-download step. The FilesetRef can include - a fragment to specify which files to load: - - workspace/fileset: Load all parsable files - - workspace/fileset#file.json: Load a specific file - - workspace/fileset#*.jsonl: Load files matching a glob pattern - - Args: - job: The metric job containing the dataset specification. - dataset_dir: Directory containing downloaded dataset files. Defaults to - the job runtime storage dataset directory if not provided. - - Returns: - List of data rows for evaluation. - - Raises: - ValueError: If no data rows are found or dataset cannot be loaded. - """ - dataset = getattr(job, "dataset", None) - metric = getattr(job, "metric", None) - optional_fields = getattr(metric, "optional_fields", []) - field_mapping = getattr(job, "field_mapping", None) - - # Inline dataset - use rows directly - if isinstance(dataset, DatasetRows): - if not dataset.rows: - raise ValueError("DatasetRows has no rows") - return [ - _apply_optional_fields_to_row(apply_column_mapping_to_row(row, field_mapping), optional_fields) - for row in dataset.rows - ] - - # FilesetRef - load from downloaded files using the new loader - # The dataset-download step places files at {dataset_dir}/{workspace}/{fileset-name}/ - if isinstance(dataset, FilesetRef): - effective_dir = dataset_dir or _default_dataset_dir() - dataset_ref = dataset.root - - try: - items = load_dataset_from_ref_as_dicts(dataset_ref, base_dir=effective_dir) - except DatasetLoadError as e: - raise ValueError( - f"Failed to load dataset '{dataset_ref}': {e}. " - f"The dataset should have been downloaded by the dataset-download step." - ) from e - - if not items: - raise ValueError(f"Dataset '{dataset_ref}' is empty") - - log.info(f"Loaded {len(items)} items from dataset '{dataset_ref}'") - return [ - _apply_optional_fields_to_row(apply_column_mapping_to_row(item, field_mapping), optional_fields) - for item in items - ] - - raise ValueError(f"Unsupported dataset type: {type(dataset).__name__}") - - -async def evaluate_metric( - job: MetricJob, - results_dir: str, - progress_tracking: ProgressTracking | None = None, - *, - dataset_dir: str | None = None, - inference_fn: InferenceFn | None = None, -) -> AggregatedMetricResult: - """ - Entrypoint to run offline metric evaluation with Jobs MS. - - Args: - job: The metric job configuration. - results_dir: Directory to write evaluation results. - progress_tracking: Optional progress tracking for job updates. - dataset_dir: Directory containing downloaded dataset files (for FilesetRef datasets). - Defaults to the job runtime storage dataset directory if not provided. - inference_fn: Function to make inference requests. Defaults to - make_inference_request if not provided. - """ - judge_inference_fn: InferenceFn = inference_fn or make_inference_request - log.info( - "Starting metric evaluation", - extra={"metric_type": str(job.metric.type)}, - ) - - # Load dataset items - either from inline rows or from downloaded file - items = _load_dataset_items(job, dataset_dir=dataset_dir) - - log.debug("Job configuration", extra={"results_dir": results_dir, "total_rows": len(items)}) - - if job.params.limit_samples: - log.debug("Limiting samples", extra={"limit": job.params.limit_samples}) - items = items[: job.params.limit_samples] - - log.debug("Creating metric instance", extra={"metric_type": str(job.metric.type)}) - metric = await new_metric(job.metric, job.__job_type__, inference_fn=judge_inference_fn, run_preflight=True) - - # Log evaluation mode; per-branch pipeline construction happens below. - model_format = None - default_headers = None - if isinstance(job, MetricOnlineAgentJob): - log.debug( - "Online evaluation mode (agent)", - extra={ - "agent_name": job.agent.name, - "agent_endpoint": job.agent.url, - "agent_format": job.agent.format, - }, - ) - default_headers = get_platform_headers(job.agent.url) - elif isinstance(job, MetricOnlineJob): - model_format = job.model.format - default_headers = get_platform_headers(job.model.url) - log.debug( - "Online evaluation mode", - extra={ - "model_name": job.model.name, - "model_endpoint": job.model.url, - "model_format": job.model.format, - }, - ) - else: - log.debug("Offline evaluation mode") - - log.info("Evaluating samples", extra={"sample_count": len(items), "parallelism": job.params.parallelism}) - - preprocess_hooks, postprocess_hooks = inference_hooks.new_hooks( - job.params, - model_format=model_format, - ) - - if progress_tracking: - progress_tracking.total_samples = len(items) - postprocess_hooks.append(inference_hooks.ProgressTrackingHook(progress_tracking)) - log.debug( - "Progress tracking configured", - extra={"interval": progress_tracking.interval, "total_samples": progress_tracking.total_samples}, - ) - - metric_key = metric_type_name(metric) - - # Overloaded __init__ enforces Agent↔AgentInferenceFn / Model↔InferenceFn at - # type-check time, so branch on target before constructing the pipeline. - if isinstance(job, MetricOnlineAgentJob): - pipeline = ComputeMetricPipeline( - rows=items, - parallelism=job.params.parallelism, - metric=metric, - target=job.agent, - params=job.params, - prompt_template=job.prompt_template, - metric_key=metric_key, - inference_fn=make_agent_inference_request, - client=new_agent_inference_client(), - preprocess_hooks=preprocess_hooks, - postprocess_hooks=postprocess_hooks, - default_headers=default_headers, - ) - elif isinstance(job, MetricOnlineJob): - pipeline = ComputeMetricPipeline( - rows=items, - parallelism=job.params.parallelism, - metric=metric, - target=job.model, - params=job.params, - prompt_template=job.prompt_template, - metric_key=metric_key, - inference_fn=judge_inference_fn, - client=new_inference_client(job.model), - preprocess_hooks=preprocess_hooks, - postprocess_hooks=postprocess_hooks, - default_headers=default_headers, - ) - else: - pipeline = ComputeMetricPipeline( - rows=items, - parallelism=job.params.parallelism, - metric=metric, - target=None, - metric_key=metric_key, - params=job.params, - preprocess_hooks=preprocess_hooks, - postprocess_hooks=postprocess_hooks, - ) - - try: - eval_result = await run_generated_sample_scoring_pipeline(pipeline) - except Exception as e: - evaluation_error = get_evaluation_error(e) - if isinstance(evaluation_error, EvaluationError): - log.exception( - "Metric evaluation failed", - extra={ - "phase": evaluation_error.phase.value, - "metric_key": evaluation_error.metric_key, - "row_index": evaluation_error.index, - "error": evaluation_error.message, - }, - ) - if evaluation_error.__cause__ is not None: - raise evaluation_error from evaluation_error.__cause__ - raise evaluation_error from e - - log.debug("Aggregating metric results") - evaluation_result = await finalize_evaluation_result(metric, eval_result) - aggregated_result = evaluation_result.aggregate_scores - log.debug( - "Aggregation complete", - extra={ - "input_count": sum(1 for _, result, _ in eval_result if result is not None), - "score_count": len(aggregated_result.scores), - }, - ) - - log.debug("Writing job artifacts to disk") - job_artifacts_dump(job, aggregated_result, evaluation_result.row_scores, results_dir) - - log.info( - "Evaluation completed", - extra={ - "scores": {s.name: (round(s.mean, 4) if s.mean is not None else None) for s in aggregated_result.scores} - }, - ) - - return aggregated_result - - -async def main( - args: Sequence[str] | None = None, - *, - sdk: AsyncNeMoPlatform | None = None, -) -> int: - """Main entry point for the evaluate_metric task. - - Args: - args: Optional list of CLI arguments (for testing). If None, uses sys.argv. - sdk: Optional SDK instance for dependency injection (for testing). - If None, uses get_async_platform_sdk(). - - Returns: - Exit code (0 for success, non-zero for failure). - """ - import argparse - - # Configure logging using platform's standard setup for consistent formatting - initialize_logging() - - parser = argparse.ArgumentParser(description="Watch benchmark container") - parser.add_argument( - "--progress-tracking-url", - type=str, - default=os.getenv("EVALUATIONS_CALLBACK_URL"), - help="Optional callback URL to update progress tracking details.", - ) - parser.add_argument( - "--progress-tracking-interval", - type=str, - default=50, - help="Interval to update progress tracking details.", - ) - parser.add_argument( - "--progress-tracking-interval-seconds", - type=str, - default=60, - help="Time interval (seconds) to update progress tracking details.", - ) - parser.add_argument( - "--skip-upload-results", - type=bool, - default=False, - help="Skip uploading results to Jobs MS", - ) - parsed_args = parser.parse_args(args) - results_dir = _default_results_dir() - config_file = _default_config_file() - - if not parsed_args.skip_upload_results: - results_handler_config = cast(Any, ResultsHandlerConfig)() - else: - results_handler_config = ResultsHandlerConfig(NEMO_JOB_ID="", NEMO_JOB_WORKSPACE="") - - with open(config_file, "r") as f: - job_config = json.load(f) - - job = MetricJobAdapter.validate_python(job_config) - - progress_tracking = None - try: - if parsed_args.progress_tracking_url: - progress_tracking = ProgressTracking( - parsed_args.progress_tracking_url, - parsed_args.progress_tracking_interval, - parsed_args.progress_tracking_interval_seconds, - ) - else: - log.warning("Progress tracking is not configured.") - - evaluation_result = await evaluate_metric(job, results_dir, progress_tracking) - - if not parsed_args.skip_upload_results: - effective_sdk = sdk or get_async_platform_sdk(as_service="evaluator", internal=True) - await handle_results_async(job, results_handler_config, results_dir, sdk=effective_sdk) - - if no_aggregated_metric_scores(evaluation_result): - # EvalFactory can complete successfully with no metrics when retries are configured. - # This edge case happens when inference fails and no outputs can be evaluated on to - # generate metrics. - raise ValueError( - f"Job {results_handler_config.NEMO_JOB_ID} completed but no evaluation results detected. Job marked as failed: {evaluation_result}" - ) - - if progress_tracking: - # Update job progress to 100% when contains results - progress_tracking.update_progress(100) - - return 0 - finally: - if progress_tracking: - progress_tracking.stop() - - -def run( - args: Sequence[str] | None = None, - *, - sdk: AsyncNeMoPlatform | None = None, -) -> int: - """Synchronous wrapper for main() - for task_harness compatibility. - - Args: - args: Optional list of CLI arguments (for testing). If None, uses sys.argv. - sdk: Optional SDK instance for dependency injection (for testing). - If None, uses get_async_platform_sdk(). - - Returns: - Exit code (0 for success, non-zero for failure). - """ - register_task_signal_handlers() - try: - return asyncio.run(main(args, sdk=sdk)) - except KeyboardInterrupt: - log.info("Received termination signal. Exiting task gracefully.") - return 0 - except Exception: - log.exception("Error in evaluate_metric task") - return 1 - - -if __name__ == "__main__": - raise SystemExit(run()) diff --git a/services/evaluator/src/nmp/evaluator/tasks/metric_results/__init__.py b/services/evaluator/src/nmp/evaluator/tasks/metric_results/__init__.py deleted file mode 100644 index ed0b4b62ef..0000000000 --- a/services/evaluator/src/nmp/evaluator/tasks/metric_results/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Metric results task package. - -This task uploads evaluation results to the Jobs and Files APIs. -""" - -from nmp.evaluator.tasks.metric_results.__main__ import run - -__all__ = ["run"] diff --git a/services/evaluator/src/nmp/evaluator/tasks/metric_results/__main__.py b/services/evaluator/src/nmp/evaluator/tasks/metric_results/__main__.py deleted file mode 100644 index d382443c0b..0000000000 --- a/services/evaluator/src/nmp/evaluator/tasks/metric_results/__main__.py +++ /dev/null @@ -1,122 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import argparse -import asyncio -import json -import logging -import os -from collections.abc import Sequence -from pathlib import Path - -from nmp.common.jobs.constants import ( - DEFAULT_JOB_STORAGE_PATH, - DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH, - NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, - PERSISTENT_JOB_STORAGE_PATH_ENVVAR, -) -from nmp.common.observability.otel import initialize_logging -from nmp.common.sdk_factory import get_async_platform_sdk -from nmp.evaluator.app.jobs.metric_results import ResultsHandlerConfig, handle_results_async -from nmp.evaluator.app.jobs.progress_tracking import ProgressTracking -from nmp.evaluator.app.tasks.termination import register_task_signal_handlers -from nmp.evaluator.app.values import ( - BenchmarkJobAdapter, - MetricJobAdapter, -) - -log = logging.getLogger(__name__) - - -def _default_results_dir() -> str: - return str(Path(os.environ.get(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, DEFAULT_JOB_STORAGE_PATH)) / "results") - - -def _default_config_file() -> str: - return os.environ.get(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH) - - -async def main(args: Sequence[str] | None = None) -> int: - """Async implementation of the metric_results task. - - Args: - args: Optional list of CLI arguments (for testing). If None, uses sys.argv. - - Returns: - Exit code (0 for success, 1 for failure). - """ - # Configure logging using platform's standard setup for consistent formatting - initialize_logging() - - parser = argparse.ArgumentParser(description="Process evaluation results") - - parser.add_argument( - "--progress-tracking-url", - type=str, - default=None, - help="Optional callback URL to update progress tracking details.", - ) - - parsed_args = parser.parse_args(args) - results_dir = _default_results_dir() - config_file = _default_config_file() - progress_tracking = None - - with open(config_file, "r") as f: - job_config = json.load(f) - - if "benchmark" in job_config: - job = BenchmarkJobAdapter.validate_python(job_config) - else: - job = MetricJobAdapter.validate_python(job_config) - - try: - sdk = get_async_platform_sdk( - as_service="evaluator", - internal=True, - ) - await handle_results_async( - job, - ResultsHandlerConfig(), # ty: ignore[missing-argument] - results_dir, - sdk=sdk, - ) - - if parsed_args.progress_tracking_url: - progress_tracking = ProgressTracking(parsed_args.progress_tracking_url) - # Update job progress to 100% when contains results - progress_tracking.update_progress(100) - else: - log.warning("Progress tracking is not configured.") - - return 0 - except Exception: - log.exception("Error handling results") - return 1 - finally: - if progress_tracking: - progress_tracking.stop() - - -def run(args: Sequence[str] | None = None) -> int: - """Synchronous entry point for the metric_results task. - - Args: - args: Optional list of CLI arguments (for testing). If None, uses sys.argv. - - Returns: - Exit code (0 for success, 1 for failure). - """ - register_task_signal_handlers() - try: - return asyncio.run(main(args)) - except KeyboardInterrupt: - log.info("Received termination signal. Exiting task gracefully.") - return 0 - except Exception: - log.exception("Error in metric_results task") - return 1 - - -if __name__ == "__main__": - raise SystemExit(run()) diff --git a/services/evaluator/src/nmp/evaluator/utils/milvus.py b/services/evaluator/src/nmp/evaluator/utils/milvus.py deleted file mode 100644 index fc164bea83..0000000000 --- a/services/evaluator/src/nmp/evaluator/utils/milvus.py +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. -import logging -from urllib.parse import urlparse - -from fastapi import HTTPException, status - -logger = logging.getLogger(__name__) - - -def validate_milvus_connectivity(host: str, port: int = 19530): - # Lazy import to avoid loading pymilvus at startup - from pymilvus import connections, utility - - try: - # Connect to Milvus server - connections.connect(host=host, port=port) - - # Check connectivity by retrieving the server version - server_version = utility.get_server_version() - logger.info(f"Milvus server version: {server_version}") - - except Exception as e: - logger.error(f"Milvus service down or unreachable: {e}") - raise HTTPException( - status_code=status.HTTP_503_SERVICE_UNAVAILABLE, - detail=f"Milvus service down or unreachable: {host}:{port}", - ) - - -def get_milvus_configs(milvus_url: str, collection_name: str): - if not milvus_url: - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Internal Server Error: MILVUS_URL environment variable is not set", - ) - - parsed_url = urlparse(milvus_url) - host = parsed_url.hostname - port = parsed_url.port - - return { - "milvus_host": host, - "milvus_port": str(port), - "milvus_password": "", - "milvus_collection_name": collection_name, - } diff --git a/services/evaluator/tests/api/v2/common/test_checks.py b/services/evaluator/tests/api/v2/common/test_checks.py deleted file mode 100644 index c5e8fb01e5..0000000000 --- a/services/evaluator/tests/api/v2/common/test_checks.py +++ /dev/null @@ -1,168 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Unit tests for common validation-check helpers.""" - -from nemo_evaluator_sdk.inference import ClientInferenceError -from nmp.evaluator.api.v2.common.checks import ( - MODEL_NO_DEPLOYMENT_MESSAGE, - MODEL_UNREACHABLE_MESSAGE, - ValidationResult, - compress_schema_errors, - format_model_reachability_error, -) - - -def test_compress_schema_errors_deduplicates_and_preserves_order() -> None: - errors = [ - "alpha", - "beta", - "alpha", - "gamma", - "beta", - ] - - assert compress_schema_errors(errors) == ["alpha", "beta", "gamma"] - - -def test_compress_schema_errors_drops_missing_definition_when_required_exists() -> None: - errors = [ - "dataset schema missing field definition 'reference'", - "dataset schema missing required field 'reference'", - "dataset schema missing field definition 'context'", - "dataset schema missing required field 'output'", - ] - - assert compress_schema_errors(errors) == [ - "dataset schema missing required field 'reference'", - "dataset schema missing field definition 'context'", - "dataset schema missing required field 'output'", - ] - - -def test_compress_schema_errors_keeps_non_matching_messages() -> None: - errors = [ - "dataset schema incompatible type at 'input'", - "dataset schema missing field definition 'input'", - "custom parser error", - ] - - assert compress_schema_errors(errors) == [ - "dataset schema incompatible type at 'input'", - "dataset schema missing field definition 'input'", - "custom parser error", - ] - - -class _FakeClientInferenceError(ClientInferenceError): - """Stand-in ClientInferenceError that skips its openai-coupled __init__.""" - - def __init__(self, status_code: int, message: str = "boom"): - Exception.__init__(self, message) - self.status_code = status_code - - -class _FakeStatusError(Exception): - """Non-ClientInferenceError exception that still exposes a status_code attribute. - - Models exceptions like nemo_platform.NotFoundError raised by sdk.secrets.access() - when an api_key_secret is missing during model reachability checks. - """ - - def __init__(self, status_code: int, message: str = "boom"): - super().__init__(message) - self.status_code = status_code - - -def test_format_model_reachability_error_404_evaluation_model() -> None: - error = _FakeClientInferenceError(status_code=404) - message = format_model_reachability_error( - "job.model", {"name": "qwen2-5-1-5b-instruct", "url": "http://gateway/v1"}, error - ) - assert message == MODEL_NO_DEPLOYMENT_MESSAGE.format(label="Evaluation Model", model_name="qwen2-5-1-5b-instruct") - - -def test_format_model_reachability_error_404_judge_model_via_metric_params() -> None: - error = _FakeClientInferenceError(status_code=404) - message = format_model_reachability_error( - "metric_params.judge.model", {"name": "judge-7b", "url": "http://gateway/v1"}, error - ) - assert message == MODEL_NO_DEPLOYMENT_MESSAGE.format(label="Judge Model", model_name="judge-7b") - - -def test_format_model_reachability_error_404_judge_model_via_inline_metric() -> None: - error = _FakeClientInferenceError(status_code=404) - message = format_model_reachability_error( - "job.metric.model", {"name": "judge-7b", "url": "http://gateway/v1"}, error - ) - assert message == MODEL_NO_DEPLOYMENT_MESSAGE.format(label="Judge Model", model_name="judge-7b") - - -def test_format_model_reachability_error_404_benchmark_judge_model() -> None: - error = _FakeClientInferenceError(status_code=404) - message = format_model_reachability_error( - "benchmark_params.judge.model", {"name": "judge-7b", "url": "http://gateway/v1"}, error - ) - assert message == MODEL_NO_DEPLOYMENT_MESSAGE.format(label="Judge Model", model_name="judge-7b") - - -def test_format_model_reachability_error_non_inference_404_falls_back_to_generic_message() -> None: - """Regression: 404s outside the inference call (e.g. nemo_platform.NotFoundError from - sdk.secrets.access when api_key_secret is missing) must NOT be reported as a missing - inference deployment — that would mask the real cause. - """ - error = _FakeStatusError(status_code=404, message="Secret not found: my-api-key") - message = format_model_reachability_error( - "job.model", {"name": "qwen2-5-1-5b-instruct", "url": "http://gateway/v1"}, error - ) - assert message == MODEL_UNREACHABLE_MESSAGE.format( - label="Evaluation Model", model_name="qwen2-5-1-5b-instruct", error=error - ) - - -def test_format_model_reachability_error_non_404_falls_back_to_generic_message() -> None: - error = _FakeClientInferenceError(status_code=500, message="server exploded") - message = format_model_reachability_error( - "job.model", {"name": "qwen2-5-1-5b-instruct", "url": "http://gateway/v1"}, error - ) - assert message == MODEL_UNREACHABLE_MESSAGE.format( - label="Evaluation Model", model_name="qwen2-5-1-5b-instruct", error=error - ) - - -def test_format_model_reachability_error_no_status_code_attr_falls_back() -> None: - error = RuntimeError("Error connecting to inference server") - message = format_model_reachability_error( - "job.model", {"name": "qwen2-5-1-5b-instruct", "url": "http://gateway/v1"}, error - ) - assert message == MODEL_UNREACHABLE_MESSAGE.format( - label="Evaluation Model", model_name="qwen2-5-1-5b-instruct", error=error - ) - - -def test_format_model_reachability_error_unknown_field_path_uses_path_as_label() -> None: - error = _FakeClientInferenceError(status_code=404) - message = format_model_reachability_error("custom.path", {"name": "foo"}, error) - assert message == MODEL_NO_DEPLOYMENT_MESSAGE.format(label="custom.path", model_name="foo") - - -def test_format_model_reachability_error_missing_model_name_uses_placeholder() -> None: - error = _FakeClientInferenceError(status_code=404) - message = format_model_reachability_error("job.model", {"url": "http://gateway/v1"}, error) - assert message == MODEL_NO_DEPLOYMENT_MESSAGE.format(label="Evaluation Model", model_name="") - - -def test_format_model_reachability_error_wrapped_in_validation_result_has_single_terminal_period() -> None: - """End-to-end: the ValidationResult string the user sees ends with exactly one period. - - Locks the structural pipeline (label mapping + ValidationResult wrap + trailing period) - against the literal copy template — fails loudly if either drifts. - """ - error = _FakeClientInferenceError(status_code=404) - inner = format_model_reachability_error( - "job.model", {"name": "qwen2-5-1-5b-instruct", "url": "http://gateway/v1"}, error - ) - wrapped = str(ValidationResult(False, [inner])) - expected_inner = MODEL_NO_DEPLOYMENT_MESSAGE.format(label="Evaluation Model", model_name="qwen2-5-1-5b-instruct") - assert wrapped == f"Invalid payload. Errors: {expected_inner}." - assert not wrapped.endswith(".."), "Expected single trailing period, not double" diff --git a/services/evaluator/tests/api/v2/common/test_model_checks.py b/services/evaluator/tests/api/v2/common/test_model_checks.py deleted file mode 100644 index f5ca520640..0000000000 --- a/services/evaluator/tests/api/v2/common/test_model_checks.py +++ /dev/null @@ -1,212 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Unit tests for model check utilities with secret resolution.""" - -from unittest import mock - -import pytest -from nemo_evaluator_sdk.values import Model -from nmp.evaluator.app.inference import verify_model_reachable - - -@pytest.mark.asyncio -async def test_check_model_without_secret(): - """Test model check when no secret is configured.""" - model_dict = {"url": "http://model.test/v1", "name": "test-model"} - - with mock.patch( - "nmp.evaluator.app.inference.make_inference_request", - new_callable=mock.AsyncMock, - ) as mock_inference: - mock_inference.return_value = {"status": "ok"} - - mock_sdk = mock.AsyncMock() - - try: - await verify_model_reachable(model_dict, sdk=mock_sdk, workspace="default") - error = None - except Exception as e: - error = e - - assert error is None - mock_inference.assert_called_once() - # Should be called without api_key parameter - call_args = mock_inference.call_args - assert call_args.kwargs.get("api_key") is None - - -@pytest.mark.asyncio -async def test_check_model_with_secret_and_workspace(): - """Test model check when secret is configured and workspace is provided.""" - model_dict = { - "url": "http://model.test/v1", - "name": "test-model", - "api_key_secret": "my-secret", - } - - mock_secret = mock.MagicMock() - mock_secret.value = "resolved-api-key-12345" - - with mock.patch( - "nmp.evaluator.app.inference.make_inference_request", - new_callable=mock.AsyncMock, - ) as mock_inference: - mock_sdk = mock.AsyncMock() - mock_sdk.secrets.access = mock.AsyncMock(return_value=mock_secret) - mock_inference.return_value = {"status": "ok"} - - try: - await verify_model_reachable(model_dict, sdk=mock_sdk, workspace="my-workspace") - error = None - except Exception as e: - error = e - - assert error is None - # Verify secret was accessed - mock_sdk.secrets.access.assert_called_once_with("my-secret", workspace="my-workspace") - # Verify inference was called with resolved API key - mock_inference.assert_called_once() - call_args = mock_inference.call_args - assert call_args.kwargs.get("api_key") == "resolved-api-key-12345" - - -@pytest.mark.asyncio -async def test_check_model_with_secret_and_workspace_provided(): - """Test model check when secret is configured and workspace is provided (workspace is required).""" - model_dict = { - "url": "http://model.test/v1", - "name": "test-model", - "api_key_secret": "my-secret", - } - - mock_sdk = mock.AsyncMock() - - with mock.patch( - "nmp.evaluator.app.inference.make_inference_request", - new_callable=mock.AsyncMock, - ) as mock_inference: - mock_inference.return_value = {"status": "ok"} - - try: - await verify_model_reachable(model_dict, sdk=mock_sdk, workspace="my-workspace") - error = None - except Exception as e: - error = e - - assert error is None - # Should resolve secret when workspace is provided - mock_sdk.secrets.access.assert_called_once_with("my-secret", workspace="my-workspace") - mock_inference.assert_called_once() - - -@pytest.mark.asyncio -async def test_check_model_secret_resolution_failure(): - """Test model check when secret resolution fails - should propagate error.""" - - from httpx import Request, Response - from nemo_platform import NotFoundError - - model_dict = { - "url": "http://model.test/v1", - "name": "test-model", - "api_key_secret": "my-secret", - } - - mock_sdk = mock.AsyncMock() - mock_response = Response(status_code=404, request=Request("GET", "http://test")) - mock_sdk.secrets.access = mock.AsyncMock( - side_effect=NotFoundError( - message="Secret not found", - response=mock_response, - body={"detail": "Secret not found"}, - ) - ) - - with pytest.raises(NotFoundError, match="Secret not found"): - await verify_model_reachable(model_dict, sdk=mock_sdk, workspace="my-workspace") - - # Should attempt secret resolution - mock_sdk.secrets.access.assert_called_once_with("my-secret", workspace="my-workspace") - - -@pytest.mark.asyncio -async def test_check_model_verification_failure(): - """Test model check when verification fails.""" - model_dict = {"url": "http://unreachable.test/v1", "name": "unreachable-model"} - - with mock.patch( - "nmp.evaluator.app.inference.make_inference_request", - new_callable=mock.AsyncMock, - ) as mock_inference: - verification_error = Exception("Connection refused") - mock_inference.side_effect = verification_error - - mock_sdk = mock.AsyncMock() - - try: - await verify_model_reachable(model_dict, sdk=mock_sdk, workspace="default") - error = None - except Exception as e: - error = e - - assert error is not None - assert error == verification_error - mock_inference.assert_called_once() - - -@pytest.mark.asyncio -async def test_check_model_invalid_model_dict(): - """Test model check with invalid model dictionary.""" - model_dict = {"url": "http://model.test/v1"} # Missing 'name' field - - mock_sdk = mock.AsyncMock() - - try: - await verify_model_reachable(model_dict, sdk=mock_sdk, workspace="default") - error = None - except Exception as e: - error = e - - assert error is not None - # Should be a validation error from Model.model_validate - assert isinstance(error, Exception) - - -@pytest.mark.asyncio -async def test_check_model_with_secret_success(): - """Test successful model check with secret resolution.""" - model_dict = { - "url": "http://model.test/v1", - "name": "test-model", - "api_key_secret": "my-secret", - } - - mock_secret = mock.MagicMock() - mock_secret.value = "resolved-api-key-12345" - - with mock.patch( - "nmp.evaluator.app.inference.make_inference_request", - new_callable=mock.AsyncMock, - ) as mock_inference: - mock_sdk = mock.AsyncMock() - mock_sdk.secrets.access = mock.AsyncMock(return_value=mock_secret) - mock_inference.return_value = {"status": "ok"} - - try: - await verify_model_reachable(model_dict, sdk=mock_sdk, workspace="my-workspace") - error = None - except Exception as e: - error = e - - assert error is None - # Verify the flow: secret access -> verify with resolved key - mock_sdk.secrets.access.assert_called_once_with("my-secret", workspace="my-workspace") - mock_inference.assert_called_once() - # Verify the resolved API key was passed - inference_call = mock_inference.call_args - assert inference_call.kwargs["api_key"] == "resolved-api-key-12345" - # Verify the model object was passed - assert isinstance(inference_call.kwargs["model"], Model) - assert inference_call.kwargs["model"].url == "http://model.test/v1" - assert inference_call.kwargs["model"].name == "test-model" diff --git a/services/evaluator/tests/api/v2/jobs/test_job_prechecks.py b/services/evaluator/tests/api/v2/jobs/test_job_prechecks.py deleted file mode 100644 index 7b9a9c45fa..0000000000 --- a/services/evaluator/tests/api/v2/jobs/test_job_prechecks.py +++ /dev/null @@ -1,774 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""End-to-end tests for job prechecks in MetricsManager and BenchmarksManager. - -These tests verify that model prechecks are properly invoked during compile_job -for different job types. -""" - -from unittest import mock - -import nmp.evaluator.entities as entities -import pytest -from nemo_evaluator_sdk.values import ( - DatasetRows, - JSONScoreParser, - Model, -) -from nmp.evaluator.api.v2.benchmarks.manager import BenchmarksManager -from nmp.evaluator.api.v2.benchmarks.schemas.jobs import ( - BenchmarkOnlineAgentJob, - BenchmarkOnlineJob, - SystemBenchmarkOnlineJob, -) -from nmp.evaluator.api.v2.metrics.manager import MetricsManager -from nmp.evaluator.api.v2.metrics.schemas.jobs import ( - MetricOfflineJob, - MetricOnlineJob, - MetricRetrieverJob, - RetrieverPipeline, -) -from nmp.evaluator.app.evalfactory.agentic_eval import AgenticEvalHandler -from nmp.evaluator.app.evalfactory.bfcl import BFCLHandler -from nmp.evaluator.app.evalfactory.retriever import RetrieverHandler -from nmp.evaluator.app.evalfactory.simple_evals import SimpleEvalsHandler -from nmp.evaluator.app.values import BenchmarkRef, FilesetRef, MetricRef -from nmp.evaluator.app.values.common import ModelRef -from pydantic import ValidationError - - -@pytest.fixture -def mock_entity_client(): - """Mock entity client for manager tests.""" - return mock.AsyncMock() - - -# mock_sdk fixture is now provided by conftest.py - - -@pytest.fixture -def mock_fileset_check(): - """Mock fileset existence check to always pass. - - Mocks the underlying fileset_exists function that all fileset checks use. - """ - with mock.patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.dataset_exists", - new_callable=mock.AsyncMock, - ) as fileset_mock: - fileset_mock.return_value = True - yield fileset_mock - - -class TestMetricJobPrechecks: - """Tests for metric job prechecks.""" - - def test_metric_online_job_accepts_optional_fields(self): - job = MetricOnlineJob( - metric=MetricRef(root="test/bleu"), - model=Model(url="http://model.test/v1", name="test-model"), - dataset=DatasetRows(rows=[{"input": "test"}]), - prompt_template="{{input}}{{reference}}", - optional_fields=["reference"], - ) - - assert job.optional_fields == ["reference"] - - def test_metric_online_job_rejects_empty_optional_field(self): - with pytest.raises(ValidationError): - MetricOnlineJob( - metric=MetricRef(root="test/bleu"), - model=Model(url="http://model.test/v1", name="test-model"), - dataset=DatasetRows(rows=[{"input": "test"}]), - prompt_template="{{input}}{{reference}}", - optional_fields=[""], - ) - - @pytest.mark.asyncio - async def test_offline_job_no_model_check(self, mock_entity_client, mock_sdk, mock_fileset_check): - """Offline job without model should not trigger model check.""" - # Use a metric reference and mock get_metric to return the entity - metric_ref = MetricRef(root="test/bleu") - metric_entity = entities.BLEUMetric(workspace="test", name="bleu", references=[]) - - job = MetricOfflineJob( - metric=metric_ref, - dataset=DatasetRows(rows=[{"input": "test", "output": "test"}]), - ) - - manager = MetricsManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock) as mock_get_metric, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.app.jobs.metrics.compile_metric_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_metric.return_value = metric_entity - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - # verify_model_reachable should NOT be called (no model in offline job) - mock_verify.assert_not_called() - - @pytest.mark.asyncio - async def test_online_job_model_check_called(self, mock_entity_client, mock_sdk, mock_fileset_check): - """Online job with model should trigger model check.""" - # Use a metric reference and mock get_metric to return the entity - metric_ref = MetricRef(root="test/bleu") - metric_entity = entities.BLEUMetric(workspace="test", name="bleu", references=[]) - - job = MetricOnlineJob( - metric=metric_ref, - model=Model(url="http://model.test/v1", name="test-model"), - dataset=DatasetRows(rows=[{"input": "test"}]), - prompt_template="{{input}}", - ) - - manager = MetricsManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock) as mock_get_metric, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.app.jobs.metrics.compile_metric_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_metric.return_value = metric_entity - mock_verify.return_value = {"status": "ok"} - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - # verify_model_reachable should be called for the job model - mock_verify.assert_called_once() - call_args = mock_verify.call_args[0][0] - # Handle both Model objects and dicts - if isinstance(call_args, dict): - assert call_args["url"] == "http://model.test/v1" - assert call_args["name"] == "test-model" - else: - assert call_args.url == "http://model.test/v1" - assert call_args.name == "test-model" - - @pytest.mark.asyncio - async def test_online_job_model_ref_resolved_before_model_check( - self, mock_entity_client, mock_sdk, mock_fileset_check - ): - """Online job ModelRef should be resolved to Model before prechecks.""" - metric_ref = "test/bleu" - metric_entity = entities.BLEUMetric(workspace="test", name="bleu", references=[]) - resolved_model = Model(url="http://resolved-model.test/v1", name="resolved-model") - - job = MetricOnlineJob.model_validate( - { - "metric": metric_ref, - "model": "test-workspace/resolved-model", - "dataset": {"rows": [{"input": "test"}]}, - "prompt_template": "{{input}}", - } - ) - - manager = MetricsManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock) as mock_get_metric, - mock.patch( - "nmp.evaluator.api.v2.metrics.manager.resolve_model", - new_callable=mock.AsyncMock, - return_value=resolved_model, - ) as mock_resolve_model, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.app.jobs.metrics.compile_metric_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_metric.return_value = metric_entity - mock_verify.return_value = {"status": "ok"} - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - mock_resolve_model.assert_called_once() - assert isinstance(mock_resolve_model.call_args[0][0], ModelRef) - mock_verify.assert_called_once() - call_args = mock_verify.call_args[0][0] - if isinstance(call_args, dict): - assert call_args["url"] == "http://resolved-model.test/v1" - assert call_args["name"] == "resolved-model" - else: - assert call_args.url == "http://resolved-model.test/v1" - assert call_args.name == "resolved-model" - - @pytest.mark.asyncio - async def test_online_job_rewrites_model_url_only_for_compiled_payload( - self, mock_entity_client, mock_sdk, mock_fileset_check - ): - """Prechecks use the original model URL, but compiled jobs get the rewritten URL.""" - metric_entity = entities.BLEUMetric(workspace="test", name="bleu", references=[]) - job = MetricOnlineJob( - metric=MetricRef(root="test/bleu"), - model=Model( - url="http://localhost:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1", - name="demo", - ), - dataset=DatasetRows(rows=[{"input": "test"}]), - prompt_template="{{input}}", - ) - manager = MetricsManager(mock_entity_client) - - def rewrite_payload(payload: dict) -> dict: - rewritten = dict(payload) - rewritten["model"] = dict(payload["model"]) - rewritten["model"]["url"] = ( - "http://container-host:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1" - ) - return rewritten - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock, return_value=metric_entity), - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - return_value={"status": "ok"}, - ) as mock_verify, - mock.patch( - "nmp.evaluator.api.v2.metrics.manager.rewrite_models_for_job_container", - side_effect=rewrite_payload, - ), - mock.patch( - "nmp.evaluator.api.v2.metrics.manager.compile_metric_job", - new_callable=mock.AsyncMock, - return_value=mock.MagicMock(), - ) as mock_compile, - ): - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - checked_model = mock_verify.call_args[0][0] - if isinstance(checked_model, dict): - assert checked_model["url"] == ( - "http://localhost:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1" - ) - else: - assert checked_model.url == ( - "http://localhost:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1" - ) - - compiled_job = mock_compile.call_args[0][0] - assert compiled_job.model.url == ( - "http://container-host:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1" - ) - - @pytest.mark.asyncio - async def test_retriever_job_no_model_check(self, mock_entity_client, mock_sdk, mock_fileset_check): - """Retriever job should not trigger model check (no job.model).""" - # Use metric reference for system metric - metric = MetricRef(root="system/retriever-ndcg") - - job = MetricRetrieverJob( - metric=metric, - retriever_pipeline=RetrieverPipeline( - embeddings_model=Model(url="http://embedding.test/v1", name="embed-model"), - ), - dataset=DatasetRows(rows=[{"query": "test", "relevant_docs": ["doc1"]}]), - ) - - manager = MetricsManager(mock_entity_client) - - # Mock get_metric to return the actual system metric entity - retriever_metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-ndcg") - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock) as mock_get_metric, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.app.jobs.metrics.compile_metric_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_metric.return_value = retriever_metric - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - # verify_model_reachable should NOT be called (retriever has no job.model) - mock_verify.assert_not_called() - - @pytest.mark.asyncio - async def test_retriever_embeddings_model_ref_resolved_before_compile( - self, mock_entity_client, mock_sdk, mock_fileset_check - ): - """Retriever embeddings ModelRef should be resolved before app-layer job validation.""" - metric = MetricRef(root="system/retriever-ndcg") - resolved_embeddings_model = Model(url="http://embedder.test/v1", name="embed-model") - - job = MetricRetrieverJob.model_validate( - { - "metric": str(metric.root), - "retriever_pipeline": { - "embeddings_model": "test-workspace/embed-model", - }, - "dataset": {"rows": [{"query": "test", "relevant_docs": ["doc1"]}]}, - } - ) - - manager = MetricsManager(mock_entity_client) - retriever_metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-ndcg") - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock) as mock_get_metric, - mock.patch( - "nmp.evaluator.api.v2.metrics.manager.resolve_model", - new_callable=mock.AsyncMock, - return_value=resolved_embeddings_model, - ) as mock_resolve_model, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.app.jobs.metrics.compile_metric_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_metric.return_value = retriever_metric - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - mock_resolve_model.assert_called_once() - assert isinstance(mock_resolve_model.call_args[0][0], ModelRef) - mock_verify.assert_not_called() - - @pytest.mark.asyncio - async def test_agentic_eval_job_judge_check_called(self, mock_entity_client, mock_sdk, mock_fileset_check): - """Agentic eval metric with judge should trigger judge model check.""" - metric = MetricRef(root="system/trajectory-evaluation") - - job = MetricOfflineJob( - metric=metric, - dataset=DatasetRows(rows=[{"input": "test", "output": "test"}]), - metric_params={ - "judge": { - # URL must end in /v1/chat/completions for agentic eval - "model": {"url": "http://judge.test/v1/chat/completions", "name": "judge-model"}, - }, - "trajectory_used_tools": "tool1,tool2", - }, - ) - - manager = MetricsManager(mock_entity_client) - - # Mock get_metric to return the actual system metric entity - agentic_metric = next(m for m in AgenticEvalHandler._system_metrics if m.name == "trajectory-evaluation") - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock) as mock_get_metric, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.app.jobs.metrics.compile_metric_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_metric.return_value = agentic_metric - mock_verify.return_value = {"status": "ok"} - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - # verify_model_reachable should be called for judge.model - mock_verify.assert_called_once() - call_args = mock_verify.call_args[0][0] - # Handle both Model objects and dicts - if isinstance(call_args, dict): - # URL may be normalized (e.g., /chat/completions removed) - assert "judge.test" in call_args["url"] - assert call_args["name"] == "judge-model" - else: - # URL may be normalized (e.g., /chat/completions removed) - assert "judge.test" in call_args.url - assert call_args.name == "judge-model" - - @pytest.mark.asyncio - async def test_model_check_failure_raises_error(self, mock_entity_client, mock_sdk, mock_fileset_check): - """Model check failure should raise ValueError.""" - # Use a metric reference and mock get_metric to return the entity - metric_ref = MetricRef(root="test/bleu") - metric_entity = entities.BLEUMetric(workspace="test", name="bleu", references=[]) - - job = MetricOnlineJob( - metric=metric_ref, - model=Model(url="http://unreachable.test/v1", name="unreachable-model"), - dataset=DatasetRows(rows=[{"input": "test"}]), - prompt_template="{{input}}", - ) - - manager = MetricsManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock) as mock_get_metric, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - ): - mock_get_metric.return_value = metric_entity - mock_verify.side_effect = Exception("Connection refused") - - with pytest.raises(ValueError, match="Job cannot be launched"): - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - @pytest.mark.asyncio - async def test_llm_judge_failed_model_raises_error(self, mock_entity_client, mock_sdk, mock_fileset_check): - """LLM Judge metric with unreachable job.metric.model should raise ValueError.""" - from nemo_evaluator_sdk.values.scores import RangeScore - from nmp.evaluator.api.v2.metrics.schemas.metrics import LLMJudgeMetric - - # Create inline LLM Judge metric with unreachable model - inline_metric = LLMJudgeMetric( - model=Model(url="http://unreachable-judge.test/v1", name="unreachable-judge-model"), - scores=[ - RangeScore( - name="quality", - description="Quality score", - minimum=1, - maximum=5, - parser=JSONScoreParser(json_path="score"), - ) - ], - prompt_template={"messages": [{"role": "user", "content": "Evaluate: {{item.response}}"}]}, - ) - - job = MetricOfflineJob( - metric=inline_metric, - dataset=DatasetRows(rows=[{"response": "test response"}]), - ) - - manager = MetricsManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_metric", new_callable=mock.AsyncMock) as mock_get_metric, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - ): - # get_metric should return the validated inline metric - mock_get_metric.return_value = inline_metric - mock_verify.side_effect = Exception("Connection refused") - - with pytest.raises(ValueError, match="Job cannot be launched"): - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - # Should check the model from job.metric.model - mock_verify.assert_called_once() - call_args = mock_verify.call_args[0][0] - # Handle both Model objects and dicts - if isinstance(call_args, dict): - assert call_args["url"] == "http://unreachable-judge.test/v1" - assert call_args["name"] == "unreachable-judge-model" - else: - assert call_args.url == "http://unreachable-judge.test/v1" - assert call_args.name == "unreachable-judge-model" - - -class TestBenchmarkJobPrechecks: - """Tests for benchmark job prechecks.""" - - def test_benchmark_online_job_accepts_optional_fields(self): - job = BenchmarkOnlineJob( - benchmark=BenchmarkRef(root="test/test-benchmark"), - model=Model(url="http://model.test/v1", name="test-model"), - prompt_template="{{input}}{{reference}}", - optional_fields=["reference"], - ) - - assert job.optional_fields == ["reference"] - - def test_benchmark_online_job_rejects_empty_optional_field(self): - with pytest.raises(ValidationError): - BenchmarkOnlineJob( - benchmark=BenchmarkRef(root="test/test-benchmark"), - model=Model(url="http://model.test/v1", name="test-model"), - prompt_template="{{input}}{{reference}}", - optional_fields=[""], - ) - - def test_benchmark_online_agent_job_accepts_optional_fields(self): - job = BenchmarkOnlineAgentJob( - benchmark=BenchmarkRef(root="test/test-benchmark"), - agent={"url": "http://agent.test/v1", "name": "test-agent", "format": "nemo_agent_toolkit"}, - prompt_template="{{input}}{{reference}}", - optional_fields=["reference"], - ) - - assert job.optional_fields == ["reference"] - - def test_benchmark_online_agent_job_rejects_empty_optional_field(self): - with pytest.raises(ValidationError): - BenchmarkOnlineAgentJob( - benchmark=BenchmarkRef(root="test/test-benchmark"), - agent={"url": "http://agent.test/v1", "name": "test-agent", "format": "nemo_agent_toolkit"}, - prompt_template="{{input}}{{reference}}", - optional_fields=[""], - ) - - @pytest.mark.asyncio - async def test_online_benchmark_model_check_called(self, mock_entity_client, mock_sdk, mock_fileset_check): - """Online benchmark job with model should trigger model check.""" - # Create a minimal benchmark entity - benchmark = entities.Benchmark( - workspace="test", - name="test-benchmark", - description="Test benchmark", - dataset=FilesetRef(root="test-workspace/test-dataset"), - metrics=[entities.BLEUMetric(workspace="test", name="bleu", references=[])], - ) - - job = BenchmarkOnlineJob( - benchmark=BenchmarkRef(root="test/test-benchmark"), - model=Model(url="http://model.test/v1", name="test-model"), - prompt_template="{{input}}", - ) - - manager = BenchmarksManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_benchmark", new_callable=mock.AsyncMock) as mock_get_benchmark, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.api.v2.benchmarks.manager.app.BenchmarkJobAdapter.validate_python", - ) as mock_adapter, - mock.patch( - # Mock at manager import location to ensure it's the right function - "nmp.evaluator.api.v2.benchmarks.manager.compile_benchmark_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_benchmark.return_value = benchmark - mock_verify.return_value = {"status": "ok"} - mock_adapter.return_value = mock.MagicMock() - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - # verify_model_reachable should be called for the job model - mock_verify.assert_called_once() - call_args = mock_verify.call_args[0][0] - # Handle both Model objects and dicts - if isinstance(call_args, dict): - assert call_args["url"] == "http://model.test/v1" - assert call_args["name"] == "test-model" - else: - assert call_args.url == "http://model.test/v1" - assert call_args.name == "test-model" - - @pytest.mark.asyncio - async def test_online_benchmark_rewrites_model_url_only_for_compiled_payload( - self, mock_entity_client, mock_sdk, mock_fileset_check - ): - """Benchmark prechecks use the original model URL, but compiled jobs get the rewritten URL.""" - benchmark = entities.Benchmark( - workspace="test", - name="test-benchmark", - description="Test benchmark", - dataset=FilesetRef(root="test-workspace/test-dataset"), - metrics=[entities.BLEUMetric(workspace="test", name="bleu", references=[])], - ) - job = BenchmarkOnlineJob( - benchmark=BenchmarkRef(root="test/test-benchmark"), - model=Model( - url="http://localhost:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1", - name="demo", - ), - prompt_template="{{input}}", - ) - manager = BenchmarksManager(mock_entity_client) - - def rewrite_payload(payload: dict) -> dict: - rewritten = dict(payload) - rewritten["model"] = dict(payload["model"]) - rewritten["model"]["url"] = ( - "http://container-host:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1" - ) - return rewritten - - with ( - mock.patch.object(manager, "get_benchmark", new_callable=mock.AsyncMock, return_value=benchmark), - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - return_value={"status": "ok"}, - ) as mock_verify, - mock.patch( - "nmp.evaluator.api.v2.benchmarks.manager.rewrite_models_for_job_container", - side_effect=rewrite_payload, - ), - mock.patch( - "nmp.evaluator.api.v2.benchmarks.manager.compile_benchmark_job", - new_callable=mock.AsyncMock, - return_value=mock.MagicMock(), - ) as mock_compile, - ): - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - checked_model = mock_verify.call_args[0][0] - if isinstance(checked_model, dict): - assert checked_model["url"] == ( - "http://localhost:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1" - ) - else: - assert checked_model.url == ( - "http://localhost:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1" - ) - - compiled_job = mock_compile.call_args[0][0] - assert compiled_job.model.url == ( - "http://container-host:8080/apis/inference-gateway/v2/workspaces/test/model/demo/-/v1" - ) - - @pytest.mark.asyncio - async def test_system_benchmark_online_model_and_judge_check( - self, mock_entity_client, mock_sdk, mock_fileset_check - ): - """System benchmark online job with model and judge should check both.""" - # Get an actual system benchmark that requires judge (simple-evals) - benchmark = SimpleEvalsHandler._system_benchmarks[0] # First benchmark - - job = SystemBenchmarkOnlineJob( - benchmark=BenchmarkRef(root=f"system/{benchmark.name}"), - model=Model(url="http://model.test/v1", name="test-model"), - benchmark_params={ - "judge": { - "model": {"url": "http://judge.test/v1", "name": "judge-model"}, - }, - }, - ) - - manager = BenchmarksManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_benchmark", new_callable=mock.AsyncMock) as mock_get_benchmark, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.app.jobs.benchmarks.compile_benchmark_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_benchmark.return_value = benchmark - mock_verify.return_value = {"status": "ok"} - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - # verify_model_reachable should be called for both model and judge - assert mock_verify.call_count == 2 - - checked_urls = [] - for call in mock_verify.call_args_list: - model_arg = call[0][0] - if isinstance(model_arg, dict): - checked_urls.append(model_arg["url"]) - else: - checked_urls.append(model_arg.url) - assert "http://model.test/v1" in checked_urls - assert "http://judge.test/v1" in checked_urls - - @pytest.mark.asyncio - async def test_bfcl_benchmark_model_check_called(self, mock_entity_client, mock_sdk, mock_fileset_check): - """BFCL system benchmark should trigger model check.""" - # Get a BFCL benchmark - benchmark = BFCLHandler._system_benchmarks[0] # First benchmark - - job = SystemBenchmarkOnlineJob( - benchmark=BenchmarkRef(root=f"system/{benchmark.name}"), - model=Model(url="http://model.test/v1", name="test-model"), - benchmark_params={}, - ) - - manager = BenchmarksManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_benchmark", new_callable=mock.AsyncMock) as mock_get_benchmark, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - mock.patch( - "nmp.evaluator.app.jobs.benchmarks.compile_benchmark_job", - new_callable=mock.AsyncMock, - ) as mock_compile, - ): - mock_get_benchmark.return_value = benchmark - mock_verify.return_value = {"status": "ok"} - mock_compile.return_value = mock.MagicMock() - - await manager.compile_job("test-workspace", job, sdk=mock_sdk) - - # verify_model_reachable should be called for the job model - mock_verify.assert_called_once() - call_args = mock_verify.call_args[0][0] - # Handle both Model objects and dicts - if isinstance(call_args, dict): - assert call_args["url"] == "http://model.test/v1" - else: - assert call_args.url == "http://model.test/v1" - - @pytest.mark.asyncio - async def test_benchmark_model_check_failure_raises_error(self, mock_entity_client, mock_sdk, mock_fileset_check): - """Model check failure should raise ValueError for benchmark jobs.""" - benchmark = entities.Benchmark( - workspace="test", - name="test-benchmark", - description="Test benchmark", - dataset=FilesetRef(root="test-workspace/test-dataset"), - metrics=[entities.BLEUMetric(workspace="test", name="bleu", references=[])], - ) - - job = BenchmarkOnlineJob( - benchmark=BenchmarkRef(root="test/test-benchmark"), - model=Model(url="http://unreachable.test/v1", name="unreachable-model"), - prompt_template="{{input}}", - ) - - manager = BenchmarksManager(mock_entity_client) - - with ( - mock.patch.object(manager, "get_benchmark", new_callable=mock.AsyncMock) as mock_get_benchmark, - mock.patch( - "nmp.evaluator.app.inference.verify_model_reachable", - new_callable=mock.AsyncMock, - ) as mock_verify, - ): - mock_get_benchmark.return_value = benchmark - mock_verify.side_effect = Exception("Connection refused") - - with pytest.raises(ValueError, match="Job cannot be launched"): - await manager.compile_job("test-workspace", job, sdk=mock_sdk) diff --git a/services/evaluator/tests/api/v2/test_wildcard_schema_prechecks.py b/services/evaluator/tests/api/v2/test_wildcard_schema_prechecks.py deleted file mode 100644 index a9877c09c3..0000000000 --- a/services/evaluator/tests/api/v2/test_wildcard_schema_prechecks.py +++ /dev/null @@ -1,1188 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from types import SimpleNamespace -from typing import Literal -from unittest import mock -from unittest.mock import AsyncMock - -import nmp.evaluator.app.values as app -import nmp.evaluator.entities as entities -import pytest -from nmp.evaluator.api.v2.benchmarks.checks import ( - benchmark_creation_schema_check, - benchmark_job_schema_check, -) -from nmp.evaluator.api.v2.benchmarks.schemas.jobs import BenchmarkOfflineJob, BenchmarkOnlineJob -from nmp.evaluator.api.v2.metrics.checks import metric_dataset_schema_check -from nmp.evaluator.api.v2.metrics.schemas.jobs import MetricOfflineJob, MetricOnlineJob -from nmp.evaluator.app.dataset_schemas import TemplateSchemaInferenceError -from nmp.evaluator.app.values import BenchmarkRef, FilesetRef, MetricRef, Model - -INPUT_REQUIRED_SCHEMA = { - "type": "object", - "properties": {"input": {"type": "string"}}, - "required": ["input"], -} -INPUT_WITH_EXTRA_SCHEMA = { - "type": "object", - "properties": {"input": {"type": "string"}, "extra": {"type": "string"}}, - "required": ["input"], -} -REFERENCE_REQUIRED_SCHEMA = { - "type": "object", - "properties": {"reference": {"type": "string"}}, - "required": ["reference"], -} -SCHEMAS = { - "input": INPUT_REQUIRED_SCHEMA, - "input_extra": INPUT_WITH_EXTRA_SCHEMA, - "reference": REFERENCE_REQUIRED_SCHEMA, -} -SCHEMA_REF_KEYS = { - "input": "input_required", - "input_extra": "input_with_extra", - "reference": "reference_required", -} -SCHEMA_DEFS = { - SCHEMA_REF_KEYS["input"]: INPUT_REQUIRED_SCHEMA, - SCHEMA_REF_KEYS["input_extra"]: INPUT_WITH_EXTRA_SCHEMA, - SCHEMA_REF_KEYS["reference"]: REFERENCE_REQUIRED_SCHEMA, -} - - -def _files_response(*paths: str) -> SimpleNamespace: - return SimpleNamespace(data=[SimpleNamespace(path=path) for path in paths]) - - -def _build_dataset_metadata( - metadata_variant: Literal["schema_refs", "inline"], - *, - default_schema_kind: Literal["input", "reference"], - path_schema_kinds: dict[str, str], -) -> SimpleNamespace: - if metadata_variant == "schema_refs": - return SimpleNamespace( - metadata=SimpleNamespace( - dataset=SimpleNamespace( - schema_=SCHEMA_REF_KEYS[default_schema_kind], - schemas_by_path={ - path: SCHEMA_REF_KEYS[schema_kind] for path, schema_kind in path_schema_kinds.items() - }, - schema_defs=SCHEMA_DEFS, - ) - ) - ) - if metadata_variant == "inline": - return SimpleNamespace( - metadata=SimpleNamespace( - dataset=SimpleNamespace( - schema_=SCHEMAS[default_schema_kind], - schemas_by_path={path: SCHEMAS[schema_kind] for path, schema_kind in path_schema_kinds.items()}, - schema_defs={}, - ) - ) - ) - raise ValueError(f"unsupported metadata variant: {metadata_variant}") - - -def _mock_metric_with_required_schema(schema: dict) -> mock.Mock: - metric = mock.Mock() - metric.workspace = "default" - metric.name = "metric" - metric.supported_job_types = [app.SupportedJobTypes.OFFLINE, app.SupportedJobTypes.ONLINE] - metric.input_schema.return_value = SimpleNamespace(schema_=schema) - return metric - - -def _metric_job(dataset_root: str, *, optional_fields: list[str] | None = None) -> MetricOnlineJob: - return MetricOnlineJob( - metric=MetricRef(root="default/metric"), - model=Model(url="http://model.test/v1", name="model"), - dataset=FilesetRef(root=dataset_root), - prompt_template="{{input}}", - optional_fields=optional_fields or [], - ) - - -def _benchmark_online_job(*, optional_fields: list[str] | None = None) -> BenchmarkOnlineJob: - return BenchmarkOnlineJob( - benchmark=BenchmarkRef(root="default/bench"), - model=Model(url="http://model.test/v1", name="model"), - prompt_template="{{input}}", - optional_fields=optional_fields or [], - ) - - -def _metric_offline_job(dataset_root: str) -> MetricOfflineJob: - return MetricOfflineJob( - metric=MetricRef(root="default/metric"), - dataset=FilesetRef(root=dataset_root), - ) - - -def _benchmark_offline_job() -> BenchmarkOfflineJob: - return BenchmarkOfflineJob(benchmark=BenchmarkRef(root="default/bench")) - - -def _benchmark_entity(dataset_root: str) -> entities.Benchmark: - return entities.Benchmark( - workspace="default", - name="bench", - description="Test benchmark", - dataset=FilesetRef(root=dataset_root), - metrics=[entities.BLEUMetric(workspace="default", name="bleu", references=[])], - ) - - -def _benchmark_entity_with_input_metric(dataset_root: str) -> entities.Benchmark: - return entities.Benchmark( - workspace="default", - name="bench", - description="Test benchmark", - dataset=FilesetRef(root=dataset_root), - metrics=[ - entities.ExactMatchMetric( - workspace="default", - name="exact-match", - reference="{{input}}", - ) - ], - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_wildcard_no_matches_returns_error( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={}, - ) - # Fileset contains files, but none inside selector path. - sdk.files.list.return_value = _files_response("train/c.jsonl") - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is False - assert any("no matching files found in fileset" in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_wildcard_ignores_unmatched_incompatible_files( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input", - # Outside selector and intentionally incompatible. - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is True - assert result.errors == [] - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_wildcard_does_not_validate_right_anchored_matches( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - # Would match under right-anchored path matching, but root-anchored - # fileset selector semantics should not select it. - "nested/validation/b.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "nested/validation/b.jsonl", - ) - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is True - assert result.errors == [] - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_wildcard_default_fallback_applies_to_unmapped_matched_path( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={ - "validation/a.jsonl": "input", - # Outside selector and should be ignored. - "train/c.jsonl": "input", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is False - assert any("[validation/b.jsonl]" in error for error in result.errors) - assert all("[train/c.jsonl]" not in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_exact_fragment_selects_only_exact_file( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "reference", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/a.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_exact_fragment_uses_default_schema_without_listing( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={}, - ) - sdk.files.list.return_value = _files_response("validation/b.jsonl", "train/c.jsonl") - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/a.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_metric_schema_check_invalid_fileset_ref_format_returns_validation_error(): - sdk = AsyncMock() - - result = await metric_dataset_schema_check( - _metric_job("my-fileset-without-workspace"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is False - assert any("Invalid dataset schema metadata" in error for error in result.errors) - assert any("workspace/fileset-name" in error for error in result.errors) - sdk.files.filesets.retrieve.assert_not_awaited() - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_prompt_validation_receives_optional_fields_and_ignored_roots( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - job = _metric_job( - "default/my-fileset#validation/*.jsonl", - optional_fields=["reference", "sample.output_text"], - ) - - with mock.patch( - "nmp.evaluator.api.v2.metrics.checks.validate_prompt_template_against_dataset_schema", - return_value=[], - ) as mock_prompt_check: - result = await metric_dataset_schema_check( - job, - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is True - assert mock_prompt_check.call_count == 1 - for call in mock_prompt_check.call_args_list: - assert call.kwargs["ignored_roots"] == {"output", "output_text", "response"} - assert call.kwargs["optional_fields"] == {"reference", "sample.output_text"} - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_wildcard_prompt_error_has_matched_path_context_only( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input_extra", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - - with mock.patch( - "nmp.evaluator.api.v2.metrics.checks.validate_prompt_template_against_dataset_schema", - side_effect=[[], ["dataset schema missing required field 'input'"]], - ): - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is False - assert any("[validation/b.jsonl]" in error for error in result.errors) - assert all("[train/c.jsonl]" not in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_offline_job_skips_prompt_validation( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input", - }, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl", "validation/b.jsonl") - - with mock.patch( - "nmp.evaluator.api.v2.metrics.checks.validate_prompt_template_against_dataset_schema", - return_value=[], - ) as mock_prompt_check: - result = await metric_dataset_schema_check( - _metric_offline_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is True - mock_prompt_check.assert_not_called() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_without_fragment_uses_default_schema( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={"validation/a.jsonl": "reference"}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_without_fragment_error_has_no_path_prefix( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is False - assert any("dataset schema missing required field 'input'" in error for error in result.errors) - assert all("[" not in error for error in result.errors) - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_metric_schema_check_returns_true_when_fileset_has_no_dataset_metadata(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace(metadata=SimpleNamespace(dataset=None)) - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_metric_schema_check_unknown_schema_ref_returns_invalid_metadata_error(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace( - metadata=SimpleNamespace( - dataset=SimpleNamespace( - schema_="input_required", - schemas_by_path={"validation/a.jsonl": "missing_schema"}, - schema_defs=SCHEMA_DEFS, - ) - ) - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl", "train/c.jsonl") - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is False - assert any("Invalid dataset schema metadata" in error for error in result.errors) - assert any("unknown dataset schema reference" in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_wraps_template_schema_inference_error_from_input_schema( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={"validation/a.jsonl": "input"}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - metric = _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA) - metric.input_schema.side_effect = TemplateSchemaInferenceError("unsupported metric template expression") - - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - metric, - sdk, - ) - - assert result.status is False - assert any("Unsupported metric prompt template for schema inference" in error for error in result.errors) - assert any("unsupported metric template expression" in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_metric_schema_check_wraps_generic_prompt_validation_exception( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={"validation/a.jsonl": "input"}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - - with mock.patch( - "nmp.evaluator.api.v2.metrics.checks.validate_prompt_template_against_dataset_schema", - side_effect=RuntimeError("prompt validation blew up"), - ): - result = await metric_dataset_schema_check( - _metric_job("default/my-fileset#validation/*.jsonl"), - _mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA), - sdk, - ) - - assert result.status is False - assert any("Invalid dataset schema metadata" in error for error in result.errors) - assert any("prompt validation blew up" in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_creation_schema_check_wildcard_ignores_unmatched_incompatible_files( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - - result = await benchmark_creation_schema_check( - FilesetRef(root="default/my-fileset#validation/*.jsonl"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is True - assert result.errors == [] - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_creation_schema_check_wildcard_no_matches_returns_error( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={}, - ) - sdk.files.list.return_value = _files_response("train/c.jsonl") - - result = await benchmark_creation_schema_check( - FilesetRef(root="default/my-fileset#validation/*.jsonl"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is False - assert any("no matching files found in fileset" in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_creation_schema_check_wildcard_default_fallback_applies_to_unmapped_matched_path( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={ - "validation/a.jsonl": "input", - # Outside selector and should be ignored. - "train/c.jsonl": "input", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - - result = await benchmark_creation_schema_check( - FilesetRef(root="default/my-fileset#validation/*.jsonl"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is False - assert any("[validation/b.jsonl]" in error for error in result.errors) - assert all("[train/c.jsonl]" not in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_creation_schema_check_exact_fragment_selects_only_exact_file( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "reference", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - - result = await benchmark_creation_schema_check( - FilesetRef(root="default/my-fileset#validation/a.jsonl"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_benchmark_creation_schema_check_invalid_fileset_ref_format_returns_validation_error(): - sdk = AsyncMock() - - result = await benchmark_creation_schema_check( - FilesetRef(root="my-fileset-without-workspace"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is False - assert any("Invalid dataset schema metadata" in error for error in result.errors) - assert any("workspace/fileset-name" in error for error in result.errors) - sdk.files.filesets.retrieve.assert_not_awaited() - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_benchmark_creation_schema_check_unknown_schema_ref_returns_invalid_metadata_error(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace( - metadata=SimpleNamespace( - dataset=SimpleNamespace( - schema_="input_required", - schemas_by_path={"validation/a.jsonl": "missing_schema"}, - schema_defs=SCHEMA_DEFS, - ) - ) - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl", "train/c.jsonl") - - result = await benchmark_creation_schema_check( - FilesetRef(root="default/my-fileset#validation/*.jsonl"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is False - assert any("Invalid dataset schema metadata" in error for error in result.errors) - assert any("unknown dataset schema reference" in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_wildcard_prompt_validation_runs_for_matched_only( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - job = _benchmark_online_job() - - with mock.patch( - "nmp.evaluator.api.v2.benchmarks.checks.validate_prompt_template_against_dataset_schema", - return_value=[], - ) as mock_prompt_check: - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is True - assert mock_prompt_check.call_count == 1 - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_prompt_validation_receives_optional_fields_and_ignored_roots( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - job = _benchmark_online_job(optional_fields=["reference", "sample.output_text"]) - - with mock.patch( - "nmp.evaluator.api.v2.benchmarks.checks.validate_prompt_template_against_dataset_schema", - return_value=[], - ) as mock_prompt_check: - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is True - assert mock_prompt_check.call_count == 1 - for call in mock_prompt_check.call_args_list: - assert call.kwargs["ignored_roots"] == {"output", "output_text", "response"} - assert call.kwargs["optional_fields"] == {"reference", "sample.output_text"} - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_offline_job_skips_prompt_validation( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input", - }, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl", "validation/b.jsonl") - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - - with mock.patch( - "nmp.evaluator.api.v2.benchmarks.checks.validate_prompt_template_against_dataset_schema", - return_value=[], - ) as mock_prompt_check: - result = await benchmark_job_schema_check(_benchmark_offline_job(), benchmark, sdk) - - assert result.status is True - mock_prompt_check.assert_not_called() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_creation_schema_check_without_fragment_uses_default_schema( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={"validation/a.jsonl": "reference"}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - - result = await benchmark_creation_schema_check( - FilesetRef(root="default/my-fileset"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_creation_schema_check_without_fragment_error_has_no_path_prefix( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - - result = await benchmark_creation_schema_check( - FilesetRef(root="default/my-fileset"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is False - assert any("dataset schema missing required field 'input'" in error for error in result.errors) - assert all("[" not in error for error in result.errors) - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_benchmark_creation_schema_check_returns_true_when_fileset_has_no_dataset_metadata(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace(metadata=SimpleNamespace(dataset=None)) - - result = await benchmark_creation_schema_check( - FilesetRef(root="default/my-fileset#validation/*.jsonl"), - [_mock_metric_with_required_schema(INPUT_REQUIRED_SCHEMA)], - None, - sdk, - ) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_without_fragment_uses_default_schema( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={"validation/a.jsonl": "reference"}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - benchmark = _benchmark_entity_with_input_metric("default/my-fileset") - job = _benchmark_online_job() - - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_without_fragment_error_has_no_path_prefix( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - benchmark = _benchmark_entity_with_input_metric("default/my-fileset") - job = _benchmark_online_job() - - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is False - assert any("dataset schema missing required field 'input'" in error for error in result.errors) - assert all("[" not in error for error in result.errors) - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_benchmark_job_schema_check_returns_true_when_fileset_has_no_dataset_metadata(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace(metadata=SimpleNamespace(dataset=None)) - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - job = _benchmark_online_job() - - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_benchmark_job_schema_check_validates_job_type_without_dataset_schema_metadata(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace(metadata=SimpleNamespace(dataset=None)) - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - benchmark.metrics[0].supported_job_types = [app.SupportedJobTypes.OFFLINE] - - result = await benchmark_job_schema_check(_benchmark_online_job(), benchmark, sdk) - - assert result.status is False - assert any("Benchmark does not support online jobs." in error for error in result.errors) - sdk.files.filesets.retrieve.assert_not_awaited() - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_wildcard_prompt_error_has_matched_path_context_only( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "input_extra", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - job = _benchmark_online_job() - - with mock.patch( - "nmp.evaluator.api.v2.benchmarks.checks.validate_prompt_template_against_dataset_schema", - side_effect=[[], ["dataset schema missing required field 'input'"]], - ): - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is False - assert any("[validation/b.jsonl]" in error for error in result.errors) - assert all("[train/c.jsonl]" not in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_exact_fragment_selects_only_exact_file( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "reference", - "train/c.jsonl": "reference", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/a.jsonl") - job = _benchmark_online_job() - - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is True - assert result.errors == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_benchmark_job_schema_check_invalid_fileset_ref_format_returns_validation_error(): - sdk = AsyncMock() - benchmark = _benchmark_entity_with_input_metric("my-fileset-without-workspace") - job = _benchmark_online_job() - - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is False - assert any("Invalid dataset schema metadata" in error for error in result.errors) - assert any("workspace/fileset-name" in error for error in result.errors) - sdk.files.filesets.retrieve.assert_not_awaited() - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_skips_prompt_validation_when_schema_fails( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="reference", - path_schema_kinds={ - "validation/a.jsonl": "input", - "validation/b.jsonl": "reference", - "train/c.jsonl": "input", - }, - ) - sdk.files.list.return_value = _files_response( - "validation/a.jsonl", - "validation/b.jsonl", - "train/c.jsonl", - ) - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - job = _benchmark_online_job() - - with mock.patch( - "nmp.evaluator.api.v2.benchmarks.checks.validate_prompt_template_against_dataset_schema", - return_value=[], - ) as mock_prompt_check: - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is False - assert any("[validation/b.jsonl]" in error for error in result.errors) - assert all("[train/c.jsonl]" not in error for error in result.errors) - mock_prompt_check.assert_not_called() - - -@pytest.mark.asyncio -async def test_benchmark_job_schema_check_unknown_schema_ref_returns_invalid_metadata_error(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace( - metadata=SimpleNamespace( - dataset=SimpleNamespace( - schema_="input_required", - schemas_by_path={"validation/a.jsonl": "missing_schema"}, - schema_defs=SCHEMA_DEFS, - ) - ) - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl", "train/c.jsonl") - benchmark = _benchmark_entity("default/my-fileset#validation/*.jsonl") - job = _benchmark_online_job() - - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is False - assert any("Invalid dataset schema metadata" in error for error in result.errors) - assert any("unknown dataset schema reference" in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_wraps_template_schema_inference_error_from_prompt_validation( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={"validation/a.jsonl": "input"}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - job = _benchmark_online_job() - - with mock.patch( - "nmp.evaluator.api.v2.benchmarks.checks.validate_prompt_template_against_dataset_schema", - side_effect=TemplateSchemaInferenceError("unsupported benchmark prompt expression"), - ): - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is False - assert any("Unsupported prompt template for schema inference" in error for error in result.errors) - assert any("unsupported benchmark prompt expression" in error for error in result.errors) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("metadata_variant", ["schema_refs", "inline"]) -async def test_benchmark_job_schema_check_wraps_generic_prompt_validation_exception( - metadata_variant: Literal["schema_refs", "inline"], -): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _build_dataset_metadata( - metadata_variant, - default_schema_kind="input", - path_schema_kinds={"validation/a.jsonl": "input"}, - ) - sdk.files.list.return_value = _files_response("validation/a.jsonl") - benchmark = _benchmark_entity_with_input_metric("default/my-fileset#validation/*.jsonl") - job = _benchmark_online_job() - - with mock.patch( - "nmp.evaluator.api.v2.benchmarks.checks.validate_prompt_template_against_dataset_schema", - side_effect=RuntimeError("benchmark prompt validation blew up"), - ): - result = await benchmark_job_schema_check(job, benchmark, sdk) - - assert result.status is False - assert any("Invalid dataset schema metadata" in error for error in result.errors) - assert any("benchmark prompt validation blew up" in error for error in result.errors) diff --git a/services/evaluator/tests/app/dataset_schemas/test_filesets.py b/services/evaluator/tests/app/dataset_schemas/test_filesets.py deleted file mode 100644 index 28066febef..0000000000 --- a/services/evaluator/tests/app/dataset_schemas/test_filesets.py +++ /dev/null @@ -1,63 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import pytest -from nmp.evaluator.app.dataset_schemas.filesets import ( - parse_fileset_ref_path, - resolve_schema_entry, - select_schema_for_path, -) - - -def test_select_schema_for_path_resolves_schema_defs(): - selected = select_schema_for_path( - "default_row", - {"validation.jsonl": "validation_row"}, - "validation.jsonl", - schema_defs={ - "default_row": {"type": "object", "properties": {"id": {"type": "string"}}}, - "validation_row": {"type": "object", "properties": {"name": {"type": "string"}}}, - }, - ) - - assert selected == {"type": "object", "properties": {"name": {"type": "string"}}} - - -def test_select_schema_for_path_normalizes_leading_slash(): - selected = select_schema_for_path( - {"type": "object", "properties": {"id": {"type": "string"}}}, - {"validation.jsonl": {"type": "object", "properties": {"input": {"type": "string"}}}}, - "/validation.jsonl", - ) - - assert selected == {"type": "object", "properties": {"input": {"type": "string"}}} - - -def test_parse_fileset_ref_path_preserves_glob_fragments(): - assert parse_fileset_ref_path("workspace/fileset#validation/*.jsonl") == ( - "workspace/fileset", - "validation/*.jsonl", - ) - - -def test_parse_fileset_ref_path_without_fragment(): - assert parse_fileset_ref_path("workspace/fileset") == ("workspace/fileset", None) - - -def test_parse_fileset_ref_path_normalizes_empty_and_leading_slash_fragments(): - assert parse_fileset_ref_path("workspace/fileset#") == ("workspace/fileset", None) - assert parse_fileset_ref_path("workspace/fileset#/") == ("workspace/fileset", None) - assert parse_fileset_ref_path("workspace/fileset#/validation/a.jsonl") == ( - "workspace/fileset", - "validation/a.jsonl", - ) - - -def test_resolve_schema_entry_rejects_unknown_schema_def_reference(): - with pytest.raises(ValueError, match="unknown dataset schema reference"): - resolve_schema_entry("missing_schema", schema_defs={"other": {"type": "object"}}) - - -def test_resolve_schema_entry_rejects_unsupported_type(): - with pytest.raises(TypeError, match="unsupported dataset schema entry type"): - resolve_schema_entry(123, schema_defs={}) diff --git a/services/evaluator/tests/app/dataset_schemas/test_resolution.py b/services/evaluator/tests/app/dataset_schemas/test_resolution.py deleted file mode 100644 index 7070e9977a..0000000000 --- a/services/evaluator/tests/app/dataset_schemas/test_resolution.py +++ /dev/null @@ -1,260 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from types import SimpleNamespace -from unittest.mock import AsyncMock - -import pytest -from nmp.evaluator.app.dataset_schemas.resolution import ( - SchemaResolutionTarget, - group_schema_resolution_targets, - resolve_dataset_schema_targets, -) -from nmp.evaluator.app.values import DatasetRows, Fileset, FilesetRef - - -def _mock_fileset_with_dataset_metadata( - *, - schema_: dict | str | None = None, - schemas_by_path: dict[str, dict | str] | None = None, - schema_defs: dict[str, dict] | None = None, -) -> SimpleNamespace: - return SimpleNamespace( - metadata=SimpleNamespace( - dataset=SimpleNamespace( - schema_=schema_, - schemas_by_path=schemas_by_path or {}, - schema_defs=schema_defs or {}, - ) - ) - ) - - -def test_group_schema_resolution_targets_collapses_identical_schemas_with_path_context(): - schema = {"type": "object", "properties": {"input": {"type": "string"}}} - - grouped = group_schema_resolution_targets( - [ - SchemaResolutionTarget(paths=("validation/a.jsonl",), schema=schema), - SchemaResolutionTarget( - paths=("validation/b.jsonl",), schema={"properties": {"input": {"type": "string"}}, "type": "object"} - ), - SchemaResolutionTarget(paths=("validation/c.jsonl",), schema={"type": "object"}), - ] - ) - - assert [(target.paths, target.schema) for target in grouped] == [ - (("validation/a.jsonl", "validation/b.jsonl"), schema), - (("validation/c.jsonl",), {"type": "object"}), - ] - assert grouped[0].path_context() == "validation/a.jsonl (+1 more paths)" - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_rejects_wildcard_with_no_matches(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _mock_fileset_with_dataset_metadata(schema_={"type": "object"}) - sdk.files.list.return_value = SimpleNamespace(data=[]) - - with pytest.raises(ValueError, match="no matching files found in fileset"): - await resolve_dataset_schema_targets(FilesetRef(root="workspace/fileset#validation/*.jsonl"), sdk) - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_rejects_wildcard_over_match_limit(monkeypatch: pytest.MonkeyPatch): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _mock_fileset_with_dataset_metadata(schema_={"type": "object"}) - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/a.jsonl"), - SimpleNamespace(path="validation/b.jsonl"), - SimpleNamespace(path="validation/c.jsonl"), - ] - ) - monkeypatch.setattr("nmp.evaluator.app.dataset_schemas.resolution._MAX_WILDCARD_SCHEMA_VALIDATION_TARGETS", 2) - - with pytest.raises(ValueError, match="matched more than 2 validation targets"): - await resolve_dataset_schema_targets(FilesetRef(root="workspace/fileset#validation/*.jsonl"), sdk) - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_returns_empty_when_fileset_metadata_has_no_dataset(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace(metadata=SimpleNamespace(dataset=None)) - - targets = await resolve_dataset_schema_targets(FilesetRef(root="workspace/fileset#validation/*.jsonl"), sdk) - - assert targets == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_returns_schema_per_matched_path(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _mock_fileset_with_dataset_metadata( - schema_="default_row", - schemas_by_path={"validation/a.jsonl": "special_row"}, - schema_defs={ - "default_row": {"type": "object", "properties": {"id": {"type": "string"}}}, - "special_row": {"type": "object", "properties": {"name": {"type": "string"}}}, - }, - ) - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/a.jsonl"), - SimpleNamespace(path="validation/b.jsonl"), - SimpleNamespace(path="train/c.jsonl"), - ] - ) - - targets = await resolve_dataset_schema_targets(FilesetRef(root="workspace/fileset#validation/*.jsonl"), sdk) - - assert [(target.paths, target.schema) for target in targets] == [ - (("validation/a.jsonl",), {"type": "object", "properties": {"name": {"type": "string"}}}), - (("validation/b.jsonl",), {"type": "object", "properties": {"id": {"type": "string"}}}), - ] - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_ignores_unsupported_default_schema_type(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace( - metadata=SimpleNamespace( - dataset=SimpleNamespace( - schema_=123, - schemas_by_path={}, - schema_defs={}, - ) - ) - ) - - targets = await resolve_dataset_schema_targets(FilesetRef(root="workspace/fileset#validation/*.jsonl"), sdk) - - assert targets == [] - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_coerces_invalid_schema_maps_to_defaults(): - default_schema = {"type": "object", "properties": {"id": {"type": "string"}}} - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = SimpleNamespace( - metadata=SimpleNamespace( - dataset=SimpleNamespace( - schema_=default_schema, - schemas_by_path=["not-a-dict"], - schema_defs=["not-a-dict"], - ) - ) - ) - sdk.files.list.return_value = SimpleNamespace(data=[SimpleNamespace(path="validation/a.jsonl")]) - - targets = await resolve_dataset_schema_targets(FilesetRef(root="workspace/fileset#validation/*.jsonl"), sdk) - - assert [(target.paths, target.schema) for target in targets] == [(("validation/a.jsonl",), default_schema)] - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_returns_empty_for_inline_dataset_rows(): - sdk = AsyncMock() - - targets = await resolve_dataset_schema_targets( - DatasetRows(rows=[{"input": "hello"}]), - sdk, - ) - - assert targets == [] - sdk.files.filesets.retrieve.assert_not_awaited() - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_uses_fileset_embedded_metadata_without_sdk_lookup(): - sdk = AsyncMock() - fileset = Fileset( - path="validation/a.jsonl", - storage={ - "type": "ngc", - "org": "org", - "team": "team", - "target": "target", - "api_key_secret": "test-api-key", - }, - metadata={ - "dataset": { - "schema": {"type": "object", "properties": {"id": {"type": "string"}}}, - "schemas_by_path": { - "validation/a.jsonl": {"type": "object", "properties": {"input": {"type": "string"}}} - }, - } - }, - ) - - targets = await resolve_dataset_schema_targets(fileset, sdk) - - assert [(target.paths, target.schema) for target in targets] == [ - (("validation/a.jsonl",), {"type": "object", "properties": {"input": {"type": "string"}}}) - ] - sdk.files.filesets.retrieve.assert_not_awaited() - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_returns_empty_for_fileset_without_dataset_metadata(): - sdk = AsyncMock() - fileset = Fileset( - path="validation/a.jsonl", - storage={ - "type": "ngc", - "org": "org", - "team": "team", - "target": "target", - "api_key_secret": "test-api-key", - }, - ) - - targets = await resolve_dataset_schema_targets(fileset, sdk) - - assert targets == [] - sdk.files.filesets.retrieve.assert_not_awaited() - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_rejects_invalid_fileset_ref_format(): - sdk = AsyncMock() - - with pytest.raises(ValueError, match="workspace/fileset-name"): - await resolve_dataset_schema_targets(FilesetRef(root="fileset-only"), sdk) - - sdk.files.filesets.retrieve.assert_not_awaited() - sdk.files.list.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_rejects_unknown_default_schema_reference(): - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _mock_fileset_with_dataset_metadata( - schema_="missing_default_schema", - schemas_by_path={}, - schema_defs={}, - ) - sdk.files.list.return_value = SimpleNamespace(data=[SimpleNamespace(path="validation/a.jsonl")]) - - with pytest.raises(ValueError, match="unknown dataset schema reference"): - await resolve_dataset_schema_targets(FilesetRef(root="workspace/fileset#validation/*.jsonl"), sdk) - - -@pytest.mark.asyncio -async def test_resolve_dataset_schema_targets_without_fragment_uses_default_schema(): - default_schema = {"type": "object", "properties": {"input": {"type": "string"}}} - sdk = AsyncMock() - sdk.files.filesets.retrieve.return_value = _mock_fileset_with_dataset_metadata( - schema_=default_schema, - schemas_by_path={"validation/a.jsonl": {"type": "object", "properties": {"reference": {"type": "string"}}}}, - ) - - targets = await resolve_dataset_schema_targets(FilesetRef(root="workspace/fileset"), sdk) - - assert [(target.paths, target.schema) for target in targets] == [((), default_schema)] - sdk.files.list.assert_not_awaited() diff --git a/services/evaluator/tests/app/datasets/nmp_datasets/test_fileset.py b/services/evaluator/tests/app/datasets/nmp_datasets/test_fileset.py deleted file mode 100644 index 4f6626e600..0000000000 --- a/services/evaluator/tests/app/datasets/nmp_datasets/test_fileset.py +++ /dev/null @@ -1,1187 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import json -import sys -from pathlib import Path -from typing import cast -from unittest.mock import AsyncMock, MagicMock, patch - -import pytest -from nemo_evaluator_sdk.values import DatasetRows -from nmp.common.files.storage_config import HuggingfaceStorageConfig -from nmp.evaluator.app.datasets.nmp_datasets.fileset import ( - _download_fileset_ref, - _download_fileset_ref_sync, - _download_inline_dataset, - _download_inline_fileset, - _download_inline_fileset_sync, - _generate_fileset_name, - create_fileset, - dataset_exists, - download_dataset, - download_dataset_sync, - get_local_dataset_path, - normalize_fileset_path, -) -from nmp.evaluator.app.values import Fileset, FilesetRef - -# Mock fileset_filesystem before importing the module under test -mock_fileset_filesystem = MagicMock() -sys.modules["fileset_filesystem"] = mock_fileset_filesystem - - -def make_hf_storage_config() -> HuggingfaceStorageConfig: - """Create a test HuggingfaceStorageConfig.""" - return HuggingfaceStorageConfig( - repo_id="test-org/test-repo", - repo_type="dataset", - ) - - -class TestNormalizeFilesetPath: - @pytest.mark.parametrize( - ("path", "expected"), - [ - # `#` as a separator - ("workspace#fileset-name", "workspace/fileset-name"), - # No fragment - ("workspace/fileset-name", "workspace/fileset-name"), - # Glob fragments should not become local paths with wildcards - ("workspace/fileset-name#*.jsonl", "workspace/fileset-name"), - ("workspace/fileset-name#**/*.jsonl", "workspace/fileset-name"), - # Glob fragment keeps stable prefix directory, if any - ("workspace/fileset-name#data/*.jsonl", "workspace/fileset-name/data"), - # Specific file fragments are appended normally - ("workspace/fileset-name#data/train.jsonl", "workspace/fileset-name/data/train.jsonl"), - # Empty string - ("", ""), - ], - ) - def test_normalize_fileset_path(self, path: str, expected: str): - assert normalize_fileset_path(path) == expected - - -class TestGetLocalDatasetPath: - def test_inline_dataset_returns_output_dir_with_default_filename(self): - """Test that DatasetRows returns output_dir/dataset.json.""" - dataset = DatasetRows(rows=[{"a": 1}]) - result = get_local_dataset_path(dataset, "/data/output") - assert result == "/data/output/dataset.json" - - def test_inline_dataset_with_custom_filename(self): - """Test that DatasetRows uses custom inline_filename.""" - dataset = DatasetRows(rows=[{"a": 1}]) - result = get_local_dataset_path(dataset, "/data/output", inline_filename="custom.json") - assert result == "/data/output/custom.json" - - def test_fileset_ref_normalizes_hash_separator(self): - """Test that FilesetRef path with # is normalized to /.""" - dataset = FilesetRef(root="workspace#fileset-name") - result = get_local_dataset_path(dataset, "/data/output") - assert result == "/data/output/workspace/fileset-name" - - def test_fileset_ref_with_slash_separator(self): - """Test that FilesetRef with / separator works correctly.""" - dataset = FilesetRef(root="workspace/fileset-name") - result = get_local_dataset_path(dataset, "/data/output") - assert result == "/data/output/workspace/fileset-name" - - def test_fileset_ref_with_subpath(self): - """Test that FilesetRef with subpath works correctly.""" - dataset = FilesetRef(root="workspace/fileset-name/subdir/file.json") - result = get_local_dataset_path(dataset, "/data/output") - assert result == "/data/output/workspace/fileset-name/subdir/file.json" - - def test_fileset_ref_with_glob_fragment_drops_pattern(self): - """Glob fragments should resolve to a stable directory path.""" - dataset = FilesetRef(root="workspace/fileset-name#*.jsonl") - result = get_local_dataset_path(dataset, "/data/output") - assert result == "/data/output/workspace/fileset-name" - - def test_fileset_ref_with_glob_fragment_keeps_prefix_dir(self): - """Glob fragments with a stable dir prefix keep that prefix.""" - dataset = FilesetRef(root="workspace/fileset-name#data/*.jsonl") - result = get_local_dataset_path(dataset, "/data/output") - assert result == "/data/output/workspace/fileset-name/data" - - def test_inline_fileset_with_path(self): - """Test that Fileset with path joins correctly.""" - dataset = Fileset(storage=make_hf_storage_config(), path="data/file.json") - result = get_local_dataset_path(dataset, "/data/output") - assert result == "/data/output/data/file.json" - - def test_inline_fileset_with_none_path(self): - """Test that Fileset with None path returns output_dir.""" - dataset = Fileset(storage=make_hf_storage_config(), path=None) - result = get_local_dataset_path(dataset, "/data/output") - assert result == "/data/output" - - def test_raises_error_when_output_dir_is_none(self): - """Test that ValueError is raised when output_dir is None.""" - dataset = DatasetRows(rows=[{"a": 1}]) - with pytest.raises(ValueError, match="output_dir is required"): - get_local_dataset_path(dataset, None) - - def test_raises_error_when_output_dir_is_empty(self): - """Test that ValueError is raised when output_dir is empty string.""" - dataset = DatasetRows(rows=[{"a": 1}]) - with pytest.raises(ValueError, match="output_dir is required"): - get_local_dataset_path(dataset, "") - - def test_raises_error_for_unsupported_dataset_type(self): - """Test that ValueError is raised for unsupported dataset type.""" - unsupported_dataset = cast(FilesetRef | Fileset | DatasetRows, "not-a-dataset") - with pytest.raises(ValueError, match="Unsupported dataset type"): - get_local_dataset_path(unsupported_dataset, "/data/output") - - -class TestGenerateFilesetName: - def test_generates_unique_names(self): - """Test that _generate_fileset_name generates unique names.""" - names = {_generate_fileset_name() for _ in range(100)} - assert len(names) == 100 - - def test_name_format(self): - """Test that _generate_fileset_name follows expected format.""" - name = _generate_fileset_name() - assert name.startswith("fileset-") - assert len(name) == len("fileset-") + 8 - - -class TestCreateFileset: - @pytest.mark.asyncio - async def test_creates_and_deletes_fileset(self): - """Test that create_fileset creates and then deletes the fileset.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_fileset.workspace = "default" - mock_sdk.files.filesets.create.return_value = mock_fileset - - async with create_fileset(mock_sdk, name="test-fileset", workspace="default") as fileset: - assert fileset.name == "test-fileset" - mock_sdk.files.filesets.create.assert_called_once_with( - workspace="default", - name="test-fileset", - description="Test fileset", - ) - - mock_sdk.files.filesets.delete.assert_called_once_with("test-fileset", workspace="default") - - @pytest.mark.asyncio - async def test_generates_name_if_not_provided(self): - """Test that create_fileset generates a name if not provided.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_sdk.files.filesets.create.return_value = mock_fileset - - async with create_fileset(mock_sdk, workspace="default"): - call_args = mock_sdk.files.filesets.create.call_args - assert call_args.kwargs["name"].startswith("fileset-") - - @pytest.mark.asyncio - async def test_passes_kwargs_to_create(self): - """Test that create_fileset passes additional kwargs to SDK create.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_sdk.files.filesets.create.return_value = mock_fileset - - storage_config = {"type": "huggingface", "repo_id": "test/repo"} - - async with create_fileset(mock_sdk, name="test", storage=storage_config): - call_args = mock_sdk.files.filesets.create.call_args - assert call_args.kwargs["storage"] == storage_config - - @pytest.mark.asyncio - async def test_cleanup_called_on_user_exception(self): - """Test that cleanup is called even when user code raises an exception.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_sdk.files.filesets.create.return_value = mock_fileset - - with pytest.raises(ValueError, match="User error"): - async with create_fileset(mock_sdk, name="test-fileset", workspace="default"): - raise ValueError("User error") - - # Cleanup should still be called despite the exception - mock_sdk.files.filesets.delete.assert_called_once_with("test-fileset", workspace="default") - - @pytest.mark.asyncio - async def test_cleanup_failure_logs_warning(self, caplog): - """Test that cleanup failure is logged as warning and doesn't raise.""" - import logging - - caplog.set_level(logging.WARNING, logger="nmp.evaluator.app.datasets.nmp_datasets.fileset") - - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_sdk.files.filesets.create.return_value = mock_fileset - mock_sdk.files.filesets.delete.side_effect = Exception("Delete failed") - - # Should not raise despite cleanup failure - async with create_fileset(mock_sdk, name="test-fileset", workspace="default"): - pass - - # Warning should be logged - assert "Fileset cleanup failed" in caplog.text - assert "Delete failed" in caplog.text - - @pytest.mark.asyncio - async def test_cleanup_failure_on_user_exception_logs_warning(self, caplog): - """Test that both user exception and cleanup failure are handled.""" - import logging - - caplog.set_level(logging.WARNING, logger="nmp.evaluator.app.datasets.nmp_datasets.fileset") - - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_sdk.files.filesets.create.return_value = mock_fileset - mock_sdk.files.filesets.delete.side_effect = Exception("Delete failed") - - # User exception should still propagate - with pytest.raises(ValueError, match="User error"): - async with create_fileset(mock_sdk, name="test-fileset", workspace="default"): - raise ValueError("User error") - - # Cleanup warning should still be logged - assert "Fileset cleanup failed" in caplog.text - assert "Delete failed" in caplog.text - - -class TestDatasetExists: - @pytest.mark.asyncio - async def test_dataset_inline_always_returns_true(self): - """Test that DatasetRows always returns True.""" - mock_sdk = AsyncMock() - dataset = DatasetRows(rows=[{"a": 1}]) - - result = await dataset_exists(mock_sdk, dataset) - - assert result is True - # SDK should not be called for inline datasets - mock_sdk.files.filesets.create.assert_not_called() - - @pytest.mark.asyncio - async def test_fileset_urn_checks_exists(self): - """Test that FilesetRef uses FilesetFileSystem._exists.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._exists.return_value = True - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is True - mock_fs._exists.assert_called_once_with("default/my-fileset") - - @pytest.mark.asyncio - async def test_fileset_urn_returns_false_when_not_exists(self): - """Test that FilesetRef returns False when path doesn't exist.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._exists.return_value = False - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is False - - @pytest.mark.asyncio - async def test_fileset_inline_with_path_checks_exists(self): - """Test that Fileset with path uses FilesetFileSystem._exists.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_fileset.workspace = "default" - mock_sdk.files.filesets.create.return_value = mock_fileset - - dataset = Fileset( - storage=make_hf_storage_config(), - path="data/file.json", - ) - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._exists.return_value = True - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is True - mock_fs._exists.assert_called_once_with("default/test-fileset/data/file.json") - - @pytest.mark.asyncio - async def test_fileset_inline_with_none_path_checks_list_files(self): - """Test that Fileset with None path uses list.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_fileset.workspace = "default" - mock_sdk.files.filesets.create.return_value = mock_fileset - - # sdk.files.list() returns ListFilesResponse with .data attribute - mock_response = MagicMock() - mock_response.data = [MagicMock(), MagicMock()] - mock_sdk.files.list.return_value = mock_response - - # Fileset with None path - treated as "no specific path" - dataset = Fileset(storage=make_hf_storage_config(), path=None) - - result = await dataset_exists(mock_sdk, dataset) - - # None path uses list to check if fileset has any files - assert result is True - mock_sdk.files.list.assert_called_once() - - @pytest.mark.asyncio - async def test_fileset_inline_with_none_path_returns_false_when_no_files(self): - """Test that Fileset with None path returns False when no files exist.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_fileset.workspace = "default" - mock_sdk.files.filesets.create.return_value = mock_fileset - - # sdk.files.list() returns ListFilesResponse with empty .data - mock_response = MagicMock() - mock_response.data = [] - mock_sdk.files.list.return_value = mock_response - - # Fileset with None path - dataset = Fileset(storage=make_hf_storage_config(), path=None) - - result = await dataset_exists(mock_sdk, dataset) - - assert result is False - mock_sdk.files.list.assert_called_once() - - @pytest.mark.asyncio - async def test_fileset_ref_with_fragment_specific_file_exists(self): - """Test that FilesetRef with specific file fragment checks that file exists.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#train.json") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - # First call checks base path, second checks specific file - mock_fs._exists.side_effect = [True, True] - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is True - assert mock_fs._exists.call_count == 2 - mock_fs._exists.assert_any_call("default/my-fileset") - mock_fs._exists.assert_any_call("default/my-fileset/train.json") - - @pytest.mark.asyncio - async def test_fileset_ref_with_fragment_specific_file_not_exists(self): - """Test that FilesetRef with specific file fragment returns False when file doesn't exist.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#train.json") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - # Base path exists but file doesn't - mock_fs._exists.side_effect = [True, False] - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is False - - @pytest.mark.asyncio - async def test_fileset_ref_with_fragment_base_not_exists(self): - """Test that FilesetRef with fragment returns False when base fileset doesn't exist.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#train.json") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._exists.return_value = False - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is False - # Should only check base path, not try to find files - mock_fs._exists.assert_called_once_with("default/my-fileset") - - @pytest.mark.asyncio - async def test_fileset_ref_with_glob_pattern_matches(self): - """Glob precheck should only validate base exists (avoid listing).""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#*.json") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._exists.return_value = True # Base path exists - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is True - mock_fs._find.assert_not_called() - - @pytest.mark.asyncio - async def test_fileset_ref_with_glob_pattern_checks_prefix_dir(self): - """Glob precheck should validate stable prefix dir if present.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#data/*.json") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - # base exists, then prefix dir exists - mock_fs._exists.side_effect = [True, True] - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is True - assert mock_fs._exists.call_count == 2 - mock_fs._exists.assert_any_call("default/my-fileset") - mock_fs._exists.assert_any_call("default/my-fileset/data") - - @pytest.mark.asyncio - async def test_fileset_ref_with_glob_pattern_missing_prefix_dir_returns_false(self): - """Glob precheck should fail if stable prefix directory is missing.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#data/*.json") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - # base exists, but prefix dir does not - mock_fs._exists.side_effect = [True, False] - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is False - - @pytest.mark.asyncio - async def test_fileset_ref_with_glob_pattern_no_matches(self): - """Glob precheck no longer attempts to prove a match exists.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#*.json") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._exists.return_value = True # Base path exists - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is True - - @pytest.mark.asyncio - async def test_fileset_ref_with_glob_pattern_find_exception(self): - """Glob precheck should not call find, so exceptions are irrelevant.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#*.json") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._exists.return_value = True - mock_fs_class.return_value = mock_fs - - result = await dataset_exists(mock_sdk, dataset) - - assert result is True - - -class TestDownloadDatasetRows: - def test_creates_directory_and_writes_json(self, tmp_path): - """Test that _download_inline_dataset creates dir and writes JSON.""" - dataset = DatasetRows(rows=[{"a": 1}, {"b": 2}]) - destination = tmp_path / "output" - - result = _download_inline_dataset(dataset, str(destination)) - - assert result == destination / "dataset.json" - assert result.exists() - - with open(result) as f: - data = json.load(f) - assert data == [{"a": 1}, {"b": 2}] - - def test_custom_filename(self, tmp_path): - """Test that _download_inline_dataset uses custom filename.""" - dataset = DatasetRows(rows=[{"a": 1}]) - destination = tmp_path / "output" - - result = _download_inline_dataset(dataset, str(destination), filename="custom.json") - - assert result == destination / "custom.json" - assert result.exists() - - def test_creates_nested_directories(self, tmp_path): - """Test that _download_inline_dataset creates nested directories.""" - dataset = DatasetRows(rows=[{"a": 1}]) - destination = tmp_path / "deep" / "nested" / "path" - - result = _download_inline_dataset(dataset, str(destination)) - - assert result.exists() - assert destination.exists() - - def test_unwraps_columnar_format_for_ragas(self, tmp_path): - """Test that _download_inline_dataset unwraps columnar format for RAGAS/HuggingFace compatibility. - - When rows contains a single dict with list values (columnar format), - the dict is unwrapped so Dataset.from_dict() can consume it directly. - """ - # RAGAS/HF columnar format: single dict with list values, wrapped in a list - columnar_data = { - "question": ["Q1", "Q2", "Q3"], - "contexts": [["ctx1"], ["ctx2"], ["ctx3"]], - "ground_truth": ["gt1", "gt2", "gt3"], - "answer": ["A1", "A2", "A3"], - } - dataset = DatasetRows(rows=[columnar_data]) - destination = tmp_path / "output" - - result = _download_inline_dataset(dataset, str(destination)) - - assert result.exists() - - with open(result) as f: - data = json.load(f) - - # Should be unwrapped to just the dict, not a list containing a dict - assert isinstance(data, dict), "Columnar format should be unwrapped to a dict" - assert data == columnar_data - assert "question" in data - assert data["question"] == ["Q1", "Q2", "Q3"] - - def test_preserves_row_format_multiple_dicts(self, tmp_path): - """Test that _download_inline_dataset preserves row format when multiple dicts present.""" - # Standard row format: list of dicts - row_data = [{"a": 1}, {"a": 2}, {"a": 3}] - dataset = DatasetRows(rows=row_data) - destination = tmp_path / "output" - - result = _download_inline_dataset(dataset, str(destination)) - - with open(result) as f: - data = json.load(f) - - # Should remain as a list of dicts - assert isinstance(data, list) - assert data == row_data - - def test_preserves_single_row_with_non_list_values(self, tmp_path): - """Test that single row with non-list values is not unwrapped.""" - # Single row with scalar values (not columnar format) - row_data = [{"name": "test", "value": 42}] - dataset = DatasetRows(rows=row_data) - destination = tmp_path / "output" - - result = _download_inline_dataset(dataset, str(destination)) - - with open(result) as f: - data = json.load(f) - - # Should remain as a list since values are not lists - assert isinstance(data, list) - assert data == row_data - - -class TestDownloadFilesetRef: - @pytest.mark.asyncio - async def test_downloads_using_fs_get(self, tmp_path): - """Test that _download_fileset_ref uses FilesetFileSystem._get to download to destination/root.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset") - destination = tmp_path / "output" - - # Mock _get to simulate download - async def mock_get(path, dest, recursive=True): - # dest is now destination/default/my-fileset - dest_path = Path(dest) - dest_path.mkdir(parents=True, exist_ok=True) - (dest_path / "file.json").write_text('{"test": 1}') - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._get = mock_get - mock_fs_class.return_value = mock_fs - - result = await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - # Files are downloaded to destination / dataset.root - expected_dest = destination / "default" / "my-fileset" - assert result == expected_dest - assert (expected_dest / "file.json").exists() - - @pytest.mark.asyncio - async def test_respects_recursive_flag(self, tmp_path): - """Test that _download_fileset_ref respects recursive flag.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset") - destination = tmp_path / "output" - get_calls = [] - - async def mock_get(path, dest, recursive=True): - get_calls.append({"path": path, "recursive": recursive}) - fileset_dir = Path(dest) / "my-fileset" - fileset_dir.mkdir(parents=True, exist_ok=True) - (fileset_dir / "file.json").write_text('{"test": 1}') - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._get = mock_get - mock_fs_class.return_value = mock_fs - - await _download_fileset_ref(mock_sdk, dataset, str(destination), recursive=False) - - assert len(get_calls) == 1 - assert get_calls[0]["recursive"] is False - - @pytest.mark.asyncio - async def test_downloads_specific_file_with_fragment(self, tmp_path): - """Test that _download_fileset_ref downloads specific file when fragment is used.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#train.json") - destination = tmp_path / "output" - get_file_calls = [] - - async def mock_get_file(remote_path, local_path): - get_file_calls.append({"remote": remote_path, "local": local_path}) - Path(local_path).parent.mkdir(parents=True, exist_ok=True) - Path(local_path).write_text('{"data": "train"}') - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._get_file = mock_get_file - mock_fs_class.return_value = mock_fs - - result = await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - assert len(get_file_calls) == 1 - assert get_file_calls[0]["remote"] == "default/my-fileset/train.json" - # File is downloaded to destination/base_path/filename - expected_file = destination / "default" / "my-fileset" / "train.json" - assert result == expected_file - assert expected_file.exists() - - @pytest.mark.asyncio - async def test_downloads_matching_files_with_glob_pattern(self, tmp_path): - """Test that _download_fileset_ref downloads all files matching glob pattern.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#*.json") - destination = tmp_path / "output" - get_file_calls = [] - - async def mock_get_file(remote_path, local_path): - get_file_calls.append({"remote": remote_path, "local": local_path}) - Path(local_path).parent.mkdir(parents=True, exist_ok=True) - Path(local_path).write_text('{"data": "test"}') - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - # _find returns paths in format "workspace/fileset#relative_path" - mock_fs._find.return_value = [ - "default/my-fileset#train.json", - "default/my-fileset#test.json", - "default/my-fileset#data.csv", # Should not be downloaded - ] - mock_fs._get_file = mock_get_file - mock_fs_class.return_value = mock_fs - - result = await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - # Should download only .json files - assert len(get_file_calls) == 2 - remote_paths = {call["remote"] for call in get_file_calls} - assert "default/my-fileset#train.json" in remote_paths - assert "default/my-fileset#test.json" in remote_paths - assert "default/my-fileset#data.csv" not in remote_paths - - # Result should be the base directory - expected_base = destination / "default" / "my-fileset" - assert result == expected_base - - @pytest.mark.asyncio - async def test_simple_glob_matches_only_top_level_files(self, tmp_path): - """Test that *.json only matches top-level files, not nested ones.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#*.json") - destination = tmp_path / "output" - get_file_calls = [] - - async def mock_get_file(remote_path, local_path): - get_file_calls.append({"remote": remote_path, "local": local_path}) - Path(local_path).parent.mkdir(parents=True, exist_ok=True) - Path(local_path).write_text("{}") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - # _find returns paths in format "workspace/fileset#relative_path" - mock_fs._find.return_value = [ - "default/my-fileset#train.json", - "default/my-fileset#subdir/nested.json", # Should NOT match *.json - ] - mock_fs._get_file = mock_get_file - mock_fs_class.return_value = mock_fs - - await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - # *.json matches only top-level .json files (simple pattern) - assert len(get_file_calls) == 1 - assert get_file_calls[0]["remote"] == "default/my-fileset#train.json" - - @pytest.mark.asyncio - async def test_path_pattern_matches_subdir_files(self, tmp_path): - """Test that */*.json matches files in any single subdirectory.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#*/*.json") - destination = tmp_path / "output" - get_file_calls = [] - - async def mock_get_file(remote_path, local_path): - get_file_calls.append({"remote": remote_path, "local": local_path}) - Path(local_path).parent.mkdir(parents=True, exist_ok=True) - Path(local_path).write_text("{}") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - # _find returns paths in format "workspace/fileset#relative_path" - mock_fs._find.return_value = [ - "default/my-fileset#train.json", # Won't match */*.json (no subdir) - "default/my-fileset#subdir/nested.json", # Matches - "default/my-fileset#data/file.json", # Matches - ] - mock_fs._get_file = mock_get_file - mock_fs_class.return_value = mock_fs - - await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - # */*.json matches files in single-level subdirectories - assert len(get_file_calls) == 2 - remote_paths = {call["remote"] for call in get_file_calls} - assert "default/my-fileset#subdir/nested.json" in remote_paths - assert "default/my-fileset#data/file.json" in remote_paths - - @pytest.mark.asyncio - async def test_path_pattern_does_not_match_from_right(self, tmp_path): - """Test that data/*.json is anchored at the fileset root.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#data/*.json") - destination = tmp_path / "output" - get_file_calls = [] - - async def mock_get_file(remote_path, local_path): - get_file_calls.append({"remote": remote_path, "local": local_path}) - Path(local_path).parent.mkdir(parents=True, exist_ok=True) - Path(local_path).write_text("{}") - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._find.return_value = [ - "default/my-fileset#data/root.json", - "default/my-fileset#nested/data/right-anchored.json", - ] - mock_fs._get_file = mock_get_file - mock_fs_class.return_value = mock_fs - - await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - assert len(get_file_calls) == 1 - assert get_file_calls[0]["remote"] == "default/my-fileset#data/root.json" - - @pytest.mark.asyncio - async def test_fragment_with_subdirectory_path(self, tmp_path): - """Test that _download_fileset_ref handles fragment with subdirectory path.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#data/train.json") - destination = tmp_path / "output" - get_file_calls = [] - - async def mock_get_file(remote_path, local_path): - get_file_calls.append({"remote": remote_path, "local": local_path}) - Path(local_path).parent.mkdir(parents=True, exist_ok=True) - Path(local_path).write_text('{"data": "nested"}') - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._get_file = mock_get_file - mock_fs_class.return_value = mock_fs - - result = await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - assert len(get_file_calls) == 1 - assert get_file_calls[0]["remote"] == "default/my-fileset/data/train.json" - # File is downloaded to destination/base_path/fragment_path - expected_file = destination / "default" / "my-fileset" / "data" / "train.json" - assert result == expected_file - - @pytest.mark.asyncio - async def test_fragment_with_leading_slash_stays_relative(self, tmp_path): - """Test that leading slash fragments do not escape the fileset destination.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#/data/train.json") - destination = tmp_path / "output" - get_file_calls = [] - - async def mock_get_file(remote_path, local_path): - get_file_calls.append({"remote": remote_path, "local": local_path}) - Path(local_path).parent.mkdir(parents=True, exist_ok=True) - Path(local_path).write_text('{"data": "nested"}') - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._get_file = mock_get_file - mock_fs_class.return_value = mock_fs - - result = await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - assert len(get_file_calls) == 1 - assert get_file_calls[0]["remote"] == "default/my-fileset/data/train.json" - assert result == destination / "default" / "my-fileset" / "data" / "train.json" - - @pytest.mark.asyncio - @pytest.mark.parametrize("root", ["default/my-fileset#", "default/my-fileset#/"]) - async def test_empty_fragment_downloads_fileset_root(self, root, tmp_path): - """Test that empty fragments behave like no fragment.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root=root) - destination = tmp_path / "output" - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs_class.return_value = mock_fs - - result = await _download_fileset_ref(mock_sdk, dataset, str(destination)) - - expected_dest = destination / "default" / "my-fileset" - assert result == expected_dest - mock_fs._get.assert_awaited_once_with( - "default/my-fileset/", - str(expected_dest), - recursive=True, - ) - - -class TestDownloadFileset: - @pytest.mark.asyncio - async def test_creates_fileset_and_downloads(self): - """Test that _download_inline_fileset creates fileset and downloads.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_fileset.workspace = "default" - mock_sdk.files.filesets.create.return_value = mock_fileset - - dataset = Fileset( - storage=make_hf_storage_config(), - path="checkpoints/", - ) - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs_class.return_value = mock_fs - - result = await _download_inline_fileset(mock_sdk, dataset, "/local/destination") - - # dest = destination / dataset.path (Path strips trailing slash) - mock_fs._get.assert_called_once_with( - "default/test-fileset/checkpoints/", "/local/destination/checkpoints", recursive=True - ) - assert result == Path("/local/destination/checkpoints") - - # Verify fileset was deleted after download - mock_sdk.files.filesets.delete.assert_called_once() - - @pytest.mark.asyncio - async def test_downloads_root_when_none_path(self): - """Test that _download_inline_fileset downloads root when path is None.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_fileset.workspace = "default" - mock_sdk.files.filesets.create.return_value = mock_fileset - - # Fileset with None path - downloads from root - dataset = Fileset(storage=make_hf_storage_config(), path=None) - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs_class.return_value = mock_fs - - result = await _download_inline_fileset(mock_sdk, dataset, "/local/destination") - - # When path is None, dest = destination (unchanged) - mock_fs._get.assert_called_once_with("default/test-fileset/", "/local/destination", recursive=True) - assert result == Path("/local/destination") - - -class TestDownloadDataset: - @pytest.mark.asyncio - async def test_routes_to_inline_download(self, tmp_path): - """Test that download_dataset routes DatasetRows correctly.""" - mock_sdk = AsyncMock() - dataset = DatasetRows(rows=[{"a": 1}]) - - await download_dataset(mock_sdk, dataset, str(tmp_path)) - - # Verify file was created - output_file = tmp_path / "dataset.json" - assert output_file.exists() - - @pytest.mark.asyncio - async def test_routes_to_fileset_urn_download(self, tmp_path): - """Test that download_dataset routes FilesetRef correctly.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset") - destination = tmp_path / "output" - - async def mock_get(path, dest, recursive=True): - # dest is now destination/default/my-fileset - dest_path = Path(dest) - dest_path.mkdir(parents=True, exist_ok=True) - (dest_path / "file.json").write_text('{"test": 1}') - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._get = mock_get - mock_fs_class.return_value = mock_fs - - result = await download_dataset(mock_sdk, dataset, str(destination)) - - # Files are downloaded to destination / dataset.root - expected_dest = destination / "default" / "my-fileset" - assert result == expected_dest - assert (expected_dest / "file.json").exists() - - @pytest.mark.asyncio - async def test_routes_to_fileset_inline_download(self): - """Test that download_dataset routes Fileset correctly.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_fileset.workspace = "default" - mock_sdk.files.filesets.create.return_value = mock_fileset - - dataset = Fileset( - storage=make_hf_storage_config(), - path="data/", - ) - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs_class.return_value = mock_fs - - await download_dataset(mock_sdk, dataset, "/local/destination") - - mock_sdk.files.filesets.create.assert_called_once() - mock_fs._get.assert_called_once() - - @pytest.mark.asyncio - async def test_passes_workspace_to_fileset_inline(self): - """Test that download_dataset passes workspace to Fileset download.""" - mock_sdk = AsyncMock() - mock_fileset = MagicMock() - mock_fileset.name = "test-fileset" - mock_fileset.workspace = "custom-workspace" - mock_sdk.files.filesets.create.return_value = mock_fileset - - dataset = Fileset( - storage=make_hf_storage_config(), - path="data/", - ) - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs_class.return_value = mock_fs - - await download_dataset(mock_sdk, dataset, "/local/destination", workspace="custom-workspace") - - call_args = mock_sdk.files.filesets.create.call_args - assert call_args.kwargs["workspace"] == "custom-workspace" - - @pytest.mark.asyncio - async def test_passes_recursive_flag(self, tmp_path): - """Test that download_dataset passes recursive flag.""" - mock_sdk = AsyncMock() - dataset = FilesetRef(root="default/my-fileset") - destination = tmp_path / "output" - get_calls = [] - - async def mock_get(path, dest, recursive=True): - get_calls.append({"path": path, "recursive": recursive}) - fileset_dir = Path(dest) / "my-fileset" - fileset_dir.mkdir(parents=True, exist_ok=True) - (fileset_dir / "file.json").write_text('{"test": 1}') - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class: - mock_fs = AsyncMock() - mock_fs._get = mock_get - mock_fs_class.return_value = mock_fs - - await download_dataset(mock_sdk, dataset, str(destination), recursive=False) - - assert len(get_calls) == 1 - assert get_calls[0]["recursive"] is False - - -class TestDownloadDatasetSync: - def test_routes_to_inline_download(self, tmp_path): - """Test that download_dataset_sync routes DatasetRows correctly.""" - mock_sdk = MagicMock() - dataset = DatasetRows(rows=[{"a": 1}]) - - with patch("nmp.evaluator.app.datasets.nmp_datasets.fileset._download_fileset_ref_sync") as mock_bridge: - result = download_dataset_sync(mock_sdk, dataset, str(tmp_path)) - - assert result == tmp_path / "dataset.json" - assert json.loads(result.read_text(encoding="utf-8")) == [{"a": 1}] - mock_bridge.assert_not_called() - - def test_routes_inline_fileset_to_sync_bridge(self, tmp_path): - """Test that download_dataset_sync routes Fileset configs to the sync bridge.""" - mock_sdk = MagicMock() - dataset = Fileset(storage=make_hf_storage_config(), path="data/") - expected_path = tmp_path / "data" - - with patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset._download_inline_fileset_sync", - return_value=expected_path, - ) as mock_bridge: - result = download_dataset_sync(mock_sdk, dataset, str(tmp_path), workspace="custom") - - assert result == expected_path - mock_bridge.assert_called_once_with(mock_sdk, dataset, str(tmp_path), workspace="custom", recursive=True) - - def test_bridges_filesetref_to_async_helper(self, tmp_path): - """Test that the sync helper delegates to `_download_fileset_ref` via `fsspec.asyn.sync`.""" - mock_sdk = MagicMock() - mock_async_sdk = MagicMock() - mock_async_sdk.close = AsyncMock() - dataset = FilesetRef(root="default/my-fileset#data/validation.jsonl") - destination = tmp_path / "output" - expected_path = destination / "default" / "my-fileset" / "data" / "validation.jsonl" - - with ( - patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class, - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset._download_fileset_ref", - new_callable=AsyncMock, - ) as mock_async_helper, - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.fsspec.asyn.sync", - side_effect=lambda loop, fn, *a, **kw: asyncio.run(fn(*a, **kw)), - ), - ): - mock_fs_class.return_value._sdk = mock_async_sdk - mock_async_helper.return_value = expected_path - - result = _download_fileset_ref_sync(mock_sdk, dataset, str(destination)) - - assert result == expected_path - mock_fs_class.assert_called_once_with(sdk=mock_sdk) - mock_async_helper.assert_awaited_once_with(mock_async_sdk, dataset, str(destination), recursive=True) - mock_async_sdk.close.assert_awaited_once_with() - - def test_bridges_recursive_false(self, tmp_path): - """Test that recursive=False propagates to the async helper through the bridge.""" - mock_sdk = MagicMock() - mock_async_sdk = MagicMock() - mock_async_sdk.close = AsyncMock() - dataset = FilesetRef(root="default/my-fileset") - destination = tmp_path / "output" - expected_path = destination / "default" / "my-fileset" - - with ( - patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class, - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset._download_fileset_ref", - new_callable=AsyncMock, - ) as mock_async_helper, - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.fsspec.asyn.sync", - side_effect=lambda loop, fn, *a, **kw: asyncio.run(fn(*a, **kw)), - ), - ): - mock_fs_class.return_value._sdk = mock_async_sdk - mock_async_helper.return_value = expected_path - - _download_fileset_ref_sync(mock_sdk, dataset, str(destination), recursive=False) - - mock_async_helper.assert_awaited_once_with(mock_async_sdk, dataset, str(destination), recursive=False) - mock_async_sdk.close.assert_awaited_once_with() - - def test_closes_async_sdk_when_filesetref_download_fails(self, tmp_path): - """Test that the sync bridge closes its converted async SDK when downloads fail.""" - mock_sdk = MagicMock() - mock_async_sdk = MagicMock() - mock_async_sdk.close = AsyncMock() - dataset = FilesetRef(root="default/my-fileset") - destination = tmp_path / "output" - - with ( - patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class, - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset._download_fileset_ref", - new_callable=AsyncMock, - ) as mock_async_helper, - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.fsspec.asyn.sync", - side_effect=lambda loop, fn, *a, **kw: asyncio.run(fn(*a, **kw)), - ), - ): - mock_fs_class.return_value._sdk = mock_async_sdk - mock_async_helper.side_effect = RuntimeError("download failed") - - with pytest.raises(RuntimeError, match="download failed"): - _download_fileset_ref_sync(mock_sdk, dataset, str(destination)) - - mock_async_sdk.close.assert_awaited_once_with() - - def test_bridges_inline_fileset_to_async_helper(self, tmp_path): - """Test that the inline Fileset sync helper delegates through the async SDK bridge.""" - mock_sdk = MagicMock() - mock_async_sdk = MagicMock() - mock_async_sdk.close = AsyncMock() - dataset = Fileset(storage=make_hf_storage_config(), path="data/validation.jsonl") - destination = tmp_path / "output" - expected_path = destination / "data" / "validation.jsonl" - - with ( - patch("nmp.evaluator.app.datasets.nmp_datasets.fileset.FilesetFileSystem") as mock_fs_class, - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset._download_inline_fileset", - new_callable=AsyncMock, - ) as mock_async_helper, - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.fsspec.asyn.sync", - side_effect=lambda loop, fn, *a, **kw: asyncio.run(fn(*a, **kw)), - ), - ): - mock_fs_class.return_value._sdk = mock_async_sdk - mock_async_helper.return_value = expected_path - - result = _download_inline_fileset_sync( - mock_sdk, dataset, str(destination), workspace="custom", recursive=False - ) - - assert result == expected_path - mock_fs_class.assert_called_once_with(sdk=mock_sdk) - mock_async_helper.assert_awaited_once_with( - mock_async_sdk, - dataset, - str(destination), - workspace="custom", - recursive=False, - ) - mock_async_sdk.close.assert_awaited_once_with() diff --git a/services/evaluator/tests/app/datasets/test_fileset_selectors.py b/services/evaluator/tests/app/datasets/test_fileset_selectors.py deleted file mode 100644 index eeea12560c..0000000000 --- a/services/evaluator/tests/app/datasets/test_fileset_selectors.py +++ /dev/null @@ -1,321 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from types import SimpleNamespace -from unittest.mock import AsyncMock - -import pytest -from nmp.evaluator.app.datasets.fileset_selectors import ( - fileset_glob_prefix_dir, - is_fileset_glob_pattern, - list_matching_fileset_paths, - matches_fileset_glob, -) - - -@pytest.mark.parametrize( - ("pattern", "expected"), - [ - ("*.json", True), - ("**/*.json", True), - ("file?.json", True), - ("file[0-9].json", True), - ("validation/file?.jsonl", True), - ("validation/file[ab].jsonl", True), - ("train.jsonl", False), - ("data/train.json", False), - ("validation/file.jsonl", False), - ("", False), - ], -) -def test_is_fileset_glob_pattern(pattern: str, expected: bool): - assert is_fileset_glob_pattern(pattern) is expected - - -@pytest.mark.parametrize( - ("pattern", "expected"), - [ - ("*.json", ""), - ("**/*.json", ""), - ("data/*.json", "data"), - ("data/**/train*.jsonl", "data"), - ("/data/*.json", "data"), - ("subdir/nested.json", "subdir/nested.json"), - ], -) -def test_fileset_glob_prefix_dir(pattern: str, expected: str): - assert fileset_glob_prefix_dir(pattern) == expected - - -def test_matches_fileset_glob_is_root_anchored(): - assert matches_fileset_glob("validation/a.jsonl", "validation/*.jsonl") is True - assert matches_fileset_glob("nested/validation/a.jsonl", "validation/*.jsonl") is False - assert matches_fileset_glob("validation/nested/a.jsonl", "validation/*.jsonl") is False - assert matches_fileset_glob("validation/nested/a.jsonl", "validation/**/*.jsonl") is True - - -@pytest.mark.parametrize( - ("filepath", "pattern", "expected"), - [ - ("train.json", "*.json", True), - ("test.json", "*.json", True), - ("data.jsonl", "*.json", False), - ("train.json", "train.json", True), - ("test.json", "train.json", False), - ("file1.json", "file?.json", True), - ("file10.json", "file?.json", False), - ("file1.json", "file[0-9].json", True), - ("filea.json", "file[0-9].json", False), - ("subdir/nested.json", "*.json", False), - ("data/train.json", "*.json", False), - ("subdir/nested.json", "subdir/*.json", True), - ("nested/subdir/nested.json", "subdir/*.json", False), - ("subdir/nested.json", "other/*.json", False), - ("data/train.json", "*/*.json", True), - ("nested/data/train.json", "*/*.json", False), - ("nested/data/train.json", "**/*.json", True), - ], -) -def test_matches_fileset_glob(filepath: str, pattern: str, expected: bool): - assert matches_fileset_glob(filepath, pattern) is expected - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_filters_by_glob(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/a.jsonl"), - SimpleNamespace(path="validation/b.jsonl"), - SimpleNamespace(path="train/c.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/*.jsonl", - ) - - assert matched == ["validation/a.jsonl", "validation/b.jsonl"] - sdk.files.list.assert_awaited_once_with( - fileset="fileset", - workspace="workspace", - remote_path="validation/", - ) - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_returns_sorted_matches(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/b.jsonl"), - SimpleNamespace(path="validation/a.jsonl"), - SimpleNamespace(path="validation/c.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/*.jsonl", - ) - - assert matched == ["validation/a.jsonl", "validation/b.jsonl", "validation/c.jsonl"] - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_rejects_too_many_matches(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/a.jsonl"), - SimpleNamespace(path="validation/b.jsonl"), - SimpleNamespace(path="validation/c.jsonl"), - ] - ) - - with pytest.raises(ValueError, match="matched more than 2 validation targets"): - await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/*.jsonl", - max_validation_targets=2, - ) - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_supports_question_mark_patterns(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/file1.jsonl"), - SimpleNamespace(path="validation/file12.jsonl"), - SimpleNamespace(path="validation/fileA.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/file?.jsonl", - ) - - assert matched == ["validation/file1.jsonl", "validation/fileA.jsonl"] - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_supports_character_class_patterns(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/filea.jsonl"), - SimpleNamespace(path="validation/fileb.jsonl"), - SimpleNamespace(path="validation/filec.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/file[ab].jsonl", - ) - - assert matched == ["validation/filea.jsonl", "validation/fileb.jsonl"] - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_simple_pattern_does_not_match_nested_paths(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="root.jsonl"), - SimpleNamespace(path="nested/root.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="*.jsonl", - ) - - assert matched == ["root.jsonl"] - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_path_pattern_does_not_match_from_right(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/root.jsonl"), - SimpleNamespace(path="nested/validation/root.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/*.jsonl", - ) - - assert matched == ["validation/root.jsonl"] - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_lists_prefix_for_recursive_glob(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/root.jsonl"), - SimpleNamespace(path="validation/nested/root.jsonl"), - SimpleNamespace(path="train/root.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/**/*.jsonl", - ) - - assert matched == ["validation/nested/root.jsonl", "validation/root.jsonl"] - sdk.files.list.assert_awaited_once_with( - fileset="fileset", - workspace="workspace", - remote_path="validation/", - ) - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_exact_path_without_glob_matches_only_exact_path(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path="validation/a.jsonl"), - SimpleNamespace(path="validation/a.jsonl.bak"), - SimpleNamespace(path="train/a.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/a.jsonl", - ) - - assert matched == ["validation/a.jsonl"] - - -@pytest.mark.asyncio -async def test_list_matching_fileset_paths_ignores_entries_without_string_path(): - sdk = AsyncMock() - sdk.files.list.return_value = SimpleNamespace( - data=[ - SimpleNamespace(path=None), - SimpleNamespace(path=123), - SimpleNamespace(other="missing-path"), - SimpleNamespace(path="validation/a.jsonl"), - ] - ) - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/*.jsonl", - ) - - assert matched == ["validation/a.jsonl"] - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - "list_response", - [ - SimpleNamespace(), - SimpleNamespace(data=None), - ], -) -async def test_list_matching_fileset_paths_handles_missing_or_none_data(list_response: SimpleNamespace): - sdk = AsyncMock() - sdk.files.list.return_value = list_response - - matched = await list_matching_fileset_paths( - sdk, - workspace="workspace", - fileset_name="fileset", - fragment_pattern="validation/*.jsonl", - ) - - assert matched == [] diff --git a/services/evaluator/tests/app/datasets/test_loader.py b/services/evaluator/tests/app/datasets/test_loader.py deleted file mode 100644 index 65773890a3..0000000000 --- a/services/evaluator/tests/app/datasets/test_loader.py +++ /dev/null @@ -1,654 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual -# property and proprietary rights in and to this material, related -# documentation and any modifications thereto. Any use, reproduction, -# disclosure or distribution of this material and related documentation -# without an express license agreement from NVIDIA CORPORATION or -# its affiliates is strictly prohibited. - -"""Unit tests for the dataset loader module. - -Tests the loading of datasets from downloaded filesets using PyArrow. -Supports multiple file formats (JSON, JSONL, CSV, Parquet, ORC, Feather) -and pattern matching for file selection. -""" - -import gzip -import json -from pathlib import Path - -import pyarrow as pa -import pyarrow.feather as pa_feather -import pyarrow.parquet as pa_parquet -import pytest -from nemo_evaluator_sdk.datasets.loader import ( - DatasetLoadError, - load_dataset, - load_dataset_as_dicts, -) -from nemo_evaluator_sdk.datasets.loader import ( - discover_files as _discover_files, -) -from nemo_evaluator_sdk.datasets.loader import ( - is_glob_pattern as _is_glob_pattern, -) -from nemo_evaluator_sdk.datasets.loader import ( - load_file as _load_file, -) -from nmp.evaluator.app.datasets.loader import ( - _parse_dataset_ref, - load_dataset_from_ref, - load_dataset_from_ref_as_dicts, -) - -# ============================================================================= -# Test Fixtures -# ============================================================================= - - -@pytest.fixture -def sample_data() -> list[dict]: - """Sample dataset rows for testing.""" - return [ - {"prompt": "What is Python?", "response": "A programming language"}, - {"prompt": "Explain AI", "response": "Artificial intelligence"}, - {"prompt": "What is ML?", "response": "Machine learning"}, - ] - - -@pytest.fixture -def dataset_dir(tmp_path: Path, sample_data: list[dict]) -> Path: - """Create a temporary dataset directory structure. - - Structure: - tmp_path/ - workspace/ - fileset/ - data.json - train.jsonl - test.csv - embeddings.parquet - features.feather - subdir/ - nested.json - """ - fileset_dir = tmp_path / "workspace" / "fileset" - fileset_dir.mkdir(parents=True) - - # JSON file (array of objects) - with open(fileset_dir / "data.json", "w") as f: - json.dump(sample_data, f) - - # JSONL file (one object per line) - with open(fileset_dir / "train.jsonl", "w") as f: - for row in sample_data: - f.write(json.dumps(row) + "\n") - - # CSV file - csv_content = "prompt,response\n" - for row in sample_data: - csv_content += f'"{row["prompt"]}","{row["response"]}"\n' - (fileset_dir / "test.csv").write_text(csv_content) - - # Parquet file - table = pa.Table.from_pylist(sample_data) - pa_parquet.write_table(table, fileset_dir / "embeddings.parquet") - - # Feather/Arrow IPC file - pa_feather.write_feather(table, fileset_dir / "features.feather") - - # Nested directory with JSON - subdir = fileset_dir / "subdir" - subdir.mkdir() - with open(subdir / "nested.json", "w") as f: - json.dump(sample_data[:1], f) # Just first row - - return tmp_path - - -@pytest.fixture -def compressed_dataset_dir(tmp_path: Path, sample_data: list[dict]) -> Path: - """Create a dataset directory with compressed files.""" - fileset_dir = tmp_path / "workspace" / "compressed-fileset" - fileset_dir.mkdir(parents=True) - - # Gzipped JSONL (common for HuggingFace datasets) - with gzip.open(fileset_dir / "train.jsonl.gz", "wt", encoding="utf-8") as f: - for row in sample_data: - f.write(json.dumps(row) + "\n") - - return tmp_path - - -# ============================================================================= -# Test: parse_dataset_ref -# ============================================================================= - - -class TestParseDatasetRef: - """Tests for parsing dataset reference strings.""" - - def test_parse_simple_ref(self): - """Parse workspace/fileset without fragment.""" - workspace, fileset, pattern = _parse_dataset_ref("my-workspace/my-fileset") - assert workspace == "my-workspace" - assert fileset == "my-fileset" - assert pattern is None - - def test_parse_ref_with_filename_fragment(self): - """Parse workspace/fileset#filename.""" - workspace, fileset, pattern = _parse_dataset_ref("workspace/fileset#train.jsonl") - assert workspace == "workspace" - assert fileset == "fileset" - assert pattern == "train.jsonl" - - def test_parse_ref_with_path_fragment(self): - """Parse workspace/fileset#path/to/file.json.""" - workspace, fileset, pattern = _parse_dataset_ref("workspace/fileset#data/train.json") - assert workspace == "workspace" - assert fileset == "fileset" - assert pattern == "data/train.json" - - def test_parse_ref_with_glob_pattern(self): - """Parse workspace/fileset#*.json.""" - workspace, fileset, pattern = _parse_dataset_ref("workspace/fileset#*.json") - assert workspace == "workspace" - assert fileset == "fileset" - assert pattern == "*.json" - - def test_parse_ref_with_recursive_glob(self): - """Parse workspace/fileset#**/*.parquet.""" - workspace, fileset, pattern = _parse_dataset_ref("workspace/fileset#**/*.parquet") - assert workspace == "workspace" - assert fileset == "fileset" - assert pattern == "**/*.parquet" - - def test_parse_ref_with_subdir_glob(self): - """Parse workspace/fileset#subdir/*.csv.""" - workspace, fileset, pattern = _parse_dataset_ref("workspace/fileset#subdir/*.csv") - assert workspace == "workspace" - assert fileset == "fileset" - assert pattern == "subdir/*.csv" - - def test_parse_ref_invalid_no_workspace(self): - """Raise error for ref without workspace.""" - with pytest.raises(ValueError, match="workspace"): - _parse_dataset_ref("just-fileset") - - def test_parse_ref_empty_string(self): - """Raise error for empty string.""" - with pytest.raises(ValueError): - _parse_dataset_ref("") - - -# ============================================================================= -# Test: is_glob_pattern -# ============================================================================= - - -class TestIsGlobPattern: - """Tests for glob pattern detection.""" - - @pytest.mark.parametrize( - ("pattern", "expected"), - [ - ("*.json", True), # Single asterisk - ("**/*.json", True), # Double asterisk (recursive) - ("file?.json", True), # Question mark wildcard - ("file[0-9].json", True), # Bracket range - ("train.jsonl", False), # Plain filename - ("data/train.json", False), # Path without wildcards - ], - ) - def test_is_glob_pattern(self, pattern: str, expected: bool): - """Detect glob patterns correctly.""" - assert _is_glob_pattern(pattern) is expected - - -# ============================================================================= -# Test: discover_files -# ============================================================================= - - -class TestDiscoverFiles: - """Tests for file discovery in datasets.""" - - def test_discover_all_files(self, dataset_dir: Path): - """Discover all files when no pattern specified.""" - fileset_path = dataset_dir / "workspace" / "fileset" - files = _discover_files(fileset_path, pattern=None) - - # Should find all data files (not directories) - filenames = {f.name for f in files} - assert "data.json" in filenames - assert "train.jsonl" in filenames - assert "test.csv" in filenames - assert "embeddings.parquet" in filenames - assert "features.feather" in filenames - assert "nested.json" in filenames # From subdir - - def test_discover_specific_file(self, dataset_dir: Path): - """Discover a specific file by name.""" - fileset_path = dataset_dir / "workspace" / "fileset" - files = _discover_files(fileset_path, pattern="data.json") - - assert len(files) == 1 - assert files[0].name == "data.json" - - def test_discover_file_in_subdir(self, dataset_dir: Path): - """Discover a file in subdirectory by path.""" - fileset_path = dataset_dir / "workspace" / "fileset" - files = _discover_files(fileset_path, pattern="subdir/nested.json") - - assert len(files) == 1 - assert files[0].name == "nested.json" - - def test_discover_glob_extension(self, dataset_dir: Path): - """Discover files matching glob extension pattern.""" - fileset_path = dataset_dir / "workspace" / "fileset" - files = _discover_files(fileset_path, pattern="*.json") - - # Should match data.json but not nested.json (different dir) or train.jsonl - filenames = {f.name for f in files} - assert "data.json" in filenames - assert "train.jsonl" not in filenames - - def test_discover_recursive_glob(self, dataset_dir: Path): - """Discover files matching recursive glob pattern.""" - fileset_path = dataset_dir / "workspace" / "fileset" - files = _discover_files(fileset_path, pattern="**/*.json") - - # Should match both data.json and subdir/nested.json - filenames = {f.name for f in files} - assert "data.json" in filenames - assert "nested.json" in filenames - - def test_discover_no_matches_raises(self, dataset_dir: Path): - """Raise error when pattern matches no files.""" - fileset_path = dataset_dir / "workspace" / "fileset" - - with pytest.raises(DatasetLoadError, match="No files found"): - _discover_files(fileset_path, pattern="*.nonexistent") - - def test_discover_specific_file_not_found_raises(self, dataset_dir: Path): - """Raise error when specific file not found.""" - fileset_path = dataset_dir / "workspace" / "fileset" - - with pytest.raises(DatasetLoadError, match="not found"): - _discover_files(fileset_path, pattern="missing.json") - - def test_discover_empty_directory_raises(self, tmp_path: Path): - """Raise error when directory is empty.""" - empty_dir = tmp_path / "empty" - empty_dir.mkdir() - - with pytest.raises(DatasetLoadError, match="No files found"): - _discover_files(empty_dir, pattern=None) - - -# ============================================================================= -# Test: load_file -# ============================================================================= - - -class TestLoadFile: - """Tests for loading individual files.""" - - def test_load_json_array(self, dataset_dir: Path): - """Load JSON file containing array of objects.""" - file_path = dataset_dir / "workspace" / "fileset" / "data.json" - table = _load_file(file_path) - - assert table is not None - assert table.num_rows == 3 - assert "prompt" in table.column_names - assert "response" in table.column_names - - def test_load_jsonl(self, dataset_dir: Path): - """Load JSONL file (newline-delimited JSON).""" - file_path = dataset_dir / "workspace" / "fileset" / "train.jsonl" - table = _load_file(file_path) - - assert table is not None - assert table.num_rows == 3 - - def test_load_csv(self, dataset_dir: Path): - """Load CSV file.""" - file_path = dataset_dir / "workspace" / "fileset" / "test.csv" - table = _load_file(file_path) - - assert table is not None - assert table.num_rows == 3 - - def test_load_parquet(self, dataset_dir: Path): - """Load Parquet file.""" - file_path = dataset_dir / "workspace" / "fileset" / "embeddings.parquet" - table = _load_file(file_path) - - assert table is not None - assert table.num_rows == 3 - - def test_load_feather(self, dataset_dir: Path): - """Load Feather/Arrow IPC file.""" - file_path = dataset_dir / "workspace" / "fileset" / "features.feather" - table = _load_file(file_path) - - assert table is not None - assert table.num_rows == 3 - - def test_load_gzipped_jsonl(self, compressed_dataset_dir: Path): - """Load gzip-compressed JSONL file.""" - file_path = compressed_dataset_dir / "workspace" / "compressed-fileset" / "train.jsonl.gz" - table = _load_file(file_path) - - assert table is not None - assert table.num_rows == 3 - - def test_load_unsupported_format_returns_none(self, tmp_path: Path): - """Return None for unsupported file formats.""" - # Create a text file (not a supported data format) - text_file = tmp_path / "readme.txt" - text_file.write_text("This is not a data file") - - result = _load_file(text_file) - assert result is None - - def test_load_corrupted_file_returns_none(self, tmp_path: Path): - """Return None for corrupted/invalid files.""" - # Create a file with invalid JSON - bad_json = tmp_path / "bad.json" - bad_json.write_text("this is not valid json {{{") - - result = _load_file(bad_json) - assert result is None - - -# ============================================================================= -# Test: load_dataset -# ============================================================================= - - -class TestLoadDataset: - """Tests for the main dataset loading function.""" - - def test_load_all_files_concatenated(self, dataset_dir: Path, sample_data: list[dict]): - """Load all files and concatenate into single table.""" - fileset_path = dataset_dir / "workspace" / "fileset" - table = load_dataset(fileset_path, pattern=None) - - # Multiple files loaded, each with 3 rows (except nested.json with 1) - # data.json (3) + train.jsonl (3) + test.csv (3) + embeddings.parquet (3) - # + features.feather (3) + nested.json (1) = 16 rows - assert table.num_rows == 16 - assert "prompt" in table.column_names - assert "response" in table.column_names - - def test_load_specific_file(self, dataset_dir: Path): - """Load a specific file by name.""" - fileset_path = dataset_dir / "workspace" / "fileset" - table = load_dataset(fileset_path, pattern="data.json") - - assert table.num_rows == 3 - - def test_load_glob_pattern(self, dataset_dir: Path): - """Load files matching glob pattern.""" - fileset_path = dataset_dir / "workspace" / "fileset" - table = load_dataset(fileset_path, pattern="*.parquet") - - assert table.num_rows == 3 # Only embeddings.parquet - - def test_load_skips_unparseable_files(self, dataset_dir: Path): - """Skip files that cannot be parsed.""" - fileset_path = dataset_dir / "workspace" / "fileset" - - # Add an unparseable file - (fileset_path / "readme.md").write_text("# This is markdown") - - # Should still load successfully, skipping the markdown file - table = load_dataset(fileset_path, pattern=None) - assert table.num_rows > 0 - - def test_load_no_parseable_files_raises(self, tmp_path: Path): - """Raise error when no files can be parsed.""" - fileset_path = tmp_path / "workspace" / "bad-fileset" - fileset_path.mkdir(parents=True) - - # Only unparseable files - (fileset_path / "readme.md").write_text("# Readme") - (fileset_path / "notes.txt").write_text("Notes") - - with pytest.raises(DatasetLoadError, match="No data could be loaded"): - load_dataset(fileset_path, pattern=None) - - -# ============================================================================= -# Test: load_dataset_as_dicts -# ============================================================================= - - -class TestLoadDatasetAsDicts: - """Tests for loading datasets as list of dicts.""" - - def test_load_as_dicts(self, dataset_dir: Path, sample_data: list[dict]): - """Load dataset and convert to list of dicts.""" - fileset_path = dataset_dir / "workspace" / "fileset" - rows = load_dataset_as_dicts(fileset_path, pattern="data.json") - - assert len(rows) == 3 - assert rows[0] == sample_data[0] - assert rows[1] == sample_data[1] - assert rows[2] == sample_data[2] - - def test_load_preserves_types(self, tmp_path: Path): - """Preserve data types when converting to dicts.""" - fileset_path = tmp_path / "workspace" / "typed-fileset" - fileset_path.mkdir(parents=True) - - # Create data with various types - data = [ - {"int_col": 42, "float_col": 3.14, "bool_col": True, "str_col": "hello"}, - {"int_col": -1, "float_col": 2.718, "bool_col": False, "str_col": "world"}, - ] - with open(fileset_path / "data.json", "w") as f: - json.dump(data, f) - - rows = load_dataset_as_dicts(fileset_path, pattern="data.json") - - assert rows[0]["int_col"] == 42 - assert abs(rows[0]["float_col"] - 3.14) < 0.001 - assert rows[0]["bool_col"] is True - assert rows[0]["str_col"] == "hello" - - def test_load_as_dicts_falls_back_for_mixed_nested_jsonl(self, tmp_path: Path): - """Fallback should load mixed nested JSONL rows without pyarrow schema inference.""" - fileset_path = tmp_path / "workspace" / "mixed-base-fileset" - fileset_path.mkdir(parents=True) - - rows = [ - { - "messages": [{"role": "user", "content": "q1"}], - "tools": [ - { - "type": "function", - "function": { - "name": "search", - "parameters": { - "type": "object", - "properties": {"page": {"type": "integer", "default": 1}}, - }, - }, - } - ], - }, - { - "messages": [{"role": "user", "content": "q2"}], - "tools": [ - { - "type": "function", - "function": { - "name": "search", - "parameters": { - "type": "object", - "properties": {"page": {"type": "string", "default": "1"}}, - }, - }, - } - ], - }, - ] - with open(fileset_path / "mixed.jsonl", "w", encoding="utf-8") as f: - for row in rows: - f.write(json.dumps(row) + "\n") - - loaded = load_dataset_as_dicts(fileset_path, pattern="mixed.jsonl") - assert len(loaded) == 2 - assert loaded[0]["tools"][0]["function"]["parameters"]["properties"]["page"]["default"] == 1 - assert loaded[1]["tools"][0]["function"]["parameters"]["properties"]["page"]["default"] == "1" - - -# ============================================================================= -# Test: Integration with FilesetRef -# ============================================================================= - - -class TestFilesetRefIntegration: - """Tests for integration with FilesetRef dataset references.""" - - def test_load_from_fileset_ref_path(self, dataset_dir: Path): - """Load dataset using FilesetRef-style path structure.""" - # Simulate the path structure after download: - # {base_dir}/{workspace}/{fileset}/ - base_dir = dataset_dir - ref = "workspace/fileset" - - table = load_dataset_from_ref(ref, base_dir=base_dir, pattern=None) - assert table.num_rows > 0 - - def test_load_from_fileset_ref_with_fragment(self, dataset_dir: Path): - """Load dataset using FilesetRef with # fragment.""" - base_dir = dataset_dir - # ref includes fragment for specific file - ref = "workspace/fileset#data.json" - - table = load_dataset_from_ref(ref, base_dir=base_dir) - assert table.num_rows == 3 - - def test_load_from_fileset_ref_with_glob_fragment(self, dataset_dir: Path): - """Load dataset using FilesetRef with glob fragment.""" - base_dir = dataset_dir - ref = "workspace/fileset#*.json" - - table = load_dataset_from_ref(ref, base_dir=base_dir) - # data.json has 3 rows - assert table.num_rows == 3 - - def test_load_from_fileset_ref_dir_not_found(self, tmp_path: Path): - """Raise error when fileset directory doesn't exist.""" - with pytest.raises(DatasetLoadError, match="not found"): - load_dataset_from_ref("workspace/missing-fileset", base_dir=tmp_path) - - -class TestFilesetRefFallbackLoading: - """Tests for JSON fallback path when PyArrow cannot infer nested schema.""" - - def test_load_from_ref_as_dicts_falls_back_for_mixed_nested_jsonl(self, tmp_path: Path): - """Fallback loader should parse mixed-type nested JSONL rows as dicts.""" - fileset_path = tmp_path / "workspace" / "mixed-fileset" - fileset_path.mkdir(parents=True) - ref = "workspace/mixed-fileset#evaluation.jsonl" - - rows = [ - { - "messages": [{"role": "user", "content": "q1"}], - "tools": [ - { - "type": "function", - "function": { - "name": "search", - "parameters": { - "type": "object", - "properties": {"page": {"type": "integer", "default": 1}}, - }, - }, - } - ], - "tool_calls": [{"type": "function", "function": {"name": "search", "arguments": {"page": 1}}}], - }, - { - "messages": [{"role": "user", "content": "q2"}], - "tools": [ - { - "type": "function", - "function": { - "name": "search", - "parameters": { - "type": "object", - "properties": {"page": {"type": "string", "default": "1"}}, - }, - }, - } - ], - "tool_calls": [{"type": "function", "function": {"name": "search", "arguments": {"page": "1"}}}], - }, - ] - - with open(fileset_path / "evaluation.jsonl", "w", encoding="utf-8") as f: - for row in rows: - f.write(json.dumps(row) + "\n") - - loaded = load_dataset_from_ref_as_dicts(ref, base_dir=tmp_path) - assert len(loaded) == 2 - assert loaded[0]["tools"][0]["function"]["parameters"]["properties"]["page"]["default"] == 1 - assert loaded[1]["tools"][0]["function"]["parameters"]["properties"]["page"]["default"] == "1" - - def test_load_from_ref_as_dicts_falls_back_for_gzipped_jsonl(self, tmp_path: Path): - """Fallback loader should parse gzipped JSONL rows when PyArrow path fails.""" - fileset_path = tmp_path / "workspace" / "mixed-gz-fileset" - fileset_path.mkdir(parents=True) - ref = "workspace/mixed-gz-fileset#evaluation.jsonl.gz" - - rows = [ - { - "messages": [{"role": "user", "content": "q1"}], - "tools": [ - { - "type": "function", - "function": { - "name": "lookup", - "parameters": { - "type": "object", - "properties": {"date": {"type": "string", "default": "2022-10-08"}}, - }, - }, - } - ], - "tool_calls": [{"type": "function", "function": {"name": "lookup", "arguments": {"id": 123}}}], - }, - { - "messages": [{"role": "user", "content": "q2"}], - "tools": [ - { - "type": "function", - "function": { - "name": "lookup", - "parameters": { - "type": "object", - "properties": {"date": {"type": "string", "default": "2022-10-08"}}, - }, - }, - } - ], - "tool_calls": [{"type": "function", "function": {"name": "lookup", "arguments": {"id": "123"}}}], - }, - ] - - with gzip.open(fileset_path / "evaluation.jsonl.gz", "wt", encoding="utf-8") as f: - for row in rows: - f.write(json.dumps(row) + "\n") - - loaded = load_dataset_from_ref_as_dicts(ref, base_dir=tmp_path) - assert len(loaded) == 2 - assert loaded[0]["tool_calls"][0]["function"]["arguments"]["id"] == 123 - assert loaded[1]["tool_calls"][0]["function"]["arguments"]["id"] == "123" diff --git a/services/evaluator/tests/app/jobs/test_benchmarks_jobs.py b/services/evaluator/tests/app/jobs/test_benchmarks_jobs.py deleted file mode 100644 index b111b2665e..0000000000 --- a/services/evaluator/tests/app/jobs/test_benchmarks_jobs.py +++ /dev/null @@ -1,239 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Unit tests for compile_benchmark_job function.""" - -import shlex -from typing import Any, Protocol, cast, runtime_checkable - -import pytest -from nemo_evaluator_sdk.enums import MetricType -from nmp.evaluator.app.evalfactory.safety_harness import SafetyHarnessHandler -from nmp.evaluator.app.evalfactory.system import get_system_benchmark_handler -from nmp.evaluator.app.jobs.benchmarks import compile_benchmark_job -from nmp.evaluator.app.jobs.constants import NEMO_EVAL_HARNESS -from nmp.evaluator.app.jobs.metrics import generate_config_file_from_env_command_str -from nmp.evaluator.app.values import BenchmarkOfflineJob, BenchmarkOnlineJob, SystemBenchmarkOnlineJob -from nmp.evaluator.config import settings - - -@pytest.fixture -def custom_offline_benchmark_job() -> BenchmarkOfflineJob: - return BenchmarkOfflineJob.model_validate( - { - "benchmark": { - "name": "bench", - "dataset": "ws/dataset", - "metrics": [ - { - "metric_ref": "ws/m1", - "metric": { - "type": "exact-match", - "reference": "{{item.reference}}", - }, - } - ], - } - } - ) - - -@pytest.mark.asyncio -async def test_compile_system_benchmark_sets_eval_harness_on_results_step(): - benchmark = next(b for b in SafetyHarnessHandler._system_benchmarks if b.name == "aegis-v2") - job = SystemBenchmarkOnlineJob.model_validate( - { - "benchmark": benchmark, - "model": {"url": "http://nim.test", "name": "my/model"}, - "benchmark_params": { - "hf_token": "my-hf-secret", - "judge": { - "model": { - "name": "my/judge", - "url": "http://nim.test/v1/completions", - "api_key_secret": "my-judge-secret", - } - }, - }, - } - ) - - result = await compile_benchmark_job(job) - steps = list(result["steps"]) - - assert len(steps) == 2 - assert steps[0]["name"] == "evaluation" - assert steps[1]["name"] == "results" - assert _get_step_env_value(steps[1], NEMO_EVAL_HARNESS) == "safety_harness" - config_file_command_str, config_file_path = generate_config_file_from_env_command_str() - handler = get_system_benchmark_handler(job.benchmark.name) - ef_job_config = handler.augment_benchmark_job(job.model_copy(deep=True), settings.jobs.results_dir) - container_command = handler.container_command(ef_job_config, config_file_path) - assert _get_container(steps[0]).get("command") == [ - "/bin/sh", - "-c", - config_file_command_str + " && exec " + shlex.join(container_command), - ] - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - ("model_url", "model_name"), - [ - ( - "https://api.example.com/v1/chat/completions?api-version=2024-10-01&deployment=gpt-4o", - "Llama 3.1 70B Instruct", - ), - ( - "http://nim.test/v1/chat/completions;profile=default", - "my/model; sleep 1", - ), - ], - ids=[ - "realistic_url_and_name", - "semicolon_meta_chars", - ], -) -async def test_compile_system_benchmark_shell_escapes_dynamic_command_args(model_url: str, model_name: str): - benchmark = next(b for b in SafetyHarnessHandler._system_benchmarks if b.name == "aegis-v2") - job = SystemBenchmarkOnlineJob.model_validate( - { - "benchmark": benchmark, - "model": { - "url": model_url, - "name": model_name, - }, - "benchmark_params": { - "hf_token": "my-hf-secret", - "judge": { - "model": { - "name": "my/judge", - "url": "http://nim.test/v1/completions", - "api_key_secret": "my-judge-secret", - } - }, - }, - } - ) - - result = await compile_benchmark_job(job) - steps = list(result["steps"]) - config_file_command_str, config_file_path = generate_config_file_from_env_command_str() - handler = get_system_benchmark_handler(job.benchmark.name) - ef_job_config = handler.augment_benchmark_job(job.model_copy(deep=True), settings.jobs.results_dir) - container_command = handler.container_command(ef_job_config, config_file_path) - shell_command = _get_container(steps[0]).get("command", [])[2] - - assert _get_container(steps[0]).get("command") == [ - "/bin/sh", - "-c", - config_file_command_str + " && exec " + shlex.join(container_command), - ] - assert f"--model_id {model_name}" not in shell_command - assert f"--model_url {model_url}" not in shell_command - - -@runtime_checkable -class SupportsModelDump(Protocol): - def model_dump(self, *, mode: str, exclude_none: bool) -> dict[str, object]: ... - - -def _get_step_env_value(step: object, name: str) -> str | None: - step_dict: dict[str, object] - if not isinstance(step, dict): - assert isinstance(step, SupportsModelDump) - step_dict = step.model_dump(mode="json", exclude_none=True) - else: - step_dict = {str(key): value for key, value in step.items()} - envs = step_dict.get("environment") - if not isinstance(envs, list): - return None - for env in envs: - if not isinstance(env, dict): - continue - env_dict = {str(key): value for key, value in env.items()} - if env_dict.get("name") == name: - value = env_dict.get("value") - return value if isinstance(value, str) else None - return None - - -def _get_container(step: object) -> dict[str, Any]: - step_dict = cast(dict[str, Any], step) - return cast(dict[str, Any], step_dict["executor"]["container"]) - - -@pytest.mark.asyncio -async def test_compile_offline_benchmark_passes_inner_metric_to_new_metric( - monkeypatch: pytest.MonkeyPatch, custom_offline_benchmark_job: BenchmarkOfflineJob -): - seen_metric_types: list[MetricType] = [] - - class _Metric: - def secrets(self) -> dict[str, object]: - return {} - - async def _fake_new_metric(metric_config, *_args, **_kwargs): - assert hasattr(metric_config, "type"), "Expected inner metric config, got benchmark wrapper" - seen_metric_types.append(metric_config.type) - return _Metric() - - monkeypatch.setattr("nmp.evaluator.app.jobs.benchmarks.new_metric", _fake_new_metric) - - await compile_benchmark_job(custom_offline_benchmark_job) - assert seen_metric_types == [MetricType.EXACT_MATCH] - - -@pytest.mark.asyncio -async def test_compile_online_benchmark_passes_inner_metric_to_new_metric(monkeypatch: pytest.MonkeyPatch): - seen_metric_types: list[MetricType] = [] - - class _Metric: - def secrets(self) -> dict[str, object]: - return {} - - async def _fake_new_metric(metric_config, *_args, **_kwargs): - assert hasattr(metric_config, "type"), "Expected inner metric config, got benchmark wrapper" - seen_metric_types.append(metric_config.type) - return _Metric() - - monkeypatch.setattr("nmp.evaluator.app.jobs.benchmarks.new_metric", _fake_new_metric) - - job = BenchmarkOnlineJob.model_validate( - { - "benchmark": { - "name": "bench", - "dataset": "ws/dataset", - "metrics": [ - { - "metric_ref": "ws/m1", - "metric": { - "type": "exact-match", - "reference": "{{item.reference}}", - }, - } - ], - }, - "model": {"url": "http://nim.test/v1", "name": "my/model"}, - "prompt_template": "{{item.input}}", - } - ) - - await compile_benchmark_job(job) - assert seen_metric_types == [MetricType.EXACT_MATCH] - - -@pytest.mark.asyncio -async def test_compile_custom_benchmark_uses_python_entrypoint(custom_offline_benchmark_job: BenchmarkOfflineJob): - """Evaluator-owned custom benchmark step should run task directly, not via /bin/sh.""" - - result = await compile_benchmark_job(custom_offline_benchmark_job) - steps = list(result["steps"]) - - assert len(steps) == 2 - assert steps[1]["name"] == "evaluation" - assert _get_container(steps[1]).get("entrypoint") == [ - "python", - "-m", - "nmp.evaluator.tasks.evaluate_benchmark", - ] diff --git a/services/evaluator/tests/app/jobs/test_fileset_jobs.py b/services/evaluator/tests/app/jobs/test_fileset_jobs.py deleted file mode 100644 index dc7c6729d5..0000000000 --- a/services/evaluator/tests/app/jobs/test_fileset_jobs.py +++ /dev/null @@ -1,186 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for fileset download job step utilities.""" - -import json -from typing import Any, cast -from unittest.mock import patch - -from nemo_evaluator_sdk.values import DatasetRows -from nmp.common.files.storage_config import HuggingfaceStorageConfig -from nmp.common.jobs.constants import ( - DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH, - EPHEMERAL_TASK_STORAGE_PATH_ENVVAR, - PERSISTENT_JOB_STORAGE_PATH_ENVVAR, -) -from nmp.evaluator.app.jobs.fileset import ( - fileset_entrypoint, - fileset_entrypoint_args, - get_fileset_step, -) -from nmp.evaluator.app.values import Fileset, FilesetRef - - -def make_hf_storage_config() -> HuggingfaceStorageConfig: - """Create a test HuggingfaceStorageConfig.""" - return HuggingfaceStorageConfig( - repo_id="test-org/test-repo", - repo_type="dataset", - ) - - -class TestFilesetEntrypoint: - def test_returns_python_task_entrypoint(self): - """Test that fileset_entrypoint returns python module entrypoint.""" - result = fileset_entrypoint() - assert result == ["python", "-m", "nmp.evaluator.tasks.download_fileset"] - - -class TestFilesetEntrypointArgs: - def test_fileset_ref_serializes_root_string(self): - """Test that FilesetRef serializes just the root string.""" - dataset = FilesetRef(root="workspace/my-fileset") - result = fileset_entrypoint_args(dataset, "/target/dir", "/scratch") - - assert len(result) == 6 - assert result[result.index("--local-dir") + 1] == "/scratch" - assert result[result.index("--target-dir") + 1] == "/target/dir" - assert result[4] == "--dataset" - assert json.loads(result[5]) == "workspace/my-fileset" - - def test_inline_dataset_file(self): - """Test that DatasetRows serializes the full model dump.""" - dataset = DatasetRows(rows=[{"a": 1}]) - result = fileset_entrypoint_args(dataset, "/target/dir", "/scratch") - - assert len(result) == 6 - assert result[result.index("--local-dir") + 1] == "/scratch" - assert result[result.index("--target-dir") + 1] == "/target/dir" - assert result[4] == "--dataset-file" - assert result[5] == DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH - - def test_inline_fileset_serializes_model_dump(self): - """Test that Fileset serializes the full model dump.""" - dataset = Fileset(storage=make_hf_storage_config(), path="data/file.json") - result = fileset_entrypoint_args(dataset, "/target/dir", "/scratch") - - assert len(result) == 6 - dataset_arg = json.loads(result[5]) - assert dataset_arg["storage"]["repo_id"] == "test-org/test-repo" - assert dataset_arg["path"] == "data/file.json" - - def test_scratch_path_with_env_var_is_preserved(self): - """Test that env var references in scratch_path are passed through.""" - dataset = FilesetRef(root="workspace/my-fileset") - scratch_path = "${SCRATCH_DIR}" - result = fileset_entrypoint_args(dataset, "/target/dir", scratch_path) - - assert len(result) == 6 - assert result[result.index("--local-dir") + 1] == "${SCRATCH_DIR}" - assert result[result.index("--target-dir") + 1] == "/target/dir" - - -class TestGetFilesetStep: - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_creates_platform_job_step(self, settings, mock_get_image): - """Test that get_fileset_step creates a properly configured PlatformJobStep.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = FilesetRef(root="workspace/my-fileset") - result = get_fileset_step(dataset, "download-step") - - assert result["name"] == "download-step" - assert result["executor"]["provider"] == "cpu" - container = _get_container(result) - assert container["image"] == "registry/nmp-cpu-tasks:latest" - assert container["entrypoint"] == [ - "python", - "-m", - "nmp.evaluator.tasks.download_fileset", - ] - mock_get_image.assert_called_once_with("nmp-cpu-tasks") - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_sets_environment_variables(self, settings, mock_get_image): - """Test that get_fileset_step sets the required environment variables.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = FilesetRef(root="workspace/my-fileset") - result = get_fileset_step(dataset, "download-step") - - env_names = {env["name"] for env in result["environment"]} - assert PERSISTENT_JOB_STORAGE_PATH_ENVVAR in env_names - for env in result["environment"]: - if env["name"] == PERSISTENT_JOB_STORAGE_PATH_ENVVAR: - assert env["value"] == "/job/volume" - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_uses_ephemeral_storage_for_scratch(self, settings, mock_get_image): - """Test that get_fileset_step uses ephemeral storage env var for scratch path.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = FilesetRef(root="workspace/my-fileset") - result = get_fileset_step(dataset, "download-step") - - command = _get_container(result)["command"] - assert command[command.index("--local-dir") + 1] == f"${{{EPHEMERAL_TASK_STORAGE_PATH_ENVVAR}}}" - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_command_targets_runtime_job_dataset_dir(self, settings, mock_get_image): - """Test that get_fileset_step targets the runtime job storage dataset directory.""" - settings.jobs.dataset_dir = "/custom/dataset/path" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = FilesetRef(root="workspace/my-fileset") - result = get_fileset_step(dataset, "download-step") - - command = _get_container(result)["command"] - assert command[command.index("--target-dir") + 1] == f"${{{PERSISTENT_JOB_STORAGE_PATH_ENVVAR}}}/datasets" - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_works_with_inline_dataset(self, settings, mock_get_image): - """Test that get_fileset_step works with DatasetRows.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = DatasetRows(rows=[{"a": 1}]) - result = get_fileset_step(dataset, "download-inline") - - assert result["name"] == "download-inline" - command = _get_container(result)["command"] - assert command[4] == "--dataset-file" - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_works_with_inline_fileset(self, settings, mock_get_image): - """Test that get_fileset_step works with Fileset.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = Fileset(storage=make_hf_storage_config(), path="data/file.json") - result = get_fileset_step(dataset, "download-hf") - - assert result["name"] == "download-hf" - command = _get_container(result)["command"] - dataset_arg = json.loads(command[command.index("--dataset") + 1]) - assert dataset_arg["storage"]["repo_id"] == "test-org/test-repo" - - -def _get_container(step: object) -> dict[str, Any]: - step_dict = cast(dict[str, Any], step) - return cast(dict[str, Any], step_dict["executor"]["container"]) diff --git a/services/evaluator/tests/app/jobs/test_jobs_fileset.py b/services/evaluator/tests/app/jobs/test_jobs_fileset.py deleted file mode 100644 index 9cb8461f16..0000000000 --- a/services/evaluator/tests/app/jobs/test_jobs_fileset.py +++ /dev/null @@ -1,186 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for fileset download job step utilities.""" - -import json -from typing import Any, cast -from unittest.mock import patch - -from nemo_evaluator_sdk.values import DatasetRows -from nmp.common.files.storage_config import HuggingfaceStorageConfig -from nmp.common.jobs.constants import ( - DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH, - EPHEMERAL_TASK_STORAGE_PATH_ENVVAR, - PERSISTENT_JOB_STORAGE_PATH_ENVVAR, -) -from nmp.evaluator.app.jobs.fileset import ( - fileset_entrypoint, - fileset_entrypoint_args, - get_fileset_step, -) -from nmp.evaluator.app.values import Fileset, FilesetRef - - -def make_hf_storage_config() -> HuggingfaceStorageConfig: - """Create a test HuggingfaceStorageConfig.""" - return HuggingfaceStorageConfig( - repo_id="test-org/test-repo", - repo_type="dataset", - ) - - -class TestFilesetEntrypoint: - def test_returns_python_task_entrypoint(self): - """Test that fileset_entrypoint returns python module entrypoint.""" - result = fileset_entrypoint() - assert result == ["python", "-m", "nmp.evaluator.tasks.download_fileset"] - - -class TestFilesetEntrypointArgs: - def test_fileset_ref_serializes_root_string(self): - """Test that FilesetRef serializes just the root string.""" - dataset = FilesetRef(root="workspace/my-fileset") - result = fileset_entrypoint_args(dataset, "/target/dir", "/scratch") - - assert len(result) == 6 - assert result[4] == "--dataset" - assert json.loads(result[5]) == "workspace/my-fileset" - assert result[result.index("--local-dir") + 1] == "/scratch" - assert result[result.index("--target-dir") + 1] == "/target/dir" - - def test_inline_dataset_serializes_model_dump(self): - """Test that DatasetRows serializes the full model dump.""" - dataset = DatasetRows(rows=[{"a": 1}]) - result = fileset_entrypoint_args(dataset, "/target/dir", "/scratch") - - assert len(result) == 6 - assert result[4] == "--dataset-file" - assert result[5] == DEFAULT_NEMO_JOB_STEP_CONFIG_FILE_PATH - assert result[result.index("--local-dir") + 1] == "/scratch" - assert result[result.index("--target-dir") + 1] == "/target/dir" - - def test_inline_fileset_serializes_model_dump(self): - """Test that Fileset serializes the full model dump.""" - dataset = Fileset(storage=make_hf_storage_config(), path="data/file.json") - result = fileset_entrypoint_args(dataset, "/target/dir", "/scratch") - - assert len(result) == 6 - dataset_arg = json.loads(result[5]) - assert dataset_arg["storage"]["repo_id"] == "test-org/test-repo" - assert dataset_arg["path"] == "data/file.json" - - def test_scratch_path_with_env_var_is_preserved(self): - """Test that env var references in scratch_path are passed through.""" - dataset = FilesetRef(root="workspace/my-fileset") - scratch_path = "${SCRATCH_DIR}" - result = fileset_entrypoint_args(dataset, "/target/dir", scratch_path) - - assert result[result.index("--local-dir") + 1] == "${SCRATCH_DIR}" - assert result[result.index("--target-dir") + 1] == "/target/dir" - - -class TestGetFilesetStep: - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_creates_platform_job_step(self, settings, mock_get_image): - """Test that get_fileset_step creates a properly configured PlatformJobStep.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = FilesetRef(root="workspace/my-fileset") - result = get_fileset_step(dataset, "download-step") - - assert result["name"] == "download-step" - assert result["executor"]["provider"] == "cpu" - container = _get_container(result) - assert container["image"] == "registry/nmp-cpu-tasks:latest" - assert container["entrypoint"] == [ - "python", - "-m", - "nmp.evaluator.tasks.download_fileset", - ] - mock_get_image.assert_called_once_with("nmp-cpu-tasks") - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_sets_environment_variables(self, settings, mock_get_image): - """Test that get_fileset_step sets the required environment variables.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = FilesetRef(root="workspace/my-fileset") - result = get_fileset_step(dataset, "download-step") - - env_names = {env["name"] for env in result["environment"]} - assert PERSISTENT_JOB_STORAGE_PATH_ENVVAR in env_names - for env in result["environment"]: - if env["name"] == PERSISTENT_JOB_STORAGE_PATH_ENVVAR: - assert env["value"] == "/job/volume" - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_uses_ephemeral_storage_for_scratch(self, settings, mock_get_image): - """Test that get_fileset_step uses ephemeral storage env var for scratch path.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = FilesetRef(root="workspace/my-fileset") - result = get_fileset_step(dataset, "download-step") - - command = _get_container(result)["command"] - assert command[command.index("--local-dir") + 1] == f"${{{EPHEMERAL_TASK_STORAGE_PATH_ENVVAR}}}" - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_command_targets_runtime_job_dataset_dir(self, settings, mock_get_image): - """Test that get_fileset_step targets the runtime job storage dataset directory.""" - settings.jobs.dataset_dir = "/custom/dataset/path" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = FilesetRef(root="workspace/my-fileset") - result = get_fileset_step(dataset, "download-step") - - command = _get_container(result)["command"] - assert command[command.index("--target-dir") + 1] == f"${{{PERSISTENT_JOB_STORAGE_PATH_ENVVAR}}}/datasets" - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_works_with_inline_dataset(self, settings, mock_get_image): - """Test that get_fileset_step works with DatasetRows.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = DatasetRows(rows=[{"a": 1}]) - result = get_fileset_step(dataset, "download-inline") - - assert result["name"] == "download-inline" - command = _get_container(result)["command"] - assert len(command) == 6 - assert command[4] == "--dataset-file" - - @patch("nmp.evaluator.app.jobs.fileset.get_qualified_image") - @patch("nmp.evaluator.app.jobs.fileset.settings") - def test_works_with_inline_fileset(self, settings, mock_get_image): - """Test that get_fileset_step works with Fileset.""" - settings.jobs.dataset_dir = "/data/datasets" - settings.jobs.volume_path = "/job/volume" - mock_get_image.return_value = "registry/nmp-cpu-tasks:latest" - - dataset = Fileset(storage=make_hf_storage_config(), path="data/file.json") - result = get_fileset_step(dataset, "download-hf") - - assert result["name"] == "download-hf" - command = _get_container(result)["command"] - dataset_arg = json.loads(command[command.index("--dataset") + 1]) - assert dataset_arg["storage"]["repo_id"] == "test-org/test-repo" - - -def _get_container(step: object) -> dict[str, Any]: - step_dict = cast(dict[str, Any], step) - return cast(dict[str, Any], step_dict["executor"]["container"]) diff --git a/services/evaluator/tests/app/jobs/test_metric_results.py b/services/evaluator/tests/app/jobs/test_metric_results.py deleted file mode 100644 index 8bb8fb73a3..0000000000 --- a/services/evaluator/tests/app/jobs/test_metric_results.py +++ /dev/null @@ -1,699 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Unit tests for metric_results module.""" - -import json -from unittest.mock import patch - -import pytest -from nemo_evaluator_sdk.values import MetricScore, ScoreStats -from nmp.evaluator.app.jobs.constants import normalize_eval_harness -from nmp.evaluator.app.jobs.metric_results import _get_results_parser -from nmp.evaluator.app.jobs.result_parsers.custom import CustomResultsParser -from nmp.evaluator.app.jobs.result_parsers.evalfactory import ( - EvalFactoryResultsParser, - _normalize_cached_outputs_row, - _parse_evalfactory_bfcl_rows, - _parse_evalfactory_cached_outputs_rows, - _parse_evalfactory_csv_rows, - _parse_evalfactory_predictions_rows, - _parse_evalfactory_retriever_rows, - _parse_evalfactory_scores, - _scores_to_aggregated_result, - _select_evalfactory_row_source, - resolve_evalfactory_results_file_path, -) -from nmp.evaluator.app.values import ( - DeprecatedMetricResult, - DeprecatedScoreValue, - EvaluationResult, - GroupResult, - TaskResult, -) - - -class TestParseEvalFactoryResults: - """Tests for _parse_evalfactory_scores function.""" - - def test_parses_tasks_only(self): - """Test parsing results that only have tasks (e.g., simple_evals, lm-eval-harness).""" - mock_result = EvaluationResult( - job="test-job", - tasks={ - "task1": TaskResult( - metrics={"metric1": DeprecatedMetricResult(scores={"accuracy": DeprecatedScoreValue(value=0.85)})} - ) - }, - groups=None, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - assert len(scores) == 1 - assert scores[0].name == "accuracy" - assert scores[0].value == 0.85 - - def test_parses_groups_only(self): - """Test parsing results that only have groups (e.g., BFCL).""" - mock_result = EvaluationResult( - job="test-job", - tasks=None, - groups={ - "group1": GroupResult( - metrics={"metric1": DeprecatedMetricResult(scores={"f1": DeprecatedScoreValue(value=0.75)})} - ) - }, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - assert len(scores) == 1 - assert scores[0].name == "f1" - assert scores[0].value == 0.75 - - def test_no_duplicate_scores_when_tasks_and_groups_have_same_data(self): - """Test that scores are NOT duplicated when both tasks and groups contain the same data. - - This regression test verifies fix for bug 5872277: some EvalFactory containers - output identical scores in both tasks and groups sections of results.yml, - causing duplicate scores in aggregate_scores API. - """ - # Create identical scores in both tasks and groups - shared_scores = {"accuracy": DeprecatedScoreValue(value=0.90)} - - mock_result = EvaluationResult( - job="test-job", - tasks={"task1": TaskResult(metrics={"metric1": DeprecatedMetricResult(scores=shared_scores.copy())})}, - groups={"group1": GroupResult(metrics={"metric1": DeprecatedMetricResult(scores=shared_scores.copy())})}, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - # Should only have 1 score, not 2 (tasks takes priority) - assert len(scores) == 1 - assert scores[0].name == "accuracy" - assert scores[0].value == 0.90 - - def test_tasks_take_priority_over_groups_for_same_score_name(self): - """Test that tasks scores take priority when same score name exists in both.""" - mock_result = EvaluationResult( - job="test-job", - tasks={ - "task1": TaskResult( - metrics={ - "metric1": DeprecatedMetricResult(scores={"shared_score": DeprecatedScoreValue(value=0.80)}) - } - ) - }, - groups={ - "group1": GroupResult( - metrics={ - "metric1": DeprecatedMetricResult(scores={"shared_score": DeprecatedScoreValue(value=0.70)}) - } - ) - }, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - # Should only have task score value (0.80), not group score value (0.70) - assert len(scores) == 1 - assert scores[0].name == "shared_score" - assert scores[0].value == 0.80 - - def test_merges_different_scores_from_tasks_and_groups(self): - """Test that different scores from tasks and groups are both included. - - This is important for harnesses that output different metrics in tasks vs groups. - """ - mock_result = EvaluationResult( - job="test-job", - tasks={ - "task1": TaskResult( - metrics={ - "metric1": DeprecatedMetricResult(scores={"task_only_score": DeprecatedScoreValue(value=0.80)}) - } - ) - }, - groups={ - "group1": GroupResult( - metrics={ - "metric1": DeprecatedMetricResult(scores={"group_only_score": DeprecatedScoreValue(value=0.70)}) - } - ) - }, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - # Should have BOTH scores since they have different names - assert len(scores) == 2 - score_names = {s.name for s in scores} - assert score_names == {"task_only_score", "group_only_score"} - - def test_multiple_tasks_with_multiple_metrics(self): - """Test parsing multiple tasks with multiple metrics and scores.""" - mock_result = EvaluationResult( - job="test-job", - tasks={ - "task1": TaskResult( - metrics={ - "metric1": DeprecatedMetricResult( - scores={ - "accuracy": DeprecatedScoreValue(value=0.85), - "precision": DeprecatedScoreValue(value=0.80), - } - ), - "metric2": DeprecatedMetricResult(scores={"recall": DeprecatedScoreValue(value=0.75)}), - } - ), - "task2": TaskResult( - metrics={"metric3": DeprecatedMetricResult(scores={"f1": DeprecatedScoreValue(value=0.78)})} - ), - }, - groups=None, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - assert len(scores) == 4 - score_names = {s.name for s in scores} - assert score_names == {"accuracy", "precision", "recall", "f1"} - - def test_raises_on_no_valid_scores(self): - """Test that ValueError is raised when no valid scores are found.""" - mock_result = EvaluationResult( - job="test-job", - tasks={}, - groups={}, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - with pytest.raises(ValueError, match="no evaluation results detected"): - _parse_evalfactory_scores("test-job", "/fake/path") - - def test_empty_tasks_falls_back_to_groups(self): - """Test that empty tasks dict falls back to groups.""" - mock_result = EvaluationResult( - job="test-job", - tasks={}, # Empty but truthy - groups={ - "group1": GroupResult( - metrics={ - "metric1": DeprecatedMetricResult(scores={"group_score": DeprecatedScoreValue(value=0.65)}) - } - ) - }, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - # Empty dict is falsy, so groups should be used - assert len(scores) == 1 - assert scores[0].name == "group_score" - - def test_same_score_name_across_tasks_last_wins(self): - """Test behavior when multiple tasks have the same score name. - - When multiple tasks have the same score name with different values, - the last task's value is kept. This is documented behavior - if distinct - values are needed, tasks should use unique score names. - """ - mock_result = EvaluationResult( - job="test-job", - tasks={ - "task1": TaskResult( - metrics={"metric1": DeprecatedMetricResult(scores={"accuracy": DeprecatedScoreValue(value=0.85)})} - ), - "task2": TaskResult( - metrics={"metric1": DeprecatedMetricResult(scores={"accuracy": DeprecatedScoreValue(value=0.90)})} - ), - }, - groups=None, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - # Only one accuracy score should be present (last task wins due to dict iteration) - assert len(scores) == 1 - assert scores[0].name == "accuracy" - # Note: The value depends on dict iteration order (Python 3.7+ preserves insertion order) - # In practice, EvalFactory containers use unique score names per task - - def test_preserves_score_stats(self): - """Test that score stats are preserved when parsing.""" - mock_result = EvaluationResult( - job="test-job", - tasks={ - "task1": TaskResult( - metrics={ - "metric1": DeprecatedMetricResult( - scores={ - "accuracy": DeprecatedScoreValue( - value=0.85, stats=ScoreStats(count=100, mean=0.85, min=0.5, max=1.0) - ) - } - ) - } - ) - }, - groups=None, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - assert len(scores) == 1 - assert scores[0].stats is not None - assert scores[0].stats.count == 100 - assert scores[0].stats.mean == 0.85 - - def test_accepts_nan_only_scores_when_scores_exist(self): - """Regression: system metrics can emit NaN scores without groups.""" - mock_result = EvaluationResult( - job="test-job", - tasks={ - "rag": TaskResult( - metrics={ - "rag_response_relevancy": DeprecatedMetricResult( - scores={"response_relevancy": DeprecatedScoreValue(value=float("nan"))} - ) - } - ) - }, - groups=None, - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory.load_evaluation_result", return_value=mock_result - ): - scores = _parse_evalfactory_scores("test-job", "/fake/path") - - assert len(scores) == 1 - assert scores[0].name == "response_relevancy" - assert scores[0].value != scores[0].value # NaN - - -class TestMetricResultConversion: - def test_converts_metric_result_to_aggregated_schema(self): - scores = [ - MetricScore( - name="accuracy", - value=0.85, - stats=ScoreStats(count=10, sum=8.5, mean=0.85, min=0.1, max=1.0, variance=0.04, stddev=0.2), - ) - ] - - aggregated = _scores_to_aggregated_result(scores) - assert len(aggregated.scores) == 1 - score = aggregated.scores[0] - assert score.name == "accuracy" - assert score.count == 10 - assert score.mean == 0.85 - assert score.score_type == "range" - - def test_nan_only_score_uses_null_for_undefined_aggregate_stats(self): - scores = [MetricScore(name="response_relevancy", value=float("nan"))] - - aggregated = _scores_to_aggregated_result(scores) - assert len(aggregated.scores) == 1 - score = aggregated.scores[0] - assert score.name == "response_relevancy" - assert score.count == 0 - assert score.nan_count == 1 - assert score.mean is None - assert score.min is None - assert score.max is None - assert score.std_dev is None - assert score.variance is None - assert score.sum is None - assert score.percentiles is None - - def test_nan_only_score_with_zero_placeholder_stats_converts_to_null_aggregates(self): - scores = [ - MetricScore( - name="response_relevancy", - value=float("nan"), - stats=ScoreStats(count=0, nan_count=1, mean=0.0, min=0.0, max=0.0, sum=0.0, variance=0.0, stddev=0.0), - ) - ] - - aggregated = _scores_to_aggregated_result(scores) - score = aggregated.scores[0] - assert score.count == 0 - assert score.nan_count == 1 - assert score.mean is None - assert score.min is None - assert score.max is None - assert score.sum is None - assert score.variance is None - assert score.std_dev is None - assert score.percentiles is None - - -class TestPrepareEvalFactoryResults: - def test_creates_empty_row_scores_when_missing(self, tmp_path): - results_file = tmp_path / "results.yml" - results_file.write_text("tasks: {}") - - parsed = [MetricScore(name="accuracy", value=1.0)] - with patch("nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", return_value=parsed): - prepared = EvalFactoryResultsParser(job_id="job-1", eval_harness="retriever").prepare_results(str(tmp_path)) - - assert prepared.aggregate_scores_path.endswith("aggregate-scores.json") - assert prepared.row_scores_path is not None - assert prepared.row_scores_path.endswith("row-scores.jsonl") - assert (tmp_path / "row-scores.jsonl").exists() - assert (tmp_path / "row-scores.jsonl").read_text() == "" - aggregate = json.loads((tmp_path / "aggregate-scores.json").read_text()) - assert "scores" in aggregate - - def test_parses_retriever_cached_outputs_to_row_scores(self, tmp_path): - results_file = tmp_path / "results.yml" - results_file.write_text("tasks: {}") - retriever_rows = tmp_path / "results" / "retriever_cached_outputs.json" - retriever_rows.parent.mkdir(parents=True, exist_ok=True) - retriever_rows.write_text( - json.dumps( - { - "q1": {"retrieved_docs": [{"doc_id": "d1", "score": 0.1}]}, - "q2": {"retrieved_docs": [{"doc_id": "d2", "score": 0.2}]}, - } - ) - ) - - parsed = [MetricScore(name="accuracy", value=1.0)] - with patch("nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", return_value=parsed): - prepared = EvalFactoryResultsParser(job_id="job-1", eval_harness="retriever").prepare_results(str(tmp_path)) - - assert prepared.row_scores_path is not None - row_lines = (tmp_path / "row-scores.jsonl").read_text().splitlines() - assert len(row_lines) == 2 - first = json.loads(row_lines[0]) - second = json.loads(row_lines[1]) - assert first["item"] == {"query_id": "q1"} - assert second["item"] == {"query_id": "q2"} - assert first["row_index"] is None - assert second["row_index"] is None - assert first["metrics"] == {} - assert second["metrics"] == {} - assert first["metric_errors"] is None - assert second["metric_errors"] is None - assert "error" not in first - assert "error" not in second - assert "retriever" in first - assert "retriever" in second - - def test_overwrites_existing_empty_row_scores(self, tmp_path): - results_file = tmp_path / "results.yml" - results_file.write_text("tasks: {}") - (tmp_path / "row-scores.jsonl").write_text("") - predictions = tmp_path / "artifacts" / "predictions.json" - predictions.parent.mkdir(parents=True, exist_ok=True) - predictions.write_text(json.dumps(["p1", "p2"])) - - parsed = [MetricScore(name="accuracy", value=1.0)] - with patch("nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", return_value=parsed): - EvalFactoryResultsParser(job_id="job-1", eval_harness="bigcode_eval_harness").prepare_results(str(tmp_path)) - - row_lines = (tmp_path / "row-scores.jsonl").read_text().splitlines() - assert len(row_lines) == 2 - - def test_loads_results_yml_from_artifacts_directory(self, tmp_path): - artifacts_dir = tmp_path / "artifacts" - artifacts_dir.mkdir(parents=True, exist_ok=True) - results_file = artifacts_dir / "results.yml" - results_file.write_text("tasks: {}") - - parsed = [MetricScore(name="accuracy", value=1.0)] - with patch("nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", return_value=parsed): - prepared = EvalFactoryResultsParser(job_id="job-1", eval_harness="retriever").prepare_results(str(tmp_path)) - - assert prepared.aggregate_scores_path.endswith("aggregate-scores.json") - assert (tmp_path / "aggregate-scores.json").exists() - - -class TestEvalFactoryResultsPathResolution: - def test_resolves_results_yml_from_artifacts_directory(self, tmp_path): - artifacts_dir = tmp_path / "artifacts" - artifacts_dir.mkdir(parents=True, exist_ok=True) - results_path = artifacts_dir / "results.yml" - results_path.write_text("tasks: {}") - - resolved = resolve_evalfactory_results_file_path(str(tmp_path)) - assert resolved is not None - assert resolved.endswith("artifacts/results.yml") - - -class TestEvalFactoryRetrieverRowsParsing: - def test_raises_when_retriever_artifact_is_not_object(self, tmp_path): - artifact_path = tmp_path / "retriever_cached_outputs.json" - artifact_path.write_text(json.dumps([{"query_id": "q1"}])) - - with pytest.raises(ValueError, match="Expected EvalFactory retriever row artifact to be a JSON object"): - _parse_evalfactory_retriever_rows(str(artifact_path)) - - def test_raises_when_retriever_entry_is_not_object(self, tmp_path): - artifact_path = tmp_path / "retriever_cached_outputs.json" - artifact_path.write_text(json.dumps({"q1": "invalid"})) - - with pytest.raises(ValueError, match="Invalid EvalFactory retriever row artifact entry type"): - _parse_evalfactory_retriever_rows(str(artifact_path)) - - -class TestEvalFactoryCachedOutputsRowsParsing: - def test_prefers_known_cached_outputs_filename_over_other_jsonl(self, tmp_path): - (tmp_path / "artifacts").mkdir() - (tmp_path / "artifacts" / "misc.jsonl").write_text(json.dumps({"ignored": True}) + "\n") - (tmp_path / "artifacts" / "answer_acc.jsonl").write_text(json.dumps({"question": "q1"}) + "\n") - - source = _select_evalfactory_row_source(str(tmp_path), "simple_evals") - assert source is not None - assert source[0] == "cached-outputs" - assert source[1].endswith("answer_acc.jsonl") - - def test_ignores_unknown_jsonl_filename(self, tmp_path): - artifact_path = tmp_path / "unknown_rows.jsonl" - artifact_path.write_text(json.dumps({"question": "q1"}) + "\n") - - results_file = tmp_path / "results.yml" - results_file.write_text("tasks: {}") - parsed = [MetricScore(name="accuracy", value=1.0)] - with patch("nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", return_value=parsed): - prepared = EvalFactoryResultsParser(job_id="job-1", eval_harness="simple_evals").prepare_results( - str(tmp_path) - ) - - assert prepared.row_scores_path is not None - row_lines = (tmp_path / "row-scores.jsonl").read_text().splitlines() - assert len(row_lines) == 0 - - def test_ignores_generic_scores_jsonl_filename(self, tmp_path): - artifact_path = tmp_path / "scores.jsonl" - artifact_path.write_text(json.dumps({"question": "q1", "score": 1.0}) + "\n") - - results_file = tmp_path / "results.yml" - results_file.write_text("tasks: {}") - parsed = [MetricScore(name="accuracy", value=1.0)] - with patch("nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", return_value=parsed): - prepared = EvalFactoryResultsParser(job_id="job-1", eval_harness="simple_evals").prepare_results( - str(tmp_path) - ) - - assert prepared.row_scores_path is not None - row_lines = (tmp_path / "row-scores.jsonl").read_text().splitlines() - assert len(row_lines) == 0 - - def test_parses_nested_samples_jsonl_filename(self, tmp_path): - samples_dir = tmp_path / "artifacts" / "mock-model" - samples_dir.mkdir(parents=True) - artifact_path = samples_dir / "samples_gsm8k_run.jsonl" - artifact_path.write_text(json.dumps({"doc_id": 0, "doc": {"question": "q1"}}) + "\n") - - results_file = tmp_path / "results.yml" - results_file.write_text("tasks: {}") - parsed = [MetricScore(name="accuracy", value=1.0)] - with patch("nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", return_value=parsed): - prepared = EvalFactoryResultsParser(job_id="job-1", eval_harness="lm_eval_harness").prepare_results( - str(tmp_path) - ) - - assert prepared.row_scores_path is not None - row_lines = (tmp_path / "row-scores.jsonl").read_text().splitlines() - assert len(row_lines) == 1 - parsed_row = json.loads(row_lines[0]) - assert parsed_row["item"]["doc_id"] == 0 - assert parsed_row["item"]["doc"]["question"] == "q1" - assert parsed_row["metrics"] == {} - assert parsed_row["requests"] == [] - - def test_parses_cached_outputs_jsonl_rows(self, tmp_path): - artifact_path = tmp_path / "answer_acc.jsonl" - artifact_path.write_text( - "\n".join( - [ - json.dumps({"question": "q1", "answer": "a1"}), - json.dumps({"item": {"question": "q2"}, "sample": {"output_text": "a2"}}), - ] - ) - ) - - rows = _parse_evalfactory_cached_outputs_rows(str(artifact_path)) - assert len(rows) == 2 - assert rows[0]["item"]["question"] == "q1" - assert rows[0]["sample"] == {} - assert rows[0]["metrics"] == {} - assert rows[0]["requests"] == [] - assert rows[1]["item"]["question"] == "q2" - assert rows[1]["sample"]["output_text"] == "a2" - assert rows[1]["metrics"] == {} - assert rows[1]["requests"] == [] - - def test_raises_on_non_object_cached_outputs_row(self, tmp_path): - artifact_path = tmp_path / "answer_acc.jsonl" - artifact_path.write_text(json.dumps(["not-an-object"])) - - with pytest.raises(ValueError, match="Invalid EvalFactory cached-outputs row"): - _parse_evalfactory_cached_outputs_rows(str(artifact_path)) - - def test_normalize_cached_row_preserves_existing_item_sample(self): - normalized = _normalize_cached_outputs_row({"item": {"x": 1}, "sample": {"y": 2}}) - assert normalized["item"] == {"x": 1} - assert normalized["sample"] == {"y": 2} - assert normalized["metrics"] == {} - assert normalized["requests"] == [] - - -class TestEvalFactoryBenchmarkRowsParsing: - def test_parses_aegis_output_csv(self, tmp_path): - artifact_path = tmp_path / "output.csv" - artifact_path.write_text("prompt,response,safe\np1,r1,true\np2,r2,false\n") - - rows = _parse_evalfactory_csv_rows(str(artifact_path)) - assert len(rows) == 2 - assert rows[0]["item"]["row_index"] == 0 - assert rows[0]["benchmark"]["prompt"] == "p1" - assert rows[1]["benchmark"]["safe"] == "false" - - def test_parses_humaneval_predictions_json(self, tmp_path): - artifact_path = tmp_path / "predictions.json" - artifact_path.write_text(json.dumps(["def foo(): pass", "def bar(): pass"])) - - rows = _parse_evalfactory_predictions_rows(str(artifact_path)) - assert len(rows) == 2 - assert rows[0]["item"]["row_index"] == 0 - assert rows[1]["prediction"] == "def bar(): pass" - - def test_parses_bfcl_ndjson_payload(self, tmp_path): - artifact_path = tmp_path / "BFCL_v3_simple_result.json" - artifact_path.write_text( - "\n".join( - [ - json.dumps({"id": "simple_0", "result": "{}"}), - json.dumps({"id": "simple_1", "result": "{}"}), - ] - ) - ) - - rows = _parse_evalfactory_bfcl_rows(str(artifact_path)) - assert len(rows) == 2 - assert rows[0]["item"]["id"] == "simple_0" - assert rows[1]["item"]["id"] == "simple_1" - - -class TestEvalFactoryHarnessRouting: - def test_selects_retriever_rows_from_harness(self, tmp_path): - retriever_rows = tmp_path / "results" / "retriever_cached_outputs.json" - retriever_rows.parent.mkdir(parents=True, exist_ok=True) - retriever_rows.write_text(json.dumps({"q1": {"retrieved_docs": []}})) - - source = _select_evalfactory_row_source(str(tmp_path), "retriever") - assert source is not None - assert source[0] == "retriever" - assert source[1].endswith("retriever_cached_outputs.json") - - def test_selects_bfcl_rows_from_harness(self, tmp_path): - bfcl_rows = tmp_path / "results" / "result" / "bfcl" / "simple.json" - bfcl_rows.parent.mkdir(parents=True, exist_ok=True) - bfcl_rows.write_text(json.dumps({"id": "simple_0"}) + "\n") - - source = _select_evalfactory_row_source(str(tmp_path), "bfcl") - assert source is not None - assert source[0] == "benchmark" - assert source[2] == "bfcl-ndjson" - - def test_selects_agentic_rows_from_harness(self, tmp_path): - agentic_rows = tmp_path / "results" / "trajectory_eval_input.jsonl" - agentic_rows.parent.mkdir(parents=True, exist_ok=True) - agentic_rows.write_text(json.dumps({"question": "q1"}) + "\n") - - source = _select_evalfactory_row_source(str(tmp_path), "agentic_eval") - assert source is not None - assert source[0] == "cached-outputs" - assert source[1].endswith("trajectory_eval_input.jsonl") - - -class TestResultsParserSelection: - def test_uses_custom_parser_for_evaluator_harness(self, tmp_path): - parser = _get_results_parser("job-1", str(tmp_path), eval_harness="evaluator") - assert isinstance(parser, CustomResultsParser) - - def test_uses_evalfactory_parser_for_non_evaluator_harness(self, tmp_path): - parser = _get_results_parser("job-1", str(tmp_path), eval_harness="retriever") - assert isinstance(parser, EvalFactoryResultsParser) - - def test_defaults_to_custom_parser_when_harness_not_set(self, tmp_path): - parser = _get_results_parser("job-1", str(tmp_path)) - assert isinstance(parser, CustomResultsParser) - - def test_blank_harness_defaults_to_custom_parser(self, tmp_path): - parser = _get_results_parser("job-1", str(tmp_path), eval_harness=" ") - assert isinstance(parser, CustomResultsParser) - - def test_raises_for_unknown_harness(self, tmp_path): - with pytest.raises(ValueError, match="Unsupported eval harness"): - _get_results_parser("job-1", str(tmp_path), eval_harness="not-a-harness") - - -class TestEvalHarnessNormalization: - def test_normalize_valid_eval_harness(self): - assert normalize_eval_harness("retriever") == "retriever" - - def test_normalize_none_defaults_to_evaluator(self): - assert normalize_eval_harness(None) == "evaluator" - - def test_normalize_blank_defaults_to_evaluator(self): - assert normalize_eval_harness(" ") == "evaluator" - - def test_normalize_invalid_raises(self): - with pytest.raises(ValueError, match="Unsupported eval harness"): - normalize_eval_harness("bad-harness") diff --git a/services/evaluator/tests/app/jobs/test_metrics_jobs.py b/services/evaluator/tests/app/jobs/test_metrics_jobs.py deleted file mode 100644 index 555a9a8591..0000000000 --- a/services/evaluator/tests/app/jobs/test_metrics_jobs.py +++ /dev/null @@ -1,219 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Unit tests for compile_metric_job function.""" - -import shlex -from typing import Any, Protocol, cast, runtime_checkable - -import pytest -from nmp.common.files.storage_config import HuggingfaceStorageConfig -from nmp.evaluator.app.evalfactory.agentic_eval import AgenticEvalHandler -from nmp.evaluator.app.evalfactory.retriever import RetrieverHandler -from nmp.evaluator.app.evalfactory.system import get_system_metric_handler -from nmp.evaluator.app.jobs.constants import NEMO_EVAL_HARNESS -from nmp.evaluator.app.jobs.metrics import compile_metric_job, generate_config_file_from_env_command_str -from nmp.evaluator.app.values import Fileset, MetricOfflineJob, MetricOnlineJob, MetricRetrieverJob -from nmp.evaluator.config import settings - - -def _hf_storage_config() -> HuggingfaceStorageConfig: - """Create a Hugging Face storage config for inline Fileset tests.""" - return HuggingfaceStorageConfig(repo_id="test-org/test-dataset", repo_type="dataset") - - -class TestCompileMetricJob: - """Tests for compile_metric_job function.""" - - @pytest.mark.asyncio - async def test_compile_retriever_job(self): - """Test compile_metric_job for a Retriever job produces evaluation and results steps.""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-map") - job = MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": {"url": "http://embedding.test", "name": "my/embedding-model"}, - }, - "dataset": {"path": "test", "storage": {"type": "huggingface", "repo_id": "test/test"}}, - "metric_params": {}, - } - ) - - result = await compile_metric_job(job) - steps = list(result["steps"]) - - # Retriever jobs should have: dataset-download, evaluation, results - assert len(steps) == 3 - assert steps[0]["name"] == "dataset-download" - assert steps[1]["name"] == "evaluation" - assert steps[2]["name"] == "results" - assert _get_step_env_value(steps[2], NEMO_EVAL_HARNESS) == "retriever" - config_file_command_str, config_file_path = generate_config_file_from_env_command_str() - handler = get_system_metric_handler(metric.name) - ef_job_config = handler.augment_metric_job(job, settings.jobs.results_dir) - container_command = handler.container_command(ef_job_config, config_file_path) - assert _get_container(steps[1]).get("command") == [ - "/bin/sh", - "-c", - config_file_command_str + " && exec " + shlex.join(container_command), - ] - - @pytest.mark.asyncio - @pytest.mark.parametrize( - ("model_url", "model_name"), - [ - ( - "https://api.example.com/v1/chat/completions?api-version=2024-10-01&deployment=gpt-4o", - "Llama 3.1 70B Instruct", - ), - ( - "http://judge.test/v1/chat/completions;profile=default", - "judge; sleep 1", - ), - ], - ids=[ - "realistic_url_and_name", - "semicolon_meta_chars", - ], - ) - async def test_compile_system_metric_shell_escapes_dynamic_command_args(self, model_url: str, model_name: str): - """System metric EvalFactory command should quote dynamic arguments for /bin/sh -c.""" - metric = next(m for m in AgenticEvalHandler._system_metrics if m.name == "trajectory-evaluation") - job = MetricOfflineJob.model_validate( - { - "metric": metric, - "dataset": {"path": "test", "storage": {"type": "huggingface", "repo_id": "test/test"}}, - "metric_params": { - "judge": { - "model": { - "url": model_url, - "name": model_name, - }, - }, - "trajectory_used_tools": "tool1,tool2", - }, - } - ) - - result = await compile_metric_job(job) - steps = list(result["steps"]) - config_file_command_str, config_file_path = generate_config_file_from_env_command_str() - handler = get_system_metric_handler(metric.name) - ef_job_config = handler.augment_metric_job(job, settings.jobs.results_dir) - container_command = handler.container_command(ef_job_config, config_file_path) - shell_command = _get_container(steps[1]).get("command", [])[2] - - assert _get_container(steps[1]).get("command") == [ - "/bin/sh", - "-c", - config_file_command_str + " && exec " + shlex.join(container_command), - ] - assert f"--model_id {model_name}" not in shell_command - assert f"--model_url {model_url}" not in shell_command - - @pytest.mark.asyncio - async def test_compile_agentic_job_inline_model(self): - """Test that inline models (not URNs) don't trigger resolution.""" - metric = next(m for m in AgenticEvalHandler._system_metrics if m.name == "trajectory-evaluation") - - # Job with an already-inline model (not a URN string) - job = MetricOfflineJob.model_validate( - { - "metric": metric, - "dataset": {"path": "test", "storage": {"type": "huggingface", "repo_id": "test/test"}}, - "metric_params": { - "judge": { - "model": {"url": "http://judge.test/v1/chat/completions", "name": "my/judge"}, - }, - "trajectory_used_tools": "tool1,tool2", - }, - } - ) - - result = await compile_metric_job(job) - steps = list(result["steps"]) - - # Agentic jobs should have: dataset-download, evaluation, results - assert len(steps) == 3 - assert steps[0]["name"] == "dataset-download" - assert steps[1]["name"] == "evaluation" - assert steps[2]["name"] == "results" - assert _get_step_env_value(steps[2], NEMO_EVAL_HARNESS) == "agentic_eval" - - @pytest.mark.asyncio - async def test_compile_custom_metric_uses_python_entrypoint(self): - """Evaluator-owned custom metric step should run task directly, not via /bin/sh.""" - job = MetricOnlineJob.model_validate( - { - "model": {"url": "http://nim.test/v1/chat/completions", "name": "my/model"}, - "dataset": {"rows": [{"input": "hello", "expected": "hello"}]}, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "metric": {"type": "exact-match", "reference": "{{item.expected}}"}, - } - ) - - result = await compile_metric_job(job) - steps = list(result["steps"]) - - assert len(steps) == 1 - assert steps[0]["name"] == "evaluation" - assert _get_container(steps[0]).get("entrypoint") == [ - "python", - "-m", - "nmp.evaluator.tasks.evaluate_metric", - ] - - @pytest.mark.asyncio - async def test_compile_custom_metric_inline_fileset_adds_download_step(self): - """Custom metric jobs should download inline Fileset datasets before evaluation.""" - job = MetricOfflineJob.model_validate( - { - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - "candidate": "{{item.output}}", - }, - "dataset": Fileset(storage=_hf_storage_config(), path="data/validation.jsonl"), - } - ) - - result = await compile_metric_job(job) - steps = list(result["steps"]) - - assert [step["name"] for step in steps] == ["dataset-download", "evaluation"] - assert _get_container(steps[1]).get("entrypoint") == [ - "python", - "-m", - "nmp.evaluator.tasks.evaluate_metric", - ] - - -@runtime_checkable -class SupportsModelDump(Protocol): - def model_dump(self, *, mode: str, exclude_none: bool) -> dict[str, object]: ... - - -def _get_step_env_value(step: object, name: str) -> str | None: - step_dict: dict[str, object] - if not isinstance(step, dict): - assert isinstance(step, SupportsModelDump) - step_dict = step.model_dump(mode="json", exclude_none=True) - else: - step_dict = {str(key): value for key, value in step.items()} - envs = step_dict.get("environment") - if not isinstance(envs, list): - return None - for env in envs: - if not isinstance(env, dict): - continue - env_dict = {str(key): value for key, value in env.items()} - if env_dict.get("name") == name: - value = env_dict.get("value") - return value if isinstance(value, str) else None - return None - - -def _get_container(step: object) -> dict[str, Any]: - step_dict = cast(dict[str, Any], step) - return cast(dict[str, Any], step_dict["executor"]["container"]) diff --git a/services/evaluator/tests/app/metrics/evalfactory/__init__.py b/services/evaluator/tests/app/metrics/evalfactory/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_agentic_eval.py b/services/evaluator/tests/app/metrics/evalfactory/test_agentic_eval.py deleted file mode 100644 index 5e65a34278..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_agentic_eval.py +++ /dev/null @@ -1,201 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest import mock - -import pytest -from nmp.evaluator.app.evalfactory.agentic_eval import ( - AgenticEvalHandler, - SecretRef, -) -from nmp.evaluator.app.evalfactory.convert import INLINE_DATASET_FILENAME -from nmp.evaluator.app.values import MetricOfflineJob, MetricOnlineJob -from nmp.evaluator.config import EvaluatorSettings - - -class TestAgenticEvalHandler: - handler = AgenticEvalHandler() - - def _test_job_dict(self) -> dict: - return { - "metric": AgenticEvalHandler._system_metrics[0], - "dataset": { - "rows": [{"input": "test"}], - }, - "metric_params": { - "judge": {"model": {"name": "my/judge", "url": "http://nim.test/v1/chat/completions"}}, - "trajectory_used_tools": "tool1,tool2", - }, - } - - def _test_job(self, job: dict | None = None) -> MetricOfflineJob: - return MetricOfflineJob.model_validate(job or self._test_job_dict()) - - @mock.patch.dict( - os.environ, - { - "NMP_EVALUATOR_EVALFACTORY_AGENTIC_EVAL": "my-container", - }, - ) - def test_docker_image(self): - assert AgenticEvalHandler.docker_image() == "nvcr.io/nvidia/eval-factory/agentic_eval:26.01", ( - "settings is loaded before env override, expect defaults" - ) - assert EvaluatorSettings().evalfactory.agentic_eval == "my-container", "failed environment variable override" - - def test_system_metrics(self): - system_metrics = AgenticEvalHandler.system_metrics() - assert len(system_metrics) == 1 - - for system_metric in system_metrics: - assert system_metric.labels.get("eval_harness") == "agentic_eval" - assert system_metric.supported_job_types == ["offline"], "only offline is supported for Agentic Eval" - - # Verify the only metric is trajectory-evaluation - assert system_metrics[0].name == "trajectory-evaluation" - - def test_metric_job_secrets(self): - job_dict = self._test_job_dict() - job = MetricOfflineJob.model_validate(job_dict) - secrets = self.handler.metric_job_secrets(job) - assert len(secrets) == 0, "no secrets expected" - - job_dict["metric_params"]["judge"]["model"]["api_key_secret"] = "my-judge-secret" - job = MetricOfflineJob.model_validate(job_dict) - secrets = self.handler.metric_job_secrets(job) - assert len(secrets) == 1, "expected secret for judge API key (NIM format)" - assert secrets["judge_api_key_secret"] == SecretRef(root="my-judge-secret") - - def test_secrets_openai_format(self): - """Test that OPENAI_API_KEY is also exported when judge model uses OpenAI format.""" - job_dict = self._test_job_dict() - job_dict["metric_params"]["judge"]["model"]["api_key_secret"] = "my-judge-secret" - job_dict["metric_params"]["judge"]["model"]["format"] = "openai" - job = MetricOfflineJob.model_validate(job_dict) - secrets = self.handler.metric_job_secrets(job) - assert len(secrets) == 2, "expected both judge_api_key_secret and OPENAI_API_KEY" - assert secrets["judge_api_key_secret"] == SecretRef(root="my-judge-secret") - assert secrets["OPENAI_API_KEY"] == SecretRef(root="my-judge-secret") - - def test_unsupported_job_type(self): - job = MetricOnlineJob.model_validate( - { - "metric": AgenticEvalHandler._system_metrics[0], - "model": { - "url": "http://nim.test", - "name": "my/model", - }, - "dataset": {"rows": [{"input": "test"}]}, - "prompt_template": "{{input}}", - "metric_params": {}, - } - ) - with pytest.raises( - ValueError, - match="metric does not support online evaluations with a model. Remove the model and specify a dataset.", - ): - self.handler.augment_metric_job(job, "output_dir") - - def test_missing_req_param(self): - job = self._test_job() - job.metric_params = {} - with pytest.raises(ValueError, match="missing required parameter"): - self.handler.augment_metric_job(job, "output_dir") - - def test_invalid_judge(self): - job = self._test_job( - { - "metric": AgenticEvalHandler._system_metrics[0], - "dataset": { - "rows": [{"input": "test"}], - }, - "metric_params": { - "judge": { - "model": { - "url": "http://nim.test", - "name": "my/judge", - }, - }, - "trajectory_used_tools": "tool1,tool2", - }, - } - ) - with pytest.raises( - ValueError, match="job.metric_params.judge.model.url must end in '/v1/chat/completions' for agentic judge" - ): - self.handler.augment_metric_job(job, "output_dir") - - def test_augment_metric_job(self): - ef_job = self.handler.augment_metric_job(self._test_job(), "output_dir") - result = ef_job.model_dump(mode="json", exclude_none=True) - - # Check dataset_path ends with expected suffix (actual base path varies in tests) - dataset_path = result["config"]["params"]["extra"]["dataset_path"] - assert dataset_path.endswith(f"/jobs/datasets/{INLINE_DATASET_FILENAME}") - - # Check the rest of the structure (trajectory-evaluation requires judge) - assert result["target"]["api_endpoint"]["url"] == "http://nim.test/v1/chat/completions" - assert result["target"]["api_endpoint"]["model_id"] == "my/judge" - assert result["target"]["api_endpoint"]["type"] == "chat" - assert result["config"]["type"] == "agentic_eval_trajectory_evaluation" - assert result["config"]["params"]["extra"]["judge"] == { - "model": {"name": "my/judge", "url": "http://nim.test/v1/chat/completions"} - } - assert result["config"]["params"]["extra"]["trajectory_used_tools"] == "tool1,tool2" - assert result["config"]["params"]["extra"]["judge_model_args"] == {} - assert result["config"]["params"]["extra"]["judge_model_type"] == "nvidia-nim" - - def test_augment_metric_job_with_api_key_secret(self): - """Test that api_key_secret is correctly mapped to env var name.""" - job_dict = self._test_job_dict() - job_dict["metric_params"]["judge"]["model"]["api_key_secret"] = "my-judge-secret" - job = MetricOfflineJob.model_validate(job_dict) - - ef_job = self.handler.augment_metric_job(job, "output_dir") - result = ef_job.model_dump(mode="json", exclude_none=True) - - # api_key should be the env var name (Jinja template adds $ prefix) - assert result["target"]["api_endpoint"]["api_key_name"] == "judge_api_key_secret" - # dataset_path should be in extra params for offline jobs - assert result["config"]["params"]["extra"]["dataset_path"].endswith(f"/jobs/datasets/{INLINE_DATASET_FILENAME}") - - def test_augment_metric_job_trajectory_with_custom_tools(self): - """Test trajectory-evaluation metric with custom tools parameter.""" - trajectory_metric = AgenticEvalHandler._system_metrics[0] - assert trajectory_metric.name == "trajectory-evaluation" - - job = MetricOfflineJob.model_validate( - { - "metric": trajectory_metric, - "dataset": { - "rows": [{"input": "test"}], - }, - "metric_params": { - "trajectory_used_tools": "tool1,tool2,custom_tool", - "trajectory_custom_tools": {"custom_tool": "A custom tool for testing"}, - "judge": { - "model": { - "name": "my/judge", - "url": "http://nim.test/v1/chat/completions", - } - }, - }, - } - ) - - ef_job = self.handler.augment_metric_job(job, "output_dir") - result = ef_job.model_dump(mode="json", exclude_none=True) - - # Judge metrics use the judge endpoint - assert result["target"]["api_endpoint"]["url"] == "http://nim.test/v1/chat/completions" - assert result["target"]["api_endpoint"]["model_id"] == "my/judge" - assert result["target"]["api_endpoint"]["type"] == "chat" - assert result["config"]["type"] == "agentic_eval_trajectory_evaluation" - # trajectory params should be in extra params - assert result["config"]["params"]["extra"]["trajectory_used_tools"] == "tool1,tool2,custom_tool" - assert result["config"]["params"]["extra"]["trajectory_custom_tools"] == { - "custom_tool": "A custom tool for testing" - } - # dataset_path should be in extra params - assert result["config"]["params"]["extra"]["dataset_path"].endswith(f"/jobs/datasets/{INLINE_DATASET_FILENAME}") diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_bfcl.py b/services/evaluator/tests/app/metrics/evalfactory/test_bfcl.py deleted file mode 100644 index cdd127998e..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_bfcl.py +++ /dev/null @@ -1,127 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest import mock - -import pytest -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.bfcl import BFCLHandler -from nmp.evaluator.app.values import SystemBenchmarkOfflineJob, SystemBenchmarkOnlineJob -from nmp.evaluator.config import EvaluatorSettings - - -class TestBFCLHandler: - handler = BFCLHandler() - - def _test_job_ast(self) -> SystemBenchmarkOnlineJob: - """Job for AST benchmark (no secrets).""" - benchmark = next(m for m in BFCLHandler._system_benchmarks if m.name == "bfclv3-simple") - return SystemBenchmarkOnlineJob.model_validate( - { - "benchmark": benchmark, - "model": {"url": "http://nim.test", "name": "my/model"}, - "benchmark_params": {}, - } - ) - - def _test_job_exec(self) -> SystemBenchmarkOnlineJob: - """Job for exec benchmark (with secrets).""" - benchmark = next(m for m in BFCLHandler._system_benchmarks if m.name == "bfclv3-exec-simple") - return SystemBenchmarkOnlineJob.model_validate( - { - "benchmark": benchmark, - "model": {"url": "http://nim.test", "name": "my/model"}, - "benchmark_params": { - "rapid_api_key": "my-rapid-secret", - "exchangerate_api_key": "my-exchangerate-secret", - "omdb_api_key": "my-omdb-secret", - "geocode_api_key": "my-geocode-secret", - }, - } - ) - - @mock.patch.dict( - os.environ, - { - "NMP_EVALUATOR_EVALFACTORY_BFCL": "my-container", - }, - ) - def test_docker_image(self): - assert BFCLHandler.docker_image() == "nvcr.io/nvidia/eval-factory/bfcl:26.01", ( - "settings is loaded before env override, expect defaults" - ) - assert EvaluatorSettings().evalfactory.bfcl == "my-container", "failed environment variable override" - - def test_system_benchmarks_count(self): - # 22 individual task benchmarks (17 AST + 5 exec) - assert len(BFCLHandler.system_benchmarks()) == 22 - - def test_all_benchmarks_are_online_only(self): - for benchmark in BFCLHandler.system_benchmarks(): - assert benchmark.labels.get("eval_harness") == "bfcl" - assert benchmark.supported_job_types == ["online"] - - def test_ast_benchmarks_no_required_params(self): - ast_benchmarks = [ - m - for m in BFCLHandler._system_benchmarks - if not m.name.startswith("bfclv3-exec") and m.name != "bfclv3-rest" - ] - for benchmark in ast_benchmarks: - assert len(benchmark.required_params) == 0, f"{benchmark.name} should not require API keys" - - def test_exec_benchmarks_require_api_keys(self): - exec_benchmarks = [ - m for m in BFCLHandler._system_benchmarks if m.name.startswith("bfclv3-exec") or m.name == "bfclv3-rest" - ] - assert len(exec_benchmarks) == 5 - for benchmark in exec_benchmarks: - assert len(benchmark.required_params) == 4, f"{benchmark.name} should require 4 API keys" - - def test_secrets_ast_benchmark(self): - secrets = self.handler.benchmark_job_secrets(self._test_job_ast()) - assert len(secrets) == 0 - - def test_secrets_exec_benchmark(self): - secrets = self.handler.benchmark_job_secrets(self._test_job_exec()) - assert secrets == { - "RAPID_API_KEY": SecretRef(root="my-rapid-secret"), - "EXCHANGERATE_API_KEY": SecretRef(root="my-exchangerate-secret"), - "OMDB_API_KEY": SecretRef(root="my-omdb-secret"), - "GEOCODE_API_KEY": SecretRef(root="my-geocode-secret"), - } - - def test_unsupported_offline_job(self): - benchmark = next(m for m in BFCLHandler._system_benchmarks if m.name == "bfclv3-simple") - job = SystemBenchmarkOfflineJob.model_validate( - { - "benchmark": benchmark, - "dataset": {"rows": [{"input": "test"}]}, - "benchmark_params": {}, - } - ) - with pytest.raises(ValueError, match="benchmark does not support offline evaluations"): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_augment_benchmark_job_ast_benchmark(self): - ef_job = self.handler.augment_benchmark_job(self._test_job_ast(), "output_dir") - - assert ef_job.config is not None - assert ef_job.config.params is not None - assert ef_job.config.type == "bfclv3" - assert ef_job.config.params.task == "simple" - - def test_augment_benchmark_job_exec_benchmark(self): - ef_job = self.handler.augment_benchmark_job(self._test_job_exec(), "output_dir") - - assert ef_job.config is not None - assert ef_job.config.params is not None - assert ef_job.config.type == "bfclv3" - assert ef_job.config.params.task == "exec_simple" - - def test_task_derived_from_benchmark_name(self): - """Task category is derived from benchmark name by removing prefix and converting dashes.""" - for benchmark in BFCLHandler._system_benchmarks: - expected_task = benchmark.name.removeprefix("bfclv3-").replace("-", "_") - assert expected_task, f"Could not derive task from {benchmark.name}" diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_bigcode.py b/services/evaluator/tests/app/metrics/evalfactory/test_bigcode.py deleted file mode 100644 index 21e20e3052..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_bigcode.py +++ /dev/null @@ -1,143 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest import mock - -import pytest -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.bigcode import BigCodeEvaluationHarnessHandler -from nmp.evaluator.app.values import SystemBenchmarkOfflineJob, SystemBenchmarkOnlineJob -from nmp.evaluator.config import EvaluatorSettings - -from .util import default_adapter_config - - -class TestBigCodeEvaluationHarnessHandler: - handler = BigCodeEvaluationHarnessHandler() - - def _test_job_dict(self) -> dict: - return { - "benchmark": BigCodeEvaluationHarnessHandler._system_benchmarks[1], - "model": { - "url": "http://nim.test", - "name": "my/model", - }, - "benchmark_params": {}, - } - - def _test_job_dict_secrets(self) -> dict: - job = self._test_job_dict() - job["benchmark_params"]["hf_token"] = "my-hf-secret" - return job - - def _test_job(self, job: dict | None = None) -> SystemBenchmarkOnlineJob: - return SystemBenchmarkOnlineJob.model_validate(job or self._test_job_dict_secrets()) - - @mock.patch.dict( - os.environ, - { - "NMP_EVALUATOR_EVALFACTORY_BIGCODE_EVALUATION_HARNESS": "my-container", - }, - ) - def test_docker_image(self): - assert ( - BigCodeEvaluationHarnessHandler.docker_image() - == "nvcr.io/nvidia/eval-factory/bigcode-evaluation-harness:26.01" - ), "settings is loaded before env override, expect defaults" - assert EvaluatorSettings().evalfactory.bigcode_evaluation_harness == "my-container", ( - "failed environment variable override" - ) - - def test_supported_model_type(self): - for system_benchmark in BigCodeEvaluationHarnessHandler._system_benchmarks: - assert system_benchmark.name in BigCodeEvaluationHarnessHandler.SUPPORTED_MODEL_TYPE, ( - f"missing mapping for benchmark {system_benchmark.name} to supported model types." - ) - - assert len(BigCodeEvaluationHarnessHandler._system_benchmarks) == len( - BigCodeEvaluationHarnessHandler.SUPPORTED_MODEL_TYPE - ), "missing system benchmark definition or benchmark mapping to supported model types" - - def test_system_benchmarks(self): - system_benchmarks = BigCodeEvaluationHarnessHandler.system_benchmarks() - assert len(system_benchmarks) == 27 - - for system_benchmark in system_benchmarks: - assert system_benchmark.labels.get("eval_harness") == "bigcode_eval_harness" - assert system_benchmark.supported_job_types == ["online"], ( - "only online is supported for BigCode Eval Harness" - ) - - def test_secrets(self): - job = self._test_job(self._test_job_dict()) - secrets = self.handler.benchmark_job_secrets(job) - assert len(secrets) == 0, "no secrets expected" - - job = self._test_job(self._test_job_dict_secrets()) - secrets = self.handler.benchmark_job_secrets(job) - assert len(secrets) == 1, "expected optional secrets" - assert next(iter(secrets.values())) == SecretRef(root="my-hf-secret") - - def test_unsupported_job_type(self): - job = SystemBenchmarkOfflineJob.model_validate( - { - "benchmark": BigCodeEvaluationHarnessHandler._system_benchmarks[1], - "dataset": { - "rows": [{"input": "test"}], - }, - "benchmark_params": {}, - } - ) - with pytest.raises( - ValueError, - match="benchmark does not support offline evaluations and a model is required. Specify a model to evaluate.", - ): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_invalid_param_type(self): - job = self._test_job() - job.benchmark_params["hf_token"] = True - with pytest.raises(ValueError, match="unexpected type for parameter hf_token"): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_unsupported_model_type(self): - job = self._test_job( - { - "benchmark": BigCodeEvaluationHarnessHandler._system_benchmarks[0], - "model": { - "url": "http://nim.test", - "name": "my/model", - }, - "benchmark_params": {}, - } - ) - with pytest.raises( - ValueError, - match="chat detected from job.model.url but is not supported for job .*, expected \['completions'\]", - ): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_augment_benchmark_job(self): - ef_job = self.handler.augment_benchmark_job(self._test_job(), "output_dir") - expected = { - "target": { - "api_endpoint": { - "url": "http://nim.test", - "model_id": "my/model", - "type": "chat", - "adapter_config": default_adapter_config, - }, - }, - "config": { - "type": "humaneval_instruct", - "params": { - "extra": { - "hf_token": "my-hf-secret", - "model_type": "chat", - }, - }, - }, - "output_dir": "output_dir", - } - assert ef_job.model_dump(mode="json", exclude_none=True) == expected diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_convert.py b/services/evaluator/tests/app/metrics/evalfactory/test_convert.py deleted file mode 100644 index d97a0229d0..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_convert.py +++ /dev/null @@ -1,183 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import patch - -import pytest -from nemo_evaluator_sdk.values import DatasetRows -from nmp.common.files.storage_config import HuggingfaceStorageConfig -from nmp.evaluator.app.evalfactory.convert import _convert_config_params, get_dataset_config -from nmp.evaluator.app.values import BuiltInDataset, Fileset, FilesetRef, MetricOfflineJob - - -def make_hf_storage_config() -> HuggingfaceStorageConfig: - """Create a test HuggingfaceStorageConfig.""" - return HuggingfaceStorageConfig( - repo_id="test-org/test-repo", - repo_type="dataset", - ) - - -class TestGetDatasetConfig: - def test_builtin_ragas_amnesty_qa_returns_special_config(self): - """Test that ragas/amnesty_qa returns the special HuggingFace config.""" - dataset = BuiltInDataset(root="ragas/amnesty_qa") - result = get_dataset_config(dataset) - - assert result.format == "ragas" - assert result.path == "explodinggradients/amnesty_qa" - assert result.dataset_name == "english_v2" - assert result.split == "eval" - - def test_builtin_beir_dataset_returns_format_and_name(self): - """Test that BEIR datasets return format and name from the dataset.""" - dataset = BuiltInDataset(root="beir/fiqa") - result = get_dataset_config(dataset) - - assert result.format == "beir" - assert result.path == "fiqa" - - def test_inline_dataset_uses_local_path(self): - """Test that DatasetRows resolves to local path with default filename.""" - dataset = DatasetRows(rows=[{"a": 1}]) - result = get_dataset_config(dataset, output_dir="/data/output") - - assert result.path == "/data/output/dataset.json" - assert result.format is None - - def test_inline_dataset_with_format(self): - """Test that DatasetRows with dataset_format sets format.""" - dataset = DatasetRows(rows=[{"a": 1}]) - result = get_dataset_config(dataset, dataset_format="ragas", output_dir="/data/output") - - assert result.path == "/data/output/dataset.json" - assert result.format == "ragas" - - def test_fileset_ref_uses_local_path(self): - """Test that FilesetRef resolves to local path.""" - dataset = FilesetRef(root="workspace/fileset-name") - result = get_dataset_config(dataset, output_dir="/data/output") - - assert result.path == "/data/output/workspace/fileset-name" - assert result.format is None - - def test_fileset_ref_with_format(self): - """Test that FilesetRef with dataset_format sets format.""" - dataset = FilesetRef(root="workspace/fileset-name") - result = get_dataset_config(dataset, dataset_format="beir", output_dir="/data/output") - - assert result.path == "/data/output/workspace/fileset-name" - assert result.format == "beir" - - def test_inline_fileset_uses_local_path(self): - """Test that Fileset resolves to local path.""" - dataset = Fileset(storage=make_hf_storage_config(), path="data/file.json") - result = get_dataset_config(dataset, output_dir="/data/output") - - assert result.path == "/data/output/data/file.json" - assert result.format is None - - def test_inline_fileset_with_none_path(self): - """Test that Fileset with None path returns output_dir.""" - dataset = Fileset(storage=make_hf_storage_config(), path=None) - result = get_dataset_config(dataset, output_dir="/data/output") - - assert result.path == "/data/output" - - def test_inline_fileset_with_format(self): - """Test that Fileset with dataset_format sets format.""" - dataset = Fileset(storage=make_hf_storage_config(), path="data/file.json") - result = get_dataset_config(dataset, dataset_format="ragas", output_dir="/data/output") - - assert result.path == "/data/output/data/file.json" - assert result.format == "ragas" - - def test_non_builtin_requires_output_dir(self): - """Test that non-BuiltInDataset types raise when output_dir is missing.""" - dataset = DatasetRows(rows=[{"a": 1}]) - - with pytest.raises(ValueError, match="output_dir is required"): - get_dataset_config(dataset, output_dir=None) - - def test_builtin_does_not_require_output_dir(self): - """Test that BuiltInDataset does not require output_dir.""" - dataset = BuiltInDataset(root="beir/fiqa") - # Should not raise - result = get_dataset_config(dataset, output_dir=None) - - assert result.format == "beir" - assert result.path == "fiqa" - - -class TestConvertConfigParams: - """Tests for _convert_config_params function.""" - - def _make_offline_job(self, dataset) -> MetricOfflineJob: - """Create a minimal MetricOfflineJob for testing.""" - return MetricOfflineJob.model_validate( - { - "metric": { - "name": "test-metric", - "type": "system", - }, - "dataset": dataset, - } - ) - - @patch("nmp.evaluator.app.evalfactory.convert.settings") - def test_offline_job_with_inline_dataset_sets_dataset_path(self, mock_settings): - """Test that extra_params['dataset_path'] is set for DatasetRows.""" - mock_settings.jobs.dataset_dir = "/jobs/datasets" - - dataset = DatasetRows(rows=[{"a": 1}]) - job = self._make_offline_job(dataset.model_dump()) - - result = _convert_config_params(job) - - assert result.extra is not None - assert "dataset_path" in result.extra - assert result.extra["dataset_path"] == "/jobs/datasets/dataset.json" - - @patch("nmp.evaluator.app.evalfactory.convert.settings") - def test_offline_job_with_fileset_ref_sets_dataset_path(self, mock_settings): - """Test that extra_params['dataset_path'] is set for FilesetRef with full path.""" - mock_settings.jobs.dataset_dir = "/jobs/datasets" - - dataset = FilesetRef(root="default/my-fileset/data.jsonl") - job = self._make_offline_job(dataset.root) - - result = _convert_config_params(job) - - assert result.extra is not None - assert "dataset_path" in result.extra - assert result.extra["dataset_path"] == "/jobs/datasets/default/my-fileset/data.jsonl" - - @patch("nmp.evaluator.app.evalfactory.convert.settings") - def test_offline_job_with_fileset_ref_directory_sets_dataset_path(self, mock_settings): - """Test that extra_params['dataset_path'] is set for FilesetRef directory.""" - mock_settings.jobs.dataset_dir = "/jobs/datasets" - - dataset = FilesetRef(root="workspace/fileset-name") - job = self._make_offline_job(dataset.root) - - result = _convert_config_params(job) - - assert result.extra is not None - assert "dataset_path" in result.extra - assert result.extra["dataset_path"] == "/jobs/datasets/workspace/fileset-name" - - @patch("nmp.evaluator.app.evalfactory.convert.settings") - def test_metric_params_included_in_extra(self, mock_settings): - """Test that metric_params are included in extra_params.""" - mock_settings.jobs.dataset_dir = "/jobs/datasets" - - dataset = DatasetRows(rows=[{"a": 1}]) - job = self._make_offline_job(dataset.model_dump()) - job.metric_params["custom_param"] = "custom_value" - - result = _convert_config_params(job) - - assert result.extra is not None - assert "custom_param" in result.extra - assert result.extra["custom_param"] == "custom_value" - assert "dataset_path" in result.extra diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_lm_eval_harness.py b/services/evaluator/tests/app/metrics/evalfactory/test_lm_eval_harness.py deleted file mode 100644 index 0a3753df50..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_lm_eval_harness.py +++ /dev/null @@ -1,129 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest import mock - -import pytest -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.lm_eval_harness import LMEvalHarnessHandler -from nmp.evaluator.app.values import SystemBenchmarkOfflineJob, SystemBenchmarkOnlineJob -from nmp.evaluator.config import EvaluatorSettings - -from .util import default_adapter_config - - -class TestLMEvalHarnessHandler: - handler = LMEvalHarnessHandler() - - def _test_job_dict(self) -> dict: - return { - "benchmark": LMEvalHarnessHandler._system_benchmarks[1], - "model": { - "url": "http://nim.test", - "name": "my/model", - }, - "benchmark_params": {"hf_token": "my-hf-secret"}, - } - - def _test_job(self, job: dict | None = None) -> SystemBenchmarkOnlineJob: - return SystemBenchmarkOnlineJob.model_validate(job or self._test_job_dict()) - - @mock.patch.dict( - os.environ, - { - "NMP_EVALUATOR_EVALFACTORY_LM_EVAL_HARNESS": "my-container", - }, - ) - def test_docker_image(self): - assert LMEvalHarnessHandler.docker_image() == "nvcr.io/nvidia/eval-factory/lm-evaluation-harness:26.01", ( - "settings is loaded before env override, expect defaults" - ) - assert EvaluatorSettings().evalfactory.lm_eval_harness == "my-container", "failed environment variable override" - - def test_supported_model_type(self): - for system_benchmark in LMEvalHarnessHandler._system_benchmarks: - assert system_benchmark.name in LMEvalHarnessHandler.SUPPORTED_MODEL_TYPE, ( - f"missing mapping for benchmark {system_benchmark.name} to supported model types." - ) - - assert len(LMEvalHarnessHandler._system_benchmarks) == len(LMEvalHarnessHandler.SUPPORTED_MODEL_TYPE), ( - "missing system benchmark definition or benchmark mapping to supported model types" - ) - - def test_system_benchmarks(self): - system_benchmarks = LMEvalHarnessHandler.system_benchmarks() - assert len(system_benchmarks) == 20 - - for system_benchmark in system_benchmarks: - assert system_benchmark.labels.get("eval_harness") == "lm_eval_harness" - assert system_benchmark.supported_job_types == ["online"], "only online is supported for LM Eval Harness" - - def test_secrets(self): - job = self._test_job() - secrets = self.handler.benchmark_job_secrets(job) - assert len(secrets) == 1, "expected required secret" - assert next(iter(secrets.values())) == SecretRef(root="my-hf-secret") - - def test_missing_req_param(self): - job = self._test_job() - del job.benchmark_params["hf_token"] - - with pytest.raises(ValueError, match="missing required parameter hf_token"): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_unsupported_job_type(self): - job = SystemBenchmarkOfflineJob.model_validate( - { - "benchmark": LMEvalHarnessHandler._system_benchmarks[1], - "dataset": { - "rows": [{"input": "test"}], - }, - "benchmark_params": {}, - } - ) - with pytest.raises( - ValueError, - match="benchmark does not support offline evaluations and a model is required. Specify a model to evaluate.", - ): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_invalid_param_type(self): - job = self._test_job() - job.benchmark_params["hf_token"] = True - with pytest.raises(ValueError, match="unexpected type for parameter hf_token"): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_unsupported_model_type(self): - job = self._test_job() - job.benchmark = LMEvalHarnessHandler._system_benchmarks[0] # gpqa (completions only) - job.benchmark_params["tokenizer"] = "meta/llama-3.2-3b-instruct" # Required for completions benchmarks - with pytest.raises( - ValueError, - match="chat detected from job.model.url but is not supported for job .*, expected \['completions'\]", - ): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_augment_benchmark_job(self): - ef_job = self.handler.augment_benchmark_job(self._test_job(), "output_dir") - expected = { - "target": { - "api_endpoint": { - "url": "http://nim.test", - "model_id": "my/model", - "type": "chat", - "adapter_config": default_adapter_config, - }, - }, - "config": { - "type": "gpqa_diamond_cot", - "params": { - "extra": { - "hf_token": "my-hf-secret", - "model_type": "chat", - }, - }, - }, - "output_dir": "output_dir", - } - assert ef_job.model_dump(mode="json", exclude_none=True) == expected diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_retriever.py b/services/evaluator/tests/app/metrics/evalfactory/test_retriever.py deleted file mode 100644 index 787c5fc8c1..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_retriever.py +++ /dev/null @@ -1,412 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from typing import Literal -from unittest import mock - -import pytest -from nemo_evaluator_sdk.values import SecretRef, SupportedJobTypes -from nmp.evaluator import constants -from nmp.evaluator.app.evalfactory.retriever import RetrieverHandler -from nmp.evaluator.app.values import MetricOfflineJob, MetricRetrieverJob -from nmp.evaluator.config import EvaluatorSettings, settings - - -class TestRetrieverHandler: - handler = RetrieverHandler() - - def _fileset_dataset(self, path: str = "fiqa") -> dict: - """Create an Fileset dataset configuration (external dataset).""" - return { - "path": path, - "storage": {"type": "huggingface", "repo_id": "BeIR/fiqa", "repo_type": "dataset"}, - } - - def _inline_dataset(self, name: str = "fiqa") -> dict: - """Create an DatasetRows dataset configuration (local/BEIR dataset).""" - # rows is required by DatasetRows schema - provide dummy row for BEIR test cases - return {"rows": [{"input": "placeholder"}]} - - def _test_job_basic(self) -> MetricRetrieverJob: - """Job for basic retriever metric (no secrets).""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-map") - return MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": {"url": "http://embedding.test", "name": "my/embedding-model"}, - }, - "dataset": self._fileset_dataset(), - "metric_params": {}, - } - ) - - def _test_job_with_secrets(self) -> MetricRetrieverJob: - """Job for retriever metric with secrets.""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-ndcg") - return MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": { - "url": "http://embedding.test", - "name": "my/embedding-model", - "api_key_secret": "embedding-api-secret", - }, - }, - "dataset": self._fileset_dataset(), - "metric_params": {}, - } - ) - - @mock.patch.dict( - os.environ, - { - "NMP_EVALUATOR_EVALFACTORY_RAG_RETRIEVER": "my-container", - }, - ) - def test_docker_image(self): - assert RetrieverHandler.docker_image() == settings.evalfactory.rag_retriever, ( - "settings is loaded before env override, expect loaded defaults" - ) - assert EvaluatorSettings().evalfactory.rag_retriever == "my-container", "failed environment variable override" - - def test_system_metrics_count(self): - # 38 total retriever metrics (18 fixed + 20 cutoff-based) - assert len(RetrieverHandler.system_metrics()) == 38 - - def test_all_metrics_are_retriever_only(self): - for metric in RetrieverHandler.system_metrics(): - assert metric.labels.get("eval_harness") == "retriever" - assert metric.supported_job_types == [SupportedJobTypes.RETRIEVER.value] - - def test_all_metrics_no_required_params(self): - """Retriever metrics don't require API keys by default.""" - for metric in RetrieverHandler._system_metrics: - assert len(metric.required_params) == 0, f"{metric.name} should not have required params" - - def test_all_metrics_have_optional_params(self): - """All retriever metrics should have common optional params.""" - for metric in RetrieverHandler._system_metrics: - param_names = [p.name for p in metric.optional_params] - assert "dataset_format" in param_names, f"{metric.name} missing dataset_format param" - assert "top_k" in param_names, f"{metric.name} missing top_k param" - - def test_secrets_no_api_keys(self): - secrets = self.handler.metric_job_secrets(self._test_job_basic()) - assert len(secrets) == 0 - - def test_secrets_with_api_keys(self): - secrets = self.handler.metric_job_secrets(self._test_job_with_secrets()) - assert secrets == { - "QUERY_API_KEY": SecretRef(root="embedding-api-secret"), - "INDEX_API_KEY": SecretRef(root="embedding-api-secret"), - } - - def test_unsupported_offline_job(self): - """Retriever metrics don't support offline job type.""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-map") - job = MetricOfflineJob.model_validate( - { - "metric": metric, - "dataset": {"rows": [{"input": "test"}]}, - "metric_params": {}, - } - ) - with pytest.raises(ValueError, match="metric does not support offline evaluations"): - self.handler.augment_metric_job(job, "output_dir") - - def test_augment_metric_job_basic_metric(self): - ef_job = self.handler.augment_metric_job(self._test_job_basic(), "output_dir") - assert ef_job.config is not None - assert ef_job.target is not None - assert ef_job.target.api_endpoint is not None - assert ef_job.config.params is not None - assert ef_job.config.params.extra is not None - - assert ef_job.config.type == "retriever" - assert ef_job.target.api_endpoint.type == "embedding" - assert ef_job.output_dir == "output_dir" - # Metric is in the tasks config - assert "map" in ef_job.config.params.extra["tasks"]["retriever"]["metrics"] - - def test_augment_metric_job_basic_metric_sets_placeholder_embedder_api_key(self): - """Embedder API key must be explicit to avoid strict NVIDIA_API_KEY env lookup.""" - ef_job = self.handler.augment_metric_job(self._test_job_basic(), "output_dir") - assert ef_job.config is not None - assert ef_job.config.params is not None - assert ef_job.config.params.extra is not None - - pipeline = ef_job.config.params.extra["pipeline"] - # api_key_name is not supported by Retriever 26.01 - assert pipeline["query_embedding_model"]["api_endpoint"]["api_key"] == constants.PLACEHOLDER_INFERENCE_API_KEY - # api_key_name is not supported by Retriever 26.01 - assert pipeline["index_embedding_model"]["api_endpoint"]["api_key"] == constants.PLACEHOLDER_INFERENCE_API_KEY - - def test_augment_metric_job_cutoff_metric(self): - """Test cutoff-based metric name conversion.""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-ndcg-cut-10") - job = MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": {"url": "http://embedding.test", "name": "my/embedding-model"}, - }, - "dataset": self._fileset_dataset(), - "metric_params": {}, - } - ) - ef_job = self.handler.augment_metric_job(job, "output_dir") - assert ef_job.config is not None - assert ef_job.config.params is not None - assert ef_job.config.params.extra is not None - - assert ef_job.config.type == "retriever" - # Metric is in the tasks config with underscore format - assert "ndcg_cut_10" in ef_job.config.params.extra["tasks"]["retriever"]["metrics"] - - def test_metric_name_conversion(self): - """Metric names use dashes which are converted to underscores during augment_metric_job.""" - # Note: Some metric names may have been mutated by previous tests that called augment_metric_job - for metric in RetrieverHandler._system_metrics: - # Names should contain either dashes or underscores (if already converted), not mixed - has_dash = "-" in metric.name - has_underscore = "_" in metric.name - # Either all dashes, all underscores, or single word (no separator) - assert not (has_dash and has_underscore), f"Metric {metric.name} has mixed separators" - - def test_fixed_metrics_exist(self): - """Verify all expected fixed metrics exist.""" - fixed_metric_names = RetrieverHandler._fixed_metrics - # Normalize names (handle both dashes and underscores due to potential mutation from augment_metric_job) - system_metric_names = [m.name.replace("_", "-") for m in RetrieverHandler._system_metrics] - for name in fixed_metric_names: - assert name in system_metric_names, f"Fixed metric {name} not found in system metrics" - - def test_cutoff_metrics_exist(self): - """Verify cutoff-based metrics exist for common cutoff values.""" - cutoff_values = [5, 10, 20, 100] - cutoff_metric_prefixes = [ - "retriever-p-", - "retriever-recall-", - "retriever-ndcg-cut-", - "retriever-map-cut-", - "retriever-success-", - ] - - # Normalize names (handle both dashes and underscores due to potential mutation from augment_metric_job) - system_metric_names = [m.name.replace("_", "-") for m in RetrieverHandler._system_metrics] - for prefix in cutoff_metric_prefixes: - for cutoff in cutoff_values: - expected_name = f"{prefix}{cutoff}" - assert expected_name in system_metric_names, f"Cutoff metric {expected_name} not found" - - def test_augment_metric_job_generates_evalfactory_config_structure(self): - """Verify the generated eval factory config matches expected structure.""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-recall-5") - job = MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": { - "url": "https://integrate.api.nvidia.com/v1", - "name": "nvidia/nv-embedqa-e5-v5", - "api_key_secret": "query_embed_secret", - }, - }, - "dataset": self._fileset_dataset("fiqa"), - "metric_params": {"top_k": 10, "dataset_format": "beir"}, - } - ) - - ef_job = self.handler.augment_metric_job(job, "/output") - assert ef_job.config is not None - - # Validate target structure - assert ef_job.target is not None - assert ef_job.target.api_endpoint is not None - assert ef_job.target.api_endpoint.type == "embedding" - - # Validate config structure - assert ef_job.config.type == "retriever" - assert ef_job.config.params is not None - assert ef_job.config.params.extra is not None - - extra = ef_job.config.params.extra - - # Validate tasks structure - assert "tasks" in extra - assert "retriever" in extra["tasks"] - task = extra["tasks"]["retriever"] - assert task["type"] == "beir" - assert "metrics" in task - assert "recall_5" in task["metrics"] - assert task["metrics"]["recall_5"]["type"] == "pytrec_eval" - - # Validate dataset in task config - Fileset uses output_dir + path - assert "dataset" in task - assert task["dataset"]["format"] == "beir" - assert task["dataset"]["path"] == f"{settings.jobs.dataset_dir}/fiqa" - - # Validate pipeline structure - assert "pipeline" in extra - pipeline = extra["pipeline"] - - # Validate query_embedding_model - assert "query_embedding_model" in pipeline - query_model = pipeline["query_embedding_model"] - assert query_model["api_endpoint"]["url"] == "https://integrate.api.nvidia.com/v1" - assert query_model["api_endpoint"]["model_id"] == "nvidia/nv-embedqa-e5-v5" - # api_key_name is not supported by Retriever 26.01 - assert query_model["api_endpoint"]["api_key"] == "$QUERY_API_KEY" - - # Validate index_embedding_model - assert "index_embedding_model" in pipeline - index_model = pipeline["index_embedding_model"] - assert index_model["api_endpoint"]["url"] == "https://integrate.api.nvidia.com/v1" - assert index_model["api_endpoint"]["model_id"] == "nvidia/nv-embedqa-e5-v5" - # api_key_name is not supported by Retriever 26.01 - assert index_model["api_endpoint"]["api_key"] == "$INDEX_API_KEY" - - # Validate reranker_model is not present - assert "reranker_model" not in pipeline or pipeline.get("reranker_model") is None - - # Validate top_k - assert pipeline["top_k"] == 10 - - # Validate pipeline params (milvus config, yaml files) - assert "params" in pipeline - params = pipeline["params"] - assert "milvus_collection_name" in params - assert "index_pipeline_yaml_file" in params - assert "query_pipeline_yaml_file" in params - assert "component_inputs_template" in params - # Dense only yaml files should be used - assert "dense_only" in params["index_pipeline_yaml_file"] - assert "dense_only" in params["query_pipeline_yaml_file"] - assert "ranker" not in params["component_inputs_template"] - - def test_augment_metric_job_without_reranker(self): - """Verify config structure without reranker uses dense_only yaml files.""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-map") - job = MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": { - "url": "https://integrate.api.nvidia.com/v1", - "name": "nvidia/nv-embedqa-e5-v5", - }, - }, - "dataset": self._fileset_dataset("fiqa"), - "metric_params": {"top_k": 5}, - } - ) - - ef_job = self.handler.augment_metric_job(job, "/output") - assert ef_job.config is not None - assert ef_job.config.params is not None - assert ef_job.config.params.extra is not None - extra = ef_job.config.params.extra - pipeline = extra["pipeline"] - - # No reranker_model in pipeline - assert "reranker_model" not in pipeline or pipeline.get("reranker_model") is None - - # Dense only yaml files should be used - assert "dense_only" in pipeline["params"]["index_pipeline_yaml_file"] - assert "dense_only" in pipeline["params"]["query_pipeline_yaml_file"] - assert "ranker" not in pipeline["params"]["component_inputs_template"] - - # top_k from metric_params - assert pipeline["top_k"] == 5 - - def test_builtin_dataset_invalid_rejected_by_type_system(self): - """Verify that invalid BuiltInDataset identifiers are rejected by Pydantic validation.""" - from nmp.evaluator.app.values import BuiltInDataset - from pydantic import ValidationError - - # Invalid dataset ID should be rejected by Pydantic's Literal validation - with pytest.raises(ValidationError): - BuiltInDataset(root="invalid-dataset-name") # ty: ignore[invalid-argument-type] - - def test_builtin_dataset_all_known_datasets(self): - """Verify that all known BEIR academic datasets work with BuiltInDataset.""" - from nmp.evaluator.app.values import BuiltInDataset - - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-map") - - # Test a few representative BEIR datasets using BuiltInDataset - test_datasets: list[Literal["beir/fiqa", "beir/nfcorpus", "beir/msmarco", "beir/hotpotqa"]] = [ - "beir/fiqa", - "beir/nfcorpus", - "beir/msmarco", - "beir/hotpotqa", - ] - for dataset_id in test_datasets: - builtin_dataset = BuiltInDataset(root=dataset_id) - job = MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": {"url": "http://embedding.test", "name": "my/embedding-model"}, - }, - "dataset": builtin_dataset, - "metric_params": {"dataset_format": "beir"}, - } - ) - - ef_job = self.handler.augment_metric_job(job, "/output") - assert ef_job.config is not None - assert ef_job.config.params is not None - assert ef_job.config.params.extra is not None - task = ef_job.config.params.extra["tasks"]["retriever"] - # BuiltInDataset uses name directly (e.g., "fiqa" from "beir/fiqa") - assert task["dataset"]["path"] == builtin_dataset.name - assert task["dataset"]["format"] == "beir" - - def test_inline_dataset_uses_output_dir_json(self): - """Verify that DatasetRows outputs to output_dir/dataset.json.""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-map") - job = MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": {"url": "http://embedding.test", "name": "my/embedding-model"}, - }, - "dataset": self._inline_dataset("custom-dataset"), - "metric_params": {"dataset_format": "custom"}, - } - ) - - ef_job = self.handler.augment_metric_job(job, "/output") - assert ef_job.config is not None - assert ef_job.config.params is not None - assert ef_job.config.params.extra is not None - task = ef_job.config.params.extra["tasks"]["retriever"] - # DatasetRows is written to output_dir/dataset.json - assert task["dataset"]["path"] == f"{settings.jobs.dataset_dir}/dataset.json" - assert task["dataset"]["format"] == "custom" - - def test_fileset_dataset_uses_output_dir(self): - """Verify that Fileset datasets use output_dir + path.""" - metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-map") - job = MetricRetrieverJob.model_validate( - { - "metric": metric, - "retriever_pipeline": { - "embeddings_model": {"url": "http://embedding.test", "name": "my/embedding-model"}, - }, - "dataset": self._fileset_dataset("my-external-dataset"), - "metric_params": {"dataset_format": "beir"}, - } - ) - - ef_job = self.handler.augment_metric_job(job, "/output") - assert ef_job.config is not None - assert ef_job.config.params is not None - assert ef_job.config.params.extra is not None - task = ef_job.config.params.extra["tasks"]["retriever"] - assert task["dataset"]["path"] == f"{settings.jobs.dataset_dir}/my-external-dataset" # JOB_DATASET_DIR + path - assert task["dataset"]["format"] == "beir" diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_safety_harness.py b/services/evaluator/tests/app/metrics/evalfactory/test_safety_harness.py deleted file mode 100644 index a9d2f4707e..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_safety_harness.py +++ /dev/null @@ -1,142 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest import mock - -import pytest -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.safety_harness import ( - SafetyHarnessHandler, -) -from nmp.evaluator.app.values import SystemBenchmarkOfflineJob, SystemBenchmarkOnlineJob -from nmp.evaluator.config import EvaluatorSettings - -from .util import default_adapter_config - - -class TestSafetyHarnessHandler: - handler = SafetyHarnessHandler() - - def _test_job_dict(self) -> dict: - return { - "benchmark": SafetyHarnessHandler._system_benchmarks[0], - "model": { - "url": "http://nim.test", - "name": "my/model", - }, - "benchmark_params": { - "hf_token": "my-hf-secret", - "judge": { - "model": { - "name": "my/judge", - "url": "http://nim.test/v1/completions", - "api_key_secret": "my-judge-secret", - } - }, - }, - } - - def _test_job(self, job: dict | None = None) -> SystemBenchmarkOnlineJob: - return SystemBenchmarkOnlineJob.model_validate(job or self._test_job_dict()) - - @mock.patch.dict( - os.environ, - { - "NMP_EVALUATOR_EVALFACTORY_SAFETY_HARNESS": "my-container", - }, - ) - def test_docker_image(self): - assert SafetyHarnessHandler.docker_image() == "nvcr.io/nvidia/eval-factory/safety-harness:26.01", ( - "settings is loaded before env override, expect defaults" - ) - assert EvaluatorSettings().evalfactory.safety_harness == "my-container", "failed environment variable override" - - def test_system_benchmarks(self): - system_benchmarks = SafetyHarnessHandler.system_benchmarks() - assert len(system_benchmarks) == 2 - - for system_benchmark in system_benchmarks: - assert system_benchmark.labels.get("eval_harness") == "safety_harness" - assert system_benchmark.supported_job_types == ["online"], "only online is supported for LM Eval Harness" - assert len(system_benchmark.required_params) == 2 - for param in system_benchmark.required_params: - if param.name == "judge": - assert param.schema_ is not None, "expected schema for judge parameter" - assert '"schema":' in param.model_dump_json(by_alias=True), ( - "expected schema to serialize for judge parameter" - ) - - def test_secrets(self): - job = self._test_job() - secrets = self.handler.benchmark_job_secrets(job) - assert len(secrets) == 2, "expected required secret and judge" - assert next(iter(secrets.values())) == SecretRef(root="my-hf-secret") - - def test_missing_req_param(self): - job = self._test_job() - del job.benchmark_params["hf_token"] - - with pytest.raises(ValueError, match="missing required parameter hf_token"): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_unsupported_job_type(self): - job = SystemBenchmarkOfflineJob.model_validate( - { - "benchmark": SafetyHarnessHandler._system_benchmarks[1], - "dataset": { - "rows": [{"input": "test"}], - }, - "benchmark_params": {}, - } - ) - with pytest.raises( - ValueError, - match="benchmark does not support offline evaluations and a model is required. Specify a model to evaluate.", - ): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_invalid_param_type(self): - job = self._test_job() - job.benchmark_params["hf_token"] = True - with pytest.raises(ValueError, match="unexpected type for parameter hf_token"): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_unsupported_judge_url(self): - job = self._test_job() - job.benchmark_params["judge"]["model"]["url"] = "http://nim.test/v1/chat/completions" - with pytest.raises( - ValueError, - match="job.benchmark_params.judge.model.url must end in '/v1/completions' for safety judge", - ): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_augment_job(self): - ef_job = self.handler.augment_benchmark_job(self._test_job(), "output_dir") - expected = { - "target": { - "api_endpoint": { - "url": "http://nim.test", - "model_id": "my/model", - "type": "chat", - "adapter_config": default_adapter_config, - }, - }, - "config": { - "type": "aegis_v2", - "params": { - "extra": { - "hf_token": "my-hf-secret", - "judge": { - # api_key is the env var name (Jinja template adds $ prefix) - "api_key": "judge_api_key_secret", - "api_key_name": "judge_api_key_secret", - "model_id": "my/judge", - "url": "http://nim.test/v1/completions", - }, - }, - }, - }, - "output_dir": "output_dir", - } - assert ef_job.model_dump(mode="json", exclude_none=True) == expected diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_simple_evals.py b/services/evaluator/tests/app/metrics/evalfactory/test_simple_evals.py deleted file mode 100644 index 6ed9288f55..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_simple_evals.py +++ /dev/null @@ -1,155 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest import mock - -import nmp.evaluator.entities as entities -import pytest -from nemo_evaluator_sdk.values import SecretRef -from nmp.evaluator.app.evalfactory.simple_evals import ( - SimpleEvalsHandler, -) -from nmp.evaluator.app.values import SystemBenchmarkOfflineJob, SystemBenchmarkOnlineJob -from nmp.evaluator.config import EvaluatorSettings - -from .util import default_adapter_config - - -class TestSimpleEvalsHandler: - handler = SimpleEvalsHandler() - - def _test_job_dict(self, benchmark: entities.SystemBenchmark | None = None) -> dict: - return { - "benchmark": benchmark or SimpleEvalsHandler._system_benchmarks[0], - "model": { - "url": "http://nim.test", - "name": "my/model", - }, - "benchmark_params": { - "hf_token": "my-hf-secret", - "judge": { - "model": { - "name": "my/judge", - "url": "http://nim.test/v1/completions", - "api_key_secret": "my-judge-secret", - } - }, - }, - } - - def _test_job( - self, job: dict | None = None, benchmark: entities.SystemBenchmark | None = None - ) -> SystemBenchmarkOnlineJob: - return SystemBenchmarkOnlineJob.model_validate(job or self._test_job_dict(benchmark)) - - @mock.patch.dict( - os.environ, - { - "NMP_EVALUATOR_EVALFACTORY_SIMPLE_EVALS": "my-container", - }, - ) - def test_docker_image(self): - assert SimpleEvalsHandler.docker_image() == "nvcr.io/nvidia/eval-factory/simple-evals:26.01", ( - "settings is loaded before env override, expect defaults" - ) - assert EvaluatorSettings().evalfactory.simple_evals == "my-container", "failed environment variable override" - - def test_supported_model_type(self): - for system_benchmark in SimpleEvalsHandler._system_benchmarks: - assert system_benchmark.name in SimpleEvalsHandler.SUPPORTED_MODEL_TYPE, ( - f"missing mapping for benchmark {system_benchmark.name} to supported model types." - ) - - assert len(SimpleEvalsHandler._system_benchmarks) == len(SimpleEvalsHandler.SUPPORTED_MODEL_TYPE), ( - "missing system benchmark definition or benchmark mapping to supported model types" - ) - - def test_system_benchmarks(self): - system_benchmarks = SimpleEvalsHandler.system_benchmarks() - assert len(system_benchmarks) == 54 - - for system_benchmark in system_benchmarks: - assert system_benchmark.labels.get("eval_harness") == "simple_evals" - assert system_benchmark.supported_job_types == ["online"], "only online is supported for LM Eval Harness" - - def test_secrets(self): - job = self._test_job() - secrets = self.handler.benchmark_job_secrets(job) - assert len(secrets) == 2, "expected optional secret and judge" - assert next(iter(secrets.values())) == SecretRef(root="my-hf-secret") - - del job.benchmark_params["hf_token"] - del job.benchmark_params["judge"]["model"]["api_key_secret"] - secrets = self.handler.benchmark_job_secrets(job) - assert len(secrets) == 0, "no secrets expected" - - def test_missing_req_param(self): - job = self._test_job() - del job.benchmark_params["judge"] - - with pytest.raises(ValueError, match="missing required parameter judge"): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_unsupported_job_type(self): - job = SystemBenchmarkOfflineJob.model_validate( - { - "benchmark": SimpleEvalsHandler._system_benchmarks[1], - "dataset": { - "rows": [{"input": "test"}], - }, - "benchmark_params": {}, - } - ) - with pytest.raises( - ValueError, - match="benchmark does not support offline evaluations and a model is required. Specify a model to evaluate.", - ): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_invalid_param_type(self): - job = self._test_job() - job.benchmark_params["hf_token"] = True - with pytest.raises(ValueError, match="unexpected type for parameter hf_token"): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_unsupported_model_type(self): - job = self._test_job() - job.model.url = "http://nim.test/v1/completions" - with pytest.raises( - ValueError, - match="completions detected from job.model.url but is not supported for job .*, expected \['chat'\]", - ): - self.handler.augment_benchmark_job(job, "output_dir") - - def test_augment_benchmark_job(self): - ef_job = self.handler.augment_benchmark_job(self._test_job(), "output_dir") - expected = { - "target": { - "api_endpoint": { - "url": "http://nim.test", - "model_id": "my/model", - "type": "chat", - "adapter_config": default_adapter_config, - } - }, - "config": { - "type": "AA_AIME_2024", - "params": { - "extra": { - "hf_token": "my-hf-secret", - "judge": { - # api_key is the env var name (Jinja template adds $ prefix) - "api_key": "judge_api_key_secret", - "api_key_name": "judge_api_key_secret", - "model_id": "my/judge", - "url": "http://nim.test/v1/completions", - "backend": "generic", - }, - "model_type": "chat", - }, - }, - }, - "output_dir": "output_dir", - } - assert ef_job.model_dump(mode="json", exclude_none=True) == expected diff --git a/services/evaluator/tests/app/metrics/evalfactory/test_system.py b/services/evaluator/tests/app/metrics/evalfactory/test_system.py deleted file mode 100644 index 332bfbde7e..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/test_system.py +++ /dev/null @@ -1,67 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import pytest -from nmp.evaluator.app.evalfactory.retriever import RetrieverHandler -from nmp.evaluator.app.evalfactory.system import ( - AgenticEvalHandler, - BigCodeEvaluationHarnessHandler, - SafetyHarnessHandler, - SystemMetricsHandler, - get_system_benchmark_handler, - get_system_metric, - get_system_metric_handler, -) -from nmp.evaluator.app.values import SystemMetric - - -@pytest.mark.parametrize( - "metric_name,expected", - [ - ("trajectory-evaluation", AgenticEvalHandler._system_metrics[0]), - ("retriever-map", RetrieverHandler._system_metrics[0]), - ], -) -def test_get_system_metric(metric_name: str, expected: SystemMetric): - metric = get_system_metric(metric_name) - assert metric.name == metric_name - assert metric == expected - - -def test_get_system_metric_not_found(): - with pytest.raises(ValueError, match="Unknown system metric"): - get_system_metric("dne") - - -@pytest.mark.parametrize( - "metric_name,expected", - [ - ("trajectory-evaluation", AgenticEvalHandler), - ("retriever-map", RetrieverHandler), - ], -) -def test_get_system_metric_handler(metric_name: str, expected: type[SystemMetricsHandler]): - handler = get_system_metric_handler(metric_name) - assert isinstance(handler, expected) - - -def test_get_system_metric_handler_not_found(): - with pytest.raises(ValueError, match="Unknown system metric"): - get_system_metric_handler("bfclv3-simple") - - -@pytest.mark.parametrize( - "metric_name,expected", - [ - ("humaneval", BigCodeEvaluationHarnessHandler), - ("aegis-v2", SafetyHarnessHandler), - ], -) -def test_get_system_benchmark_handler(metric_name: str, expected: type[SystemMetricsHandler]): - handler = get_system_benchmark_handler(metric_name) - assert isinstance(handler, expected) - - -def test_get_system_benchmark_handler_not_found(): - with pytest.raises(ValueError, match="Unknown system benchmark"): - get_system_benchmark_handler("dne") diff --git a/services/evaluator/tests/app/metrics/evalfactory/util.py b/services/evaluator/tests/app/metrics/evalfactory/util.py deleted file mode 100644 index 3e47850bf9..0000000000 --- a/services/evaluator/tests/app/metrics/evalfactory/util.py +++ /dev/null @@ -1,48 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -default_adapter_config = { - "interceptors": [ - { - "name": "request_logging", - "enabled": True, - "config": {"output_dir": "output_dir", "log_failed_requests": True}, - }, - { - "name": "caching", - "enabled": True, - "config": { - "cache_dir": "output_dir", - "reuse_cached_responses": True, - "save_requests": True, - "save_responses": True, - }, - }, - {"name": "endpoint", "enabled": True, "config": {}}, - {"name": "response_logging", "enabled": True, "config": {"output_dir": "output_dir"}}, - {"name": "raise_client_errors", "enabled": True, "config": {}}, - { - "name": "progress_tracking", - "enabled": True, - "config": { - "progress_tracking_interval": 50, - "progress_tracking_interval_seconds": 60, - "progress_tracking_url": "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - "request_method": "PATCH", - }, - }, - ], - "post_eval_hooks": [ - {"name": "post_eval_report", "enabled": True, "config": {"report_types": ["json"]}}, - { - "name": "progress_tracking", - "enabled": True, - "config": { - "progress_tracking_interval": 50, - "progress_tracking_interval_seconds": 60, - "progress_tracking_url": "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - "request_method": "PATCH", - }, - }, - ], -} diff --git a/services/evaluator/tests/app/metrics/test_metric.py b/services/evaluator/tests/app/metrics/test_metric.py deleted file mode 100644 index 26f4391fcb..0000000000 --- a/services/evaluator/tests/app/metrics/test_metric.py +++ /dev/null @@ -1,250 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import math -from typing import cast - -import nmp.evaluator.entities as entities -import pytest -from nemo_evaluator_sdk.metrics.aggregation import aggregate_metrics -from nemo_evaluator_sdk.metrics.bleu import BLEUMetric -from nemo_evaluator_sdk.metrics.exact_match import ExactMatchMetric -from nemo_evaluator_sdk.metrics.f1 import F1Metric -from nemo_evaluator_sdk.metrics.rouge import ROUGEMetric -from nemo_evaluator_sdk.metrics.string_check import StringCheckMetric -from nemo_evaluator_sdk.metrics.tool_calling import ToolCallingMetric -from nemo_evaluator_sdk.values import ( - AggregateRangeScore, - MetricOutput, - MetricOutputSpec, - MetricResult, -) -from nmp.evaluator.app.metrics.metric import new_metric -from nmp.evaluator.app.values.metrics import Metric as MetricParams - - -def _metric_result(name: str, value: float | int | bool) -> MetricResult: - return MetricResult(outputs=[MetricOutput(name=name, value=value)]) - - -def _output_specs(*names: str) -> list[MetricOutputSpec]: - return [MetricOutputSpec.continuous_score(name) for name in names] - - -async def _new_metric(params: object): - return await new_metric(cast(MetricParams, params)) - - -def test_aggregate_metrics(): - """Test basic aggregation computes all statistics correctly.""" - metric_results = [ - _metric_result("my-score", 0), - _metric_result("my-score", 2), - _metric_result("my-score", 5), - _metric_result("my-score", 15), - ] - # Expected: sum=22, mean=5.5, min=0, max=15, variance=33.25, stddev=5.766... - results = aggregate_metrics(metric_results, _output_specs("my-score")) - - assert len(results.scores) == 1 - score = results.scores[0] - assert isinstance(score, AggregateRangeScore) - assert score.name == "my-score" - assert score.mean == 5.5 - assert score.count == 4 - assert score.sum == 22.0 - assert score.min == 0.0 - assert score.max == 15.0 - assert score.variance is not None - assert score.std_dev is not None - assert math.isclose(score.variance, 33.25) # population variance - assert math.isclose(score.std_dev, 5.766281297335398) - assert score.nan_count == 0 - - -def test_aggregate_metrics_nan(): - """Test that NaN values are excluded from statistics but counted.""" - metric_results = [ - _metric_result("my-score", 0), - _metric_result("my-score", float("nan")), - _metric_result("my-score", 2), - _metric_result("my-score", 5), - _metric_result("my-score", float("nan")), - _metric_result("my-score", 15), - ] - results = aggregate_metrics(metric_results, _output_specs("my-score")) - - assert len(results.scores) == 1 - score = results.scores[0] - assert isinstance(score, AggregateRangeScore) - assert score.name == "my-score" - assert score.mean == 5.5 - assert score.count == 4 # NaN values excluded from count - assert score.nan_count == 2 # But tracked separately - assert score.sum == 22.0 - assert score.min == 0.0 - assert score.max == 15.0 - - -def test_aggregate_metrics_all_nan_returns_null_aggregates(): - metric_results = [ - _metric_result("my-score", float("nan")), - _metric_result("my-score", float("nan")), - ] - - results = aggregate_metrics(metric_results, _output_specs("my-score")) - - assert len(results.scores) == 1 - score = results.scores[0] - assert isinstance(score, AggregateRangeScore) - assert score.name == "my-score" - assert score.count == 0 - assert score.nan_count == 2 - assert score.sum is None - assert score.mean is None - assert score.min is None - assert score.max is None - assert score.variance is None - assert score.std_dev is None - assert score.percentiles is None - - -def test_aggregate_metrics_returns_distribution(): - """Test that aggregate_metrics returns percentiles and histogram for range scores.""" - metric_results = [_metric_result("my-score", i) for i in range(10)] # values 0-9 - - result = aggregate_metrics(metric_results, _output_specs("my-score")) - - assert len(result.scores) == 1 - agg_score = result.scores[0] - assert isinstance(agg_score, AggregateRangeScore) - assert agg_score.name == "my-score" - assert agg_score.count == 10 - assert agg_score.mean == 4.5 # (0+1+...+9)/10 = 45/10 = 4.5 - assert agg_score.min == 0.0 - assert agg_score.max == 9.0 - - # Check percentiles (approximate for 10 values) - assert agg_score.percentiles is not None - assert agg_score.percentiles.p50 == 4.5 # median - assert agg_score.percentiles.p100 == 9.0 # max - - # Check histogram has bins - assert agg_score.histogram is not None - assert len(agg_score.histogram.bins) == 10 # default 10 bins - - -class TestNewMetricBLEU: - """Tests for new_metric factory function with BLEU.""" - - @pytest.mark.asyncio - async def test_new_metric_creates_bleu_metric(self): - """Test that new_metric creates BLEUMetric from config.""" - params = entities.BLEUMetric( - name="test-bleu-metric", - workspace="default", - references=["{{item.reference}}"], - ) - - metric = await _new_metric(params) - - assert isinstance(metric, BLEUMetric) - assert metric.references == ["{{item.reference}}"] - assert metric.type.value == "bleu" - - -class TestNewMetricExactMatch: - """Tests for new_metric factory function with ExactMatch.""" - - @pytest.mark.asyncio - async def test_new_metric_creates_exact_match_metric(self): - """Test that new_metric creates ExactMatchMetric from config.""" - params = entities.ExactMatchMetric( - name="test-exact-match-metric", - workspace="default", - reference="{{item.reference}}", - ) - - metric = await _new_metric(params) - - assert isinstance(metric, ExactMatchMetric) - assert metric.reference == "{{item.reference}}" - assert metric.type.value == "exact-match" - - -class TestNewMetricF1: - """Tests for new_metric factory function with F1.""" - - @pytest.mark.asyncio - async def test_new_metric_creates_f1_metric(self): - """Test that new_metric creates F1Metric from config.""" - params = entities.F1Metric( - name="test-f1-metric", - workspace="default", - reference="{{item.reference}}", - ) - - metric = await _new_metric(params) - - assert isinstance(metric, F1Metric) - assert metric.reference == "{{item.reference}}" - assert metric.type.value == "f1" - - -class TestNewMetricROUGE: - """Tests for new_metric factory function with ROUGE.""" - - @pytest.mark.asyncio - async def test_new_metric_creates_rouge_metric(self): - """Test that new_metric creates ROUGEMetric from config.""" - params = entities.ROUGEMetric( - name="test-rouge-metric", - workspace="default", - reference="{{item.reference}}", - ) - - metric = await _new_metric(params) - - assert isinstance(metric, ROUGEMetric) - assert metric.reference == "{{item.reference}}" - assert metric.type.value == "rouge" - - -class TestNewMetricStringCheck: - """Tests for new_metric factory function with StringCheck.""" - - @pytest.mark.asyncio - async def test_new_metric_creates_string_check_metric(self): - """Test that new_metric creates StringCheckMetric from config.""" - params = entities.StringCheckMetric( - name="test-string-check-metric", - workspace="default", - operation="equals", - left_template="{{item.expected}}", - right_template="{{sample.output_text}}", - ) - - metric = await _new_metric(params) - - assert isinstance(metric, StringCheckMetric) - assert metric.operation == "equals" - assert metric.type.value == "string-check" - - -class TestNewMetricToolCalling: - """Tests for new_metric factory function with ToolCalling.""" - - @pytest.mark.asyncio - async def test_new_metric_creates_tool_calling_metric(self): - """Test that new_metric creates ToolCallingMetric from config.""" - params = entities.ToolCallingMetric( - name="test-tool-calling-metric", - workspace="default", - reference="{{item.expected_tool_calls}}", - ) - - metric = await _new_metric(params) - - assert isinstance(metric, ToolCallingMetric) - assert metric.reference == "{{item.expected_tool_calls}}" - assert metric.type.value == "tool-calling" diff --git a/services/evaluator/tests/app/metrics/test_metric_factory.py b/services/evaluator/tests/app/metrics/test_metric_factory.py deleted file mode 100644 index 7b5203fec4..0000000000 --- a/services/evaluator/tests/app/metrics/test_metric_factory.py +++ /dev/null @@ -1,87 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from types import SimpleNamespace - -import pytest -from nemo_evaluator_sdk.metrics.llm_judge import ( - JSONScoreParser, - LLMJudgeMetric, - Model, - ModelFormat, - RangeScore, - SupportedJobTypes, - default_judge_prompt_template_chat, -) -from nmp.evaluator.app.metrics.metric import metric_runtime_kwargs, new_metric -from pytest_mock import MockerFixture - - -def _judge_metric_config() -> LLMJudgeMetric: - return LLMJudgeMetric( - model=Model(url="https://judge.example.test/v1/chat/completions", name="judge", format=ModelFormat.OPEN_AI), - scores=[RangeScore(name="quality", minimum=1, maximum=5, parser=JSONScoreParser(json_path="quality"))], - ) - - -class TestMetricRuntimeKwargs: - def test_llm_judge_omits_unset_prompt_template(self): - params = _judge_metric_config() - - kwargs = metric_runtime_kwargs(params, LLMJudgeMetric) - - assert "prompt_template" not in kwargs - - def test_llm_judge_preserves_explicit_default_shaped_prompt_template(self): - params = LLMJudgeMetric( - model=Model(url="https://judge.example.test/v1/chat/completions", name="judge", format=ModelFormat.OPEN_AI), - scores=[RangeScore(name="quality", minimum=1, maximum=5, parser=JSONScoreParser(json_path="quality"))], - prompt_template=default_judge_prompt_template_chat(), - ) - - kwargs = metric_runtime_kwargs(params, LLMJudgeMetric) - - assert kwargs["prompt_template"] == default_judge_prompt_template_chat() - - -class TestNewMetric: - @pytest.mark.asyncio - async def test_raises_for_unknown_metric_type(self): - with pytest.raises(ValueError, match="Unknown metric type"): - await new_metric(SimpleNamespace(type="unknown")) - - @pytest.mark.asyncio - async def test_passes_job_type_to_direct_runtime_metrics(self): - params = _judge_metric_config() - metric = await new_metric(params, job_type=SupportedJobTypes.OFFLINE) - - assert metric.model == params.model - assert metric.scores == params.scores - assert metric.job_type == SupportedJobTypes.OFFLINE - - @pytest.mark.asyncio - async def test_sets_inference_fn_when_metric_supports_inference(self): - async def fake_inference(*_args, **_kwargs): - raise AssertionError("This test should only verify dependency injection") - - metric = await new_metric(_judge_metric_config(), inference_fn=fake_inference) - assert metric.inference_fn is fake_inference - - @pytest.mark.asyncio - async def test_attaches_platform_headers_to_llm_judge_model(self, mocker: MockerFixture): - mocker.patch( - "nmp.evaluator.app.metrics.metric.app_inference.get_platform_headers", - return_value={"X-NMP-Principal-Id": "service:evaluator"}, - ) - - metric = await new_metric(_judge_metric_config()) - - assert metric.model.default_headers == {"X-NMP-Principal-Id": "service:evaluator"} - - @pytest.mark.asyncio - async def test_runs_preflight_when_requested(self, mocker: MockerFixture): - preflight = mocker.patch.object(LLMJudgeMetric, "preflight", new_callable=mocker.AsyncMock) - - await new_metric(_judge_metric_config(), run_preflight=True) - - preflight.assert_awaited_once() diff --git a/services/evaluator/tests/app/metrics/test_ragas.py b/services/evaluator/tests/app/metrics/test_ragas.py deleted file mode 100644 index 83e1d48e72..0000000000 --- a/services/evaluator/tests/app/metrics/test_ragas.py +++ /dev/null @@ -1,122 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import pytest -from nemo_evaluator_sdk.enums import MetricType -from nemo_evaluator_sdk.metrics.ragas import ( - AgentGoalAccuracyMetric, - AnswerAccuracyMetric, - ContextEntityRecallMetric, - ContextPrecisionMetric, - ContextRecallMetric, - ContextRelevanceMetric, - FaithfulnessMetric, - NoiseSensitivityMetric, - ResponseGroundednessMetric, - ResponseRelevancyMetric, - ToolCallAccuracyMetric, - TopicAdherenceMetric, -) -from nemo_evaluator_sdk.values import Model -from nmp.evaluator.app.metrics.metric import new_metric - -MOCK_JUDGE_MODEL = Model( - name="gpt-4", - url="https://api.openai.com/v1", -) - -MOCK_EMBEDDINGS_MODEL = Model( - name="text-embedding-ada-002", - url="https://api.openai.com/v1/embeddings", -) - - -@pytest.mark.parametrize( - "metric_class,expected_type,extra_params", - [ - ( - TopicAdherenceMetric, - MetricType.TOPIC_ADHERENCE, - {"metric_mode": "f1", "judge_model": MOCK_JUDGE_MODEL}, - ), - ( - ToolCallAccuracyMetric, - MetricType.TOOL_CALL_ACCURACY, - {}, - ), - ( - AgentGoalAccuracyMetric, - MetricType.AGENT_GOAL_ACCURACY, - {"use_reference": True, "judge_model": MOCK_JUDGE_MODEL}, - ), - ( - AnswerAccuracyMetric, - MetricType.ANSWER_ACCURACY, - {"judge_model": MOCK_JUDGE_MODEL}, - ), - ( - ContextRecallMetric, - MetricType.CONTEXT_RECALL, - {"judge_model": MOCK_JUDGE_MODEL}, - ), - ( - ContextPrecisionMetric, - MetricType.CONTEXT_PRECISION, - {"judge_model": MOCK_JUDGE_MODEL}, - ), - ( - ContextRelevanceMetric, - MetricType.CONTEXT_RELEVANCE, - {"judge_model": MOCK_JUDGE_MODEL}, - ), - ( - ContextEntityRecallMetric, - MetricType.CONTEXT_ENTITY_RECALL, - {"judge_model": MOCK_JUDGE_MODEL}, - ), - ( - ResponseGroundednessMetric, - MetricType.RESPONSE_GROUNDEDNESS, - {"judge_model": MOCK_JUDGE_MODEL}, - ), - ( - ResponseRelevancyMetric, - MetricType.RESPONSE_RELEVANCY, - {"strictness": 1, "judge_model": MOCK_JUDGE_MODEL, "embeddings_model": MOCK_EMBEDDINGS_MODEL}, - ), - ( - FaithfulnessMetric, - MetricType.FAITHFULNESS, - {"judge_model": MOCK_JUDGE_MODEL}, - ), - ( - NoiseSensitivityMetric, - MetricType.NOISE_SENSITIVITY, - {"judge_model": MOCK_JUDGE_MODEL}, - ), - ], -) -@pytest.mark.asyncio -async def test_new_metric_factory_all_ragas_metrics(metric_class, expected_type, extra_params): - """Test that new_metric factory works for all RAGAS metric types.""" - # Create metric via factory - metric = await new_metric(metric_class(**extra_params)) - - # Verify type and instance - assert isinstance(metric, metric_class) - assert metric.type == expected_type - - -@pytest.mark.asyncio -async def test_new_metric_factory_invalid_type(): - """Test that new_metric raises error for unknown metric types.""" - from unittest.mock import MagicMock - - from nmp.evaluator.app.metrics.metric import new_metric - - # Create a mock config with an unknown metric type - params = MagicMock() - params.type = "unknown_metric_type" - - with pytest.raises(ValueError, match="Unknown metric type"): - await new_metric(params) diff --git a/services/evaluator/tests/app/tasks/test_termination.py b/services/evaluator/tests/app/tasks/test_termination.py deleted file mode 100644 index dcde026a61..0000000000 --- a/services/evaluator/tests/app/tasks/test_termination.py +++ /dev/null @@ -1,44 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import signal -import threading - -import pytest -from nmp.evaluator.app.tasks import termination -from nmp.evaluator.app.tasks.termination import register_task_signal_handlers -from pytest_mock import MockerFixture - - -class TestRegisterTaskSignalHandlers: - def test_registers_handlers_on_main_thread(self, mocker: MockerFixture): - log = mocker.Mock() - mocker.patch.object(termination, "log", log) - signal_register = mocker.patch("nmp.evaluator.app.tasks.termination.signal.signal") - - register_task_signal_handlers() - - assert signal_register.call_count == 2 - assert signal_register.call_args_list[0].args[0] == signal.SIGTERM - assert signal_register.call_args_list[1].args[0] == signal.SIGINT - - handler = signal_register.call_args_list[0].args[1] - with pytest.raises(KeyboardInterrupt): - handler(signal.SIGTERM, None) - - log.info.assert_called_once_with("Received %s. Exiting task gracefully.", "SIGTERM") - - def test_skips_registration_outside_main_thread(self, mocker: MockerFixture): - log = mocker.Mock() - mocker.patch.object(termination, "log", log) - signal_register = mocker.patch("nmp.evaluator.app.tasks.termination.signal.signal") - - non_main_thread = mocker.Mock(spec=threading.Thread) - main_thread = mocker.Mock(spec=threading.Thread) - mocker.patch("nmp.evaluator.app.tasks.termination.threading.current_thread", return_value=non_main_thread) - mocker.patch("nmp.evaluator.app.tasks.termination.threading.main_thread", return_value=main_thread) - - register_task_signal_handlers() - - signal_register.assert_not_called() - log.debug.assert_called_once_with("Skipping signal handler registration outside main thread") diff --git a/services/evaluator/tests/app/test_agent_jobs.py b/services/evaluator/tests/app/test_agent_jobs.py deleted file mode 100644 index 20f4a173f2..0000000000 --- a/services/evaluator/tests/app/test_agent_jobs.py +++ /dev/null @@ -1,296 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Unit tests for Agent integration with metric and benchmark online jobs. - -Covers: -- MetricOnlineJob accepts model or agent (mutually exclusive) -- MetricOnlineAgentJob accepts agent only (dedicated agent job type) -- BenchmarkOnlineJob accepts model or agent (mutually exclusive) -- BenchmarkOnlineAgentJob accepts agent only (dedicated agent job type) -- SystemBenchmarkOnlineJob accepts model or agent (mutually exclusive) -- Discriminator routing to the correct job type -""" - -import pytest -from nemo_evaluator_sdk.enums import AgentFormat -from nmp.evaluator.app.values import ( - BenchmarkJobAdapter, - BenchmarkOfflineJob, - BenchmarkOnlineAgentJob, - BenchmarkOnlineJob, - MetricJobAdapter, - MetricOfflineJob, - MetricOnlineAgentJob, - MetricOnlineJob, - SystemBenchmarkOnlineJob, -) -from pydantic import ValidationError - -# --------------------------------------------------------------------------- -# Helpers: minimal valid dicts for reuse -# --------------------------------------------------------------------------- - -_GENERIC_AGENT = { - "url": "http://agent.test/invoke", - "name": "test-agent", - "format": "generic", - "body": {"query": "{{ prompt }}"}, - "response_path": "$.result", -} - -_NAT_AGENT = { - "url": "http://nat.test", - "name": "nat-agent", - "format": "nemo_agent_toolkit", -} - -_MODEL = {"url": "http://nim.test/v1", "name": "my/model"} - -_METRIC = {"type": "exact-match", "reference": "{{item.ref}}", "candidate": "{{item.pred}}"} - -_DATASET = {"path": "ds", "storage": {"type": "huggingface", "repo_id": "test/ds"}} - -_PROMPT = "Question: {{input}}\nAnswer: " - - -# ============================================================================ -# MetricOnlineJob (model or agent, mutually exclusive) -# ============================================================================ - - -class TestMetricOnlineJob: - def test_accepts_model(self): - job = MetricOnlineJob.model_validate( - {"metric": _METRIC, "model": _MODEL, "dataset": _DATASET, "prompt_template": _PROMPT} - ) - assert job.model is not None - - def test_rejects_agent(self): - with pytest.raises(ValidationError): - MetricOnlineJob.model_validate( - {"metric": _METRIC, "agent": _NAT_AGENT, "dataset": _DATASET, "prompt_template": _PROMPT} - ) - - def test_rejects_both_model_and_agent(self): - with pytest.raises(ValidationError): - MetricOnlineJob.model_validate( - { - "metric": _METRIC, - "model": _MODEL, - "agent": _NAT_AGENT, - "dataset": _DATASET, - "prompt_template": _PROMPT, - } - ) - - def test_rejects_missing_model(self): - with pytest.raises(ValidationError, match="model"): - MetricOnlineJob.model_validate({"metric": _METRIC, "dataset": _DATASET, "prompt_template": _PROMPT}) - - def test_rejects_empty_optional_field(self): - with pytest.raises(ValidationError): - MetricOnlineJob.model_validate( - { - "metric": _METRIC, - "model": _MODEL, - "dataset": _DATASET, - "prompt_template": _PROMPT, - "optional_fields": [""], - } - ) - - -# ============================================================================ -# MetricOnlineAgentJob (dedicated agent-only type) -# ============================================================================ - - -class TestMetricOnlineAgentJob: - def test_accepts_generic_agent(self): - job = MetricOnlineAgentJob.model_validate( - {"metric": _METRIC, "agent": _GENERIC_AGENT, "dataset": _DATASET, "prompt_template": _PROMPT} - ) - assert job.agent is not None - assert job.agent.format == AgentFormat.GENERIC - - def test_accepts_nat_agent(self): - job = MetricOnlineAgentJob.model_validate( - {"metric": _METRIC, "agent": _NAT_AGENT, "dataset": _DATASET, "prompt_template": _PROMPT} - ) - assert job.agent is not None - assert job.agent.format == AgentFormat.NEMO_AGENT_TOOLKIT - - def test_rejects_model_field(self): - """MetricOnlineAgentJob does not accept a model field.""" - with pytest.raises(ValidationError): - MetricOnlineAgentJob.model_validate( - {"metric": _METRIC, "model": _MODEL, "dataset": _DATASET, "prompt_template": _PROMPT} - ) - - -# ============================================================================ -# MetricJob discriminator (via TypeAdapter) -# ============================================================================ - - -class TestMetricJobDiscriminator: - def test_agent_only_routes_to_online_agent(self): - data = {"metric": _METRIC, "agent": _NAT_AGENT, "dataset": _DATASET, "prompt_template": _PROMPT} - job = MetricJobAdapter.validate_python(data) - assert isinstance(job, MetricOnlineAgentJob) - - def test_model_routes_to_online(self): - data = {"metric": _METRIC, "model": _MODEL, "dataset": _DATASET, "prompt_template": _PROMPT} - job = MetricJobAdapter.validate_python(data) - assert isinstance(job, MetricOnlineJob) - - def test_no_model_no_agent_routes_to_offline(self): - data = {"metric": _METRIC, "dataset": _DATASET} - job = MetricJobAdapter.validate_python(data) - assert isinstance(job, MetricOfflineJob) - - -# ============================================================================ -# BenchmarkOnlineJob (model or agent, mutually exclusive) -# ============================================================================ - - -class TestBenchmarkOnlineJob: - _BENCH = { - "name": "bench", - "dataset": "ws/dataset", - "metrics": [{"metric_ref": "ws/m1", "metric": _METRIC}], - } - - def test_accepts_model(self): - job = BenchmarkOnlineJob.model_validate({"benchmark": self._BENCH, "model": _MODEL, "prompt_template": _PROMPT}) - assert job.model is not None - - def test_rejects_agent(self): - with pytest.raises(ValidationError): - BenchmarkOnlineJob.model_validate( - {"benchmark": self._BENCH, "agent": _NAT_AGENT, "prompt_template": _PROMPT} - ) - - def test_rejects_both_model_and_agent(self): - with pytest.raises(ValidationError): - BenchmarkOnlineJob.model_validate( - {"benchmark": self._BENCH, "model": _MODEL, "agent": _NAT_AGENT, "prompt_template": _PROMPT} - ) - - def test_rejects_missing_model(self): - with pytest.raises(ValidationError, match="model"): - BenchmarkOnlineJob.model_validate({"benchmark": self._BENCH, "prompt_template": _PROMPT}) - - -# ============================================================================ -# BenchmarkOnlineAgentJob (dedicated agent-only type) -# ============================================================================ - - -class TestBenchmarkOnlineAgentJob: - _BENCH = { - "name": "bench", - "dataset": "ws/dataset", - "metrics": [{"metric_ref": "ws/m1", "metric": _METRIC}], - } - - def test_accepts_agent(self): - job = BenchmarkOnlineAgentJob.model_validate( - {"benchmark": self._BENCH, "agent": _NAT_AGENT, "prompt_template": _PROMPT} - ) - assert job.agent is not None - - def test_accepts_generic_agent(self): - job = BenchmarkOnlineAgentJob.model_validate( - {"benchmark": self._BENCH, "agent": _GENERIC_AGENT, "prompt_template": _PROMPT} - ) - assert job.agent is not None - assert job.agent.format == AgentFormat.GENERIC - - def test_rejects_model_field(self): - """BenchmarkOnlineAgentJob does not accept a model field.""" - with pytest.raises(ValidationError): - BenchmarkOnlineAgentJob.model_validate( - {"benchmark": self._BENCH, "model": _MODEL, "prompt_template": _PROMPT} - ) - - def test_accepts_optional_fields(self): - job = BenchmarkOnlineAgentJob.model_validate( - { - "benchmark": self._BENCH, - "agent": _GENERIC_AGENT, - "prompt_template": _PROMPT, - "optional_fields": ["reference"], - } - ) - assert job.optional_fields == ["reference"] - - def test_rejects_empty_optional_field(self): - with pytest.raises(ValidationError): - BenchmarkOnlineAgentJob.model_validate( - { - "benchmark": self._BENCH, - "agent": _GENERIC_AGENT, - "prompt_template": _PROMPT, - "optional_fields": [""], - } - ) - - -# ============================================================================ -# BenchmarkJob discriminator -# ============================================================================ - - -class TestBenchmarkJobDiscriminator: - _CUSTOM_BENCH = { - "name": "bench", - "dataset": "ws/ds", - "metrics": [{"metric_ref": "ws/m1", "metric": _METRIC}], - } - - _SYSTEM_BENCH = {"name": "aegis-v2"} - - def test_agent_only_routes_to_online_agent(self): - data = {"benchmark": self._CUSTOM_BENCH, "agent": _GENERIC_AGENT, "prompt_template": _PROMPT} - job = BenchmarkJobAdapter.validate_python(data) - assert isinstance(job, BenchmarkOnlineAgentJob) - - def test_model_routes_to_online(self): - data = {"benchmark": self._CUSTOM_BENCH, "model": _MODEL, "prompt_template": _PROMPT} - job = BenchmarkJobAdapter.validate_python(data) - assert isinstance(job, BenchmarkOnlineJob) - - def test_no_model_no_agent_routes_to_offline(self): - data = {"benchmark": self._CUSTOM_BENCH} - job = BenchmarkJobAdapter.validate_python(data) - assert isinstance(job, BenchmarkOfflineJob) - - -# ============================================================================ -# SystemBenchmarkOnlineJob (model or agent, mutually exclusive) -# ============================================================================ - - -class TestSystemBenchmarkOnlineJob: - _SYS_BENCH = {"name": "aegis-v2"} - - def test_accepts_model(self): - job = SystemBenchmarkOnlineJob.model_validate( - {"benchmark": self._SYS_BENCH, "model": _MODEL, "benchmark_params": {}} - ) - assert job.model is not None - - def test_rejects_agent(self): - with pytest.raises(ValidationError): - SystemBenchmarkOnlineJob.model_validate( - {"benchmark": self._SYS_BENCH, "agent": _NAT_AGENT, "benchmark_params": {}} - ) - - def test_rejects_both(self): - with pytest.raises(ValidationError): - SystemBenchmarkOnlineJob.model_validate( - {"benchmark": self._SYS_BENCH, "model": _MODEL, "agent": _NAT_AGENT, "benchmark_params": {}} - ) diff --git a/services/evaluator/tests/app/test_inference.py b/services/evaluator/tests/app/test_inference.py deleted file mode 100644 index d327f54d89..0000000000 --- a/services/evaluator/tests/app/test_inference.py +++ /dev/null @@ -1,421 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import Mock, patch -from urllib.parse import urlparse - -import pytest -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.inference import make_inference_request, new_inference_client -from nemo_evaluator_sdk.values import Model -from nmp.evaluator.app.inference import get_platform_headers, verify_model_reachable - - -@pytest.mark.asyncio -async def test_verify_model_reachable_completions_endpoint(mock_sdk): - """ - Test that verify_model_reachable uses 'prompt' payload for v1/completions endpoints. - """ - from unittest.mock import AsyncMock, patch - - # Create a model with completions endpoint - model = Model( - url="https://api.example.com/v1/completions", - name="test/model", - ) - - mock_response = {"status": "success", "text": "pong"} - - with patch("nmp.evaluator.app.inference.make_inference_request", new_callable=AsyncMock) as mock_request: - mock_request.return_value = mock_response - - # Call verify_model_reachable - result = await verify_model_reachable(model, sdk=mock_sdk, workspace="test-workspace") - - # Verify make_inference_request was called - assert mock_request.call_count == 1 - - # Get the arguments passed to make_inference_request - call_args = mock_request.call_args - _, kwargs = call_args - - # Verify the request payload uses 'prompt' for completions endpoint - request_payload = kwargs["request"] - assert "prompt" in request_payload, "Completions endpoint should use 'prompt' in payload" - assert request_payload["prompt"] == "Ping" - # All models use max_tokens=100 - assert request_payload["max_tokens"] == 100, "All models should have max_tokens=100" - assert "messages" not in request_payload, "Completions endpoint should not have 'messages'" - - # Verify the model and max_retries parameters - assert kwargs["model"] == model - assert kwargs["max_retries"] == 3 - - # Verify the result - assert result == mock_response - - -@pytest.mark.asyncio -async def test_verify_model_reachable_completions_with_query_params(mock_sdk): - """ - Test that verify_model_reachable correctly identifies completions endpoint with query parameters. - """ - from unittest.mock import AsyncMock, patch - - # Create a model with completions endpoint and query parameters - model = Model( - url="https://api.example.com/v1/completions?api-version=2024-01-01&deployment=test", - name="test/model", - ) - - mock_response = {"status": "success"} - - with patch("nmp.evaluator.app.inference.make_inference_request", new_callable=AsyncMock) as mock_request: - mock_request.return_value = mock_response - - # Call verify_model_reachable - result = await verify_model_reachable(model, sdk=mock_sdk, workspace="test-workspace") - - # Verify make_inference_request was called - assert mock_request.call_count == 1 - - # Get the request payload - call_args = mock_request.call_args - _, kwargs = call_args - request_payload = kwargs["request"] - - # Verify the request uses 'prompt' for completions endpoint even with query params - assert "prompt" in request_payload, "Completions endpoint with query params should use 'prompt'" - assert request_payload["prompt"] == "Ping" - # All models use max_tokens=100 - assert request_payload["max_tokens"] == 100, "All models should have max_tokens=100" - assert "messages" not in request_payload, "Completions endpoint should not have 'messages'" - - # Verify the result - assert result == mock_response - - -@pytest.mark.asyncio -async def test_verify_model_reachable_chat_completions_endpoint(mock_sdk): - """ - Test that verify_model_reachable uses 'messages' payload for chat completions endpoints. - """ - from unittest.mock import AsyncMock, patch - - # Create a model with chat completions endpoint - model = Model( - url="https://api.example.com/v1/chat/completions", - name="test/model", - ) - - mock_response = {"status": "success", "message": "pong"} - - with patch("nmp.evaluator.app.inference.make_inference_request", new_callable=AsyncMock) as mock_request: - mock_request.return_value = mock_response - - # Call verify_model_reachable - result = await verify_model_reachable(model, sdk=mock_sdk, workspace="test-workspace") - - # Verify make_inference_request was called - assert mock_request.call_count == 1 - - # Get the arguments passed to make_inference_request - call_args = mock_request.call_args - _, kwargs = call_args - - # Verify the request payload uses 'messages' for chat completions endpoint - request_payload = kwargs["request"] - assert "messages" in request_payload, "Chat completions endpoint should use 'messages' in payload" - assert request_payload["messages"] == [{"role": "user", "content": "Ping!. Answer only in one word"}] - # All models use max_tokens=100 - assert request_payload["max_tokens"] == 100, "All models should have max_tokens=100" - assert "prompt" not in request_payload, "Chat completions endpoint should not have 'prompt'" - - # Verify the model and max_retries parameters - assert kwargs["model"] == model - assert kwargs["max_retries"] == 3 - - # Verify the result - assert result == mock_response - - -@pytest.mark.asyncio -async def test_verify_model_reachable_nvidia_nim_format(mock_sdk): - """ - Test that verify_model_reachable adds max_tokens for NVIDIA NIM format. - """ - from unittest.mock import AsyncMock, patch - - # Create a model with NVIDIA NIM format - model = Model( - url="https://api.example.com/v1/chat/completions", - name="test/model", - format=ModelFormat.NVIDIA_NIM, - ) - - mock_response = {"status": "success"} - - with patch("nmp.evaluator.app.inference.make_inference_request", new_callable=AsyncMock) as mock_request: - mock_request.return_value = mock_response - - # Call verify_model_reachable - result = await verify_model_reachable(model, sdk=mock_sdk, workspace="test-workspace") - - # Verify make_inference_request was called - assert mock_request.call_count == 1 - - # Get the request payload - call_args = mock_request.call_args - _, kwargs = call_args - request_payload = kwargs["request"] - - # Verify max_tokens is 100 for all models including NVIDIA NIM format - assert "max_tokens" in request_payload, "Should include max_tokens" - assert request_payload["max_tokens"] == 100, "All models should have max_tokens=100" - assert "messages" in request_payload # Should still have messages for chat endpoint - - # Verify the result - assert result == mock_response - - -@pytest.mark.asyncio -async def test_verify_model_reachable_timeout_default(mock_sdk): - """ - Test that verify_model_reachable uses default timeout of 10 seconds. - """ - from unittest.mock import AsyncMock, patch - - model = Model( - url="https://api.example.com/v1/chat/completions", - name="test/model", - ) - - mock_response = {"status": "success"} - - with patch("nmp.evaluator.app.inference.make_inference_request", new_callable=AsyncMock) as mock_request: - mock_request.return_value = mock_response - - await verify_model_reachable(model, sdk=mock_sdk, workspace="test-workspace") - - # Verify make_inference_request was called with default timeout - call_args = mock_request.call_args - _, kwargs = call_args - assert kwargs["timeout"] == 10.0, "Default timeout should be 10 seconds" - - -@pytest.mark.asyncio -async def test_verify_model_reachable_timeout_custom(mock_sdk): - """ - Test that verify_model_reachable accepts custom timeout parameter. - """ - from unittest.mock import AsyncMock, patch - - model = Model( - url="https://api.example.com/v1/chat/completions", - name="test/model", - ) - - mock_response = {"status": "success"} - - with patch("nmp.evaluator.app.inference.make_inference_request", new_callable=AsyncMock) as mock_request: - mock_request.return_value = mock_response - - await verify_model_reachable(model, sdk=mock_sdk, workspace="test-workspace", timeout=5.0) - - # Verify make_inference_request was called with custom timeout - call_args = mock_request.call_args - _, kwargs = call_args - assert kwargs["timeout"] == 5.0, "Custom timeout should be passed through" - - -@pytest.mark.asyncio -async def test_make_inference_request_timeout_passed_to_client(): - """ - Test that make_inference_request passes timeout to client.with_options(). - """ - from unittest.mock import AsyncMock, patch - - from openai.types.chat import ChatCompletion, ChatCompletionMessage - from openai.types.chat.chat_completion import Choice - - model = Model( - url="https://api.example.com/v1/chat/completions", - name="test/model", - ) - - mock_chat_completion = ChatCompletion( - id="test-id", - object="chat.completion", - created=1234567890, - model="test/model", - choices=[ - Choice( - index=0, - message=ChatCompletionMessage(role="assistant", content="test response"), - finish_reason="stop", - ) - ], - ) - - with patch("nemo_evaluator_sdk.inference.AsyncOpenAI.chat") as mock_chat: - mock_chat.completions.create = AsyncMock(return_value=mock_chat_completion) - client = new_inference_client(model) - - request = {"messages": [{"role": "user", "content": "test"}]} - await make_inference_request(model, request, timeout=15.0, client=client) - - # Verify with_options was called with timeout - assert client.max_retries == 0 - mock_chat.completions.create.assert_called_once() - call_kwargs = mock_chat.completions.create.call_args[1] - assert call_kwargs["timeout"] == 15.0, "Timeout should be passed to create" - - -class _InferenceTransportTestMixin: - PLATFORM_BASE_URL = "http://nemo-platform-api.default.svc.cluster.local" - EXTERNAL_URL = "http://external-inference-server.example.com/v1" - - def _make_mock_completion(self): - from openai.types.chat import ChatCompletion, ChatCompletionMessage - from openai.types.chat.chat_completion import Choice - - return ChatCompletion( - id="test-id", - object="chat.completion", - created=1234567890, - model="test/model", - choices=[ - Choice( - index=0, - message=ChatCompletionMessage(role="assistant", content="test response"), - finish_reason="stop", - ) - ], - ) - - -class TestGetPlatformHeaders(_InferenceTransportTestMixin): - """Tests for deriving evaluator service-principal headers from a model URL.""" - - def test_includes_service_principal_header_for_platform_url(self): - """Platform-local model URLs should resolve to evaluator service-principal headers.""" - with patch("nmp.evaluator.app.inference.get_platform_config") as mock_config: - mock_config.return_value = Mock(base_url=self.PLATFORM_BASE_URL) - - headers = get_platform_headers(f"{self.PLATFORM_BASE_URL}/v1/chat/completions") - - assert headers == {"X-NMP-Principal-Id": "service:evaluator"} - - def test_omits_service_principal_header_for_url_containing_platform_hostname_as_substring(self): - """Hostnames that only contain the platform hostname as a substring must not match.""" - platform_netloc = urlparse(self.PLATFORM_BASE_URL).netloc - spoofed_url = f"http://evil.{platform_netloc}/v1/chat/completions" - - with patch("nmp.evaluator.app.inference.get_platform_config") as mock_config: - mock_config.return_value = Mock(base_url=self.PLATFORM_BASE_URL) - - headers = get_platform_headers(spoofed_url) - - assert headers is None - - def test_omits_service_principal_header_for_external_url(self): - """External model URLs should not resolve to evaluator service-principal headers.""" - with patch("nmp.evaluator.app.inference.get_platform_config") as mock_config: - mock_config.return_value = Mock(base_url=self.PLATFORM_BASE_URL) - - headers = get_platform_headers(f"{self.EXTERNAL_URL}/chat/completions") - - assert headers is None - - -class TestMakeInferenceRequestDefaultHeaders(_InferenceTransportTestMixin): - """Tests for forwarding effective request headers through the SDK transport.""" - - @pytest.mark.asyncio - async def test_forwards_model_default_headers_as_extra_headers(self): - """Model-level default headers should be attached to the outgoing request.""" - from unittest.mock import AsyncMock, patch - - model = Model( - url=f"{self.PLATFORM_BASE_URL}/v1/chat/completions", - name="test/model", - default_headers={"X-NMP-Principal-Id": "service:evaluator"}, - ) - - with patch("nemo_evaluator_sdk.inference.AsyncOpenAI.chat") as mock_chat: - mock_chat.completions.create = AsyncMock(return_value=self._make_mock_completion()) - - await make_inference_request(model, {"messages": [{"role": "user", "content": "hi"}]}) - - request_body = mock_chat.completions.create.call_args.kwargs - assert request_body["extra_headers"] == {"X-NMP-Principal-Id": "service:evaluator"} - - @pytest.mark.asyncio - async def test_merges_model_and_per_call_default_headers(self): - """Per-call headers should merge with model-level headers and override on collision.""" - from unittest.mock import AsyncMock, patch - - model = Model( - url=f"{self.PLATFORM_BASE_URL}/v1/chat/completions", - name="test/model", - default_headers={"X-NMP-Principal-Id": "service:evaluator", "X-Trace-Id": "model"}, - ) - - with patch("nemo_evaluator_sdk.inference.AsyncOpenAI.chat") as mock_chat: - mock_chat.completions.create = AsyncMock(return_value=self._make_mock_completion()) - - await make_inference_request( - model, - {"messages": [{"role": "user", "content": "hi"}]}, - default_headers={"X-Trace-Id": "request", "X-Request-Id": "abc"}, - ) - - request_body = mock_chat.completions.create.call_args.kwargs - assert request_body["extra_headers"] == { - "X-NMP-Principal-Id": "service:evaluator", - "X-Trace-Id": "request", - "X-Request-Id": "abc", - } - - -@pytest.mark.asyncio -async def test_make_inference_request_timeout_none_uses_default(): - """ - Test that make_inference_request does not pass timeout when None (uses client default). - """ - from unittest.mock import AsyncMock, patch - - from openai.types.chat import ChatCompletion, ChatCompletionMessage - from openai.types.chat.chat_completion import Choice - - model = Model( - url="https://api.example.com/v1/chat/completions", - name="test/model", - ) - - mock_chat_completion = ChatCompletion( - id="test-id", - object="chat.completion", - created=1234567890, - model="test/model", - choices=[ - Choice( - index=0, - message=ChatCompletionMessage(role="assistant", content="test response"), - finish_reason="stop", - ) - ], - ) - - with patch("nemo_evaluator_sdk.inference.AsyncOpenAI.chat") as mock_chat: - mock_chat.completions.create = AsyncMock(return_value=mock_chat_completion) - client = new_inference_client(model) - - request = {"messages": [{"role": "user", "content": "test"}]} - await make_inference_request(model, request, timeout=None, client=client) - - # Verify with_options was called without timeout (only max_retries) - mock_chat.completions.create.assert_called_once() - call_kwargs = mock_chat.completions.create.call_args[1] - assert "timeout" not in call_kwargs, "Timeout should not be passed when None" - assert client.max_retries == 0, "max_retries should still be passed" diff --git a/services/evaluator/tests/app/test_inference_hooks.py b/services/evaluator/tests/app/test_inference_hooks.py deleted file mode 100644 index 45f27644d8..0000000000 --- a/services/evaluator/tests/app/test_inference_hooks.py +++ /dev/null @@ -1,49 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.inference import LogHook -from nemo_evaluator_sdk.values import RunConfig, RunConfigOnlineModel -from nmp.evaluator.app import inference_hooks -from pytest_mock import MockerFixture - - -def test_new_hooks_no_params(): - pre, post = inference_hooks.new_hooks(None) - assert len(pre) == 1, "at least log hook is initialized" - assert isinstance(pre[0], LogHook), "at least log hook is initialized" - assert len(post) == 1, "at least log hook is initialized" - assert isinstance(post[0], LogHook), "log hook" - assert pre[0] is post[0], "pre and post should have the same instance of log hook" - - -def test_new_hooks_offline_params(): - params = RunConfig() - pre, post = inference_hooks.new_hooks(params) - - assert len(pre) == 1, "at least log hook is initialized" - assert isinstance(pre[0], LogHook), "at least log hook is initialized" - assert len(post) == 1, "at least log hook is initialized" - assert isinstance(post[0], LogHook), "log hook" - assert pre[0] is post[0], "pre and post should have the same instance of log hook" - - -def test_new_hooks_delegates_to_sdk(mocker: MockerFixture): - expected = (["pre"], ["post"]) - new_hooks = mocker.patch("nmp.evaluator.app.inference_hooks.sdk_inference.new_hooks", return_value=expected) - params = RunConfigOnlineModel() - logger = mocker.Mock() - - result = inference_hooks.new_hooks(params, model_format=ModelFormat.OPEN_AI, logger=logger) - - assert result is expected - new_hooks.assert_called_once_with(params, model_format=ModelFormat.OPEN_AI, logger=logger) - - -def test_progress_tracking_hook_increments_and_returns_response(mocker: MockerFixture): - progress = mocker.Mock() - hook = inference_hooks.ProgressTrackingHook(progress) - response = {"choices": [{"message": {"content": "ok"}}]} - - assert hook.postprocess(response) is response - progress.increment_samples_processed.assert_called_once_with() diff --git a/services/evaluator/tests/app/values/test_common.py b/services/evaluator/tests/app/values/test_common.py deleted file mode 100644 index f37aec5484..0000000000 --- a/services/evaluator/tests/app/values/test_common.py +++ /dev/null @@ -1,43 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for common evaluator value types.""" - -from __future__ import annotations - -import pytest -from nmp.evaluator.app.values import FilesetRef - - -class TestFilesetRefWithFragment: - """Tests for appending path fragments to fileset references.""" - - def test_appends_fragment(self) -> None: - fileset_ref = FilesetRef(root="workspace/fileset") - - assert fileset_ref.with_fragment("validation/*.jsonl") == FilesetRef( - root="workspace/fileset#validation/*.jsonl" - ) - - def test_strips_leading_slash(self) -> None: - fileset_ref = FilesetRef(root="workspace/fileset") - - assert fileset_ref.with_fragment("/data/train.jsonl") == FilesetRef(root="workspace/fileset#data/train.jsonl") - - def test_rejects_empty_fragment(self) -> None: - fileset_ref = FilesetRef(root="workspace/fileset") - - with pytest.raises(ValueError, match="fragment cannot be empty"): - fileset_ref.with_fragment("/") - - def test_rejects_fragment_containing_delimiter(self) -> None: - fileset_ref = FilesetRef(root="workspace/fileset") - - with pytest.raises(ValueError, match="fragment cannot contain '#'"): - fileset_ref.with_fragment("data#train.jsonl") - - def test_rejects_existing_fragment(self) -> None: - fileset_ref = FilesetRef(root="workspace/fileset#existing.jsonl") - - with pytest.raises(ValueError, match="already includes a fragment"): - fileset_ref.with_fragment("validation/*.jsonl") diff --git a/services/evaluator/tests/conftest.py b/services/evaluator/tests/conftest.py deleted file mode 100644 index fe080cfeb3..0000000000 --- a/services/evaluator/tests/conftest.py +++ /dev/null @@ -1,132 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import sys -from pathlib import Path -from typing import Generator - -# When pytest is invoked from the repo root, site-packages order can resolve `nmp` -# to sdk/python/nemo-platform/src/nmp before services/evaluator/src/nmp. Evaluator -# tests must use the service tree (source of truth for app.values, APIs, etc.). -_EVALUATOR_SRC = Path(__file__).resolve().parents[1] / "src" -if str(_EVALUATOR_SRC) not in sys.path: - sys.path.insert(0, str(_EVALUATOR_SRC)) - -from nemo_platform.types.jobs import PlatformJobResponse # noqa: E402 - -# Add tests directory to sys.path so cross-test-file imports work -# when running from the service directory (e.g., `cd services/evaluator && pytest`) -_TESTS_DIR = Path(__file__).parent -if str(_TESTS_DIR) not in sys.path: - sys.path.insert(0, str(_TESTS_DIR)) - -import pytest # noqa: E402 -from fastapi.testclient import TestClient # noqa: E402 -from nmp.common.entities.client import EntityClient # noqa: E402 -from nmp.evaluator.api.v2.benchmarks.manager import BenchmarksManager # noqa: E402 -from nmp.evaluator.service import EvaluatorService # noqa: E402 -from nmp.testing import create_test_client # noqa: E402 -from pydantic import BaseModel # noqa: E402 - -# ============================================================================ -# Pytest Hooks -# ============================================================================ - - -def pytest_collection_modifyitems(config, items): - """ - Modify test items during collection. - - Auto-marks tests based on their location: - - Tests in e2e/ directories get the 'e2e' marker - - Tests in integration/ directories get the 'integration' marker - - Tests without category markers get the 'unit' marker - """ - # Category markers that determine test type - category_markers = {"unit", "e2e", "integration", "regression", "canary", "slow", "skip_in_ci"} - - for item in items: - # Get current marker names - marker_names = {marker.name for marker in item.iter_markers()} - - # Auto-mark tests in e2e directories - if "/e2e/" in str(item.fspath): - if "e2e" not in marker_names: - item.add_marker(pytest.mark.e2e) - marker_names.add("e2e") - - # Auto-mark tests in integration directories - elif "/integration/" in str(item.fspath): - if "integration" not in marker_names: - item.add_marker(pytest.mark.integration) - marker_names.add("integration") - - # Auto-mark tests without category markers as unit tests - if not marker_names.intersection(category_markers): - item.add_marker(pytest.mark.unit) - - -@pytest.fixture -def client(load_incluster_config): - """Fixture for initializing a test client with in-memory entities.""" - # Include projects used in tests (new, proj-big, proj-llm) - projects = ["default/test-project", "default/new", "default/proj-big", "default/proj-llm"] - with create_test_client( - EvaluatorService, - client_type=TestClient, - projects=projects, - ) as tc: - yield tc - - -@pytest.fixture -def mock_sdk(): - """Mock SDK instance for tests. - - Provides a consistent mock SDK with secrets.access and secrets.retrieve configured - for use across all evaluator test modules. This fixture eliminates duplication - and ensures consistent behavior. - """ - from unittest import mock - from unittest.mock import MagicMock - - sdk = mock.AsyncMock() - # Mock secrets.access and secrets.retrieve to return a mock secret - mock_secret = MagicMock() - mock_secret.value = "mock-api-key" - sdk.secrets.access = mock.AsyncMock(return_value=mock_secret) - sdk.secrets.retrieve = mock.AsyncMock(return_value=mock_secret) - - def mock_sdk_jobs_create(**kwargs): - """Return a job response with preserved job spec and mock values""" - spec = kwargs.get("spec") - assert isinstance(spec, BaseModel) - kwargs.update( - { - "id": "mock-id", - "attempt_id": "mock-attempt-id", - "fileset": "default/mock-id", - "name": kwargs.get("name", "mock-name"), - "status": "pending", - "spec": spec.model_dump(mode="json", exclude_none=True), - } - ) - return PlatformJobResponse.model_validate(kwargs) - - sdk.jobs.create.side_effect = mock_sdk_jobs_create - - return sdk - - -@pytest.fixture -def mock_entity_client() -> Generator[EntityClient, None, None]: - """Real EntityClient backed by in-memory storage for integration-style testing.""" - workspaces = ["default", "system", "production"] - with create_test_client(client_type=EntityClient, workspaces=workspaces) as client: - yield client - - -@pytest.fixture -def benchmarks_manager(mock_entity_client) -> BenchmarksManager: - """BenchmarksManager instance with mocked EntityClient.""" - return BenchmarksManager(mock_entity_client) diff --git a/services/evaluator/tests/data/metric-jobs/llm-judge-offline-results.json b/services/evaluator/tests/data/metric-jobs/llm-judge-offline-results.json deleted file mode 100644 index 29b0dc89f5..0000000000 --- a/services/evaluator/tests/data/metric-jobs/llm-judge-offline-results.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "scores": [ - { - "name": "length", - "count": 3, - "nan_count": 0, - "sum": 0.0, - "mean": 0.0, - "min": 0.0, - "max": 0.0, - "std_dev": 0.0, - "variance": 0.0, - "score_type": "rubric", - "rubric_distribution": [ - { - "label": "short", - "value": 0, - "count": 3 - }, - { - "label": "medium", - "value": 1, - "count": 0 - }, - { - "label": "long", - "value": 2, - "count": 0 - } - ], - "mode_category": "short" - } - ] -} diff --git a/services/evaluator/tests/data/metric-jobs/llm-judge-offline.json b/services/evaluator/tests/data/metric-jobs/llm-judge-offline.json deleted file mode 100644 index 33069efb98..0000000000 --- a/services/evaluator/tests/data/metric-jobs/llm-judge-offline.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "dataset": { - "rows": [ - {"input": "hi.", "output": "hello world"}, - {"input": "Are you hungry?", "output": "no"}, - {"input": "What is coffee?", "output": "a hot drink made from the roasted and ground seeds (coffee beans) of a tropical shrub."} - ] - }, - "metric": { - "type": "llm-judge", - "model": { - "name": "my-judge-model", - "url": "http://inference:8000/v1/chat/completions" - }, - "scores": [ - { - "name": "length", - "rubric": [ - {"label": "short", "value": 0}, - {"label": "medium", "value": 1}, - {"label": "long", "value": 2} - ] - } - ] - } -} diff --git a/services/evaluator/tests/data/metric-jobs/llm-judge.json b/services/evaluator/tests/data/metric-jobs/llm-judge.json deleted file mode 100644 index fa2b1c968d..0000000000 --- a/services/evaluator/tests/data/metric-jobs/llm-judge.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "model": { - "name": "meta/llama-3.2-3b-instruct", - "url": "https://integrate.api.nvidia.com/v1" - }, - "dataset": { - "rows": [ - {"input": "hi.", "output": "hello world"}, - {"input": "Are you hungry?", "output": "no"}, - {"input": "What is coffee?", "output": "a hot drink made from the roasted and ground seeds (coffee beans) of a tropical shrub."} - ] - }, - "prompt_template": { - "messages": [{"role": "user", "content": "{{input}}"}] - }, - "params": { - "limit_samples": 1, - "inference": { - "max_tokens": 2048 - } - }, - "metric": { - "type": "llm-judge", - "name": "my-metric-length", - "namespace": "why-not-default", - "model": { - "name": "meta/llama-3.3-70b-instruct", - "url": "https://integrate.api.nvidia.com/v1" - }, - "prompt_template": { - "messages": [ - {"role": "system", "content": "You are an expert judge evaluating the length of AI responses."}, - {"role": "user", "content": "Question: {{input}}\nAnswer: {{output_text}}"} - ] - }, - "scores": [ - { - "name": "length", - "rubric": [ - {"label": "short", "value": 0}, - {"label": "medium", "value": 1}, - {"label": "long", "value": 2} - ], - "parser": { - "type": "json", - "json_path": "length" - } - } - ], - "structured_output": { - "schema": { - "type": "object", - "properties": { - "length": { - "type": "string", - "enum": ["short", "medium", "long"] - } - }, - "required": ["length"], - "additionalProperties": false - } - } - } -} diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/adherence.jsonl b/services/evaluator/tests/datasets/agentic-eval-cached-output/adherence.jsonl deleted file mode 100644 index 0200351c1e..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/adherence.jsonl +++ /dev/null @@ -1,3 +0,0 @@ -{"user_input": [{"content": "hello", "type": "human"}, {"content": "Sure, let me retrieve the relevant information for you.", "type": "ai", "tool_calls": [{"name": "document_search", "args":{"query": "Einstein's theory of relativity"}}]}, {"content": "Found relevant documents: 1. Relativity: The Special and the General Theory, 2. General Theory of Relativity by A. Einstein.", "type": "tool"}, {"content": "I found some documents on Einstein's theory of relativity. Which one would you like to know more about: 'Relativity: The Special and the General Theory' or 'General Theory of Relativity by A. Einstein'?", "type": "ai"}, {"content": "Tell me about the 'General Theory of Relativity'.", "type": "human"}, {"content": "Got it! Let me fetch more details from 'General Theory of Relativity by A. Einstein'.", "type": "ai", "tool_calls": [{"name": "document_retrieve", "args": {"document": "General Theory of Relativity by A. Einstein"}}]}, {"content": "The document discusses how gravity affects the fabric of spacetime, describing the relationship between mass and spacetime curvature.", "type": "tool"}, {"content": "The 'General Theory of Relativity' explains how gravity affects the fabric of spacetime and the relationship between mass and spacetime curvature. Would you like more details or a specific explanation?", "type": "ai"}, {"content": "No, that's perfect. By the way, do you know any good recipes for a chocolate cake?", "type": "human"}, {"content": "Sure! Let me find a simple and delicious recipe for a chocolate cake.", "type": "ai", "tool_calls": [{"name": "recipe_search", "args": {"query": "chocolate cake recipe"}}]}, {"content": "Here\u2019s a popular recipe for a chocolate cake: Ingredients include flour, sugar, cocoa powder, eggs, milk, and butter. Instructions: Mix dry ingredients, add wet ingredients, and bake at 350\u00b0F for 30-35 minutes.", "type": "tool"}, {"content": "I found a great recipe for chocolate cake! Would you like the full details, or is that summary enough?", "type": "ai"}], "reference_topics": ["science"]} -{"user_input": [{"content": "Can you provide me with details about Einstein's theory of relativity?", "type": "human"}, {"content": "Sure, let me retrieve the relevant information for you.", "type": "ai", "tool_calls": [{"name": "document_search", "args": {"query": "Einstein's theory of relativity"}}]}, {"content": "Found relevant documents: 1. Relativity: The Special and the General Theory, 2. General Theory of Relativity by A. Einstein.", "type": "tool"}, {"content": "I found some documents on Einstein's theory of relativity. Which one would you like to know more about: 'Relativity: The Special and the General Theory' or 'General Theory of Relativity by A. Einstein'?", "type": "ai"}, {"content": "Tell me about the 'General Theory of Relativity'.", "type": "human"}, {"content": "Got it! Let me fetch more details from 'General Theory of Relativity by A. Einstein'.", "type": "ai", "tool_calls": [{"name": "document_retrieve", "args": {"document": "General Theory of Relativity by A. Einstein"}}]}, {"content": "The document discusses how gravity affects the fabric of spacetime, describing the relationship between mass and spacetime curvature.", "type": "tool"}, {"content": "The 'General Theory of Relativity' explains how gravity affects the fabric of spacetime and the relationship between mass and spacetime curvature. Would you like more details or a specific explanation?", "type": "ai"}, {"content": "No, that's perfect. By the way, do you know any good recipes for a chocolate cake?", "type": "human"}, {"content": "Sure! Let me find a simple and delicious recipe for a chocolate cake.", "type": "ai", "tool_calls": [{"name": "recipe_search", "args": {"query": "chocolate cake recipe"}}]}, {"content": "Here\u2019s a popular recipe for a chocolate cake: Ingredients include flour, sugar, cocoa powder, eggs, milk, and butter. Instructions: Mix dry ingredients, add wet ingredients, and bake at 350\u00b0F for 30-35 minutes.", "type": "tool"}, {"content": "I found a great recipe for chocolate cake! Would you like the full details, or is that summary enough?", "type": "ai"}], "reference_topics": ["science"]} -{"user_input": [{"content": "how to keep healthy?", "type": "human"},{"content": "Sure. Eat more fruit", "type":"ai"}], "reference_topics": ["technology"]} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/agent_goal_acc.jsonl b/services/evaluator/tests/datasets/agentic-eval-cached-output/agent_goal_acc.jsonl deleted file mode 100644 index de6786272d..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/agent_goal_acc.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"user_input": [{"content": "Hey, book a table at the nearest best Chinese restaurant for 8:00pm", "role": "user"}, {"content": "Sure, let me find the best options for you.", "role": "assistant", "tool_calls": [{"name": "restaurant_search", "args": {"cuisine": "Chinese", "time": "8:00pm"}}]}, {"content": "Found a few options: 1. Golden Dragon, 2. Jade Palace", "role": "tool"}, {"content": "I found some great options: Golden Dragon and Jade Palace. Which one would you prefer?", "role": "assistant"}, {"content": "Let's go with Golden Dragon.", "role": "user"}, {"content": "Great choice! I'll book a table for 8:00pm at Golden Dragon.", "role": "assistant", "tool_calls": [{"name": "restaurant_book", "args": {"name": "Golden Dragon", "time": "8:00pm"}}]}, {"content": "Table booked at Golden Dragon for 8:00pm.", "role": "tool"}, {"content": "Your table at Golden Dragon is booked for 8:00pm. Enjoy your meal!", "role": "assistant"}, {"content": "thanks", "role": "user"}]} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/agent_goal_acc_ref.jsonl b/services/evaluator/tests/datasets/agentic-eval-cached-output/agent_goal_acc_ref.jsonl deleted file mode 100644 index 37c55e5355..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/agent_goal_acc_ref.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"user_input": [{"content": "Hey, book a table at the nearest best Chinese restaurant for 8:00pm", "role": "user"}, {"content": "Sure, let me find the best options for you.", "role": "assistant", "tool_calls": [{"name": "restaurant_search", "args": {"cuisine": "Chinese", "time": "8:00pm"}}]}, {"content": "Found a few options: 1. Golden Dragon, 2. Jade Palace", "role": "tool"}, {"content": "I found some great options: Golden Dragon and Jade Palace. Which one would you prefer?", "role": "assistant"}, {"content": "Let's go with Golden Dragon.", "role": "user"}, {"content": "Great choice! I'll book a table for 8:00pm at Golden Dragon.", "role": "assistant", "tool_calls": [{"name": "restaurant_book", "args": {"name": "Golden Dragon", "time": "8:00pm"}}]}, {"content": "Table booked at Golden Dragon for 8:00pm.", "role": "tool"}, {"content": "Your table at Golden Dragon is booked for 8:00pm. Enjoy your meal!", "role": "assistant"}, {"content": "thanks", "role": "user"}], "reference": "Table booked at one of the chinese restaurants at 8 pm"} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/answer_acc.jsonl b/services/evaluator/tests/datasets/agentic-eval-cached-output/answer_acc.jsonl deleted file mode 100644 index aca3bc78d4..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/answer_acc.jsonl +++ /dev/null @@ -1,2 +0,0 @@ -{"user_input": "What is the capital of France?", "response": "Paris", "reference": "Paris"} -{"user_input": "When was Einstein born?", "response": "1879", "reference": "Albert Einstein was born in 1879."} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/invalid_adherence.jsonl b/services/evaluator/tests/datasets/agentic-eval-cached-output/invalid_adherence.jsonl deleted file mode 100644 index 41e4df506c..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/invalid_adherence.jsonl +++ /dev/null @@ -1,3 +0,0 @@ -{"input": [{"content": "hello", "type": "human"}, {"content": "Sure, let me retrieve the relevant information for you.", "type": "ai", "tool_calls": [{"name": "document_search", "args":{"query": "Einstein's theory of relativity"}}]}, {"content": "Found relevant documents: 1. Relativity: The Special and the General Theory, 2. General Theory of Relativity by A. Einstein.", "type": "tool"}, {"content": "I found some documents on Einstein's theory of relativity. Which one would you like to know more about: 'Relativity: The Special and the General Theory' or 'General Theory of Relativity by A. Einstein'?", "type": "ai"}, {"content": "Tell me about the 'General Theory of Relativity'.", "type": "human"}, {"content": "Got it! Let me fetch more details from 'General Theory of Relativity by A. Einstein'.", "type": "ai", "tool_calls": [{"name": "document_retrieve", "args": {"document": "General Theory of Relativity by A. Einstein"}}]}, {"content": "The document discusses how gravity affects the fabric of spacetime, describing the relationship between mass and spacetime curvature.", "type": "tool"}, {"content": "The 'General Theory of Relativity' explains how gravity affects the fabric of spacetime and the relationship between mass and spacetime curvature. Would you like more details or a specific explanation?", "type": "ai"}, {"content": "No, that's perfect. By the way, do you know any good recipes for a chocolate cake?", "type": "human"}, {"content": "Sure! Let me find a simple and delicious recipe for a chocolate cake.", "type": "ai", "tool_calls": [{"name": "recipe_search", "args": {"query": "chocolate cake recipe"}}]}, {"content": "Here\u2019s a popular recipe for a chocolate cake: Ingredients include flour, sugar, cocoa powder, eggs, milk, and butter. Instructions: Mix dry ingredients, add wet ingredients, and bake at 350\u00b0F for 30-35 minutes.", "type": "tool"}, {"content": "I found a great recipe for chocolate cake! Would you like the full details, or is that summary enough?", "type": "ai"}], "reference_answer": ["science"]} -{"input": [{"content": "Can you provide me with details about Einstein's theory of relativity?", "type": "human"}, {"content": "Sure, let me retrieve the relevant information for you.", "type": "ai", "tool_calls": [{"name": "document_search", "args": {"query": "Einstein's theory of relativity"}}]}, {"content": "Found relevant documents: 1. Relativity: The Special and the General Theory, 2. General Theory of Relativity by A. Einstein.", "type": "tool"}, {"content": "I found some documents on Einstein's theory of relativity. Which one would you like to know more about: 'Relativity: The Special and the General Theory' or 'General Theory of Relativity by A. Einstein'?", "type": "ai"}, {"content": "Tell me about the 'General Theory of Relativity'.", "type": "human"}, {"content": "Got it! Let me fetch more details from 'General Theory of Relativity by A. Einstein'.", "type": "ai", "tool_calls": [{"name": "document_retrieve", "args": {"document": "General Theory of Relativity by A. Einstein"}}]}, {"content": "The document discusses how gravity affects the fabric of spacetime, describing the relationship between mass and spacetime curvature.", "type": "tool"}, {"content": "The 'General Theory of Relativity' explains how gravity affects the fabric of spacetime and the relationship between mass and spacetime curvature. Would you like more details or a specific explanation?", "type": "ai"}, {"content": "No, that's perfect. By the way, do you know any good recipes for a chocolate cake?", "type": "human"}, {"content": "Sure! Let me find a simple and delicious recipe for a chocolate cake.", "type": "ai", "tool_calls": [{"name": "recipe_search", "args": {"query": "chocolate cake recipe"}}]}, {"content": "Here\u2019s a popular recipe for a chocolate cake: Ingredients include flour, sugar, cocoa powder, eggs, milk, and butter. Instructions: Mix dry ingredients, add wet ingredients, and bake at 350\u00b0F for 30-35 minutes.", "type": "tool"}, {"content": "I found a great recipe for chocolate cake! Would you like the full details, or is that summary enough?", "type": "ai"}], "reference_answer": ["science"]} -{"input": [{"content": "how to keep healthy?", "type": "human"},{"content": "Sure. Eat more fruit", "type":"ai"}], "reference_answer": ["technology"]} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/tool_call_acc1.jsonl b/services/evaluator/tests/datasets/agentic-eval-cached-output/tool_call_acc1.jsonl deleted file mode 100644 index 2059a4959a..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/tool_call_acc1.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"user_input": [{"content": "What's the weather like in New York right now?", "type": "human"}, {"content": "The current temperature in New York is 75°F and it's partly cloudy.", "type": "ai", "tool_calls": [{"name": "weather_check", "args": {"location": "New York"}}]}, {"content": "Can you translate that to Celsius?", "type": "human"}, {"content": "Let me convert that to Celsius for you.", "type": "ai", "tool_calls": [{"name": "temperature_conversion", "args": {"temperature_fahrenheit": 75}}]}, {"content": "75°F is approximately 23.9°C.", "type": "tool"}, {"content": "75°F is approximately 23.9°C.", "type": "ai"}], "reference_tool_calls": [{"name": "weather_check", "args": {"location": "New York"}}, {"name": "temperature_conversion", "args": {"temperature_fahrenheit": 75}}]} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/tool_call_acc2.jsonl b/services/evaluator/tests/datasets/agentic-eval-cached-output/tool_call_acc2.jsonl deleted file mode 100644 index 346dff0527..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/tool_call_acc2.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"conversations": [{"content": "What's the weather like in New York right now?", "type": "human"}, {"content": "The current temperature in New York is 75°F and it's partly cloudy.", "type": "ai", "tool_calls": [{"name": "weather_check", "args": {"location": "New York"}}]}, {"content": "Can you translate that to Celsius?", "type": "human"}, {"content": "Let me convert that to Celsius for you.", "type": "ai", "tool_calls": [{"name": "temperature_conversion", "args": {"temperature_fahrenheit": 75}}]}, {"content": "75°F is approximately 23.9°C.", "type": "tool"}, {"content": "75°F is approximately 23.9°C.", "type": "ai"}], "reference": [{"name": "weather_check", "args": {"location": "New York"}}, {"name": "temperature_conversion", "args": {"temperature_fahrenheit": 75}}]} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/trajectory_custom_tool.json b/services/evaluator/tests/datasets/agentic-eval-cached-output/trajectory_custom_tool.json deleted file mode 100644 index f355033987..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/trajectory_custom_tool.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dummy_custom_tool": "Do nothing. This tool is for test only", - "code_generation": "Useful to generate Python code. For any questions about code generation, you must only use this tool!", - "wikipedia_search": "Tool that retrieves relevant contexts from wikipedia search for the given question.\n\n Args:\n _type (str): The type of the object.\n max_results (int): Description unavailable. Defaults to 2." -} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/agentic-eval-cached-output/trajectory_eval_input.json b/services/evaluator/tests/datasets/agentic-eval-cached-output/trajectory_eval_input.json deleted file mode 100644 index 665c734c79..0000000000 --- a/services/evaluator/tests/datasets/agentic-eval-cached-output/trajectory_eval_input.json +++ /dev/null @@ -1,578 +0,0 @@ -[ - { - "id": "Adelanto", - "question": "What are LLMs", - "answer": "LLMs stand for Large Language Models, which are a type of machine learning model designed for natural language processing tasks such as language generation. They are trained with self-supervised learning on a vast amount of text and can acquire predictive power regarding syntax, semantics, and ontologies inherent in human language corpora.", - "generated_answer": "LLMs, or Large Language Models, are a type of artificial intelligence designed to process and generate human-like language. They are trained on vast amounts of text data and can be fine-tuned for specific tasks or guided by prompt engineering. LLMs have a wide range of applications, including language translation, text summarization, and conversational agents. They can also be used for tasks such as code generation, knowledge retrieval, and automated reasoning. However, LLMs can also inherit inaccuracies and biases present in the data they are trained on, and can generate misinformation if they misinterpret the context of the information they retrieve.", - "intermediate_steps": [ - { - "parent_id": "d0af7134-5652-4c5c-9195-364bf9d91682", - "function_ancestry": { - "function_id": "d0af7134-5652-4c5c-9195-364bf9d91682", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "LLM_END", - "event_timestamp": 1760724050.4970748, - "span_event_timestamp": 1760724049.5089211, - "framework": "langchain", - "name": "meta/llama-3.1-70b-instruct", - "tags": null, - "metadata": { - "chat_responses": [ - { - "text": "Thought: I need to find information about LLMs to answer this question.\n\nAction: wikipedia_search\nAction Input: {'question': 'LLMs'}\n\n", - "generation_info": null, - "type": "ChatGenerationChunk", - "message": { - "content": "Thought: I need to find information about LLMs to answer this question.\n\nAction: wikipedia_search\nAction Input: {'question': 'LLMs'}\n\n", - "additional_kwargs": {}, - "response_metadata": { - "finish_reason": "stop", - "model_name": "meta/llama-3.1-70b-instruct" - }, - "type": "AIMessageChunk", - "name": null, - "id": "run--258c056c-3431-44e5-9297-a8e11ddce1d1" - } - } - ], - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": null, - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "\nPrevious conversation history:\n\n\nQuestion: What are LLMs\n", - "output": "Thought: I need to find information about LLMs to answer this question.\n\nAction: wikipedia_search\nAction Input: {'question': 'LLMs'}\n\n", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 13405, - "completion_tokens": 595, - "total_tokens": 14000 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "258c056c-3431-44e5-9297-a8e11ddce1d1" - } - }, - { - "parent_id": "d0af7134-5652-4c5c-9195-364bf9d91682", - "function_ancestry": { - "function_id": "d0af7134-5652-4c5c-9195-364bf9d91682", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "TOOL_END", - "event_timestamp": 1760724055.18887, - "span_event_timestamp": 1760724050.512039, - "framework": "langchain", - "name": "wikipedia_search", - "tags": null, - "metadata": { - "chat_responses": null, - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": "\nA large language model (LLM) is a language model trained with self-supervised machine learning on a vast amount of text, designed for natural language processing tasks, especially language generation. The largest and most capable LLMs are generative pre-trained transformers (GPTs) and provide the core capabilities of chatbots such as ChatGPT, Gemini and Claude. LLMs can be fine-tuned for specific tasks or guided by prompt engineering. These models acquire predictive power regarding syntax, semantics, and ontologies inherent in human language corpora, but they also inherit inaccuracies and biases present in the data they are trained on.\nThey consist of billions to trillions of parameters and operate as general-purpose sequence models, generating, summarizing, translating, and reasoning over text. LLMs represent a significant new technology in their ability to generalize across tasks with minimal task-specific supervision, enabling capabilities like conversational agents, code generation, knowledge retrieval, and automated reasoning that previously required bespoke systems.\nLLMs evolved from earlier statistical and recurrent neural network approaches to language modeling. The transformer architecture, introduced in 2017, replaced recurrence with self-attention, allowing efficient parallelization, longer context handling, and scalable training on unprecedented data volumes. This innovation enabled models like GPT, BERT, and their successors, which demonstrated emergent behaviors at scale such as few-shot learning and compositional reasoning.\nReinforcement learning, particularly policy gradient algorithms, has been adapted to fine-tune LLMs for desired behaviors beyond raw next-token prediction. Reinforcement learning from human feedback (RLHF) applies these methods to optimize a policy, the LLM's output distribution, against reward signals derived from human or automated preference judgments. This has been critical for aligning model outputs with user expectations, improving factuality, reducing harmful responses, and enhancing task performance.\nBenchmark evaluations for LLMs have evolved from narrow linguistic assessments toward comprehensive, multi-task evaluations measuring reasoning, factual accuracy, alignment, and safety. Hill climbing, iteratively optimizing models against benchmarks, has emerged as a dominant strategy, producing rapid incremental performance gains but raising concerns of overfitting to benchmarks rather than achieving genuine generalization or robust capability improvements.\n\n\n== Applications in specific domains ==\nLarge language models have achieved impressive results across multiple specialized domains beyond dialogue, demonstrating capacity for knowledge transfer and domain-specific adaptation. \nIn software development, LLMs power intelligent development tools facilitating code completion, automated programming, and software engineering assistance without requiring special tokenization for programming languages. Models trained on mixed natural language and source code corpora demonstrate bidirectional proficiency, generating code from natural language specifications, translating between programming languages, and explaining code logic. \nIn computational biology, transformer-based architectures have revolutionized protein structure prediction and analysis, with embedding-based methods running an order of magnitude faster than MSA-based approaches while maintaining comparable accuracy. Meta Platforms' ESMFold methodology produces protein structure predictions at unprecedented scale, underpinning the ESM Atlas database containing 772 million metagenomic protein structures. LLM architectures have demonstrated capacity to design novel proteins with no natural analogues, suggesting potential applications in synthetic biology and biotechnology. In nucleic acid analysis, models effectively identify regulatory sequences, perform sequence classification, predict RNA-RNA interactions, and characterize RNA seconda\n\n\n---\n\n\nRetrieval-augmented generation (RAG) is a technique that enables large language models (LLMs) to retrieve and incorporate new information. With RAG, LLMs do not respond to user queries until they refer to a specified set of documents. These documents supplement information from the LLM's pre-existing training data. This allows LLMs to use domain-specific and/or updated information that is not available in the training data. For example, this helps LLM-based chatbots access internal company data or generate responses based on authoritative sources.\nRAG improves large language models (LLMs) by incorporating information retrieval before generating responses. Unlike traditional LLMs that rely on static training data, RAG pulls relevant text from databases, uploaded documents, or web sources. According to Ars Technica, \"RAG is a way of improving LLM performance, in essence by blending the LLM process with a web search or other document look-up process to help LLMs stick to the facts.\" This method helps reduce AI hallucinations, which have caused chatbots to describe policies that don't exist, or recommend nonexistent legal cases to lawyers that are looking for citations to support their arguments.\nRAG also reduces the need to retrain LLMs with new data, saving on computational and financial costs. Beyond efficiency gains, RAG also allows LLMs to include sources in their responses, so users can verify the cited sources. This provides greater transparency, as users can cross-check retrieved content to ensure accuracy and relevance.\nThe term RAG was first introduced in a 2020 research paper.\n\n\n== RAG and LLM Limitations ==\nLLMs can provide incorrect information. For example, when Google first demonstrated its LLM tool \"Google Bard\", the LLM provided incorrect information about the James Webb Space Telescope. This error contributed to a $100 billion decline in the company’s stock value. RAG is used to prevent these errors, but it does not solve all the problems. For example, LLMs can generate misinformation even when pulling from factually correct sources if they misinterpret the context. MIT Technology Review gives the example of an AI-generated response stating, \"The United States has had one Muslim president, Barack Hussein Obama.\" The model retrieved this from an academic book rhetorically titled Barack Hussein Obama: America’s First Muslim President? The LLM did not \"know\" or \"understand\" the context of the title, generating a false statement.\nLLMs with RAG are programmed to prioritize new information. This technique has been called \"prompt stuffing.\" Without prompt stuffing, the LLM's input is generated by a user; with prompt stuffing, additional relevant context is added to this input to guide the model’s response. This approach provides the LLM with key information early in the prompt, encouraging it to prioritize the supplied data over pre-existing training knowledge.\n\n\n== Process ==\nRetrieval-augmented generation (RAG) enhances large language models (LLMs) by incorporating an information-retrieval mechanism that allows models to access and utilize additional data beyond their original training set. Ars Technica notes that \"when new information becomes available, rather than having to retrain the model, all that’s needed is to augment the model’s external knowledge base with the updated information\" (\"augmentation\"). IBM states that \"in the generative phase, the LLM draws from the augmented prompt and its internal representation of its training data to synthesize an engaging answer tailored to the user in that instant\".\n\n\n=== RAG key stages ===\n\nTypically, the data to be referenced is converted into LLM embeddings, numerical representations in the form of a large vector space. RAG can be used on unstructured (usually text), semi-structured, or structured data (for example knowledge graphs). These embeddings are then stored in a vector database to allow for document retrieval.\nGiven a user query, a document retriever is first c\n\n\n---\n\n\nVicuna LLM is an omnibus large language model used in AI research. Its methodology is to enable the public at large to contrast and compare the accuracy of LLMs \"in the wild\" (an example of citizen science) and to vote on their output; a question-and-answer chat format is used. At the beginning of each round two LLM chatbots from a diverse pool of nine are presented randomly and anonymously, their identities only being revealed upon voting on their answers. The user has the option of either replaying (\"regenerating\") a round, or beginning an entirely fresh one with new LLMs. (The user also has the option of choosing which LLMs to do battle.) Based on Llama 2, it is an open source project, and it itself has become the subject of academic research in the burgeoning field. A non-commercial, public demo of the Vicuna-13b model is available to access using LMSYS.\n\n\n== References ==\n\n\n== External links ==\n[1] Test bed\nAI Image to Videos Generator\n", - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "{'question': 'LLMs'}", - "output": "\nA large language model (LLM) is a language model trained with self-supervised machine learning on a vast amount of text, designed for natural language processing tasks, especially language generation. The largest and most capable LLMs are generative pre-trained transformers (GPTs) and provide the core capabilities of chatbots such as ChatGPT, Gemini and Claude. LLMs can be fine-tuned for specific tasks or guided by prompt engineering. These models acquire predictive power regarding syntax, semantics, and ontologies inherent in human language corpora, but they also inherit inaccuracies and biases present in the data they are trained on.\nThey consist of billions to trillions of parameters and operate as general-purpose sequence models, generating, summarizing, translating, and reasoning over text. LLMs represent a significant new technology in their ability to generalize across tasks with minimal task-specific supervision, enabling capabilities like conversational agents, code generation, knowledge retrieval, and automated reasoning that previously required bespoke systems.\nLLMs evolved from earlier statistical and recurrent neural network approaches to language modeling. The transformer architecture, introduced in 2017, replaced recurrence with self-attention, allowing efficient parallelization, longer context handling, and scalable training on unprecedented data volumes. This innovation enabled models like GPT, BERT, and their successors, which demonstrated emergent behaviors at scale such as few-shot learning and compositional reasoning.\nReinforcement learning, particularly policy gradient algorithms, has been adapted to fine-tune LLMs for desired behaviors beyond raw next-token prediction. Reinforcement learning from human feedback (RLHF) applies these methods to optimize a policy, the LLM's output distribution, against reward signals derived from human or automated preference judgments. This has been critical for aligning model outputs with user expectations, improving factuality, reducing harmful responses, and enhancing task performance.\nBenchmark evaluations for LLMs have evolved from narrow linguistic assessments toward comprehensive, multi-task evaluations measuring reasoning, factual accuracy, alignment, and safety. Hill climbing, iteratively optimizing models against benchmarks, has emerged as a dominant strategy, producing rapid incremental performance gains but raising concerns of overfitting to benchmarks rather than achieving genuine generalization or robust capability improvements.\n\n\n== Applications in specific domains ==\nLarge language models have achieved impressive results across multiple specialized domains beyond dialogue, demonstrating capacity for knowledge transfer and domain-specific adaptation. \nIn software development, LLMs power intelligent development tools facilitating code completion, automated programming, and software engineering assistance without requiring special tokenization for programming languages. Models trained on mixed natural language and source code corpora demonstrate bidirectional proficiency, generating code from natural language specifications, translating between programming languages, and explaining code logic. \nIn computational biology, transformer-based architectures have revolutionized protein structure prediction and analysis, with embedding-based methods running an order of magnitude faster than MSA-based approaches while maintaining comparable accuracy. Meta Platforms' ESMFold methodology produces protein structure predictions at unprecedented scale, underpinning the ESM Atlas database containing 772 million metagenomic protein structures. LLM architectures have demonstrated capacity to design novel proteins with no natural analogues, suggesting potential applications in synthetic biology and biotechnology. In nucleic acid analysis, models effectively identify regulatory sequences, perform sequence classification, predict RNA-RNA interactions, and characterize RNA seconda\n\n\n---\n\n\nRetrieval-augmented generation (RAG) is a technique that enables large language models (LLMs) to retrieve and incorporate new information. With RAG, LLMs do not respond to user queries until they refer to a specified set of documents. These documents supplement information from the LLM's pre-existing training data. This allows LLMs to use domain-specific and/or updated information that is not available in the training data. For example, this helps LLM-based chatbots access internal company data or generate responses based on authoritative sources.\nRAG improves large language models (LLMs) by incorporating information retrieval before generating responses. Unlike traditional LLMs that rely on static training data, RAG pulls relevant text from databases, uploaded documents, or web sources. According to Ars Technica, \"RAG is a way of improving LLM performance, in essence by blending the LLM process with a web search or other document look-up process to help LLMs stick to the facts.\" This method helps reduce AI hallucinations, which have caused chatbots to describe policies that don't exist, or recommend nonexistent legal cases to lawyers that are looking for citations to support their arguments.\nRAG also reduces the need to retrain LLMs with new data, saving on computational and financial costs. Beyond efficiency gains, RAG also allows LLMs to include sources in their responses, so users can verify the cited sources. This provides greater transparency, as users can cross-check retrieved content to ensure accuracy and relevance.\nThe term RAG was first introduced in a 2020 research paper.\n\n\n== RAG and LLM Limitations ==\nLLMs can provide incorrect information. For example, when Google first demonstrated its LLM tool \"Google Bard\", the LLM provided incorrect information about the James Webb Space Telescope. This error contributed to a $100 billion decline in the company’s stock value. RAG is used to prevent these errors, but it does not solve all the problems. For example, LLMs can generate misinformation even when pulling from factually correct sources if they misinterpret the context. MIT Technology Review gives the example of an AI-generated response stating, \"The United States has had one Muslim president, Barack Hussein Obama.\" The model retrieved this from an academic book rhetorically titled Barack Hussein Obama: America’s First Muslim President? The LLM did not \"know\" or \"understand\" the context of the title, generating a false statement.\nLLMs with RAG are programmed to prioritize new information. This technique has been called \"prompt stuffing.\" Without prompt stuffing, the LLM's input is generated by a user; with prompt stuffing, additional relevant context is added to this input to guide the model’s response. This approach provides the LLM with key information early in the prompt, encouraging it to prioritize the supplied data over pre-existing training knowledge.\n\n\n== Process ==\nRetrieval-augmented generation (RAG) enhances large language models (LLMs) by incorporating an information-retrieval mechanism that allows models to access and utilize additional data beyond their original training set. Ars Technica notes that \"when new information becomes available, rather than having to retrain the model, all that’s needed is to augment the model’s external knowledge base with the updated information\" (\"augmentation\"). IBM states that \"in the generative phase, the LLM draws from the augmented prompt and its internal representation of its training data to synthesize an engaging answer tailored to the user in that instant\".\n\n\n=== RAG key stages ===\n\nTypically, the data to be referenced is converted into LLM embeddings, numerical representations in the form of a large vector space. RAG can be used on unstructured (usually text), semi-structured, or structured data (for example knowledge graphs). These embeddings are then stored in a vector database to allow for document retrieval.\nGiven a user query, a document retriever is first c\n\n\n---\n\n\nVicuna LLM is an omnibus large language model used in AI research. Its methodology is to enable the public at large to contrast and compare the accuracy of LLMs \"in the wild\" (an example of citizen science) and to vote on their output; a question-and-answer chat format is used. At the beginning of each round two LLM chatbots from a diverse pool of nine are presented randomly and anonymously, their identities only being revealed upon voting on their answers. The user has the option of either replaying (\"regenerating\") a round, or beginning an entirely fresh one with new LLMs. (The user also has the option of choosing which LLMs to do battle.) Based on Llama 2, it is an open source project, and it itself has become the subject of academic research in the burgeoning field. A non-commercial, public demo of the Vicuna-13b model is available to access using LMSYS.\n\n\n== References ==\n\n\n== External links ==\n[1] Test bed\nAI Image to Videos Generator\n", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 0, - "completion_tokens": 0, - "total_tokens": 0 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "a94fd566-3492-4c84-b036-1a1d60951b64" - } - }, - { - "parent_id": "d0af7134-5652-4c5c-9195-364bf9d91682", - "function_ancestry": { - "function_id": "d0af7134-5652-4c5c-9195-364bf9d91682", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "LLM_END", - "event_timestamp": 1760724057.838939, - "span_event_timestamp": 1760724055.19426, - "framework": "langchain", - "name": "meta/llama-3.1-70b-instruct", - "tags": null, - "metadata": { - "chat_responses": [ - { - "text": "Thought: I now know the final answer\n\nFinal Answer: LLMs, or Large Language Models, are a type of artificial intelligence designed to process and generate human-like language. They are trained on vast amounts of text data and can be fine-tuned for specific tasks or guided by prompt engineering. LLMs have a wide range of applications, including language translation, text summarization, and conversational agents. They can also be used for tasks such as code generation, knowledge retrieval, and automated reasoning. However, LLMs can also inherit inaccuracies and biases present in the data they are trained on, and can generate misinformation if they misinterpret the context of the information they retrieve.", - "generation_info": null, - "type": "ChatGenerationChunk", - "message": { - "content": "Thought: I now know the final answer\n\nFinal Answer: LLMs, or Large Language Models, are a type of artificial intelligence designed to process and generate human-like language. They are trained on vast amounts of text data and can be fine-tuned for specific tasks or guided by prompt engineering. LLMs have a wide range of applications, including language translation, text summarization, and conversational agents. They can also be used for tasks such as code generation, knowledge retrieval, and automated reasoning. However, LLMs can also inherit inaccuracies and biases present in the data they are trained on, and can generate misinformation if they misinterpret the context of the information they retrieve.", - "additional_kwargs": {}, - "response_metadata": { - "finish_reason": "stop", - "model_name": "meta/llama-3.1-70b-instruct" - }, - "type": "AIMessageChunk", - "name": null, - "id": "run--1f20bd2f-38c8-444f-872d-806b9b8034c6" - } - } - ], - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": null, - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "\nA large language model (LLM) is a language model trained with self-supervised machine learning on a vast amount of text, designed for natural language processing tasks, especially language generation. The largest and most capable LLMs are generative pre-trained transformers (GPTs) and provide the core capabilities of chatbots such as ChatGPT, Gemini and Claude. LLMs can be fine-tuned for specific tasks or guided by prompt engineering. These models acquire predictive power regarding syntax, semantics, and ontologies inherent in human language corpora, but they also inherit inaccuracies and biases present in the data they are trained on.\nThey consist of billions to trillions of parameters and operate as general-purpose sequence models, generating, summarizing, translating, and reasoning over text. LLMs represent a significant new technology in their ability to generalize across tasks with minimal task-specific supervision, enabling capabilities like conversational agents, code generation, knowledge retrieval, and automated reasoning that previously required bespoke systems.\nLLMs evolved from earlier statistical and recurrent neural network approaches to language modeling. The transformer architecture, introduced in 2017, replaced recurrence with self-attention, allowing efficient parallelization, longer context handling, and scalable training on unprecedented data volumes. This innovation enabled models like GPT, BERT, and their successors, which demonstrated emergent behaviors at scale such as few-shot learning and compositional reasoning.\nReinforcement learning, particularly policy gradient algorithms, has been adapted to fine-tune LLMs for desired behaviors beyond raw next-token prediction. Reinforcement learning from human feedback (RLHF) applies these methods to optimize a policy, the LLM's output distribution, against reward signals derived from human or automated preference judgments. This has been critical for aligning model outputs with user expectations, improving factuality, reducing harmful responses, and enhancing task performance.\nBenchmark evaluations for LLMs have evolved from narrow linguistic assessments toward comprehensive, multi-task evaluations measuring reasoning, factual accuracy, alignment, and safety. Hill climbing, iteratively optimizing models against benchmarks, has emerged as a dominant strategy, producing rapid incremental performance gains but raising concerns of overfitting to benchmarks rather than achieving genuine generalization or robust capability improvements.\n\n\n== Applications in specific domains ==\nLarge language models have achieved impressive results across multiple specialized domains beyond dialogue, demonstrating capacity for knowledge transfer and domain-specific adaptation. \nIn software development, LLMs power intelligent development tools facilitating code completion, automated programming, and software engineering assistance without requiring special tokenization for programming languages. Models trained on mixed natural language and source code corpora demonstrate bidirectional proficiency, generating code from natural language specifications, translating between programming languages, and explaining code logic. \nIn computational biology, transformer-based architectures have revolutionized protein structure prediction and analysis, with embedding-based methods running an order of magnitude faster than MSA-based approaches while maintaining comparable accuracy. Meta Platforms' ESMFold methodology produces protein structure predictions at unprecedented scale, underpinning the ESM Atlas database containing 772 million metagenomic protein structures. LLM architectures have demonstrated capacity to design novel proteins with no natural analogues, suggesting potential applications in synthetic biology and biotechnology. In nucleic acid analysis, models effectively identify regulatory sequences, perform sequence classification, predict RNA-RNA interactions, and characterize RNA seconda\n\n\n---\n\n\nRetrieval-augmented generation (RAG) is a technique that enables large language models (LLMs) to retrieve and incorporate new information. With RAG, LLMs do not respond to user queries until they refer to a specified set of documents. These documents supplement information from the LLM's pre-existing training data. This allows LLMs to use domain-specific and/or updated information that is not available in the training data. For example, this helps LLM-based chatbots access internal company data or generate responses based on authoritative sources.\nRAG improves large language models (LLMs) by incorporating information retrieval before generating responses. Unlike traditional LLMs that rely on static training data, RAG pulls relevant text from databases, uploaded documents, or web sources. According to Ars Technica, \"RAG is a way of improving LLM performance, in essence by blending the LLM process with a web search or other document look-up process to help LLMs stick to the facts.\" This method helps reduce AI hallucinations, which have caused chatbots to describe policies that don't exist, or recommend nonexistent legal cases to lawyers that are looking for citations to support their arguments.\nRAG also reduces the need to retrain LLMs with new data, saving on computational and financial costs. Beyond efficiency gains, RAG also allows LLMs to include sources in their responses, so users can verify the cited sources. This provides greater transparency, as users can cross-check retrieved content to ensure accuracy and relevance.\nThe term RAG was first introduced in a 2020 research paper.\n\n\n== RAG and LLM Limitations ==\nLLMs can provide incorrect information. For example, when Google first demonstrated its LLM tool \"Google Bard\", the LLM provided incorrect information about the James Webb Space Telescope. This error contributed to a $100 billion decline in the company’s stock value. RAG is used to prevent these errors, but it does not solve all the problems. For example, LLMs can generate misinformation even when pulling from factually correct sources if they misinterpret the context. MIT Technology Review gives the example of an AI-generated response stating, \"The United States has had one Muslim president, Barack Hussein Obama.\" The model retrieved this from an academic book rhetorically titled Barack Hussein Obama: America’s First Muslim President? The LLM did not \"know\" or \"understand\" the context of the title, generating a false statement.\nLLMs with RAG are programmed to prioritize new information. This technique has been called \"prompt stuffing.\" Without prompt stuffing, the LLM's input is generated by a user; with prompt stuffing, additional relevant context is added to this input to guide the model’s response. This approach provides the LLM with key information early in the prompt, encouraging it to prioritize the supplied data over pre-existing training knowledge.\n\n\n== Process ==\nRetrieval-augmented generation (RAG) enhances large language models (LLMs) by incorporating an information-retrieval mechanism that allows models to access and utilize additional data beyond their original training set. Ars Technica notes that \"when new information becomes available, rather than having to retrain the model, all that’s needed is to augment the model’s external knowledge base with the updated information\" (\"augmentation\"). IBM states that \"in the generative phase, the LLM draws from the augmented prompt and its internal representation of its training data to synthesize an engaging answer tailored to the user in that instant\".\n\n\n=== RAG key stages ===\n\nTypically, the data to be referenced is converted into LLM embeddings, numerical representations in the form of a large vector space. RAG can be used on unstructured (usually text), semi-structured, or structured data (for example knowledge graphs). These embeddings are then stored in a vector database to allow for document retrieval.\nGiven a user query, a document retriever is first c\n\n\n---\n\n\nVicuna LLM is an omnibus large language model used in AI research. Its methodology is to enable the public at large to contrast and compare the accuracy of LLMs \"in the wild\" (an example of citizen science) and to vote on their output; a question-and-answer chat format is used. At the beginning of each round two LLM chatbots from a diverse pool of nine are presented randomly and anonymously, their identities only being revealed upon voting on their answers. The user has the option of either replaying (\"regenerating\") a round, or beginning an entirely fresh one with new LLMs. (The user also has the option of choosing which LLMs to do battle.) Based on Llama 2, it is an open source project, and it itself has become the subject of academic research in the burgeoning field. A non-commercial, public demo of the Vicuna-13b model is available to access using LMSYS.\n\n\n== References ==\n\n\n== External links ==\n[1] Test bed\nAI Image to Videos Generator\n", - "output": "Thought: I now know the final answer\n\nFinal Answer: LLMs, or Large Language Models, are a type of artificial intelligence designed to process and generate human-like language. They are trained on vast amounts of text data and can be fine-tuned for specific tasks or guided by prompt engineering. LLMs have a wide range of applications, including language translation, text summarization, and conversational agents. They can also be used for tasks such as code generation, knowledge retrieval, and automated reasoning. However, LLMs can also inherit inaccuracies and biases present in the data they are trained on, and can generate misinformation if they misinterpret the context of the information they retrieve.", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 304560, - "completion_tokens": 9869, - "total_tokens": 314429 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "1f20bd2f-38c8-444f-872d-806b9b8034c6" - } - } - ], - "expected_intermediate_steps": [] - }, - { - "id": "Agoura Hills", - "question": "who was Djikstra?", - "answer": "Djikstra was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist. He is best known for his work on the shortest path problem and his development of Dijkstra's algorithm, which is used to find the shortest path between nodes in a weighted graph.", - "generated_answer": "Djikstra was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist who is best known for his work on the shortest path problem and the development of the first compiler for the programming language ALGOL 60. He was born in Rotterdam in 1930 and died in 2002. Djikstra's algorithm, which he developed in 1956, is a well-known algorithm for finding the shortest paths between nodes in a weighted graph.", - "intermediate_steps": [ - { - "parent_id": "9148cf54-3b69-4668-9035-82699a43a1d9", - "function_ancestry": { - "function_id": "9148cf54-3b69-4668-9035-82699a43a1d9", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "LLM_END", - "event_timestamp": 1760724050.443941, - "span_event_timestamp": 1760724049.509377, - "framework": "langchain", - "name": "meta/llama-3.1-70b-instruct", - "tags": null, - "metadata": { - "chat_responses": [ - { - "text": "Thought: I need to find information about Djikstra.\n\nAction: wikipedia_search\nAction Input: {\"question\": \"Djikstra\"}\n", - "generation_info": null, - "type": "ChatGenerationChunk", - "message": { - "content": "Thought: I need to find information about Djikstra.\n\nAction: wikipedia_search\nAction Input: {\"question\": \"Djikstra\"}\n", - "additional_kwargs": {}, - "response_metadata": { - "finish_reason": "stop", - "model_name": "meta/llama-3.1-70b-instruct" - }, - "type": "AIMessageChunk", - "name": null, - "id": "run--35a590c9-39db-4137-9047-fd36ba3a5066" - } - } - ], - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": null, - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "\nPrevious conversation history:\n\n\nQuestion: who was Djikstra?\n", - "output": "Thought: I need to find information about Djikstra.\n\nAction: wikipedia_search\nAction Input: {\"question\": \"Djikstra\"}\n", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 12672, - "completion_tokens": 528, - "total_tokens": 13200 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "35a590c9-39db-4137-9047-fd36ba3a5066" - } - }, - { - "parent_id": "9148cf54-3b69-4668-9035-82699a43a1d9", - "function_ancestry": { - "function_id": "9148cf54-3b69-4668-9035-82699a43a1d9", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "TOOL_END", - "event_timestamp": 1760724055.7042298, - "span_event_timestamp": 1760724050.450471, - "framework": "langchain", - "name": "wikipedia_search", - "tags": null, - "metadata": { - "chat_responses": null, - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": "\nEdsger Wybe Dijkstra ( DYKE-strə; Dutch: [ˈɛtsxər ˈʋibə ˈdɛikstraː] ; 11 May 1930 – 6 August 2002) was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist.\nBorn in Rotterdam in the Netherlands, Dijkstra studied mathematics and physics and then theoretical physics at the University of Leiden. Adriaan van Wijngaarden offered him a job as the first computer programmer in the Netherlands at the Mathematical Centre in Amsterdam, where he worked from 1952 until 1962. He formulated and solved the shortest path problem in 1956, and in 1960 developed the first compiler for the programming language ALGOL 60 in conjunction with colleague Jaap A. Zonneveld. In 1962 he moved to Eindhoven, and later to Nuenen, where he became a professor in the Mathematics Department at the Technische Hogeschool Eindhoven. In the late 1960s he built the THE multiprogramming system, which influenced the designs of subsequent systems through its use of software-based paged virtual memory. Dijkstra joined Burroughs Corporation as its sole research fellow in August 1973. The Burroughs years saw him at his most prolific in output of research articles. He wrote nearly 500 documents in the \"EWD\" series, most of them technical reports, for private circulation within a select group.\nDijkstra accepted the Schlumberger Centennial Chair in the Computer Science Department at the University of Texas at Austin in 1984, working in Austin, USA, until his retirement in November 1999. He and his wife returned from Austin to his original house in Nuenen, where he died on 6 August 2002 after a long struggle with cancer.\nHe received the 1972 Turing Award for fundamental contributions to developing structured programming languages. Shortly before his death, he received the ACM PODC Influential Paper Award in distributed computing for his work on self-stabilization of program computation. This annual award was renamed the Dijkstra Prize the following year, in his honor.\n\n\n== Life and works ==\n\n\n=== Early years ===\nDijkstra was born in Rotterdam. His father Douwe Wybe Dijkstra (1898–1970) was a chemist who studied with Frans Maurits Jaeger and was president of the Rotterdamsche Chemische Kring, the Rotterdam branch of the Royal Netherlands Chemical Society; he taught chemistry at a secondary school and was later its superintendent. His mother Brechtje Cornelia Kluijver (1900–1994) was a mathematician, but never had a formal job.\nDijkstra had considered a career in law and had hoped to represent the Netherlands in the United Nations. However, after graduating from Gymnasium Erasmianum in 1948, at his parents' suggestion he studied mathematics and physics and then theoretical physics at the University of Leiden.\nIn the early 1950s, electronic computers were a novelty. Dijkstra stumbled on his career by accident, and through his supervisor, Professor Johannes Haantjes, he met Adriaan van Wijngaarden, the director of the Computation Department at the Mathematical Centre in Amsterdam, who offered Dijkstra a job; he officially became the Netherlands' first \"programmer\" in March 1952.\nDijkstra remained committed to physics for some time, working on it in Leiden three days out of each week. With increasing exposure to computing, however, his focus began to shift. As he recalled:\n\nAfter having programmed for some three years, I had a discussion with A. van Wijngaarden, who was then my boss at the Mathematical Center in Amsterdam, a discussion for which I shall remain grateful to him as long as I live. The point was that I was supposed to study theoretical physics at the University of Leiden simultaneously, and as I found the two activities harder and harder to combine, I had to make up my mind, either to stop programming and become a real, respectable theoretical physicist, or to carry my study of physics to a formal completion only, with a minimum of effort, and to become....., yes what? A programmer? But was that a respectable profession? For aft\n\n\n---\n\n\nDijkstra's algorithm ( DYKE-strəz) is an algorithm for finding the shortest paths between nodes in a weighted graph, which may represent, for example, a road network. It was conceived by computer scientist Edsger W. Dijkstra in 1956 and published three years later.\nDijkstra's algorithm finds the shortest path from a given source node to every other node. It can be used to find the shortest path to a specific destination node, by terminating the algorithm after determining the shortest path to the destination node. For example, if the nodes of the graph represent cities, and the costs of edges represent the distances between pairs of cities connected by a direct road, then Dijkstra's algorithm can be used to find the shortest route between one city and all other cities. A common application of shortest path algorithms is network routing protocols, most notably IS-IS (Intermediate System to Intermediate System) and OSPF (Open Shortest Path First). It is also employed as a subroutine in algorithms such as Johnson's algorithm.\nThe algorithm uses a min-priority queue data structure for selecting the shortest paths known so far. Before more advanced priority queue structures were discovered, Dijkstra's original algorithm ran in \n \n \n \n Θ\n (\n \n |\n \n V\n \n \n |\n \n \n 2\n \n \n )\n \n \n {\\displaystyle \\Theta (|V|^{2})}\n \n time, where \n \n \n \n \n |\n \n V\n \n |\n \n \n \n {\\displaystyle |V|}\n \n is the number of nodes. Fredman & Tarjan 1984 proposed a Fibonacci heap priority queue to optimize the running time complexity to \n \n \n \n Θ\n (\n \n |\n \n E\n \n |\n \n +\n \n |\n \n V\n \n |\n \n log\n ⁡\n \n |\n \n V\n \n |\n \n )\n \n \n {\\displaystyle \\Theta (|E|+|V|\\log |V|)}\n \n. This is asymptotically the fastest known single-source shortest-path algorithm for arbitrary directed graphs with unbounded non-negative weights. However, specialized cases (such as bounded/integer weights, directed acyclic graphs etc.) can be improved further. If preprocessing is allowed, algorithms such as contraction hierarchies can be up to seven orders of magnitude faster.\nDijkstra's algorithm is commonly used on graphs where the edge weights are positive integers or real numbers. It can be generalized to any graph where the edge weights are partially ordered, provided the subsequent labels (a subsequent label is produced when traversing an edge) are monotonically non-decreasing.\nIn many fields, particularly artificial intelligence, Dijkstra's algorithm or a variant offers a uniform cost search and is formulated as an instance of the more general idea of best-first search.\n\n\n== History ==\nWhat is the shortest way to travel from Rotterdam to Groningen, in general: from given city to given city. It is the algorithm for the shortest path, which I designed in about twenty minutes. One morning I was shopping in Amsterdam with my young fiancée, and tired, we sat down on the café terrace to drink a cup of coffee and I was just thinking about whether I could do this, and I then designed the algorithm for the shortest path. As I said, it was a twenty-minute invention. In fact, it was published in '59, three years later. The publication is still readable, it is, in fact, quite nice. One of the reasons that it is so nice was that I designed it without pencil and paper. I learned later that one of the advantages of designing without pencil and paper is that you are almost forced to avoid all avoidable complexities. Eventually, that algorithm became to my great amazement, one of the cornerstones of my fame.\nDijkstra thought about the shortest path problem while working as a programmer a\n\n\n---\n\n\nThe 1960s (pronounced \"nineteen-sixties\", shortened to the \"'60s\" or the \"Sixties\") was the decade that began on January 1, 1960, and ended on December 31, 1969.\nWhile the achievements of humans being launched into space, orbiting Earth, performing spacewalks, and walking on the Moon extended exploration, the Sixties are known as the \"countercultural decade\" in the United States and other Western countries. There was a revolution in social norms, including religion, morality, law and order, clothing, music, drugs, dress, sexuality, formalities, civil rights, precepts of military duty, and schooling. Some people denounce the decade as one of irresponsible excess, flamboyance, the decay of social order, and the fall or relaxation of social taboos. A wide range of music emerged, from popular music inspired by and including the Beatles (in the United States known as the British Invasion) to the folk music revival, including the poetic lyrics of Bob Dylan. In the United States the Sixties were also called the \"cultural decade\" while in the United Kingdom (especially London) it was called the Swinging Sixties.\nThe United States had four presidents that served during the decade: Dwight D. Eisenhower, John F. Kennedy, Lyndon B. Johnson and Richard Nixon. Eisenhower was near the end of his term and left office in January 1961, and Kennedy was assassinated in 1963. Kennedy had wanted Keynesian and staunch anti-communist social reforms. These were passed under Johnson including civil rights for African Americans and health care for the elderly and the poor. Despite his large-scale Great Society programs, Johnson was increasingly disliked by the New Left at home and abroad. For some, May 1968 meant the end of traditional collective action and the beginning of a new era to be dominated mainly by the so-called new social movements.\nAfter the Cuban Revolution led by Fidel Castro, the United States attempted to depose the new leader by training Cuban exiles and invading the island of Cuba. This led to Cuba to ally itself to the Soviet Union, a hostile enemy to the United States, resulting in an international crisis when Cuba hosted Soviet ballistic missiles similar to Turkey hosting American missiles, which brought the possibility of causing World War III. However, after negotiations between the U.S. and the U.S.S.R, both agreed to withdraw their weapons averting potential nuclear warfare.\nAfter U.S. president Kennedy's assassination, direct tensions between the superpower countries of the United States and the Soviet Union developed into a contest with proxy wars, insurgency funding, puppet governments and other overall influence mainly in Latin America, Africa, and Asia. This \"Cold War\" dominated the world's geopolitics during the decade. Construction of the Berlin Wall by East Germany began in 1961. Africa was in a period of radical political change as 32 countries gained independence from their European colonial rulers. The heavy-handed American role in the Vietnam War lead to an anti-Vietnam War movement with outraged student protestors around the globe culminating in the protests of 1968.\nChina saw the end of Mao's Great Leap Forward in 1962 that led to many Chinese to die from the deadliest famine in human history and the start of the Cultural Revolution from 1966 to 1976. Its stated goal was to preserve Chinese communism by purging remnants of capitalist and traditional elements from Chinese society, leading to the arrests of many Chinese politicians, the killings of millions of civilians and ethnic minorities, and the destruction of many historical and cultural buildings, artifacts and materials all of which would last until the death of Mao Zedong.\nBy the end of the 1950s, post-war reconstructed Europe began an economic boom. World War II had closed up social classes with remnants of the old feudal gentry disappearing. A developing upper-working-class (a newly redefined middle-class) in Western Europe could afford a radio, televisio\n", - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "{'question': 'Djikstra'}", - "output": "\nEdsger Wybe Dijkstra ( DYKE-strə; Dutch: [ˈɛtsxər ˈʋibə ˈdɛikstraː] ; 11 May 1930 – 6 August 2002) was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist.\nBorn in Rotterdam in the Netherlands, Dijkstra studied mathematics and physics and then theoretical physics at the University of Leiden. Adriaan van Wijngaarden offered him a job as the first computer programmer in the Netherlands at the Mathematical Centre in Amsterdam, where he worked from 1952 until 1962. He formulated and solved the shortest path problem in 1956, and in 1960 developed the first compiler for the programming language ALGOL 60 in conjunction with colleague Jaap A. Zonneveld. In 1962 he moved to Eindhoven, and later to Nuenen, where he became a professor in the Mathematics Department at the Technische Hogeschool Eindhoven. In the late 1960s he built the THE multiprogramming system, which influenced the designs of subsequent systems through its use of software-based paged virtual memory. Dijkstra joined Burroughs Corporation as its sole research fellow in August 1973. The Burroughs years saw him at his most prolific in output of research articles. He wrote nearly 500 documents in the \"EWD\" series, most of them technical reports, for private circulation within a select group.\nDijkstra accepted the Schlumberger Centennial Chair in the Computer Science Department at the University of Texas at Austin in 1984, working in Austin, USA, until his retirement in November 1999. He and his wife returned from Austin to his original house in Nuenen, where he died on 6 August 2002 after a long struggle with cancer.\nHe received the 1972 Turing Award for fundamental contributions to developing structured programming languages. Shortly before his death, he received the ACM PODC Influential Paper Award in distributed computing for his work on self-stabilization of program computation. This annual award was renamed the Dijkstra Prize the following year, in his honor.\n\n\n== Life and works ==\n\n\n=== Early years ===\nDijkstra was born in Rotterdam. His father Douwe Wybe Dijkstra (1898–1970) was a chemist who studied with Frans Maurits Jaeger and was president of the Rotterdamsche Chemische Kring, the Rotterdam branch of the Royal Netherlands Chemical Society; he taught chemistry at a secondary school and was later its superintendent. His mother Brechtje Cornelia Kluijver (1900–1994) was a mathematician, but never had a formal job.\nDijkstra had considered a career in law and had hoped to represent the Netherlands in the United Nations. However, after graduating from Gymnasium Erasmianum in 1948, at his parents' suggestion he studied mathematics and physics and then theoretical physics at the University of Leiden.\nIn the early 1950s, electronic computers were a novelty. Dijkstra stumbled on his career by accident, and through his supervisor, Professor Johannes Haantjes, he met Adriaan van Wijngaarden, the director of the Computation Department at the Mathematical Centre in Amsterdam, who offered Dijkstra a job; he officially became the Netherlands' first \"programmer\" in March 1952.\nDijkstra remained committed to physics for some time, working on it in Leiden three days out of each week. With increasing exposure to computing, however, his focus began to shift. As he recalled:\n\nAfter having programmed for some three years, I had a discussion with A. van Wijngaarden, who was then my boss at the Mathematical Center in Amsterdam, a discussion for which I shall remain grateful to him as long as I live. The point was that I was supposed to study theoretical physics at the University of Leiden simultaneously, and as I found the two activities harder and harder to combine, I had to make up my mind, either to stop programming and become a real, respectable theoretical physicist, or to carry my study of physics to a formal completion only, with a minimum of effort, and to become....., yes what? A programmer? But was that a respectable profession? For aft\n\n\n---\n\n\nDijkstra's algorithm ( DYKE-strəz) is an algorithm for finding the shortest paths between nodes in a weighted graph, which may represent, for example, a road network. It was conceived by computer scientist Edsger W. Dijkstra in 1956 and published three years later.\nDijkstra's algorithm finds the shortest path from a given source node to every other node. It can be used to find the shortest path to a specific destination node, by terminating the algorithm after determining the shortest path to the destination node. For example, if the nodes of the graph represent cities, and the costs of edges represent the distances between pairs of cities connected by a direct road, then Dijkstra's algorithm can be used to find the shortest route between one city and all other cities. A common application of shortest path algorithms is network routing protocols, most notably IS-IS (Intermediate System to Intermediate System) and OSPF (Open Shortest Path First). It is also employed as a subroutine in algorithms such as Johnson's algorithm.\nThe algorithm uses a min-priority queue data structure for selecting the shortest paths known so far. Before more advanced priority queue structures were discovered, Dijkstra's original algorithm ran in \n \n \n \n Θ\n (\n \n |\n \n V\n \n \n |\n \n \n 2\n \n \n )\n \n \n {\\displaystyle \\Theta (|V|^{2})}\n \n time, where \n \n \n \n \n |\n \n V\n \n |\n \n \n \n {\\displaystyle |V|}\n \n is the number of nodes. Fredman & Tarjan 1984 proposed a Fibonacci heap priority queue to optimize the running time complexity to \n \n \n \n Θ\n (\n \n |\n \n E\n \n |\n \n +\n \n |\n \n V\n \n |\n \n log\n ⁡\n \n |\n \n V\n \n |\n \n )\n \n \n {\\displaystyle \\Theta (|E|+|V|\\log |V|)}\n \n. This is asymptotically the fastest known single-source shortest-path algorithm for arbitrary directed graphs with unbounded non-negative weights. However, specialized cases (such as bounded/integer weights, directed acyclic graphs etc.) can be improved further. If preprocessing is allowed, algorithms such as contraction hierarchies can be up to seven orders of magnitude faster.\nDijkstra's algorithm is commonly used on graphs where the edge weights are positive integers or real numbers. It can be generalized to any graph where the edge weights are partially ordered, provided the subsequent labels (a subsequent label is produced when traversing an edge) are monotonically non-decreasing.\nIn many fields, particularly artificial intelligence, Dijkstra's algorithm or a variant offers a uniform cost search and is formulated as an instance of the more general idea of best-first search.\n\n\n== History ==\nWhat is the shortest way to travel from Rotterdam to Groningen, in general: from given city to given city. It is the algorithm for the shortest path, which I designed in about twenty minutes. One morning I was shopping in Amsterdam with my young fiancée, and tired, we sat down on the café terrace to drink a cup of coffee and I was just thinking about whether I could do this, and I then designed the algorithm for the shortest path. As I said, it was a twenty-minute invention. In fact, it was published in '59, three years later. The publication is still readable, it is, in fact, quite nice. One of the reasons that it is so nice was that I designed it without pencil and paper. I learned later that one of the advantages of designing without pencil and paper is that you are almost forced to avoid all avoidable complexities. Eventually, that algorithm became to my great amazement, one of the cornerstones of my fame.\nDijkstra thought about the shortest path problem while working as a programmer a\n\n\n---\n\n\nThe 1960s (pronounced \"nineteen-sixties\", shortened to the \"'60s\" or the \"Sixties\") was the decade that began on January 1, 1960, and ended on December 31, 1969.\nWhile the achievements of humans being launched into space, orbiting Earth, performing spacewalks, and walking on the Moon extended exploration, the Sixties are known as the \"countercultural decade\" in the United States and other Western countries. There was a revolution in social norms, including religion, morality, law and order, clothing, music, drugs, dress, sexuality, formalities, civil rights, precepts of military duty, and schooling. Some people denounce the decade as one of irresponsible excess, flamboyance, the decay of social order, and the fall or relaxation of social taboos. A wide range of music emerged, from popular music inspired by and including the Beatles (in the United States known as the British Invasion) to the folk music revival, including the poetic lyrics of Bob Dylan. In the United States the Sixties were also called the \"cultural decade\" while in the United Kingdom (especially London) it was called the Swinging Sixties.\nThe United States had four presidents that served during the decade: Dwight D. Eisenhower, John F. Kennedy, Lyndon B. Johnson and Richard Nixon. Eisenhower was near the end of his term and left office in January 1961, and Kennedy was assassinated in 1963. Kennedy had wanted Keynesian and staunch anti-communist social reforms. These were passed under Johnson including civil rights for African Americans and health care for the elderly and the poor. Despite his large-scale Great Society programs, Johnson was increasingly disliked by the New Left at home and abroad. For some, May 1968 meant the end of traditional collective action and the beginning of a new era to be dominated mainly by the so-called new social movements.\nAfter the Cuban Revolution led by Fidel Castro, the United States attempted to depose the new leader by training Cuban exiles and invading the island of Cuba. This led to Cuba to ally itself to the Soviet Union, a hostile enemy to the United States, resulting in an international crisis when Cuba hosted Soviet ballistic missiles similar to Turkey hosting American missiles, which brought the possibility of causing World War III. However, after negotiations between the U.S. and the U.S.S.R, both agreed to withdraw their weapons averting potential nuclear warfare.\nAfter U.S. president Kennedy's assassination, direct tensions between the superpower countries of the United States and the Soviet Union developed into a contest with proxy wars, insurgency funding, puppet governments and other overall influence mainly in Latin America, Africa, and Asia. This \"Cold War\" dominated the world's geopolitics during the decade. Construction of the Berlin Wall by East Germany began in 1961. Africa was in a period of radical political change as 32 countries gained independence from their European colonial rulers. The heavy-handed American role in the Vietnam War lead to an anti-Vietnam War movement with outraged student protestors around the globe culminating in the protests of 1968.\nChina saw the end of Mao's Great Leap Forward in 1962 that led to many Chinese to die from the deadliest famine in human history and the start of the Cultural Revolution from 1966 to 1976. Its stated goal was to preserve Chinese communism by purging remnants of capitalist and traditional elements from Chinese society, leading to the arrests of many Chinese politicians, the killings of millions of civilians and ethnic minorities, and the destruction of many historical and cultural buildings, artifacts and materials all of which would last until the death of Mao Zedong.\nBy the end of the 1950s, post-war reconstructed Europe began an economic boom. World War II had closed up social classes with remnants of the old feudal gentry disappearing. A developing upper-working-class (a newly redefined middle-class) in Western Europe could afford a radio, televisio\n", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 0, - "completion_tokens": 0, - "total_tokens": 0 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "2b00c6d9-525f-4280-ae6e-7108fee8d743" - } - }, - { - "parent_id": "9148cf54-3b69-4668-9035-82699a43a1d9", - "function_ancestry": { - "function_id": "9148cf54-3b69-4668-9035-82699a43a1d9", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "LLM_END", - "event_timestamp": 1760724058.027028, - "span_event_timestamp": 1760724055.708524, - "framework": "langchain", - "name": "meta/llama-3.1-70b-instruct", - "tags": null, - "metadata": { - "chat_responses": [ - { - "text": "Thought: I now know the final answer\n\nFinal Answer: Djikstra was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist who is best known for his work on the shortest path problem and the development of the first compiler for the programming language ALGOL 60. He was born in Rotterdam in 1930 and died in 2002. Djikstra's algorithm, which he developed in 1956, is a well-known algorithm for finding the shortest paths between nodes in a weighted graph.", - "generation_info": null, - "type": "ChatGenerationChunk", - "message": { - "content": "Thought: I now know the final answer\n\nFinal Answer: Djikstra was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist who is best known for his work on the shortest path problem and the development of the first compiler for the programming language ALGOL 60. He was born in Rotterdam in 1930 and died in 2002. Djikstra's algorithm, which he developed in 1956, is a well-known algorithm for finding the shortest paths between nodes in a weighted graph.", - "additional_kwargs": {}, - "response_metadata": { - "finish_reason": "stop", - "model_name": "meta/llama-3.1-70b-instruct" - }, - "type": "AIMessageChunk", - "name": null, - "id": "run--ba028bcd-f43b-4c65-b382-987bfd63a70f" - } - } - ], - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": null, - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "\nEdsger Wybe Dijkstra ( DYKE-strə; Dutch: [ˈɛtsxər ˈʋibə ˈdɛikstraː] ; 11 May 1930 – 6 August 2002) was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist.\nBorn in Rotterdam in the Netherlands, Dijkstra studied mathematics and physics and then theoretical physics at the University of Leiden. Adriaan van Wijngaarden offered him a job as the first computer programmer in the Netherlands at the Mathematical Centre in Amsterdam, where he worked from 1952 until 1962. He formulated and solved the shortest path problem in 1956, and in 1960 developed the first compiler for the programming language ALGOL 60 in conjunction with colleague Jaap A. Zonneveld. In 1962 he moved to Eindhoven, and later to Nuenen, where he became a professor in the Mathematics Department at the Technische Hogeschool Eindhoven. In the late 1960s he built the THE multiprogramming system, which influenced the designs of subsequent systems through its use of software-based paged virtual memory. Dijkstra joined Burroughs Corporation as its sole research fellow in August 1973. The Burroughs years saw him at his most prolific in output of research articles. He wrote nearly 500 documents in the \"EWD\" series, most of them technical reports, for private circulation within a select group.\nDijkstra accepted the Schlumberger Centennial Chair in the Computer Science Department at the University of Texas at Austin in 1984, working in Austin, USA, until his retirement in November 1999. He and his wife returned from Austin to his original house in Nuenen, where he died on 6 August 2002 after a long struggle with cancer.\nHe received the 1972 Turing Award for fundamental contributions to developing structured programming languages. Shortly before his death, he received the ACM PODC Influential Paper Award in distributed computing for his work on self-stabilization of program computation. This annual award was renamed the Dijkstra Prize the following year, in his honor.\n\n\n== Life and works ==\n\n\n=== Early years ===\nDijkstra was born in Rotterdam. His father Douwe Wybe Dijkstra (1898–1970) was a chemist who studied with Frans Maurits Jaeger and was president of the Rotterdamsche Chemische Kring, the Rotterdam branch of the Royal Netherlands Chemical Society; he taught chemistry at a secondary school and was later its superintendent. His mother Brechtje Cornelia Kluijver (1900–1994) was a mathematician, but never had a formal job.\nDijkstra had considered a career in law and had hoped to represent the Netherlands in the United Nations. However, after graduating from Gymnasium Erasmianum in 1948, at his parents' suggestion he studied mathematics and physics and then theoretical physics at the University of Leiden.\nIn the early 1950s, electronic computers were a novelty. Dijkstra stumbled on his career by accident, and through his supervisor, Professor Johannes Haantjes, he met Adriaan van Wijngaarden, the director of the Computation Department at the Mathematical Centre in Amsterdam, who offered Dijkstra a job; he officially became the Netherlands' first \"programmer\" in March 1952.\nDijkstra remained committed to physics for some time, working on it in Leiden three days out of each week. With increasing exposure to computing, however, his focus began to shift. As he recalled:\n\nAfter having programmed for some three years, I had a discussion with A. van Wijngaarden, who was then my boss at the Mathematical Center in Amsterdam, a discussion for which I shall remain grateful to him as long as I live. The point was that I was supposed to study theoretical physics at the University of Leiden simultaneously, and as I found the two activities harder and harder to combine, I had to make up my mind, either to stop programming and become a real, respectable theoretical physicist, or to carry my study of physics to a formal completion only, with a minimum of effort, and to become....., yes what? A programmer? But was that a respectable profession? For aft\n\n\n---\n\n\nDijkstra's algorithm ( DYKE-strəz) is an algorithm for finding the shortest paths between nodes in a weighted graph, which may represent, for example, a road network. It was conceived by computer scientist Edsger W. Dijkstra in 1956 and published three years later.\nDijkstra's algorithm finds the shortest path from a given source node to every other node. It can be used to find the shortest path to a specific destination node, by terminating the algorithm after determining the shortest path to the destination node. For example, if the nodes of the graph represent cities, and the costs of edges represent the distances between pairs of cities connected by a direct road, then Dijkstra's algorithm can be used to find the shortest route between one city and all other cities. A common application of shortest path algorithms is network routing protocols, most notably IS-IS (Intermediate System to Intermediate System) and OSPF (Open Shortest Path First). It is also employed as a subroutine in algorithms such as Johnson's algorithm.\nThe algorithm uses a min-priority queue data structure for selecting the shortest paths known so far. Before more advanced priority queue structures were discovered, Dijkstra's original algorithm ran in \n \n \n \n Θ\n (\n \n |\n \n V\n \n \n |\n \n \n 2\n \n \n )\n \n \n {\\displaystyle \\Theta (|V|^{2})}\n \n time, where \n \n \n \n \n |\n \n V\n \n |\n \n \n \n {\\displaystyle |V|}\n \n is the number of nodes. Fredman & Tarjan 1984 proposed a Fibonacci heap priority queue to optimize the running time complexity to \n \n \n \n Θ\n (\n \n |\n \n E\n \n |\n \n +\n \n |\n \n V\n \n |\n \n log\n ⁡\n \n |\n \n V\n \n |\n \n )\n \n \n {\\displaystyle \\Theta (|E|+|V|\\log |V|)}\n \n. This is asymptotically the fastest known single-source shortest-path algorithm for arbitrary directed graphs with unbounded non-negative weights. However, specialized cases (such as bounded/integer weights, directed acyclic graphs etc.) can be improved further. If preprocessing is allowed, algorithms such as contraction hierarchies can be up to seven orders of magnitude faster.\nDijkstra's algorithm is commonly used on graphs where the edge weights are positive integers or real numbers. It can be generalized to any graph where the edge weights are partially ordered, provided the subsequent labels (a subsequent label is produced when traversing an edge) are monotonically non-decreasing.\nIn many fields, particularly artificial intelligence, Dijkstra's algorithm or a variant offers a uniform cost search and is formulated as an instance of the more general idea of best-first search.\n\n\n== History ==\nWhat is the shortest way to travel from Rotterdam to Groningen, in general: from given city to given city. It is the algorithm for the shortest path, which I designed in about twenty minutes. One morning I was shopping in Amsterdam with my young fiancée, and tired, we sat down on the café terrace to drink a cup of coffee and I was just thinking about whether I could do this, and I then designed the algorithm for the shortest path. As I said, it was a twenty-minute invention. In fact, it was published in '59, three years later. The publication is still readable, it is, in fact, quite nice. One of the reasons that it is so nice was that I designed it without pencil and paper. I learned later that one of the advantages of designing without pencil and paper is that you are almost forced to avoid all avoidable complexities. Eventually, that algorithm became to my great amazement, one of the cornerstones of my fame.\nDijkstra thought about the shortest path problem while working as a programmer a\n\n\n---\n\n\nThe 1960s (pronounced \"nineteen-sixties\", shortened to the \"'60s\" or the \"Sixties\") was the decade that began on January 1, 1960, and ended on December 31, 1969.\nWhile the achievements of humans being launched into space, orbiting Earth, performing spacewalks, and walking on the Moon extended exploration, the Sixties are known as the \"countercultural decade\" in the United States and other Western countries. There was a revolution in social norms, including religion, morality, law and order, clothing, music, drugs, dress, sexuality, formalities, civil rights, precepts of military duty, and schooling. Some people denounce the decade as one of irresponsible excess, flamboyance, the decay of social order, and the fall or relaxation of social taboos. A wide range of music emerged, from popular music inspired by and including the Beatles (in the United States known as the British Invasion) to the folk music revival, including the poetic lyrics of Bob Dylan. In the United States the Sixties were also called the \"cultural decade\" while in the United Kingdom (especially London) it was called the Swinging Sixties.\nThe United States had four presidents that served during the decade: Dwight D. Eisenhower, John F. Kennedy, Lyndon B. Johnson and Richard Nixon. Eisenhower was near the end of his term and left office in January 1961, and Kennedy was assassinated in 1963. Kennedy had wanted Keynesian and staunch anti-communist social reforms. These were passed under Johnson including civil rights for African Americans and health care for the elderly and the poor. Despite his large-scale Great Society programs, Johnson was increasingly disliked by the New Left at home and abroad. For some, May 1968 meant the end of traditional collective action and the beginning of a new era to be dominated mainly by the so-called new social movements.\nAfter the Cuban Revolution led by Fidel Castro, the United States attempted to depose the new leader by training Cuban exiles and invading the island of Cuba. This led to Cuba to ally itself to the Soviet Union, a hostile enemy to the United States, resulting in an international crisis when Cuba hosted Soviet ballistic missiles similar to Turkey hosting American missiles, which brought the possibility of causing World War III. However, after negotiations between the U.S. and the U.S.S.R, both agreed to withdraw their weapons averting potential nuclear warfare.\nAfter U.S. president Kennedy's assassination, direct tensions between the superpower countries of the United States and the Soviet Union developed into a contest with proxy wars, insurgency funding, puppet governments and other overall influence mainly in Latin America, Africa, and Asia. This \"Cold War\" dominated the world's geopolitics during the decade. Construction of the Berlin Wall by East Germany began in 1961. Africa was in a period of radical political change as 32 countries gained independence from their European colonial rulers. The heavy-handed American role in the Vietnam War lead to an anti-Vietnam War movement with outraged student protestors around the globe culminating in the protests of 1968.\nChina saw the end of Mao's Great Leap Forward in 1962 that led to many Chinese to die from the deadliest famine in human history and the start of the Cultural Revolution from 1966 to 1976. Its stated goal was to preserve Chinese communism by purging remnants of capitalist and traditional elements from Chinese society, leading to the arrests of many Chinese politicians, the killings of millions of civilians and ethnic minorities, and the destruction of many historical and cultural buildings, artifacts and materials all of which would last until the death of Mao Zedong.\nBy the end of the 1950s, post-war reconstructed Europe began an economic boom. World War II had closed up social classes with remnants of the old feudal gentry disappearing. A developing upper-working-class (a newly redefined middle-class) in Western Europe could afford a radio, televisio\n", - "output": "Thought: I now know the final answer\n\nFinal Answer: Djikstra was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist who is best known for his work on the shortest path problem and the development of the first compiler for the programming language ALGOL 60. He was born in Rotterdam in 1930 and died in 2002. Djikstra's algorithm, which he developed in 1956, is a well-known algorithm for finding the shortest paths between nodes in a weighted graph.", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 331446, - "completion_tokens": 6104, - "total_tokens": 337550 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "ba028bcd-f43b-4c65-b382-987bfd63a70f" - } - } - ], - "expected_intermediate_steps": [] - }, - { - "id": "Alameda", - "question": "what is the goldilocks zone?", - "answer": "The Goldilocks zone, also known as the habitable zone, is the region around a star where temperatures are just right for liquid water to exist on a planet's surface. It is called the Goldilocks zone because it is neither too hot nor too cold, but just right, much like the porridge in the children's story \"Goldilocks and the Three Bears\".", - "generated_answer": "The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.", - "intermediate_steps": [ - { - "parent_id": "12a0e59c-25d7-4a61-8361-11b996470586", - "function_ancestry": { - "function_id": "12a0e59c-25d7-4a61-8361-11b996470586", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "LLM_END", - "event_timestamp": 1760724050.536854, - "span_event_timestamp": 1760724049.50966, - "framework": "langchain", - "name": "meta/llama-3.1-70b-instruct", - "tags": null, - "metadata": { - "chat_responses": [ - { - "text": "Thought: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.\n\n", - "generation_info": null, - "type": "ChatGenerationChunk", - "message": { - "content": "Thought: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.\n\n", - "additional_kwargs": {}, - "response_metadata": { - "finish_reason": "stop", - "model_name": "meta/llama-3.1-70b-instruct" - }, - "type": "AIMessageChunk", - "name": null, - "id": "run--66d03d38-f1ae-4b0c-b3f1-b4ad69be395d" - } - } - ], - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": null, - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "\nPrevious conversation history:\n\n\nQuestion: what is the goldilocks zone?\n", - "output": "Thought: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.\n\n", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 14668, - "completion_tokens": 703, - "total_tokens": 15371 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "66d03d38-f1ae-4b0c-b3f1-b4ad69be395d" - } - }, - { - "parent_id": "12a0e59c-25d7-4a61-8361-11b996470586", - "function_ancestry": { - "function_id": "12a0e59c-25d7-4a61-8361-11b996470586", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "LLM_END", - "event_timestamp": 1760724051.740033, - "span_event_timestamp": 1760724050.53839, - "framework": "langchain", - "name": "meta/llama-3.1-70b-instruct", - "tags": null, - "metadata": { - "chat_responses": [ - { - "text": "Thought: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.\nAction: wikipedia_search\nAction Input: {\"question\": \"Goldilocks zone\"}\n", - "generation_info": null, - "type": "ChatGenerationChunk", - "message": { - "content": "Thought: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.\nAction: wikipedia_search\nAction Input: {\"question\": \"Goldilocks zone\"}\n", - "additional_kwargs": {}, - "response_metadata": { - "finish_reason": "stop", - "model_name": "meta/llama-3.1-70b-instruct" - }, - "type": "AIMessageChunk", - "name": null, - "id": "run--1a28a8b0-3f19-493b-8263-4a400005412e" - } - } - ], - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": null, - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "Invalid Format: Missing 'Action:' after 'Thought:'", - "output": "Thought: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.\nAction: wikipedia_search\nAction Input: {\"question\": \"Goldilocks zone\"}\n", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 24255, - "completion_tokens": 1485, - "total_tokens": 25740 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "1a28a8b0-3f19-493b-8263-4a400005412e" - } - }, - { - "parent_id": "12a0e59c-25d7-4a61-8361-11b996470586", - "function_ancestry": { - "function_id": "12a0e59c-25d7-4a61-8361-11b996470586", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "TOOL_END", - "event_timestamp": 1760724057.388151, - "span_event_timestamp": 1760724051.742968, - "framework": "langchain", - "name": "wikipedia_search", - "tags": null, - "metadata": { - "chat_responses": null, - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": "\nIn astronomy and astrobiology, the habitable zone (HZ), the circumstellar habitable zone (CHZ), the Goldilocks zone, is the range of orbits around a star within which a planetary surface can support liquid water given sufficient atmospheric pressure. The bounds of the HZ are based on Earth's position in the Solar System and the amount of radiant energy it receives from the Sun. Due to the importance of liquid water to Earth's biosphere, the nature of the HZ and the objects within it may be instrumental in determining the scope and distribution of planets capable of supporting Earth-like extraterrestrial life and intelligence. As such, it is considered by many to be a major factor of planetary habitability, and the most likely place to find extraterrestrial liquid water and biosignatures elsewhere in the universe.\nThe habitable zone is also called the Goldilocks zone, a metaphor, allusion and antonomasia of the children's fairy tale of \"Goldilocks and the Three Bears\", in which a little girl chooses from sets of three items, rejecting the ones that are too extreme (large or small, hot or cold, etc.), and settling on the one in the middle, which is \"just right\".\nSince the concept was first presented many stars have been confirmed to possess an HZ planet, including some systems that consist of multiple HZ planets. Most such planets, being either super-Earths or gas giants, are more massive than Earth, because massive planets are easier to detect. On November 4, 2013, astronomers reported, based on Kepler space telescope data, that there could be as many as 40 billion Earth-sized planets orbiting in the habitable zones of Sun-like stars and red dwarfs in the Milky Way. About 11 billion of these may be orbiting Sun-like stars. Proxima Centauri b, located about 4.2 light-years (1.3 parsecs) from Earth in the constellation of Centaurus, is the nearest known exoplanet, and is orbiting in the habitable zone of its star. The HZ is also of particular interest to the emerging field of habitability of natural satellites because planetary mass moons in the HZ might outnumber planets.\nIn subsequent decades, the HZ concept began to be challenged as a primary criterion for life, so the concept is still evolving. Since the discovery of evidence for extraterrestrial liquid water, substantial quantities of it are now thought to occur outside the circumstellar habitable zone. The concept of deep biospheres, like Earth's, that exist independently of stellar energy, are now generally accepted in astrobiology given the large amount of liquid water known to exist in lithospheres and asthenospheres of the Solar System. Sustained by other energy sources, such as tidal heating or radioactive decay or pressurized by non-atmospheric means, liquid water may be found even on rogue planets, or their moons. Liquid water can also exist at a wider range of temperatures and pressures as a solution, for example with sodium chlorides in seawater on Earth, chlorides and sulphates on equatorial Mars, or ammoniates, due to its different colligative properties. In addition, other circumstellar zones, where non-water solvents favorable to hypothetical life based on alternative biochemistries could exist in liquid form at the surface, have been proposed.\n\n\n== History ==\n\nAn estimate of the range of distances from the Sun allowing the existence of liquid water appears in Newton's Principia (Book III, Section 1, corol. 4). The philosopher Louis Claude de Saint-Martin speculated in his 1802 work Man: His True Nature and Ministry, \"... we may presume, that, being susceptible of vegetation, it [the Earth] has been placed, in the series of planets, in the rank which was necessary, and at exactly the right distance from the sun, to accomplish its secondary object of vegetation; and from this we might infer that the other planets are either too near or too remote from the sun, to vegetate.\"\nPossibly the earliest use of the term habitable zone was in 1913, by Edward Maunder in h\n\n\n---\n\n\nThe Goldilocks principle is named by analogy to the children's story \"Goldilocks and the Three Bears\", in which a young girl named Goldilocks tastes three different bowls of porridge and finds she prefers porridge that is neither too hot nor too cold but has just the right temperature. The concept of \"just the right amount\" is easily understood and applied to a wide range of disciplines, including developmental psychology, biology, astronomy, economics and engineering.\n\n\n== Applications ==\n\nIn cognitive science and developmental psychology, the Goldilocks effect or principle refers to an infant's preference to attend events that are neither too simple nor too complex according to their current representation of the world. This effect was observed in infants, who are less likely to look away from a visual sequence when the current event is moderately probable, as measured by an idealized learning model.\nIn astrobiology, the Goldilocks zone refers to the habitable zone around a star. As Stephen Hawking put it, \"Like Goldilocks, the development of intelligent life requires that planetary temperatures be 'just right'\". The Rare Earth hypothesis uses the Goldilocks principle in the argument that a planet must be neither too far away from nor too close to a star and galactic centre to support life, while either extreme would result in a planet incapable of supporting life. Such a planet is colloquially called a \"Goldilocks planet\". Paul Davies has argued for the extension of the principle to cover the selection of our universe from a (postulated) multiverse: \"Observers arise only in those universes where, like Goldilocks' porridge, things are by accident 'just right'\".\nIn medicine, it can refer to a drug that can hold both antagonist (inhibitory) and agonist (excitatory) properties. For example, the antipsychotic Aripiprazole causes not only antagonism of dopamine D2 receptors in areas such as the mesolimbic area of the brain (which shows increased dopamine activity in psychosis) but also agonism of dopamine receptors in areas of dopamine hypoactivity, such as the mesocortical area.\nIn economics, a Goldilocks economy sustains moderate economic growth and low inflation, which allows a market-friendly monetary policy. Goldilocks pricing, also known as good–better–best pricing, is a marketing strategy that uses product differentiation to offer three versions of a product to corner different parts of the market: a high-end version, a middle version, and a low-end version.\nIn communication, the Goldilocks principle describes the amount, type, and detail of communication necessary in a system to maximise effectiveness while minimising redundancy and excessive scope on the \"too much\" side and avoiding incomplete or inaccurate communication on the \"too little\" side.\nIn statistics, the \"Goldilocks Fit\" references a linear regression model that represents the perfect flexibility to reduce the error caused by bias and variance.\nIn the design sprint, the \"Goldilocks Quality\" means to create a prototype with just enough quality to evoke honest reactions from customers.\nIn machine learning, the Goldilocks learning rate is the learning rate that results in an algorithm taking the fewest steps to achieve minimal loss. Algorithms with a learning rate that is too large often fail to converge at all, while those with too small a learning rate take too long to converge.\n\n\n== See also ==\nCosmic Jackpot\nFrugality\nAnthropic principle\nBig History\nFine-tuned universe\nGolden mean (philosophy)\nAnna Karenina principle\n\n\n== References ==\n\n\n---\n\n\n\"Goldilocks and the Three Bears\" is a traditional classic 19th-century British fairy tale of which three versions exist. The original version of the tale tells of an impudent and bad old woman who enters the forest home of three anthropomorphic bachelor bears while they are away. She eats some of their porridge, sits down on one of their chairs, breaks it, and sleeps in one of their beds. When the bears return and discover her, she wakes up, jumps out of the window, and is never seen again. The second version replaces the old woman with a young, naive, blonde-haired girl named Goldilocks, and the third and by far best-known version replaces the bachelor bears with a family of three: a father bear, a mother bear, and a baby bear.\nThe story has elicited various interpretations and has been adapted to film, opera, and other media. \"Goldilocks and the Three Bears\" is one of the most popular fairy tales in the English language.\n\n\n== Southey's version ==\nIn Robert Southey's story, three male bears—a small bear, a medium bear, and a large bear—live together in a house in the woods. Southey describes them as good-natured, trusting, harmless, clean, and hospitable. Each bear has his own bowl of porridge, his own chair, and his own bed. One day, while their hot porridge is cooling, they wander through the woods. An old woman—described throughout the story as insolent, mean, swearing, ugly, dirty, and a vagabond who belongs in a reformatory—discovers the bears' home. She looks through the window and keyhole, opens the latch, and, after ensuring that no one is home, enters. The old woman tries the porridge of the big bear, which is too hot for her; then she tries the porridge of the middle bear, which is too cold; finally, she eats the porridge of the smallest bear. Next, she sits down in the chair of the big bear, which is too hard for her, and then in the chair of the middle bear, which is too soft. When she sits in the chair of the small bear, it breaks as a result. Continuing her exploration of the house, she finds the bears' beds. After trying the big bear's bed and the middle bear's bed and finding them unsuitable, she goes to sleep in the smallest bear's bed. When the bears return home, the story reaches its climax. One after another, they discover that someone has eaten their porridge, has sat in their chairs, and has lain in their beds. The smallest bear finds the old woman in his bed and exclaims, \"Someone has lain down in my little bed—and there she is still!\" Startled, the old woman jumps out of the window, runs away, and is never seen again.\n\n\n== Literary elements ==\nThe story makes extensive use of the literary rule of three, featuring three chairs, three bowls of porridge, three beds, and the three title characters who live in the house. There are also three sequences of the bears discovering in turn that someone has been eating from their porridge, sitting in their chairs, and finally, lying in their beds, at which point the climax of Goldilocks being discovered occurs. This follows three earlier sequences of Goldilocks trying the bowls of porridge, chairs, and beds successively, each time finding the third \"just right\". Author Christopher Booker characterises this as the \"dialectical three\" where \"the first is wrong in one way, the second in another or opposite way, and only the third, in the middle, is just right\". Booker continues: \"This idea that the way forward lies in finding an exact middle path between opposites is of extraordinary importance in storytelling\".\nThis concept has spread across many other disciplines, particularly developmental psychology, biology, economics, Buddhism, and engineering, where it is called the \"Goldilocks principle\". In planetary astronomy, a planet orbiting its sun at just the right distance for liquid water to exist on its surface, neither too hot nor too cold, is referred to as being in the \"Goldilocks zone\". As Stephen Hawking put it, \"Like Goldilocks, the development of intelligent \n", - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "{'question': 'Goldilocks zone'}", - "output": "\nIn astronomy and astrobiology, the habitable zone (HZ), the circumstellar habitable zone (CHZ), the Goldilocks zone, is the range of orbits around a star within which a planetary surface can support liquid water given sufficient atmospheric pressure. The bounds of the HZ are based on Earth's position in the Solar System and the amount of radiant energy it receives from the Sun. Due to the importance of liquid water to Earth's biosphere, the nature of the HZ and the objects within it may be instrumental in determining the scope and distribution of planets capable of supporting Earth-like extraterrestrial life and intelligence. As such, it is considered by many to be a major factor of planetary habitability, and the most likely place to find extraterrestrial liquid water and biosignatures elsewhere in the universe.\nThe habitable zone is also called the Goldilocks zone, a metaphor, allusion and antonomasia of the children's fairy tale of \"Goldilocks and the Three Bears\", in which a little girl chooses from sets of three items, rejecting the ones that are too extreme (large or small, hot or cold, etc.), and settling on the one in the middle, which is \"just right\".\nSince the concept was first presented many stars have been confirmed to possess an HZ planet, including some systems that consist of multiple HZ planets. Most such planets, being either super-Earths or gas giants, are more massive than Earth, because massive planets are easier to detect. On November 4, 2013, astronomers reported, based on Kepler space telescope data, that there could be as many as 40 billion Earth-sized planets orbiting in the habitable zones of Sun-like stars and red dwarfs in the Milky Way. About 11 billion of these may be orbiting Sun-like stars. Proxima Centauri b, located about 4.2 light-years (1.3 parsecs) from Earth in the constellation of Centaurus, is the nearest known exoplanet, and is orbiting in the habitable zone of its star. The HZ is also of particular interest to the emerging field of habitability of natural satellites because planetary mass moons in the HZ might outnumber planets.\nIn subsequent decades, the HZ concept began to be challenged as a primary criterion for life, so the concept is still evolving. Since the discovery of evidence for extraterrestrial liquid water, substantial quantities of it are now thought to occur outside the circumstellar habitable zone. The concept of deep biospheres, like Earth's, that exist independently of stellar energy, are now generally accepted in astrobiology given the large amount of liquid water known to exist in lithospheres and asthenospheres of the Solar System. Sustained by other energy sources, such as tidal heating or radioactive decay or pressurized by non-atmospheric means, liquid water may be found even on rogue planets, or their moons. Liquid water can also exist at a wider range of temperatures and pressures as a solution, for example with sodium chlorides in seawater on Earth, chlorides and sulphates on equatorial Mars, or ammoniates, due to its different colligative properties. In addition, other circumstellar zones, where non-water solvents favorable to hypothetical life based on alternative biochemistries could exist in liquid form at the surface, have been proposed.\n\n\n== History ==\n\nAn estimate of the range of distances from the Sun allowing the existence of liquid water appears in Newton's Principia (Book III, Section 1, corol. 4). The philosopher Louis Claude de Saint-Martin speculated in his 1802 work Man: His True Nature and Ministry, \"... we may presume, that, being susceptible of vegetation, it [the Earth] has been placed, in the series of planets, in the rank which was necessary, and at exactly the right distance from the sun, to accomplish its secondary object of vegetation; and from this we might infer that the other planets are either too near or too remote from the sun, to vegetate.\"\nPossibly the earliest use of the term habitable zone was in 1913, by Edward Maunder in h\n\n\n---\n\n\nThe Goldilocks principle is named by analogy to the children's story \"Goldilocks and the Three Bears\", in which a young girl named Goldilocks tastes three different bowls of porridge and finds she prefers porridge that is neither too hot nor too cold but has just the right temperature. The concept of \"just the right amount\" is easily understood and applied to a wide range of disciplines, including developmental psychology, biology, astronomy, economics and engineering.\n\n\n== Applications ==\n\nIn cognitive science and developmental psychology, the Goldilocks effect or principle refers to an infant's preference to attend events that are neither too simple nor too complex according to their current representation of the world. This effect was observed in infants, who are less likely to look away from a visual sequence when the current event is moderately probable, as measured by an idealized learning model.\nIn astrobiology, the Goldilocks zone refers to the habitable zone around a star. As Stephen Hawking put it, \"Like Goldilocks, the development of intelligent life requires that planetary temperatures be 'just right'\". The Rare Earth hypothesis uses the Goldilocks principle in the argument that a planet must be neither too far away from nor too close to a star and galactic centre to support life, while either extreme would result in a planet incapable of supporting life. Such a planet is colloquially called a \"Goldilocks planet\". Paul Davies has argued for the extension of the principle to cover the selection of our universe from a (postulated) multiverse: \"Observers arise only in those universes where, like Goldilocks' porridge, things are by accident 'just right'\".\nIn medicine, it can refer to a drug that can hold both antagonist (inhibitory) and agonist (excitatory) properties. For example, the antipsychotic Aripiprazole causes not only antagonism of dopamine D2 receptors in areas such as the mesolimbic area of the brain (which shows increased dopamine activity in psychosis) but also agonism of dopamine receptors in areas of dopamine hypoactivity, such as the mesocortical area.\nIn economics, a Goldilocks economy sustains moderate economic growth and low inflation, which allows a market-friendly monetary policy. Goldilocks pricing, also known as good–better–best pricing, is a marketing strategy that uses product differentiation to offer three versions of a product to corner different parts of the market: a high-end version, a middle version, and a low-end version.\nIn communication, the Goldilocks principle describes the amount, type, and detail of communication necessary in a system to maximise effectiveness while minimising redundancy and excessive scope on the \"too much\" side and avoiding incomplete or inaccurate communication on the \"too little\" side.\nIn statistics, the \"Goldilocks Fit\" references a linear regression model that represents the perfect flexibility to reduce the error caused by bias and variance.\nIn the design sprint, the \"Goldilocks Quality\" means to create a prototype with just enough quality to evoke honest reactions from customers.\nIn machine learning, the Goldilocks learning rate is the learning rate that results in an algorithm taking the fewest steps to achieve minimal loss. Algorithms with a learning rate that is too large often fail to converge at all, while those with too small a learning rate take too long to converge.\n\n\n== See also ==\nCosmic Jackpot\nFrugality\nAnthropic principle\nBig History\nFine-tuned universe\nGolden mean (philosophy)\nAnna Karenina principle\n\n\n== References ==\n\n\n---\n\n\n\"Goldilocks and the Three Bears\" is a traditional classic 19th-century British fairy tale of which three versions exist. The original version of the tale tells of an impudent and bad old woman who enters the forest home of three anthropomorphic bachelor bears while they are away. She eats some of their porridge, sits down on one of their chairs, breaks it, and sleeps in one of their beds. When the bears return and discover her, she wakes up, jumps out of the window, and is never seen again. The second version replaces the old woman with a young, naive, blonde-haired girl named Goldilocks, and the third and by far best-known version replaces the bachelor bears with a family of three: a father bear, a mother bear, and a baby bear.\nThe story has elicited various interpretations and has been adapted to film, opera, and other media. \"Goldilocks and the Three Bears\" is one of the most popular fairy tales in the English language.\n\n\n== Southey's version ==\nIn Robert Southey's story, three male bears—a small bear, a medium bear, and a large bear—live together in a house in the woods. Southey describes them as good-natured, trusting, harmless, clean, and hospitable. Each bear has his own bowl of porridge, his own chair, and his own bed. One day, while their hot porridge is cooling, they wander through the woods. An old woman—described throughout the story as insolent, mean, swearing, ugly, dirty, and a vagabond who belongs in a reformatory—discovers the bears' home. She looks through the window and keyhole, opens the latch, and, after ensuring that no one is home, enters. The old woman tries the porridge of the big bear, which is too hot for her; then she tries the porridge of the middle bear, which is too cold; finally, she eats the porridge of the smallest bear. Next, she sits down in the chair of the big bear, which is too hard for her, and then in the chair of the middle bear, which is too soft. When she sits in the chair of the small bear, it breaks as a result. Continuing her exploration of the house, she finds the bears' beds. After trying the big bear's bed and the middle bear's bed and finding them unsuitable, she goes to sleep in the smallest bear's bed. When the bears return home, the story reaches its climax. One after another, they discover that someone has eaten their porridge, has sat in their chairs, and has lain in their beds. The smallest bear finds the old woman in his bed and exclaims, \"Someone has lain down in my little bed—and there she is still!\" Startled, the old woman jumps out of the window, runs away, and is never seen again.\n\n\n== Literary elements ==\nThe story makes extensive use of the literary rule of three, featuring three chairs, three bowls of porridge, three beds, and the three title characters who live in the house. There are also three sequences of the bears discovering in turn that someone has been eating from their porridge, sitting in their chairs, and finally, lying in their beds, at which point the climax of Goldilocks being discovered occurs. This follows three earlier sequences of Goldilocks trying the bowls of porridge, chairs, and beds successively, each time finding the third \"just right\". Author Christopher Booker characterises this as the \"dialectical three\" where \"the first is wrong in one way, the second in another or opposite way, and only the third, in the middle, is just right\". Booker continues: \"This idea that the way forward lies in finding an exact middle path between opposites is of extraordinary importance in storytelling\".\nThis concept has spread across many other disciplines, particularly developmental psychology, biology, economics, Buddhism, and engineering, where it is called the \"Goldilocks principle\". In planetary astronomy, a planet orbiting its sun at just the right distance for liquid water to exist on its surface, neither too hot nor too cold, is referred to as being in the \"Goldilocks zone\". As Stephen Hawking put it, \"Like Goldilocks, the development of intelligent \n", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 0, - "completion_tokens": 0, - "total_tokens": 0 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "ba78e361-c316-4a72-aac8-5299ed378db4" - } - }, - { - "parent_id": "12a0e59c-25d7-4a61-8361-11b996470586", - "function_ancestry": { - "function_id": "12a0e59c-25d7-4a61-8361-11b996470586", - "function_name": "", - "parent_id": "root", - "parent_name": "root" - }, - "payload": { - "event_type": "LLM_END", - "event_timestamp": 1760724058.690381, - "span_event_timestamp": 1760724057.3925061, - "framework": "langchain", - "name": "meta/llama-3.1-70b-instruct", - "tags": null, - "metadata": { - "chat_responses": [ - { - "text": "Thought: I now know the final answer\nFinal Answer: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.", - "generation_info": null, - "type": "ChatGenerationChunk", - "message": { - "content": "Thought: I now know the final answer\nFinal Answer: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.", - "additional_kwargs": {}, - "response_metadata": { - "finish_reason": "stop", - "model_name": "meta/llama-3.1-70b-instruct" - }, - "type": "AIMessageChunk", - "name": null, - "id": "run--651cd48e-1fb3-4cac-987f-2d8c1e82a30a" - } - } - ], - "chat_inputs": null, - "tool_inputs": null, - "tool_outputs": null, - "tool_info": null, - "span_inputs": null, - "span_outputs": null, - "provided_metadata": null, - "tools_schema": [] - }, - "data": { - "input": "\nIn astronomy and astrobiology, the habitable zone (HZ), the circumstellar habitable zone (CHZ), the Goldilocks zone, is the range of orbits around a star within which a planetary surface can support liquid water given sufficient atmospheric pressure. The bounds of the HZ are based on Earth's position in the Solar System and the amount of radiant energy it receives from the Sun. Due to the importance of liquid water to Earth's biosphere, the nature of the HZ and the objects within it may be instrumental in determining the scope and distribution of planets capable of supporting Earth-like extraterrestrial life and intelligence. As such, it is considered by many to be a major factor of planetary habitability, and the most likely place to find extraterrestrial liquid water and biosignatures elsewhere in the universe.\nThe habitable zone is also called the Goldilocks zone, a metaphor, allusion and antonomasia of the children's fairy tale of \"Goldilocks and the Three Bears\", in which a little girl chooses from sets of three items, rejecting the ones that are too extreme (large or small, hot or cold, etc.), and settling on the one in the middle, which is \"just right\".\nSince the concept was first presented many stars have been confirmed to possess an HZ planet, including some systems that consist of multiple HZ planets. Most such planets, being either super-Earths or gas giants, are more massive than Earth, because massive planets are easier to detect. On November 4, 2013, astronomers reported, based on Kepler space telescope data, that there could be as many as 40 billion Earth-sized planets orbiting in the habitable zones of Sun-like stars and red dwarfs in the Milky Way. About 11 billion of these may be orbiting Sun-like stars. Proxima Centauri b, located about 4.2 light-years (1.3 parsecs) from Earth in the constellation of Centaurus, is the nearest known exoplanet, and is orbiting in the habitable zone of its star. The HZ is also of particular interest to the emerging field of habitability of natural satellites because planetary mass moons in the HZ might outnumber planets.\nIn subsequent decades, the HZ concept began to be challenged as a primary criterion for life, so the concept is still evolving. Since the discovery of evidence for extraterrestrial liquid water, substantial quantities of it are now thought to occur outside the circumstellar habitable zone. The concept of deep biospheres, like Earth's, that exist independently of stellar energy, are now generally accepted in astrobiology given the large amount of liquid water known to exist in lithospheres and asthenospheres of the Solar System. Sustained by other energy sources, such as tidal heating or radioactive decay or pressurized by non-atmospheric means, liquid water may be found even on rogue planets, or their moons. Liquid water can also exist at a wider range of temperatures and pressures as a solution, for example with sodium chlorides in seawater on Earth, chlorides and sulphates on equatorial Mars, or ammoniates, due to its different colligative properties. In addition, other circumstellar zones, where non-water solvents favorable to hypothetical life based on alternative biochemistries could exist in liquid form at the surface, have been proposed.\n\n\n== History ==\n\nAn estimate of the range of distances from the Sun allowing the existence of liquid water appears in Newton's Principia (Book III, Section 1, corol. 4). The philosopher Louis Claude de Saint-Martin speculated in his 1802 work Man: His True Nature and Ministry, \"... we may presume, that, being susceptible of vegetation, it [the Earth] has been placed, in the series of planets, in the rank which was necessary, and at exactly the right distance from the sun, to accomplish its secondary object of vegetation; and from this we might infer that the other planets are either too near or too remote from the sun, to vegetate.\"\nPossibly the earliest use of the term habitable zone was in 1913, by Edward Maunder in h\n\n\n---\n\n\nThe Goldilocks principle is named by analogy to the children's story \"Goldilocks and the Three Bears\", in which a young girl named Goldilocks tastes three different bowls of porridge and finds she prefers porridge that is neither too hot nor too cold but has just the right temperature. The concept of \"just the right amount\" is easily understood and applied to a wide range of disciplines, including developmental psychology, biology, astronomy, economics and engineering.\n\n\n== Applications ==\n\nIn cognitive science and developmental psychology, the Goldilocks effect or principle refers to an infant's preference to attend events that are neither too simple nor too complex according to their current representation of the world. This effect was observed in infants, who are less likely to look away from a visual sequence when the current event is moderately probable, as measured by an idealized learning model.\nIn astrobiology, the Goldilocks zone refers to the habitable zone around a star. As Stephen Hawking put it, \"Like Goldilocks, the development of intelligent life requires that planetary temperatures be 'just right'\". The Rare Earth hypothesis uses the Goldilocks principle in the argument that a planet must be neither too far away from nor too close to a star and galactic centre to support life, while either extreme would result in a planet incapable of supporting life. Such a planet is colloquially called a \"Goldilocks planet\". Paul Davies has argued for the extension of the principle to cover the selection of our universe from a (postulated) multiverse: \"Observers arise only in those universes where, like Goldilocks' porridge, things are by accident 'just right'\".\nIn medicine, it can refer to a drug that can hold both antagonist (inhibitory) and agonist (excitatory) properties. For example, the antipsychotic Aripiprazole causes not only antagonism of dopamine D2 receptors in areas such as the mesolimbic area of the brain (which shows increased dopamine activity in psychosis) but also agonism of dopamine receptors in areas of dopamine hypoactivity, such as the mesocortical area.\nIn economics, a Goldilocks economy sustains moderate economic growth and low inflation, which allows a market-friendly monetary policy. Goldilocks pricing, also known as good–better–best pricing, is a marketing strategy that uses product differentiation to offer three versions of a product to corner different parts of the market: a high-end version, a middle version, and a low-end version.\nIn communication, the Goldilocks principle describes the amount, type, and detail of communication necessary in a system to maximise effectiveness while minimising redundancy and excessive scope on the \"too much\" side and avoiding incomplete or inaccurate communication on the \"too little\" side.\nIn statistics, the \"Goldilocks Fit\" references a linear regression model that represents the perfect flexibility to reduce the error caused by bias and variance.\nIn the design sprint, the \"Goldilocks Quality\" means to create a prototype with just enough quality to evoke honest reactions from customers.\nIn machine learning, the Goldilocks learning rate is the learning rate that results in an algorithm taking the fewest steps to achieve minimal loss. Algorithms with a learning rate that is too large often fail to converge at all, while those with too small a learning rate take too long to converge.\n\n\n== See also ==\nCosmic Jackpot\nFrugality\nAnthropic principle\nBig History\nFine-tuned universe\nGolden mean (philosophy)\nAnna Karenina principle\n\n\n== References ==\n\n\n---\n\n\n\"Goldilocks and the Three Bears\" is a traditional classic 19th-century British fairy tale of which three versions exist. The original version of the tale tells of an impudent and bad old woman who enters the forest home of three anthropomorphic bachelor bears while they are away. She eats some of their porridge, sits down on one of their chairs, breaks it, and sleeps in one of their beds. When the bears return and discover her, she wakes up, jumps out of the window, and is never seen again. The second version replaces the old woman with a young, naive, blonde-haired girl named Goldilocks, and the third and by far best-known version replaces the bachelor bears with a family of three: a father bear, a mother bear, and a baby bear.\nThe story has elicited various interpretations and has been adapted to film, opera, and other media. \"Goldilocks and the Three Bears\" is one of the most popular fairy tales in the English language.\n\n\n== Southey's version ==\nIn Robert Southey's story, three male bears—a small bear, a medium bear, and a large bear—live together in a house in the woods. Southey describes them as good-natured, trusting, harmless, clean, and hospitable. Each bear has his own bowl of porridge, his own chair, and his own bed. One day, while their hot porridge is cooling, they wander through the woods. An old woman—described throughout the story as insolent, mean, swearing, ugly, dirty, and a vagabond who belongs in a reformatory—discovers the bears' home. She looks through the window and keyhole, opens the latch, and, after ensuring that no one is home, enters. The old woman tries the porridge of the big bear, which is too hot for her; then she tries the porridge of the middle bear, which is too cold; finally, she eats the porridge of the smallest bear. Next, she sits down in the chair of the big bear, which is too hard for her, and then in the chair of the middle bear, which is too soft. When she sits in the chair of the small bear, it breaks as a result. Continuing her exploration of the house, she finds the bears' beds. After trying the big bear's bed and the middle bear's bed and finding them unsuitable, she goes to sleep in the smallest bear's bed. When the bears return home, the story reaches its climax. One after another, they discover that someone has eaten their porridge, has sat in their chairs, and has lain in their beds. The smallest bear finds the old woman in his bed and exclaims, \"Someone has lain down in my little bed—and there she is still!\" Startled, the old woman jumps out of the window, runs away, and is never seen again.\n\n\n== Literary elements ==\nThe story makes extensive use of the literary rule of three, featuring three chairs, three bowls of porridge, three beds, and the three title characters who live in the house. There are also three sequences of the bears discovering in turn that someone has been eating from their porridge, sitting in their chairs, and finally, lying in their beds, at which point the climax of Goldilocks being discovered occurs. This follows three earlier sequences of Goldilocks trying the bowls of porridge, chairs, and beds successively, each time finding the third \"just right\". Author Christopher Booker characterises this as the \"dialectical three\" where \"the first is wrong in one way, the second in another or opposite way, and only the third, in the middle, is just right\". Booker continues: \"This idea that the way forward lies in finding an exact middle path between opposites is of extraordinary importance in storytelling\".\nThis concept has spread across many other disciplines, particularly developmental psychology, biology, economics, Buddhism, and engineering, where it is called the \"Goldilocks principle\". In planetary astronomy, a planet orbiting its sun at just the right distance for liquid water to exist on its surface, neither too hot nor too cold, is referred to as being in the \"Goldilocks zone\". As Stephen Hawking put it, \"Like Goldilocks, the development of intelligent \n", - "output": "Thought: I now know the final answer\nFinal Answer: The Goldilocks zone is a term used to describe the region around a star where temperatures are just right for liquid water to exist on a planet's surface.", - "chunk": null - }, - "usage_info": { - "token_usage": { - "prompt_tokens": 136620, - "completion_tokens": 1034, - "total_tokens": 137654 - }, - "num_llm_calls": 0, - "seconds_between_calls": 0 - }, - "UUID": "651cd48e-1fb3-4cac-987f-2d8c1e82a30a" - } - } - ], - "expected_intermediate_steps": [] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/bfcl-custom-evalfactory/nativeformat/BFCL_v3_simple.json b/services/evaluator/tests/datasets/bfcl-custom-evalfactory/nativeformat/BFCL_v3_simple.json deleted file mode 100644 index a1ac445cfb..0000000000 --- a/services/evaluator/tests/datasets/bfcl-custom-evalfactory/nativeformat/BFCL_v3_simple.json +++ /dev/null @@ -1,2 +0,0 @@ -{"id": "simple_0", "question": [[{"role": "user", "content": "Find the area of a triangle with a base of 10 units and height of 5 units."}]], "function": [{"name": "calculate_triangle_area", "description": "Calculate the area of a triangle given its base and height.", "parameters": {"type": "dict", "properties": {"base": {"type": "integer", "description": "The base of the triangle."}, "height": {"type": "integer", "description": "The height of the triangle."}, "unit": {"type": "string", "description": "The unit of measure (defaults to 'units' if not specified)"}}, "required": ["base", "height"]}}]} -{"id": "simple_1", "question": [[{"role": "user", "content": "Calculate the factorial of 5 using math functions."}]], "function": [{"name": "math.factorial", "description": "Calculate the factorial of a given number.", "parameters": {"type": "dict", "properties": {"number": {"type": "integer", "description": "The number for which factorial needs to be calculated."}}, "required": ["number"]}}]} diff --git a/services/evaluator/tests/datasets/bfcl-custom-evalfactory/nativeformat/possible_answer/BFCL_v3_simple.json b/services/evaluator/tests/datasets/bfcl-custom-evalfactory/nativeformat/possible_answer/BFCL_v3_simple.json deleted file mode 100644 index 8d980d3030..0000000000 --- a/services/evaluator/tests/datasets/bfcl-custom-evalfactory/nativeformat/possible_answer/BFCL_v3_simple.json +++ /dev/null @@ -1,2 +0,0 @@ -{"id": "simple_0", "ground_truth": [{"calculate_triangle_area": {"base": [10], "height": [5], "unit": ["units", ""]}}]} -{"id": "simple_1", "ground_truth": [{"math.factorial": {"number": [5]}}]} diff --git a/services/evaluator/tests/datasets/bfcl-custom-evalfactory/openaiformat/custom_bfcl.json b/services/evaluator/tests/datasets/bfcl-custom-evalfactory/openaiformat/custom_bfcl.json deleted file mode 100644 index 9f7971914f..0000000000 --- a/services/evaluator/tests/datasets/bfcl-custom-evalfactory/openaiformat/custom_bfcl.json +++ /dev/null @@ -1,2 +0,0 @@ -{"messages": [[{"role": "user", "content": "Find the area of a triangle with a base of 10 units and height of 5 units."}]], "tools": [{"type": "function", "function": {"name": "calculate_triangle_area", "description": "Calculate the area of a triangle given its base and height.", "parameters": {"type": "dict", "properties": {"base": {"type": "integer", "description": "The base of the triangle."}, "height": {"type": "integer", "description": "The height of the triangle."}, "unit": {"type": "string", "description": "The unit of measure (defaults to 'units' if not specified)"}}, "required": ["base", "height"]}}}], "tool_calls_ground_truth":[{"calculate_triangle_area": {"base": [10], "height": [5], "unit": ["units", ""]}}]} -{"messages": [[{"role": "user", "content": "Calculate the factorial of 5 using math functions."}]], "tools": [{"type": "function", "function": {"name": "math.factorial", "description": "Calculate the factorial of a given number.", "parameters": {"type": "dict", "properties": {"number": {"type": "integer", "description": "The number for which factorial needs to be calculated."}}, "required": ["number"]}}}], "tool_calls_ground_truth":[{"math.factorial": {"number": [5]}}]} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/custom/prompt_optimization_labeled.jsonl b/services/evaluator/tests/datasets/custom/prompt_optimization_labeled.jsonl deleted file mode 100644 index d0e5c19312..0000000000 --- a/services/evaluator/tests/datasets/custom/prompt_optimization_labeled.jsonl +++ /dev/null @@ -1,6 +0,0 @@ -{"question":"What kind of coffee can an espresso machine make?","reference":"Latte, Flat White, Americano, Macchiato, Cappuccino, Cafe au Lait, Breve","model_output":"espresso based coffee drinks","similarity_score":"9"} -{"question":"What is breve coffee?","reference":"an espresso-based drink similar to a latte, but instead of using steamed milk, it uses steamed half-and-half (a mixture of milk and cream)","model_output":"BREVE coffee is a coffee drink that originated in Scotland. Originally, it was a French coffee therapy drink before being spawned by the Scottish intrepid experimentation","similarity_score":"2"} -{"question":"Is a flat white 6 or 8 oz?","reference":"6 oz","model_output":"6 oz","similarity_score":"10"} -{"question":"What is a Vietnamese coffee?","reference":"Vietnamese coffee is traditionally made with dark roasted robusta beans, sweetened condensed milk, and hot water, often served over ice. The coffee is brewed using a special filter called a phin, which allows the coffee to drip slowly into a cup containing the condensed milk.","model_output":"Coffee made from Vietnam","similarity_score":"4"} -{"question":"What category does orange fall under?","reference":"fruit or color","model_output":"fruit","similarity_score":"7"} -{"question":"What is a synonym of 'similar'?","reference":"analogous, comparable, complementary, identical, related","model_output":"different","similarity_score":"0"} diff --git a/services/evaluator/tests/datasets/custom/similarity.csv b/services/evaluator/tests/datasets/custom/similarity.csv deleted file mode 100644 index ddc2c8d4b3..0000000000 --- a/services/evaluator/tests/datasets/custom/similarity.csv +++ /dev/null @@ -1,4 +0,0 @@ -"question","answer","reference_answer" -"What is the capital of France?","Paris","The answer is Paris" -"What is 2+2?","4","The answer is 4" -"Square root of 256?","16","The answer is 16" diff --git a/services/evaluator/tests/datasets/custom/tool_calling.json b/services/evaluator/tests/datasets/custom/tool_calling.json deleted file mode 100644 index ede70fdc58..0000000000 --- a/services/evaluator/tests/datasets/custom/tool_calling.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "messages": [ - {"role": "user", "content": "Book a table for 2 at 7pm."}, - {"role": "assistant", "content": "Booking a table...", "tool_calls": [{"function": {"name": "book_table", "arguments": {"people": 2, "time": "7pm"}}}]} - ], - "tool_calls": [ - {"function": {"name": "book_table", "arguments": {"people": 2, "time": "7pm"}}} - ] -} diff --git a/services/evaluator/tests/datasets/eval-results/eval-4SqB2PLz4BwFuqPqczmDq7.json b/services/evaluator/tests/datasets/eval-results/eval-4SqB2PLz4BwFuqPqczmDq7.json deleted file mode 100644 index 48fce14e31..0000000000 --- a/services/evaluator/tests/datasets/eval-results/eval-4SqB2PLz4BwFuqPqczmDq7.json +++ /dev/null @@ -1,58 +0,0 @@ -[ - { - "item": { - "prompt": "How long did it take Lewis and Clark to reach the Pacific Ocean?", - "ideal_response": "Lewis and Clark reached the Pacific Ocean on November 15, 1805, after a journey of approximately 18 months.", - "category": "Open QA" - }, - "response": " [1]\nLewis and Clark's expedition took 29 months from May 180" - }, - { - "item": { - "prompt": "Write a step-by-step guide on how to start seeds indoors. Be detailed enough to describe each step, but don't be too wordy.", - "ideal_response": "1. Choose the right container: Select a container that is at least 2-3 inches deep and has drainage holes at the bottom.\n\n2. Fill the container with soil: Fill the container with a good quality seed starting mix, leaving about 1 inch of space at the top.\n\n3. Moisten the soil: Water the soil until it is evenly moist, but not soaking wet.\n\n4. Plant the seeds: Follow the instructions on the seed packet to determine the appropriate depth and spacing for planting the seeds. Generally, seeds should be planted at a depth of 2-3 times their diameter.\n\n5. Cover the seeds: Cover the seeds with a thin layer of soil and gently press down to ensure good contact between the soil and the seeds.\n\n6. Label the container: Use a plant label or a popsicle stick to label the container with the name of the plant and the date of planting.\n\n7. Cover the container: Cover the container with a clear plastic lid or plastic wrap to create a mini greenhouse. This will help to keep the soil moist and warm.\n\n8. Place the container in a warm, bright location: Place the container in a warm, bright location, such as a sunny windowsill or under grow lights. The ideal temperature for most seeds is between 65-75\u00b0F.\n\n9. Water as needed: Check the soil regularly and water as needed to keep it evenly moist. Avoid overwatering, as this can lead to fungal growth and other problems.", - "category": "Generation" - }, - "response": " This guide should be good for beginners.\nStarting seeds indoors can give you a head" - }, - { - "item": { - "prompt": "Summarize this article's main points in two sentences for me.\n\nTwo of the four Americans kidnapped by armed gunmen in a Mexico border city on Friday were found dead and two were found alive, Tamaulipas Gov. Am\u00e9rico Villarreal Anaya said in a phone call with Mexican President Andr\u00e9s Manuel L\u00f3pez Obrador that was played at a news conference Tuesday.\n\nThe governor said \"ambulances and security personnel\" were now attending to and giving medical support to the survivors.\n\nThe four Americans were located at what appears to be a medical clinic in Matamoros, a US official familiar with the ongoing investigation told CNN. One of the two survivors is severely injured, the official said.\n\nTamaulipas Attorney General Irving Barrios also confirmed the developments in a tweet.\n\n\"Derived from the joint search actions, the four American citizens deprived of their liberty last Friday were found,\" he said. \"Unfortunately, two dead. Investigation and intelligence work continue to capture those responsible. Details will be given later.\"", - "ideal_response": "Two of the four Americans kidnapped in Mexico last week have been found dead, while the other two have been found alive and are receiving medical support. The four Americans were located at what appears to be a medical clinic in Matamoros, and one of the two survivors is severely injured.", - "category": "Summarization" - }, - "response": " Translation from Spanish.\n\nThe investigation is ongoing, and law enforcement continue to look for" - }, - { - "item": { - "prompt": "What do the following names have in common?\n\nSouthern Cloudywing\nRed admiral\nPainted Lady\nMorpho\nOrange Sulphur\nGossamer-winged", - "ideal_response": "They are all names of butterfly species.", - "category": "Classification" - }, - "response": " butterfly\n\nThese names are the common names of butterflies.\nThese \"Gossamer" - }, - { - "item": { - "prompt": "What main pigments can be used to virtually create all other existing pigments depending on the distribution of each one?\nA: red, yellow, blue\nB: orange, green, violet\nC: white, black, brown\nD: none of the above", - "ideal_response": "A: red, yellow, blue", - "category": "Closed QA" - }, - "response": "\nAnswer is: A\nThe correct answer is(A): red, yellow," - }, - { - "item": { - "prompt": "Why do raccoons wash their food?", - "ideal_response": "As an AI language model, I don't have personal beliefs or opinions, but I can provide you with information. \n\nRaccoons are known for their habit of \"washing\" their food in water before eating it. However, this behavior is not actually washing in the traditional sense. Raccoons have highly sensitive hands and use them to explore their surroundings and manipulate objects. When they find food, they will often dip it in water to enhance their sense of touch and remove any debris or unwanted substances. This behavior is also thought to help soften hard foods like nuts and make them easier to eat.", - "category": "Open QA" - }, - "response": " Because they're paws-itive they're getting it clean? That joke was" - }, - { - "item": { - "prompt": "Please re-write this letter template to make it specific to me with my information of Jenny Smith, 123 Cave Road, Des Moines, IA 50306, and account number 123456 for Company ABC at 4321 Cherry Street, Atlanta, GA 30033. I'll take care of any other information that needs to be filled in, so leave it as-is.\n\n[Your name]\n[Your return address]\n[Debt collector name] [Debt collector Address]\nRe: [Account number for the debt, if you have it]\nDear [Debt collector name]:\nI am responding to your contact about a debt you are trying to collect. You contacted me by\n[phone/mail], on [Date] and identified the debt as [any information they gave you about the debt]. Please supply the information below so that I can be fully informed:\nWhy you think I owe the debt and to whom I owe it, including:\nThe name and address of the creditor to whom the debt is currently owed, the account number used by that creditor, and the amount owed.\nIf this debt started with a different creditor, provide the name and address of the original creditor, the account number used by that creditor, and the amount owed to that creditor at the time it was transferred. When you identify the original creditor, please provide any other\nname by which I might know them if that is different from the official name. In addition, tell me when the current creditor obtained the debt and who the current creditor obtained it from.\nProvide verification and documentation that there is a valid basis for claiming that I must pay the debt to the current creditor. For example, can you provide a copy of the written agreement that created my original requirement to pay?\nIf you ask that I pay a debt that somebody else is or was required to pay, identify that person. Provide verification and documentation about why this is a debt that I am required to pay.\nThe amount and age of the debt, including:\nThe original creditor sent me a copy of the last billing statement.\nState the amount of the debt when you obtained it and when that was.\nIf any additional interest, fees, or charges have been added since the last billing statement from the original creditor, provide an itemization showing the dates and amount of each added amount. In addition, explain how the added interest, fees, or other charges are expressly authorized by the agreement creating the debt or are permitted by law.\nIf there have been any payments or other reductions since the last billing statement from the original creditor, provide an itemization showing the dates and amount of each of them.\nIf there have been any other changes or adjustments since the last billing statement from the original creditor, please provide complete verification and documentation of the amount you are trying to collect. Explain how that amount was calculated. In addition, explain how the other changes or adjustments are expressly authorized by the agreement creating the debt or permitted by law.\nTell me when the creditor claims this debt became due and when it became delinquent.\nIdentify the Date of the last payment made on this account.\nHave you determined that this debt is within the statute of limitations applicable to it? Please tell me when you think this debt's statute of limitations expires and how you decided.\nDetails about your authority to collect this debt.\nI want more information about your firm before I discuss the debt with you. Does your firm have a debt collection license from my state? If not, say why not. If so, provide the Date of the license, the name on the license, the license number, and the name, address, and telephone number of the state agency issuing the license.\nIf you are contacting me from a place outside my state, does your firm have a debt collection license from that place? If so, provide the Date of the license, the name on the license, the license number, and the name, address, and telephone number of the state agency issuing the license.\nI have asked for this information because I have some questions. I need to hear from you to make an informed decision about your claim that I owe this money. I am open to communicating with you for this purpose. To make sure that I am not put at any disadvantage, in the meantime, please treat this debt as being in dispute and under discussion between us.\nIn addition to providing the information requested above, please let me know whether you are prepared to accept less than the balance you claim is owed. If so, please tell me your offer with the amount you will accept to resolve the account.\nThank you for your cooperation. Sincerely, [Your name]", - "ideal_response": "Jenny Smith\n123 Cave Road\nDes Moines, IA 50306\nAccount Number: 123456\n\n[Debt collector name]\n[Debt collector Address]\n\nRe: Account number 123456 for Company ABC at 4321 Cherry Street, Atlanta, GA 30033\n\nDear [Debt collector name]:\n\nI am responding to your contact about a debt you are trying to collect. You contacted me by mail, on [Date] and identified the debt as being owed to Company ABC. Please supply the information below so that I can be fully informed:\n\nWhy you think I owe the debt and to whom I owe it, including:\nThe name and address of the creditor to whom the debt is currently owed, the account number used by that creditor, and the amount owed.\nIf this debt started with a different creditor, provide the name and address of the original creditor, the account number used by that creditor, and the amount owed to that creditor at the time it was transferred. When you identify the original creditor, please provide any other name by which I might know them if that is different from the official name. In addition, tell me when the current creditor obtained the debt and who the current creditor obtained it from.\nProvide verification and documentation that there is a valid basis for claiming that I must pay the debt to the current creditor. For example, can you provide a copy of the written agreement that created my original requirement to pay?\nIf you ask that I pay a debt that", - "category": "Rewrite" - }, - "response": " and address\n\nHere is the rewritten letter with your name and specific information inserted:\n\n" - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/eval-results/eval-5HnsxR6WtPJ2985Tfzbb5A.json b/services/evaluator/tests/datasets/eval-results/eval-5HnsxR6WtPJ2985Tfzbb5A.json deleted file mode 100644 index 3f1365f9a7..0000000000 --- a/services/evaluator/tests/datasets/eval-results/eval-5HnsxR6WtPJ2985Tfzbb5A.json +++ /dev/null @@ -1,182 +0,0 @@ -[ - { - "item": { - "prompt": "When was the war of Spanish Succession? The decline of Catalan continued in the 16th and 17th centuries. The Catalan defeat in the War of Spanish Succession (1714) initiated a series of measures imposing the use of Spanish in legal documentation. Answer:", - "ideal_response": "1714", - "category": "default", - "source": null - }, - "response": "1714", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "Drugs made between which years had to be tested before going to market? The thalidomide tragedy resurrected Kefauver's bill to enhance drug regulation that had stalled in Congress, and the Kefauver-Harris Amendment became law on 10 October 1962. Manufacturers henceforth had to prove to FDA that their drugs were effective as well as safe before they could go on the US market. The FDA received authority to regulate advertising of prescription drugs and to establish good manufacturing practices. The law required that all drugs introduced between 1938 and 1962 had to be effective. An FDA - National Academy of Sciences collaborative study showed that nearly 40 percent of these products were not effective. A similarly comprehensive study of over-the-counter products began ten years later. Answer:", - "ideal_response": "1938 and 1962", - "category": "default", - "source": null - }, - "response": "1938 and 1962", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "What do all students at BYU agree to abstain from consuming? Students attending BYU are required to follow an honor code, which mandates behavior in line with LDS teachings such as academic honesty, adherence to dress and grooming standards, and abstinence from extramarital sex and from the consumption of drugs and alcohol. Many students (88 percent of men, 33 percent of women) either delay enrollment or take a hiatus from their studies to serve as Mormon missionaries. (Men typically serve for two-years, while women serve for 18 months.) An education at BYU is also less expensive than at similar private universities, since \"a significant portion\" of the cost of operating the university is subsidized by the church's tithing funds. Answer:", - "ideal_response": "drugs and alcohol", - "category": "default", - "source": null - }, - "response": "drugs and alcohol", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "What is the name of the commission who concluded the financial crisis was avoidable? Many causes for the financial crisis have been suggested, with varying weight assigned by experts. The U.S. Senate's Levin\u2013Coburn Report concluded that the crisis was the result of \"high risk, complex financial products; undisclosed conflicts of interest; the failure of regulators, the credit rating agencies, and the market itself to rein in the excesses of Wall Street.\" The Financial Crisis Inquiry Commission concluded that the financial crisis was avoidable and was caused by \"widespread failures in financial regulation and supervision\", \"dramatic failures of corporate governance and risk management at many systemically important financial institutions\", \"a combination of excessive borrowing, risky investments, and lack of transparency\" by financial institutions, ill preparation and inconsistent action by government that \"added to the uncertainty and panic\", a \"systemic breakdown in accountability and ethics\", \"collapsing mortgage-lending standards and the mortgage securitization pipeline\", deregulation of over-the-counter derivatives, especially credit default swaps, and \"the failures of credit rating agencies\" to correctly price risk. The 1999 repeal of the Glass-Steagall Act effectively removed the separation between investment banks and depository banks in the United States. Critics argued that credit rating agencies and investors failed to accurately price the risk involved with mortgage-related financial products, and that governments did not adjust their regulatory practices to address 21st-century financial markets. Research into the causes of the financial crisis has also focused on the role of interest rate spreads. Answer:", - "ideal_response": "Financial Crisis Inquiry Commission", - "category": "default", - "source": null - }, - "response": "Financial Crisis Inquiry Commission", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "Which system had electrical tracking? However, the problem of deflection settings \u2014 'aim-off' \u2014 required knowing the rate of change in the target's position. Both France and UK introduced tachymetric devices to track targets and produce vertical and horizontal deflection angles. The French Brocq system was electrical, the operator entered the target range and had displays at guns; it was used with their 75 mm. The British Wilson-Dalby gun director used a pair of trackers and mechanical tachymetry; the operator entered the fuse length, and deflection angles were read from the instruments. Answer:", - "ideal_response": "French Brocq", - "category": "default", - "source": null - }, - "response": "Brocq", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "Hyderabad's largest zoo is known as India's first to have what two kinds of animals in a safari park setting? Hyderabad's lakes and the sloping terrain of its low-lying hills provide habitat for an assortment of flora and fauna. The forest region in and around the city encompasses areas of ecological and biological importance, which are preserved in the form of national parks, zoos, mini-zoos and a wildlife sanctuary. Nehru Zoological Park, the city's one large zoo, is the first in India to have a lion and tiger safari park. Hyderabad has three national parks (Mrugavani National Park, Mahavir Harina Vanasthali National Park and Kasu Brahmananda Reddy National Park), and the Manjira Wildlife Sanctuary is about 50 km (31 mi) from the city. Hyderabad's other environmental reserves are: Kotla Vijayabhaskara Reddy Botanical Gardens, Shamirpet Lake, Hussain Sagar, Fox Sagar Lake, Mir Alam Tank and Patancheru Lake, which is home to regional birds and attracts seasonal migratory birds from different parts of the world. Organisations engaged in environmental and wildlife preservation include the Telangana Forest Department, Indian Council of Forestry Research and Education, the International Crops Research Institute for the Semi-Arid Tropics (ICRISAT), the Animal Welfare Board of India, the Blue Cross of Hyderabad and the University of Hyderabad. Answer:", - "ideal_response": "lion and tiger", - "category": "default", - "source": null - }, - "response": "lion and tiger safari park", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "How much energy does an HVAC system use in commercial locations? In the United States, heating, ventilation and air conditioning (HVAC) systems account for 30% (4.65 EJ/yr) of the energy used in commercial buildings and nearly 50% (10.1 EJ/yr) of the energy used in residential buildings. Solar heating, cooling and ventilation technologies can be used to offset a portion of this energy. Answer:", - "ideal_response": "30% (4.65 EJ/yr)", - "category": "default", - "source": null - }, - "response": "30% and 50%", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "What did Nasser pursue for Palestinians? Nasser mediated discussions between the pro-Western, pro-Soviet, and neutralist conference factions over the composition of the \"Final Communique\" addressing colonialism in Africa and Asia and the fostering of global peace amid the Cold War between the West and the Soviet Union. At Bandung Nasser sought a proclamation for the avoidance of international defense alliances, support for the independence of Tunisia, Algeria, and Morocco from French rule, support for the Palestinian right of return, and the implementation of UN resolutions regarding the Arab\u2013Israeli conflict. He succeeded in lobbying the attendees to pass resolutions on each of these issues, notably securing the strong support of China and India. Answer:", - "ideal_response": "right of return", - "category": "default", - "source": null - }, - "response": "Palestinian right of return", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "What is a core beliefe that was recognized as important by orthodox Jews? Modern Orthodoxy, as a stream of Orthodox Judaism represented by institutions such as the U.S. National Council for Young Israel, is pro-Zionist and thus places a high national, as well as religious, significance on the State of Israel, and its affiliates are, typically, Zionist in orientation. It also practices involvement with non-Orthodox Jews that extends beyond \"outreach (Kiruv)\" to continued institutional relations and cooperation; see further under Torah Umadda. Other \"core beliefs\" are a recognition of the value and importance of secular studies, a commitment to equality of education for both men and women, and a full acceptance of the importance of being able to financially support oneself and one's family. Answer:", - "ideal_response": "secular studies", - "category": "default", - "source": null - }, - "response": "Recognition of the value and importance of secular studies", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "What event caused major changes in Bermuda? The end of the war, however, was to cause profound change in Bermuda, though some of those changes would take decades to crystallise. Following the war, with the buildup of Naval and military forces in Bermuda, the primary leg of the Bermudian economy became defence infrastructure. Even after tourism began later in the 19th century, Bermuda remained, in the eyes of London, a base more than a colony. The Crown strengthened its political and economic ties to Bermuda, and the colony's independence on the world stage was diminished. Answer:", - "ideal_response": "end of the war", - "category": "default", - "source": null - }, - "response": "the end of the war", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "How many official languages does Switzerland have? Switzerland has four official languages: principally German (63.5% total population share, with foreign residents, in 2013); French (22.5%) in the west; and Italian (8.1%) in the south. The fourth official language, Romansh (0.5%), is a Romance language spoken locally in the southeastern trilingual canton of Graub\u00fcnden, and is designated by Article 4 of the Federal Constitution as a national language along with German, French, and Italian, and in Article 70 as an official language if the authorities communicate with persons who speak Romansh. However, federal laws and other official acts do not need to be decreed in Romansh. Answer:", - "ideal_response": "four", - "category": "default", - "source": null - }, - "response": "four", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "From when was it taught that the little flock would not be the only people to survive Armageddon? From 1932, it was taught that the \"little flock\" of 144,000 would not be the only people to survive Armageddon. Rutherford explained that in addition to the 144,000 \"anointed\" who would be resurrected\u2014or transferred at death\u2014to live in heaven to rule over earth with Christ, a separate class of members, the \"great multitude,\" would live in a paradise restored on earth; from 1935, new converts to the movement were considered part of that class. By the mid-1930s, the timing of the beginning of Christ's presence (Greek: parous\u00eda), his enthronement as king, and the start of the \"last days\" were each moved to 1914. Answer:", - "ideal_response": "1932", - "category": "default", - "source": null - }, - "response": "1932", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "The VC operated in what geographic area? Fighting on one side was a coalition of forces including the Republic of Vietnam (South Vietnam or the \"RVN\"), the United States, supplemented by South Korea, Thailand, Australia, New Zealand, and the Philippines. The allies fought against the North Vietnamese Army (NVA) as well as the National Liberation Front (NLF, also known as Viet communists Viet Cong), or \"VC\", a guerrilla force within South Vietnam. The NVA received substantial military and economic aid from the Soviet Union and China, turning Vietnam into a proxy war. Answer:", - "ideal_response": "South Vietnam", - "category": "default", - "source": null - }, - "response": "South Vietnam", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "What different options did the desktop version have? Exceptions to the restrictions faced by Windows Store apps are given to web browsers. The user's default browser can distribute a Metro-style web browser in same package as the desktop version, which has access to functionality unavailable to other apps, such as being able to permanently run in the background, use multiple background processes, and use Windows API code instead of WinRT (allowing for code to be re-used with the desktop version, while still taking advantage of features available to Windows Store apps, such as charms). Microsoft advertises this exception privilege \"New experience enabled\" (formerly \"Metro-style enabled\"). Answer:", - "ideal_response": "able to permanently run in the background, use multiple background processes, and use Windows API code", - "category": "default", - "source": null - }, - "response": "New experience enabled", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "item": { - "prompt": "Who wrote The Sensations of Tone as a Physiological Basis for the Theory of Music? At the age of 19, he wrote a report on his work and sent it to philologist Alexander Ellis, a colleague of his father (who would later be portrayed as Professor Henry Higgins in Pygmalion). Ellis immediately wrote back indicating that the experiments were similar to existing work in Germany, and also lent Bell a copy of Hermann von Helmholtz's work, The Sensations of Tone as a Physiological Basis for the Theory of Music. Answer:", - "ideal_response": "Hermann von Helmholtz", - "category": "default", - "source": null - }, - "response": "Hermann von Helmholtz", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/eval-results/eval-UykeiJuMxHVy1Qnt46WKZA.json b/services/evaluator/tests/datasets/eval-results/eval-UykeiJuMxHVy1Qnt46WKZA.json deleted file mode 100644 index 60bbdf434d..0000000000 --- a/services/evaluator/tests/datasets/eval-results/eval-UykeiJuMxHVy1Qnt46WKZA.json +++ /dev/null @@ -1,1082 +0,0 @@ -[ - { - "input": { - "prompt": "When was the war of Spanish Succession? The decline of Catalan continued in the 16th and 17th centuries. The Catalan defeat in the War of Spanish Succession (1714) initiated a series of measures imposing the use of Spanish in legal documentation. Answer:", - "ideal_response": "1714", - "category": "default", - "source": null - }, - "response": "1714", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Drugs made between which years had to be tested before going to market? The thalidomide tragedy resurrected Kefauver's bill to enhance drug regulation that had stalled in Congress, and the Kefauver-Harris Amendment became law on 10 October 1962. Manufacturers henceforth had to prove to FDA that their drugs were effective as well as safe before they could go on the US market. The FDA received authority to regulate advertising of prescription drugs and to establish good manufacturing practices. The law required that all drugs introduced between 1938 and 1962 had to be effective. An FDA - National Academy of Sciences collaborative study showed that nearly 40 percent of these products were not effective. A similarly comprehensive study of over-the-counter products began ten years later. Answer:", - "ideal_response": "1938 and 1962", - "category": "default", - "source": null - }, - "response": "1938 and 1962", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What do all students at BYU agree to abstain from consuming? Students attending BYU are required to follow an honor code, which mandates behavior in line with LDS teachings such as academic honesty, adherence to dress and grooming standards, and abstinence from extramarital sex and from the consumption of drugs and alcohol. Many students (88 percent of men, 33 percent of women) either delay enrollment or take a hiatus from their studies to serve as Mormon missionaries. (Men typically serve for two-years, while women serve for 18 months.) An education at BYU is also less expensive than at similar private universities, since \"a significant portion\" of the cost of operating the university is subsidized by the church's tithing funds. Answer:", - "ideal_response": "drugs and alcohol", - "category": "default", - "source": null - }, - "response": "drugs and alcohol", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is the name of the commission who concluded the financial crisis was avoidable? Many causes for the financial crisis have been suggested, with varying weight assigned by experts. The U.S. Senate's Levin\u2013Coburn Report concluded that the crisis was the result of \"high risk, complex financial products; undisclosed conflicts of interest; the failure of regulators, the credit rating agencies, and the market itself to rein in the excesses of Wall Street.\" The Financial Crisis Inquiry Commission concluded that the financial crisis was avoidable and was caused by \"widespread failures in financial regulation and supervision\", \"dramatic failures of corporate governance and risk management at many systemically important financial institutions\", \"a combination of excessive borrowing, risky investments, and lack of transparency\" by financial institutions, ill preparation and inconsistent action by government that \"added to the uncertainty and panic\", a \"systemic breakdown in accountability and ethics\", \"collapsing mortgage-lending standards and the mortgage securitization pipeline\", deregulation of over-the-counter derivatives, especially credit default swaps, and \"the failures of credit rating agencies\" to correctly price risk. The 1999 repeal of the Glass-Steagall Act effectively removed the separation between investment banks and depository banks in the United States. Critics argued that credit rating agencies and investors failed to accurately price the risk involved with mortgage-related financial products, and that governments did not adjust their regulatory practices to address 21st-century financial markets. Research into the causes of the financial crisis has also focused on the role of interest rate spreads. Answer:", - "ideal_response": "Financial Crisis Inquiry Commission", - "category": "default", - "source": null - }, - "response": "Financial Crisis Inquiry Commission", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Which system had electrical tracking? However, the problem of deflection settings \u2014 'aim-off' \u2014 required knowing the rate of change in the target's position. Both France and UK introduced tachymetric devices to track targets and produce vertical and horizontal deflection angles. The French Brocq system was electrical, the operator entered the target range and had displays at guns; it was used with their 75 mm. The British Wilson-Dalby gun director used a pair of trackers and mechanical tachymetry; the operator entered the fuse length, and deflection angles were read from the instruments. Answer:", - "ideal_response": "French Brocq", - "category": "default", - "source": null - }, - "response": "Brocq", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Hyderabad's largest zoo is known as India's first to have what two kinds of animals in a safari park setting? Hyderabad's lakes and the sloping terrain of its low-lying hills provide habitat for an assortment of flora and fauna. The forest region in and around the city encompasses areas of ecological and biological importance, which are preserved in the form of national parks, zoos, mini-zoos and a wildlife sanctuary. Nehru Zoological Park, the city's one large zoo, is the first in India to have a lion and tiger safari park. Hyderabad has three national parks (Mrugavani National Park, Mahavir Harina Vanasthali National Park and Kasu Brahmananda Reddy National Park), and the Manjira Wildlife Sanctuary is about 50 km (31 mi) from the city. Hyderabad's other environmental reserves are: Kotla Vijayabhaskara Reddy Botanical Gardens, Shamirpet Lake, Hussain Sagar, Fox Sagar Lake, Mir Alam Tank and Patancheru Lake, which is home to regional birds and attracts seasonal migratory birds from different parts of the world. Organisations engaged in environmental and wildlife preservation include the Telangana Forest Department, Indian Council of Forestry Research and Education, the International Crops Research Institute for the Semi-Arid Tropics (ICRISAT), the Animal Welfare Board of India, the Blue Cross of Hyderabad and the University of Hyderabad. Answer:", - "ideal_response": "lion and tiger", - "category": "default", - "source": null - }, - "response": "lion and tiger safari park", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "How much energy does an HVAC system use in commercial locations? In the United States, heating, ventilation and air conditioning (HVAC) systems account for 30% (4.65 EJ/yr) of the energy used in commercial buildings and nearly 50% (10.1 EJ/yr) of the energy used in residential buildings. Solar heating, cooling and ventilation technologies can be used to offset a portion of this energy. Answer:", - "ideal_response": "30% (4.65 EJ/yr)", - "category": "default", - "source": null - }, - "response": "30% and 50%", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What did Nasser pursue for Palestinians? Nasser mediated discussions between the pro-Western, pro-Soviet, and neutralist conference factions over the composition of the \"Final Communique\" addressing colonialism in Africa and Asia and the fostering of global peace amid the Cold War between the West and the Soviet Union. At Bandung Nasser sought a proclamation for the avoidance of international defense alliances, support for the independence of Tunisia, Algeria, and Morocco from French rule, support for the Palestinian right of return, and the implementation of UN resolutions regarding the Arab\u2013Israeli conflict. He succeeded in lobbying the attendees to pass resolutions on each of these issues, notably securing the strong support of China and India. Answer:", - "ideal_response": "right of return", - "category": "default", - "source": null - }, - "response": "Palestinian right of return", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is a core beliefe that was recognized as important by orthodox Jews? Modern Orthodoxy, as a stream of Orthodox Judaism represented by institutions such as the U.S. National Council for Young Israel, is pro-Zionist and thus places a high national, as well as religious, significance on the State of Israel, and its affiliates are, typically, Zionist in orientation. It also practices involvement with non-Orthodox Jews that extends beyond \"outreach (Kiruv)\" to continued institutional relations and cooperation; see further under Torah Umadda. Other \"core beliefs\" are a recognition of the value and importance of secular studies, a commitment to equality of education for both men and women, and a full acceptance of the importance of being able to financially support oneself and one's family. Answer:", - "ideal_response": "secular studies", - "category": "default", - "source": null - }, - "response": "Recognition of the value and importance of secular studies", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What event caused major changes in Bermuda? The end of the war, however, was to cause profound change in Bermuda, though some of those changes would take decades to crystallise. Following the war, with the buildup of Naval and military forces in Bermuda, the primary leg of the Bermudian economy became defence infrastructure. Even after tourism began later in the 19th century, Bermuda remained, in the eyes of London, a base more than a colony. The Crown strengthened its political and economic ties to Bermuda, and the colony's independence on the world stage was diminished. Answer:", - "ideal_response": "end of the war", - "category": "default", - "source": null - }, - "response": "the end of the war", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "How many official languages does Switzerland have? Switzerland has four official languages: principally German (63.5% total population share, with foreign residents, in 2013); French (22.5%) in the west; and Italian (8.1%) in the south. The fourth official language, Romansh (0.5%), is a Romance language spoken locally in the southeastern trilingual canton of Graub\u00fcnden, and is designated by Article 4 of the Federal Constitution as a national language along with German, French, and Italian, and in Article 70 as an official language if the authorities communicate with persons who speak Romansh. However, federal laws and other official acts do not need to be decreed in Romansh. Answer:", - "ideal_response": "four", - "category": "default", - "source": null - }, - "response": "four", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "From when was it taught that the little flock would not be the only people to survive Armageddon? From 1932, it was taught that the \"little flock\" of 144,000 would not be the only people to survive Armageddon. Rutherford explained that in addition to the 144,000 \"anointed\" who would be resurrected\u2014or transferred at death\u2014to live in heaven to rule over earth with Christ, a separate class of members, the \"great multitude,\" would live in a paradise restored on earth; from 1935, new converts to the movement were considered part of that class. By the mid-1930s, the timing of the beginning of Christ's presence (Greek: parous\u00eda), his enthronement as king, and the start of the \"last days\" were each moved to 1914. Answer:", - "ideal_response": "1932", - "category": "default", - "source": null - }, - "response": "1932", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "The VC operated in what geographic area? Fighting on one side was a coalition of forces including the Republic of Vietnam (South Vietnam or the \"RVN\"), the United States, supplemented by South Korea, Thailand, Australia, New Zealand, and the Philippines. The allies fought against the North Vietnamese Army (NVA) as well as the National Liberation Front (NLF, also known as Viet communists Viet Cong), or \"VC\", a guerrilla force within South Vietnam. The NVA received substantial military and economic aid from the Soviet Union and China, turning Vietnam into a proxy war. Answer:", - "ideal_response": "South Vietnam", - "category": "default", - "source": null - }, - "response": "South Vietnam", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What different options did the desktop version have? Exceptions to the restrictions faced by Windows Store apps are given to web browsers. The user's default browser can distribute a Metro-style web browser in same package as the desktop version, which has access to functionality unavailable to other apps, such as being able to permanently run in the background, use multiple background processes, and use Windows API code instead of WinRT (allowing for code to be re-used with the desktop version, while still taking advantage of features available to Windows Store apps, such as charms). Microsoft advertises this exception privilege \"New experience enabled\" (formerly \"Metro-style enabled\"). Answer:", - "ideal_response": "able to permanently run in the background, use multiple background processes, and use Windows API code", - "category": "default", - "source": null - }, - "response": "New experience enabled", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Who wrote The Sensations of Tone as a Physiological Basis for the Theory of Music? At the age of 19, he wrote a report on his work and sent it to philologist Alexander Ellis, a colleague of his father (who would later be portrayed as Professor Henry Higgins in Pygmalion). Ellis immediately wrote back indicating that the experiments were similar to existing work in Germany, and also lent Bell a copy of Hermann von Helmholtz's work, The Sensations of Tone as a Physiological Basis for the Theory of Music. Answer:", - "ideal_response": "Hermann von Helmholtz", - "category": "default", - "source": null - }, - "response": "Hermann von Helmholtz", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Did Athanasius want to be the Patriarch of Alexandria? T. Gilmartin, (Professor of History, Maynooth, 1890), writes in Church History, Vol. 1, Ch XVII: On the death of Alexander, five months after the termination of the Council of Nice, Athanasius was unanimously elected to fill the vacant see. He was most unwilling to accept the dignity, for he clearly foresaw the difficulties in which it would involve him. The clergy and people were determined to have him as their bishop, Patriarch of Alexandria, and refused to accept any excuses. He at length consented to accept a responsibility that he sought in vain to escape, and was consecrated in 326, when he was about thirty years of age. Answer:", - "ideal_response": "He was most unwilling to accept", - "category": "default", - "source": null - }, - "response": "no", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What court held singer-lutenists after the Norman conquest? Beside the introduction of the lute to Spain (Andalusia) by the Moors, another important point of transfer of the lute from Arabian to European culture was Sicily, where it was brought either by Byzantine or later by Muslim musicians. There were singer-lutenists at the court in Palermo following the Norman conquest of the island from the Muslims, and the lute is depicted extensively in the ceiling paintings in the Palermo\u2019s royal Cappella Palatina, dedicated by the Norman King Roger II of Sicily in 1140. His Hohenstaufen grandson Frederick II, Holy Roman Emperor (1194 - 1250) continued integrating Muslims into his court, including Moorish musicians. By the 14th century, lutes had disseminated throughout Italy and, probably because of the cultural influence of the Hohenstaufen kings and emperor, based in Palermo, the lute had also made significant inroads into the German-speaking lands. Answer:", - "ideal_response": "Palermo", - "category": "default", - "source": null - }, - "response": "Palermo", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "After Planck's findings, what was determined could not take on an arbitrary value? Classical statistical mechanics requires the existence of h (but does not define its value). Eventually, following upon Planck's discovery, it was recognized that physical action cannot take on an arbitrary value. Instead, it must be some multiple of a very small quantity, the \"quantum of action\", now called the Planck constant. Classical physics cannot explain this fact. In many cases, such as for monochromatic light or for atoms, this quantum of action also implies that only certain energy levels are allowed, and values in between are forbidden. Answer:", - "ideal_response": "physical action", - "category": "default", - "source": null - }, - "response": "physical action", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What list did Beyonc\u00e9 make in 2013? In The New Yorker music critic Jody Rosen described Beyonc\u00e9 as \"the most important and compelling popular musician of the twenty-first century..... the result, the logical end point, of a century-plus of pop.\" When The Guardian named her Artist of the Decade, Llewyn-Smith wrote, \"Why Beyonc\u00e9? [...] Because she made not one but two of the decade's greatest singles, with Crazy in Love and Single Ladies (Put a Ring on It), not to mention her hits with Destiny's Child; and this was the decade when singles \u2013 particularly R&B singles \u2013 regained their status as pop's favourite medium. [...] [She] and not any superannuated rock star was arguably the greatest live performer of the past 10 years.\" In 2013, Beyonc\u00e9 made the Time 100 list, Baz Luhrmann writing \"no one has that voice, no one moves the way she moves, no one can hold an audience the way she does... When Beyonc\u00e9 does an album, when Beyonc\u00e9 sings a song, when Beyonc\u00e9 does anything, it's an event, and it's broadly influential. Right now, she is the heir-apparent diva of the USA \u2014 the reigning national voice.\" In 2014, Beyonc\u00e9 was listed again on the Time 100 and also featured on the cover of the issue. Answer:", - "ideal_response": "Time 100 list", - "category": "default", - "source": null - }, - "response": "Time 100", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Who had already held a large amount of magisterial offices? Shortly before 312 BCE, the Plebeian Council enacted the Plebiscitum Ovinium. During the early republic, only consuls could appoint new senators. This initiative, however, transferred this power to the censors. It also required the censor to appoint any newly elected magistrate to the senate. By this point, plebeians were already holding a significant number of magisterial offices. Thus, the number of plebeian senators probably increased quickly. However, it remained difficult for a plebeian to enter the senate if he was not from a well-known political family, as a new patrician-like plebeian aristocracy emerged. The old nobility existed through the force of law, because only patricians were allowed to stand for high office. The new nobility existed due to the organization of society. As such, only a revolution could overthrow this new structure. Answer:", - "ideal_response": "plebeians", - "category": "default", - "source": null - }, - "response": "plebeians", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Who is the leader of the station design team? On 6 September 2007, Belgian-based International Polar Foundation unveiled the Princess Elisabeth station, the world's first zero-emissions polar science station in Antarctica to research climate change. Costing $16.3 million, the prefabricated station, which is part of the International Polar Year, was shipped to the South Pole from Belgium by the end of 2008 to monitor the health of the polar regions. Belgian polar explorer Alain Hubert stated: \"This base will be the first of its kind to produce zero emissions, making it a unique model of how energy should be used in the Antarctic.\" Johan Berte is the leader of the station design team and manager of the project which conducts research in climatology, glaciology and microbiology. Answer:", - "ideal_response": "Johan Berte", - "category": "default", - "source": null - }, - "response": "Johan Berte", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Whas was Nasser's position at the military academy in 1943? In 1941, Nasser was posted to Khartoum, Sudan, which was part of Egypt at the time. Nasser returned to Sudan in September 1942 after a brief stay in Egypt, then secured a position as an instructor in the Cairo Royal Military Academy in May 1943. In 1942, the British Ambassador Miles Lampson marched into King Farouk's palace and ordered him to dismiss Prime Minister Hussein Sirri Pasha for having pro-Axis sympathies. Nasser saw the incident as a blatant violation of Egyptian sovereignty and wrote, \"I am ashamed that our army has not reacted against this attack\", and wished for \"calamity\" to overtake the British. Nasser was accepted into the General Staff College later that year. He began to form a group of young military officers with strong nationalist sentiments who supported some form of revolution. Nasser stayed in touch with the group's members primarily through Amer, who continued to seek out interested officers within the Egyptian Armed Force's various branches and presented Nasser with a complete file on each of them. Answer:", - "ideal_response": "instructor", - "category": "default", - "source": null - }, - "response": "instructor", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Who owned the Desperados trademarks? On January 6, 2016, the league took over \"ownership and operational control\" of the Portland Thunder from its previous owners. The AFL stated this move was made after months of trying work out an arrangement \"to provide financial and operational support.\" On February 3, 2016, it was announced that the franchise will start from scratch and no longer be called the \"Thunder\" as the name and trademarks belong to former franchise owner Terry Emmert (similar to the Jerry Jones move with the Desperados). AFL commissioner Scott Butera announced that a new identity will be announced at a later date. Answer:", - "ideal_response": "Jerry Jones", - "category": "default", - "source": null - }, - "response": "Terry Emmert", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "The uniqueness of Mycobacterium tuberculosis is due to its high level of what type of molecule? The main cause of TB is Mycobacterium tuberculosis, a small, aerobic, nonmotile bacillus. The high lipid content of this pathogen accounts for many of its unique clinical characteristics. It divides every 16 to 20 hours, which is an extremely slow rate compared with other bacteria, which usually divide in less than an hour. Mycobacteria have an outer membrane lipid bilayer. If a Gram stain is performed, MTB either stains very weakly \"Gram-positive\" or does not retain dye as a result of the high lipid and mycolic acid content of its cell wall. MTB can withstand weak disinfectants and survive in a dry state for weeks. In nature, the bacterium can grow only within the cells of a host organism, but M. tuberculosis can be cultured in the laboratory. Answer:", - "ideal_response": "lipid", - "category": "default", - "source": null - }, - "response": "lipid", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What type of dielectric layer is used in electrolytic capacitors? Electrolytic capacitors use an aluminum or tantalum plate with an oxide dielectric layer. The second electrode is a liquid electrolyte, connected to the circuit by another foil plate. Electrolytic capacitors offer very high capacitance but suffer from poor tolerances, high instability, gradual loss of capacitance especially when subjected to heat, and high leakage current. Poor quality capacitors may leak electrolyte, which is harmful to printed circuit boards. The conductivity of the electrolyte drops at low temperatures, which increases equivalent series resistance. While widely used for power-supply conditioning, poor high-frequency characteristics make them unsuitable for many applications. Electrolytic capacitors will self-degrade if unused for a period (around a year), and when full power is applied may short circuit, permanently damaging the capacitor and usually blowing a fuse or causing failure of rectifier diodes (for instance, in older equipment, arcing in rectifier tubes). They can be restored before use (and damage) by gradually applying the operating voltage, often done on antique vacuum tube equipment over a period of 30 minutes by using a variable transformer to supply AC power. Unfortunately, the use of this technique may be less satisfactory for some solid state equipment, which may be damaged by operation below its normal power range, requiring that the power supply first be isolated from the consuming circuits. Such remedies may not be applicable to modern high-frequency power supplies as these produce full output voltage even with reduced input. Answer:", - "ideal_response": "an oxide dielectric layer", - "category": "default", - "source": null - }, - "response": "oxide dielectric layer", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "In what city did Dominic establish a school? Dominic's education at Palencia gave him the knowledge he needed to overcome the Manicheans. With charity, the other concept that most defines the work and spirituality of the order, study became the method most used by the Dominicans in working to defend the Church against the perils that hounded it, and also of enlarging its authority over larger areas of the known world. In Dominic's thinking, it was impossible for men to preach what they did not or could not understand. When the brethren left Prouille, then, to begin their apostolic work, Dominic sent Matthew of Paris to establish a school near the University of Paris. This was the first of many Dominican schools established by the brethren, some near large universities throughout Europe. Answer:", - "ideal_response": "Paris", - "category": "default", - "source": null - }, - "response": "Paris", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "USB keyboards and mice may communicate using what? USB mice and keyboards can usually be used with older computers that have PS/2 connectors with the aid of a small USB-to-PS/2 adapter. For mice and keyboards with dual-protocol support, an adaptor that contains no logic circuitry may be used: the hardware in the USB keyboard or mouse is designed to detect whether it is connected to a USB or PS/2 port, and communicate using the appropriate protocol. Converters also exist that connect PS/2 keyboards and mice (usually one of each) to a USB port. These devices present two HID endpoints to the system and use a microcontroller to perform bidirectional data translation between the two standards. Answer:", - "ideal_response": "appropriate protocol", - "category": "default", - "source": null - }, - "response": "appropriate protocol", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What does USB 2.0 High-Speed Inter-Chip eliminate? USB 2.0 High-Speed Inter-Chip (HSIC) is a chip-to-chip variant of USB 2.0 that eliminates the conventional analog transceivers found in normal USB. It was adopted as a standard by the USB Implementers Forum in 2007. The HSIC physical layer uses about 50% less power and 75% less board area compared to traditional USB 2.0. HSIC uses two signals at 1.2 V and has a throughput of 480 Mbit/s. Maximum PCB trace length for HSIC is 10 cm. It does not have low enough latency to support RAM memory sharing between two chips. Answer:", - "ideal_response": "the conventional analog transceivers found in normal USB", - "category": "default", - "source": null - }, - "response": "analog transceivers", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is the contemporary name of the religion which Avesta was part of? The other directly attested Old Iranian dialects are the two forms of Avestan, which take their name from their use in the Avesta, the liturgical texts of indigenous Iranian religion that now goes by the name of Zoroastrianism but in the Avesta itself is simply known as vohu daena (later: behdin). The language of the Avesta is subdivided into two dialects, conventionally known as \"Old (or 'Gathic') Avestan\", and \"Younger Avestan\". These terms, which date to the 19th century, are slightly misleading since 'Younger Avestan' is not only much younger than 'Old Avestan', but also from a different geographic region. The Old Avestan dialect is very archaic, and at roughly the same stage of development as Rigvedic Sanskrit. On the other hand, Younger Avestan is at about the same linguistic stage as Old Persian, but by virtue of its use as a sacred language retained its \"old\" characteristics long after the Old Iranian languages had yielded to their Middle Iranian stage. Unlike Old Persian, which has Middle Persian as its known successor, Avestan has no clearly identifiable Middle Iranian stage (the effect of Middle Iranian is indistinguishable from effects due to other causes). Answer:", - "ideal_response": "Zoroastrianism", - "category": "default", - "source": null - }, - "response": "Zoroastrianism", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "2000 of what group fought directly for Tito? Despite conflicts with the rival monarchic Chetnik movement, Tito's Partisans succeeded in liberating territory, notably the \"Republic of U\u017eice\". During this period, Tito held talks with Chetnik leader Dra\u017ea Mihailovi\u0107 on 19 September and 27 October 1941. It is said that Tito ordered his forces to assist escaping Jews, and that more than 2,000 Jews fought directly for Tito. Answer:", - "ideal_response": "Jews", - "category": "default", - "source": null - }, - "response": "Jews", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Along with Lucius Clay, who advised Eisenhower on cabinet appointments? Due to a complete estrangement between the two as a result of campaigning, Truman and Eisenhower had minimal discussions about the transition of administrations. After selecting his budget director, Joseph M. Dodge, Eisenhower asked Herbert Brownell and Lucius Clay to make recommendations for his cabinet appointments. He accepted their recommendations without exception; they included John Foster Dulles and George M. Humphrey with whom he developed his closest relationships, and one woman, Oveta Culp Hobby. Eisenhower's cabinet, consisting of several corporate executives and one labor leader, was dubbed by one journalist, \"Eight millionaires and a plumber.\" The cabinet was notable for its lack of personal friends, office seekers, or experienced government administrators. He also upgraded the role of the National Security Council in planning all phases of the Cold War. Answer:", - "ideal_response": "Herbert Brownell", - "category": "default", - "source": null - }, - "response": "Lucius Clay", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "The Treaty of Locarno guarantees each signatory against what from another signatory? A multilateral treaty is concluded among several countries. The agreement establishes rights and obligations between each party and every other party. Multilateral treaties are often regional.[citation needed] Treaties of \"mutual guarantee\" are international compacts, e.g., the Treaty of Locarno which guarantees each signatory against attack from another. Answer:", - "ideal_response": "attack", - "category": "default", - "source": null - }, - "response": "attack", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "In which direction did the Didcot, Newbury and Southampton Railway want to expand? The town was the subject of an attempt by a separate company, the Didcot, Newbury and Southampton Railway, to open another rail route to the North in the 1880s and some building work, including a surviving embankment, was undertaken in the Hill Lane area. Answer:", - "ideal_response": "North", - "category": "default", - "source": null - }, - "response": "North", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "In addition to Yale Reparatory Theatre, what are two additional major theatre houses located in New Haven? The city hosts numerous theatres and production houses, including the Yale Repertory Theatre, the Long Wharf Theatre, and the Shubert Theatre. There is also theatre activity from the Yale School of Drama, which works through the Yale University Theatre and the student-run Yale Cabaret. Southern Connecticut State University hosts the Lyman Center for the Performing Arts. The shuttered Palace Theatre (opposite the Shubert Theatre) is being renovated and will reopen as the College Street Music Hall in May, 2015. Smaller theatres include the Little Theater on Lincoln Street. Cooperative Arts and Humanities High School also boasts a state-of-the-art theatre on College Street. The theatre is used for student productions as well as the home to weekly services to a local non-denominational church, the City Church New Haven. Answer:", - "ideal_response": "Long Wharf Theatre, and the Shubert Theatre", - "category": "default", - "source": null - }, - "response": "Long Wharf Theatre, Shubert Theatre", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Which years were plagued by the Black Death? In 1348 and 1349 Portugal, like the rest of Europe, was devastated by the Black Death. In 1373, Portugal made an alliance with England, which is the longest-standing alliance in the world. This alliance served both nations' interests throughout history and is regarded by many as the predecessor to NATO. Over time this went way beyond geo-political and military cooperation (protecting both nations' interests in Africa, the Americas and Asia against French, Spanish and Dutch rivals) and maintained strong trade and cultural ties between the two old European allies. Particularly in the Oporto region, there is visible English influence to this day. Answer:", - "ideal_response": "1348 and 1349", - "category": "default", - "source": null - }, - "response": "1348 and 1349", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "How did Boganda die? In the Ubangi-Shari Territorial Assembly election in 1957, MESAN captured 347,000 out of the total 356,000 votes, and won every legislative seat, which led to Boganda being elected president of the Grand Council of French Equatorial Africa and vice-president of the Ubangi-Shari Government Council. Within a year, he declared the establishment of the Central African Republic and served as the country's first prime minister. MESAN continued to exist, but its role was limited. After Boganda's death in a plane crash on 29 March 1959, his cousin, David Dacko, took control of MESAN and became the country's first president after the CAR had formally received independence from France. Dacko threw out his political rivals, including former Prime Minister and Mouvement d'\u00e9volution d\u00e9mocratique de l'Afrique centrale (MEDAC), leader Abel Goumba, whom he forced into exile in France. With all opposition parties suppressed by November 1962, Dacko declared MESAN as the official party of the state. Answer:", - "ideal_response": "a plane crash", - "category": "default", - "source": null - }, - "response": "plane crash", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is the life style of the indigenous people of the Pacific Northwest? Some hunter-gatherer cultures, such as the indigenous peoples of the Pacific Northwest Coast, lived in particularly rich environments that allowed them to be sedentary or semi-sedentary. Answer:", - "ideal_response": "hunter-gatherer", - "category": "default", - "source": null - }, - "response": "sedentary or semi-sedentary", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Placing red and green next to each other causes their color to be what? Matisse was also one of the first 20th-century artists to make color the central element of the painting, chosen to evoke emotions. \"A certain blue penetrates your soul\", he wrote. \"A certain red affects your blood pressure.\" He also was familiar with the way that complementary colors, such as red and green, strengthened each other when they were placed next to each other. He wrote, \"My choice of colors is not based on scientific theory; it is based on observation, upon feelings, upon the real nature of each experience ... I just try to find a color which corresponds to my feelings.\" Answer:", - "ideal_response": "strengthened", - "category": "default", - "source": null - }, - "response": "neutral", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Which is less expensive, the ReWritable Audio CD or a CD-RW? The ReWritable Audio CD is designed to be used in a consumer audio CD recorder, which will not (without modification) accept standard CD-RW discs. These consumer audio CD recorders use the Serial Copy Management System (SCMS), an early form of digital rights management (DRM), to conform to the United States' Audio Home Recording Act (AHRA). The ReWritable Audio CD is typically somewhat more expensive than CD-RW due to (a) lower volume and (b) a 3% AHRA royalty used to compensate the music industry for the making of a copy. Answer:", - "ideal_response": "CD-RW", - "category": "default", - "source": null - }, - "response": "CD-RW", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Who pioneered parsimony? The first half of the 14th century saw much important scientific work being done, largely within the framework of scholastic commentaries on Aristotle's scientific writings. William of Ockham introduced the principle of parsimony: natural philosophers should not postulate unnecessary entities, so that motion is not a distinct thing but is only the moving object and an intermediary \"sensible species\" is not needed to transmit an image of an object to the eye. Scholars such as Jean Buridan and Nicole Oresme started to reinterpret elements of Aristotle's mechanics. In particular, Buridan developed the theory that impetus was the cause of the motion of projectiles, which was a first step towards the modern concept of inertia. The Oxford Calculators began to mathematically analyze the kinematics of motion, making this analysis without considering the causes of motion. Answer:", - "ideal_response": "William of Ockham", - "category": "default", - "source": null - }, - "response": "William of Ockham", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What statement does Stark make about the leaders of the Jehovah's Witnesses? Sociologist Rodney Stark states that Jehovah's Witness leaders are \"not always very democratic\" and that members \"are expected to conform to rather strict standards,\" but adds that \"enforcement tends to be very informal, sustained by the close bonds of friendship within the group\", and that Jehovah's Witnesses see themselves as \"part of the power structure rather than subject to it.\" Sociologist Andrew Holden states that most members who join millenarian movements such as Jehovah's Witnesses have made an informed choice. However, he also states that defectors \"are seldom allowed a dignified exit\", and describes the administration as autocratic. Answer:", - "ideal_response": "\"not always very democratic\"", - "category": "default", - "source": null - }, - "response": "not always very democratic", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What was the result of the victory for the Austrians? The war was continuing indecisively when on 14 October Marshal Daun's Austrians surprised the main Prussian army at the Battle of Hochkirch in Saxony. Frederick lost much of his artillery but retreated in good order, helped by dense woods. The Austrians had ultimately made little progress in the campaign in Saxony despite Hochkirch and had failed to achieve a decisive breakthrough. After a thwarted attempt to take Dresden, Daun's troops were forced to withdraw to Austrian territory for the winter, so that Saxony remained under Prussian occupation. At the same time, the Russians failed in an attempt to take Kolberg in Pomerania (now Ko\u0142obrzeg, Poland) from the Prussians. Answer:", - "ideal_response": "The Austrians had ultimately made little progress in the campaign in Saxony despite Hochkirch and had failed to achieve a decisive breakthrough", - "category": "default", - "source": null - }, - "response": "Prussian occupation", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "When was John appointed the Lord of Ireland? John, the youngest of five sons of King Henry II of England and Eleanor of Aquitaine, was at first not expected to inherit significant lands. Following the failed rebellion of his elder brothers between 1173 and 1174, however, John became Henry's favourite child. He was appointed the Lord of Ireland in 1177 and given lands in England and on the continent. John's elder brothers William, Henry and Geoffrey died young; by the time Richard I became king in 1189, John was a potential heir to the throne. John unsuccessfully attempted a rebellion against Richard's royal administrators whilst his brother was participating in the Third Crusade. Despite this, after Richard died in 1199, John was proclaimed King of England, and came to an agreement with Philip II of France to recognise John's possession of the continental Angevin lands at the peace treaty of Le Goulet in 1200. Answer:", - "ideal_response": "1177", - "category": "default", - "source": null - }, - "response": "1177", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What were the Manchus originally named? The Qing dynasty (1644\u20131911) was founded after the fall of the Ming, the last Han Chinese dynasty, by the Manchus. The Manchus were formerly known as the Jurchens. When Beijing was captured by Li Zicheng's peasant rebels in 1644, the Chongzhen Emperor, the last Ming emperor, committed suicide. The Manchus then allied with former Ming general Wu Sangui and seized control of Beijing, which became the new capital of the Qing dynasty. The Mancus adopted the Confucian norms of traditional Chinese government in their rule of China proper. Schoppa, the editor of The Columbia Guide to Modern Chinese History argues, \"A date around 1780 as the beginning of modern China is thus closer to what we know today as historical 'reality'. It also allows us to have a better baseline to understand the precipitous decline of the Chinese polity in the nineteenth and twentieth centuries.\" Answer:", - "ideal_response": "Jurchens", - "category": "default", - "source": null - }, - "response": "Jurchens", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is the name of the modern art museum located in new Delhi? New Delhi is home to Indira Gandhi Memorial Museum, National Gallery of Modern Art, National Museum of Natural History, National Rail Museum, National Handicrafts and Handlooms Museum, National Philatelic Museum, Nehru Planetarium, Shankar's International Dolls Museum. and Supreme Court of India Museum. Answer:", - "ideal_response": "National Gallery of Modern Art", - "category": "default", - "source": null - }, - "response": "National Gallery of Modern Art", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Who rejected the idea of sending the princesses away? In September 1939, Britain entered the Second World War, which lasted until 1945. During the war, many of London's children were evacuated to avoid the frequent aerial bombing. The suggestion by senior politician Lord Hailsham that the two princesses should be evacuated to Canada was rejected by Elizabeth's mother, who declared, \"The children won't go without me. I won't leave without the King. And the King will never leave.\" Princesses Elizabeth and Margaret stayed at Balmoral Castle, Scotland, until Christmas 1939, when they moved to Sandringham House, Norfolk. From February to May 1940, they lived at Royal Lodge, Windsor, until moving to Windsor Castle, where they lived for most of the next five years. At Windsor, the princesses staged pantomimes at Christmas in aid of the Queen's Wool Fund, which bought yarn to knit into military garments. In 1940, the 14-year-old Elizabeth made her first radio broadcast during the BBC's Children's Hour, addressing other children who had been evacuated from the cities. She stated: \"We are trying to do all we can to help our gallant sailors, soldiers and airmen, and we are trying, too, to bear our share of the danger and sadness of war. We know, every one of us, that in the end all will be well.\" Answer:", - "ideal_response": "Elizabeth's mother", - "category": "default", - "source": null - }, - "response": "Elizabeth's mother", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "After World War II what did the American, English and Soviet allies want to capture? At war's end, American, British, and Soviet scientific intelligence teams competed to capture Germany's rocket engineers along with the German rockets themselves and the designs on which they were based. Each of the Allies captured a share of the available members of the German rocket team, but the United States benefited the most with Operation Paperclip, recruiting von Braun and most of his engineering team, who later helped develop the American missile and space exploration programs. The United States also acquired a large number of complete V2 rockets. Answer:", - "ideal_response": "Germany's rocket engineers", - "category": "default", - "source": null - }, - "response": "Germany's rocket engineers", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Although he was not the creator of the concept, who popularized the idea of nutritionism? Nutritionism is the view that excessive reliance on food science and the study of nutrition can lead to poor nutrition and to ill health. It was originally credited to Gyorgy Scrinis, and was popularized by Michael Pollan. Since nutrients are invisible, policy makers rely on nutrition experts to advise on food choices. Because science has an incomplete understanding of how food affects the human body, Pollan argues, nutritionism can be blamed for many of the health problems relating to diet in the Western World today. Answer:", - "ideal_response": "Michael Pollan", - "category": "default", - "source": null - }, - "response": "Michael Pollan", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "after the act of 1707 what was the second cross added to the Canton for great britian From the period of 1600, the canton consisted of a St George's Cross representing the Kingdom of England. With the Acts of Union 1707, the canton was updated to be the new Union Flag\u2014consisting of an English St George's Cross combined with a Scottish St Andrew's cross\u2014representing the Kingdom of Great Britain. After the Acts of Union 1800 that joined Ireland with Great Britain to form the United Kingdom, the canton of the East India Company flag was altered accordingly to include a Saint Patrick's Saltire replicating the updated Union Flag representing the United Kingdom of Great Britain and Ireland. Answer:", - "ideal_response": "St Andrew's cross", - "category": "default", - "source": null - }, - "response": "Saint Patrick's Saltire", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "On what date did the Indian Army take control of Hyderabad? After India gained independence, the Nizam declared his intention to remain independent rather than become part of the Indian Union. The Hyderabad State Congress, with the support of the Indian National Congress and the Communist Party of India, began agitating against Nizam VII in 1948. On 17 September that year, the Indian Army took control of Hyderabad State after an invasion codenamed Operation Polo. With the defeat of his forces, Nizam VII capitulated to the Indian Union by signing an Instrument of Accession, which made him the Rajpramukh (Princely Governor) of the state until 31 October 1956. Between 1946 and 1951, the Communist Party of India fomented the Telangana uprising against the feudal lords of the Telangana region. The Constitution of India, which became effective on 26 January 1950, made Hyderabad State one of the part B states of India, with Hyderabad city continuing to be the capital. In his 1955 report Thoughts on Linguistic States, B. R. Ambedkar, then chairman of the Drafting Committee of the Indian Constitution, proposed designating the city of Hyderabad as the second capital of India because of its amenities and strategic central location. Since 1956, the Rashtrapati Nilayam in Hyderabad has been the second official residence and business office of the President of India; the President stays once a year in winter and conducts official business particularly relating to Southern India. Answer:", - "ideal_response": "1948. On 17 September", - "category": "default", - "source": null - }, - "response": "17 September", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What aspect of the treaties that indigenous people signed with Europeans did the indigenous people typically not understand? Treaties formed an important part of European colonization and, in many parts of the world, Europeans attempted to legitimize their sovereignty by signing treaties with indigenous peoples. In most cases these treaties were in extremely disadvantageous terms to the native people, who often did not appreciate the implications of what they were signing. Answer:", - "ideal_response": "the implications", - "category": "default", - "source": null - }, - "response": "the implications of what they were signing", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Where are purpose-built pubs typically located? Although the new licensing laws prevented new beer houses from being created, those already in existence were allowed to continue and many did not close until nearly the end of the 19th century. A very small number remained into the 21st century. The vast majority of the beer houses applied for the new licences and became full pubs. These usually small establishments can still be identified in many towns, seemingly oddly located in the middle of otherwise terraced housing part way up a street, unlike purpose-built pubs that are usually found on corners or road junctions. Many of today's respected real ale micro-brewers in the UK started as home based Beer House brewers under the 1830 Act. Answer:", - "ideal_response": "corners or road junctions", - "category": "default", - "source": null - }, - "response": "on corners or road junctions", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Aristotle thought what would fill any rarity that might give rise to a void? Historically, there has been much dispute over whether such a thing as a vacuum can exist. Ancient Greek philosophers debated the existence of a vacuum, or void, in the context of atomism, which posited void and atom as the fundamental explanatory elements of physics. Following Plato, even the abstract concept of a featureless void faced considerable skepticism: it could not be apprehended by the senses, it could not, itself, provide additional explanatory power beyond the physical volume with which it was commensurate and, by definition, it was quite literally nothing at all, which cannot rightly be said to exist. Aristotle believed that no void could occur naturally, because the denser surrounding material continuum would immediately fill any incipient rarity that might give rise to a void. Answer:", - "ideal_response": "denser surrounding material continuum", - "category": "default", - "source": null - }, - "response": "denser material continuum", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "How did the English order hope to gain knowledge of Christ? The center of all mystical experience is, of course, Christ. English Dominicans sought to gain a full knowledge of Christ through an imitation of His life. English mystics of all types tended to focus on the moral values that the events in Christ's life exemplified. This led to a \"progressive understanding of the meanings of Scripture--literal, moral, allegorical, and anagogical\"\u2014that was contained within the mystical journey itself. From these considerations of Scripture comes the simplest way to imitate Christ: an emulation of the moral actions and attitudes that Jesus demonstrated in His earthly ministry becomes the most significant way to feel and have knowledge of God. Answer:", - "ideal_response": "through an imitation of His life", - "category": "default", - "source": null - }, - "response": "an emulation of the moral actions and attitudes that Jesus demonstrated in His earthly ministry", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "How is Corinthian bronze made? The gates of the Temple of Jerusalem used Corinthian bronze made by depletion gilding. It was most prevalent in Alexandria, where alchemy is thought to have begun. In ancient India, copper was used in the holistic medical science Ayurveda for surgical instruments and other medical equipment. Ancient Egyptians (~2400 BC) used copper for sterilizing wounds and drinking water, and later on for headaches, burns, and itching. The Baghdad Battery, with copper cylinders soldered to lead, dates back to 248 BC to AD 226 and resembles a galvanic cell, leading people to believe this was the first battery; the claim has not been verified. Answer:", - "ideal_response": "depletion gilding", - "category": "default", - "source": null - }, - "response": "depletion gilding", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What type of satellites does the American GPS system use? Unlike the American GPS, Russian GLONASS, and European Galileo systems, which use medium Earth orbit satellites, BeiDou-1 uses satellites in geostationary orbit. This means that the system does not require a large constellation of satellites, but it also limits the coverage to areas on Earth where the satellites are visible. The area that can be serviced is from longitude 70\u00b0E to 140\u00b0E and from latitude 5\u00b0N to 55\u00b0N. A frequency of the system is 2491.75 MHz. Answer:", - "ideal_response": "medium Earth orbit satellites", - "category": "default", - "source": null - }, - "response": "medium Earth orbit satellites", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "In what country was the 2007 Rugby World Cup finals? The rugby union team The Rock is the Eastern Canadian entry in the Americas Rugby Championship. The Rock play their home games at Swilers Rugby Park, as did the Rugby Canada Super League champions for 2005 and 2006, the Newfoundland Rock. The city hosted a Rugby World Cup qualifying match between Canada and the USA on 12 August 2006, where the Canadians heavily defeated the USA 56\u20137 to qualify for the 2007 Rugby World Cup finals in France. The 2007 age-grade Rugby Canada National Championship Festival was held in the city. Answer:", - "ideal_response": "France", - "category": "default", - "source": null - }, - "response": "France", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What branch of biology was The Origin of Species founded on? On the Origin of Species, published on 24 November 1859, is a work of scientific literature by Charles Darwin which is considered to be the foundation of evolutionary biology. Darwin's book introduced the scientific theory that populations evolve over the course of generations through a process of natural selection. It presented a body of evidence that the diversity of life arose by common descent through a branching pattern of evolution. Darwin included evidence that he had gathered on the Beagle expedition in the 1830s and his subsequent findings from research, correspondence, and experimentation. Answer:", - "ideal_response": "evolutionary biology", - "category": "default", - "source": null - }, - "response": "evolutionary", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Along with the Mariana Islands, on what island were there more Japanese settlers than indigenous inhabitants? The German Empire had primarily economic interests in Micronesia. The Japanese interests were in land. Despite the Marshalls' small area and few resources, the absorption of the territory by Japan would to some extent alleviate Japan's problem of an increasing population with a diminishing amount of available land to house it. During its years of colonial rule, Japan moved more than 1,000 Japanese to the Marshall Islands although they never outnumbered the indigenous peoples as they did in the Mariana Islands and Palau. Answer:", - "ideal_response": "Palau", - "category": "default", - "source": null - }, - "response": "Palau", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is the name of the prohibition against eating grains and legumes during Passover? Jewish historians also note that certain customs of today's Orthodox are not continuations of past practice, but instead represent innovations that would have been unknown to prior generations. For example, the now-widespread haredi tradition of cutting a boy's hair for the first time on his third birthday (upshirin or upsheerin, Yiddish for \"haircut\") \"originated as an Arab custom that parents cut a newborn boy's hair and burned it in a fire as a sacrifice,\" and \"Jews in Palestine learned this custom from Arabs and adapted it to a special Jewish context.\" The Ashkenazi prohibition against eating kitniyot (grains and legumes such as rice, corn, beans, and peanuts) during Passover was explicitly rejected in the Talmud, has no known precedent before the 12th century and represented a minority position for hundreds of years thereafter, but nonetheless has remained a mandatory prohibition among Ashkenazi Orthodox Jews due to their historic adherence to the ReMA's rulings in the Shulchan Aruch. Answer:", - "ideal_response": "Ashkenazi", - "category": "default", - "source": null - }, - "response": "kitniyot", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Which countries use the term chancellor to denote the head of government? The convention in the English language is to call nearly all national heads of government \"prime minister\" (sometimes modified to the equivalent term of premier), regardless of the correct title of the head of government as applied in his or her respective country. The few exceptions to the rule are Germany and Austria, whose heads of government titles are almost always translated as Chancellor; Monaco, whose head of government is referred to as the Minister of State; and Vatican City, for which the head of government is titled the Secretary of State. In the case of Ireland, the head of government is occasionally referred to as the Taoiseach by English speakers. A stand-out case is the President of Iran, who is not actually a head of state, but the head of the government of Iran. He is referred to as \"president\" in both the Persian and English languages. Answer:", - "ideal_response": "Germany and Austria", - "category": "default", - "source": null - }, - "response": "Germany and Austria", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What branch of government are the administrative courts a part of? Each borough is coextensive with a judicial district of the state Unified Court System, of which the Criminal Court and the Civil Court are the local courts, while the New York Supreme Court conducts major trials and appeals. Manhattan hosts the First Department of the Supreme Court, Appellate Division while Brooklyn hosts the Second Department. There are also several extrajudicial administrative courts, which are executive agencies and not part of the state Unified Court System. Answer:", - "ideal_response": "executive", - "category": "default", - "source": null - }, - "response": "executive", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Along with dogcatcher, what political job did Eisenhower specifically not want to be considered for? In June 1943 a visiting politician had suggested to Eisenhower that he might become President of the United States after the war. Believing that a general should not participate in politics, one author later wrote that \"figuratively speaking, [Eisenhower] kicked his political-minded visitor out of his office\". As others asked him about his political future, Eisenhower told one that he could not imagine wanting to be considered for any political job \"from dogcatcher to Grand High Supreme King of the Universe\", and another that he could not serve as Army Chief of Staff if others believed he had political ambitions. In 1945 Truman told Eisenhower during the Potsdam Conference that if desired, the president would help the general win the 1948 election, and in 1947 he offered to run as Eisenhower's running mate on the Democratic ticket if MacArthur won the Republican nomination. Answer:", - "ideal_response": "Grand High Supreme King of the Universe", - "category": "default", - "source": null - }, - "response": "President of the United States", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What was the origination of the Imperial Roman Style? At the same time the Empire style in France was a more grandiose wave of neoclassicism in architecture and the decorative arts. Mainly based on Imperial Roman styles, it originated in, and took its name from, the rule of Napoleon I in the First French Empire, where it was intended to idealize Napoleon's leadership and the French state. The style corresponds to the more bourgeois Biedermeier style in the German-speaking lands, Federal style in the United States, the Regency style in Britain, and the Napoleonstil in Sweden. According to the art historian Hugh Honour \"so far from being, as is sometimes supposed, the culmination of the Neo-classical movement, the Empire marks its rapid decline and transformation back once more into a mere antique revival, drained of all the high-minded ideas and force of conviction that had inspired its masterpieces\". Answer:", - "ideal_response": "Napoleon I", - "category": "default", - "source": null - }, - "response": "the rule of Napoleon I in the First French Empire", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Why can outdoor activities take place all year in Miami? Miami's tropical weather allows for year-round outdoors activities. The city has numerous marinas, rivers, bays, canals, and the Atlantic Ocean, which make boating, sailing, and fishing popular outdoors activities. Biscayne Bay has numerous coral reefs which make snorkeling and scuba diving popular. There are over 80 parks and gardens in the city. The largest and most popular parks are Bayfront Park and Bicentennial Park (located in the heart of Downtown and the location of the American Airlines Arena and Bayside Marketplace), Tropical Park, Peacock Park, Morningside Park, Virginia Key, and Watson Island. Answer:", - "ideal_response": "tropical weather", - "category": "default", - "source": null - }, - "response": "Miami's tropical weather", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "The officials in Mexico reduced the price of what food from six cents to two cents per pound? The officials in Mexico City reduced the price of corn from six cents to two cents a pound. The northern portion of the state continued to decline economically which led to another revolt led by G. Casavantes in August 1879; Governor Tr\u00edas was accused of misappropriation of funds and inefficient administration of the state. Casavantes took the state capital and occupied it briefly; he was also successful in forcing Governor Tr\u00edas to exile. Shortly afterwards, the federal government sent an entourage led by Trevi\u00f1o; Casavantes was immediately ordered to resign his position. Casavantes declared political victory as he was able to publicly accuse and depose Governor Tr\u00edas. At the same time the states of Durango and Coahuila had a military confrontation over territorial claims and water rights; this altercation between the state required additional federal troops to stabilize the area. Later a dispute ensued again among the states of Coahuila, Durango, and Chihuahua over the mountain range area known as Sierra Mojada, when large deposits of gold ore was discovered. The state of Chihuahua officially submitted a declaration of protest in May 1880 that shortly after was amicably settled. Despite the difficulties at the beginning, D\u00edaz was able to secure and stabilize the state, which earned the confidence and support of the people. Answer:", - "ideal_response": "corn", - "category": "default", - "source": null - }, - "response": "corn", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Why is glass annealed? New chemical glass compositions or new treatment techniques can be initially investigated in small-scale laboratory experiments. The raw materials for laboratory-scale glass melts are often different from those used in mass production because the cost factor has a low priority. In the laboratory mostly pure chemicals are used. Care must be taken that the raw materials have not reacted with moisture or other chemicals in the environment (such as alkali or alkaline earth metal oxides and hydroxides, or boron oxide), or that the impurities are quantified (loss on ignition). Evaporation losses during glass melting should be considered during the selection of the raw materials, e.g., sodium selenite may be preferred over easily evaporating SeO2. Also, more readily reacting raw materials may be preferred over relatively inert ones, such as Al(OH)3 over Al2O3. Usually, the melts are carried out in platinum crucibles to reduce contamination from the crucible material. Glass homogeneity is achieved by homogenizing the raw materials mixture (glass batch), by stirring the melt, and by crushing and re-melting the first melt. The obtained glass is usually annealed to prevent breakage during processing. Answer:", - "ideal_response": "to prevent breakage", - "category": "default", - "source": null - }, - "response": "to prevent breakage during processing", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "How much did Napoleon sell the Louisiana Territory to the United States for? Napoleon could be considered one of the founders of modern Germany. After dissolving the Holy Roman Empire, he reduced the number of German states from 300 to less than 50, paving the way to German Unification. A byproduct of the French occupation was a strong development in German nationalism. Napoleon also significantly aided the United States when he agreed to sell the territory of Louisiana for 15 million dollars during the presidency of Thomas Jefferson. That territory almost doubled the size of the United States, adding the equivalent of 13 states to the Union. Answer:", - "ideal_response": "15 million dollars", - "category": "default", - "source": null - }, - "response": "15 million dollars", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What happened since 1997? In modern times, a process of devolution in the United Kingdom has decentralised power once again. Since the 1997 referendums in Scotland and Wales and the Good Friday Agreement in Northern Ireland, three of the four constituent countries of the UK now have some level of autonomy. Government has been devolved to the Scottish Parliament, the National Assembly for Wales and the Northern Ireland Assembly. England does not have its own parliament and English affairs continue to be decided by the Westminster Parliament. In 1998 a set of eight unelected Regional assemblies, or chambers, was created to support the English Regional Development Agencies, but these were abolished between 2008 and 2010. The Regions of England continue to be used in certain governmental administrative functions. Answer:", - "ideal_response": "referendums in Scotland and Wales and the Good Friday Agreement in Northern Ireland", - "category": "default", - "source": null - }, - "response": "Government has been devolved to the Scottish Parliament, the National Assembly for Wales and the Northern Ireland Assembly", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is the former Cameroon pavilion? The Pagode de Vincennes Buddhist temple, near Lake Daumesnil in the Bois de Vincennes, is the former Cameroon pavilion from the 1931 Paris Colonial Exposition. It hosts several different schools of Buddhism, and does not have a single leader. It shelters the biggest Buddha statue in Europe, more than nine metres high. There are two other small temples located in the Asian community in the 13th arrondissement. A Hindu temple, dedicated to Ganesh, on Rue Pajol in the 18th arrondissement, opened in 1985. Answer:", - "ideal_response": "The Pagode de Vincennes Buddhist temple", - "category": "default", - "source": null - }, - "response": "the Pagode de Vincennes Buddhist temple", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "By 2013, how many did Madonna's Raising Malawi organization built? By 2013, Madonna's Raising Malawi organization built ten schools to educate 4,000 children in Malawi at a value of $400,000. When Madonna visited the schools in April 2013, President of Malawi Joyce Banda expressed criticism of the star and her charity, accusing her of exaggerating her charity's contribution. Madonna responded by releasing a statement saying she was saddened that Banda had chosen to act negatively about her endeavors. \"I have no intention of being distracted by these ridiculous allegations,\" she added. Later, it was confirmed that Banda had not approved the statement released written by her press team and was \"incandescent with anger\" over the mix-up. Answer:", - "ideal_response": "ten schools", - "category": "default", - "source": null - }, - "response": "ten schools", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What interstate is the West side west of? A combination of urban and suburban development, the West Side is generally defined as the area west of I-10. Western Tucson encompasses the banks of the Santa Cruz River and the foothills of the Tucson Mountains, and includes the International Wildlife Museum, Sentinel Peak, and the Marriott Starr Pass Resort & Spa, located in the wealthy enclave known as Starr Pass. Moving past the Tucson Mountains, travelers find themselves in the area commonly referred to as \"west of\" Tucson or \"Old West Tucson\". A large undulating plain extending south into the Altar Valley, rural residential development predominates, but here you will also find major attractions including Saguaro National Park West, the Arizona-Sonora Desert Museum, and the Old Tucson Studios movie set/theme park. Answer:", - "ideal_response": "I-10", - "category": "default", - "source": null - }, - "response": "I-10", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Which Catholic practices did Wycliffe speak out against? Though many of the events were outside the traditional time-period of the Middle Ages, the end of the unity of the Western Church (the Protestant Reformation), was one of the distinguishing characteristics of the medieval period. The Catholic Church had long fought against heretic movements, but during the Late Middle Ages, it started to experience demands for reform from within. The first of these came from Oxford professor John Wycliffe in England. Wycliffe held that the Bible should be the only authority in religious questions, and he spoke out against transubstantiation, celibacy and indulgences. In spite of influential supporters among the English aristocracy, such as John of Gaunt, the movement was not allowed to survive. Though Wycliffe himself was left unmolested, his supporters, the Lollards, were eventually suppressed in England. Answer:", - "ideal_response": "transubstantiation, celibacy and indulgences", - "category": "default", - "source": null - }, - "response": "transubstantiation, celibacy and indulgences", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What sort of customers did Selfridges most often cater to? Selfridges was established in 1909 by American-born Harry Gordon Selfridge on Oxford Street. The company's innovative marketing promoted the radical notion of shopping for pleasure rather than necessity and its techniques were adopted by modern department stores the world over. The store was extensively promoted through paid advertising. The shop floors were structured so that goods could be made more accessible to customers. There were elegant restaurants with modest prices, a library, reading and writing rooms, special reception rooms for French, German, American and \"Colonial\" customers, a First Aid Room, and a Silence Room, with soft lights, deep chairs, and double-glazing, all intended to keep customers in the store as long as possible. Staff members were taught to be on hand to assist customers, but not too aggressively, and to sell the merchandise. Selfridge attracted shoppers with educational and scientific exhibits; \u2013 in 1909, Louis Bl\u00e9riot's monoplane was exhibited at Selfridges (Bl\u00e9riot was the first to fly over the English Channel), and the first public demonstration of television by John Logie Baird took place in the department store in 1925. Answer:", - "ideal_response": "shoppers with educational and scientific exhibits", - "category": "default", - "source": null - }, - "response": "American and \"Colonial\"", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Which individual had a duty to maintain the imperial stables? Ranked below the Three Councillors of State were the Nine Ministers, who each headed a specialized ministry. The Minister of Ceremonies was the chief official in charge of religious rites, rituals, prayers and the maintenance of ancestral temples and altars. The Minister of the Household was in charge of the emperor's security within the palace grounds, external imperial parks and wherever the emperor made an outing by chariot. The Minister of the Guards was responsible for securing and patrolling the walls, towers, and gates of the imperial palaces. The Minister Coachman was responsible for the maintenance of imperial stables, horses, carriages and coach-houses for the emperor and his palace attendants, as well as the supply of horses for the armed forces. The Minister of Justice was the chief official in charge of upholding, administering, and interpreting the law. The Minister Herald was the chief official in charge of receiving honored guests at the imperial court, such as nobles and foreign ambassadors. The Minister of the Imperial Clan oversaw the imperial court's interactions with the empire's nobility and extended imperial family, such as granting fiefs and titles. The Minister of Finance was the treasurer for the official bureaucracy and the armed forces who handled tax revenues and set standards for units of measurement. The Minister Steward served the emperor exclusively, providing him with entertainment and amusements, proper food and clothing, medicine and physical care, valuables and equipment. Answer:", - "ideal_response": "The Minister Coachman", - "category": "default", - "source": null - }, - "response": "Minister Coachman", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Up to how many AFL matches are played each week in Melbourne? Australian rules football and cricket are the most popular sports in Melbourne. It is considered the spiritual home of the two sports in Australia. The first official Test cricket match was played at the Melbourne Cricket Ground in March 1877. The origins of Australian rules football can be traced to matches played next to the MCG in 1858. The Australian Football League is headquartered at Docklands Stadium. Nine of the League's teams are based in the Melbourne metropolitan area: Carlton, Collingwood, Essendon, Hawthorn, Melbourne, North Melbourne, Richmond, St Kilda, and Western Bulldogs. Up to five AFL matches are played each week in Melbourne, attracting an average 40,000 people per game. Additionally, the city annually hosts the AFL Grand Final. Answer:", - "ideal_response": "five", - "category": "default", - "source": null - }, - "response": "five", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What institutional structures still exist from medieval times? The architectural history of Estonia mainly reflects its contemporary development in northern Europe. Worth mentioning is especially the architectural ensemble that makes out the medieval old town of Tallinn, which is on the UNESCO World Heritage List. In addition, the country has several unique, more or less preserved hill forts dating from pre-Christian times, a large number of still intact medieval castles and churches, while the countryside is still shaped by the presence of a vast number of manor houses from earlier centuries. Answer:", - "ideal_response": "castles and churches", - "category": "default", - "source": null - }, - "response": "castles and churches", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Why did Cj clark shoes leave the area Towns such as Castle Cary and Frome grew around the medieval weaving industry. Street developed as a centre for the production of woollen slippers and, later, boots and shoes, with C. & J. Clark establishing its headquarters in the town. C&J Clark's shoes are no longer manufactured there as the work was transferred to lower-wage areas, such as China and Asia. Instead, in 1993, redundant factory buildings were converted to form Clarks Village, the first purpose-built factory outlet in the UK. C&J Clark also had shoe factories, at one time at Bridgwater, Minehead, Westfield and Weston super Mare to provide employment outside the main summer tourist season, but those satellite sites were closed in the late 1980s, before the main site at Street. Dr. Martens shoes were also made in Somerset, by the Northampton-based R. Griggs Group, using redundant skilled shoemakers from C&J Clark; that work has also been transferred to Asia. Answer:", - "ideal_response": "the work was transferred to lower-wage areas, such as China and Asia", - "category": "default", - "source": null - }, - "response": "lower-wage", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "When was Detroit's charter approved? The city is governed pursuant to the Home Rule Charter of the City of Detroit. The city government is run by a mayor and a nine-member city council and clerk elected on an at-large nonpartisan ballot. Since voters approved the city's charter in 1974, Detroit has had a \"strong mayoral\" system, with the mayor approving departmental appointments. The council approves budgets but the mayor is not obligated to adhere to any earmarking. City ordinances and substantially large contracts must be approved by the council. The Detroit City Code is the codification of Detroit's local ordinances. Answer:", - "ideal_response": "1974", - "category": "default", - "source": null - }, - "response": "1974", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "By which year did Darwin have the basic premise of his natural selection theory? Darwin had his basic theory of natural selection \"by which to work\" by December 1838, yet almost twenty years later, when Wallace's letter arrived on 18 June 1858, Darwin was still not ready to publish his theory. It was long thought that Darwin avoided or delayed making his ideas public for personal reasons. Reasons suggested have included fear of religious persecution or social disgrace if his views were revealed, and concern about upsetting his clergymen naturalist friends or his pious wife Emma. Charles Darwin's illness caused repeated delays. His paper on Glen Roy had proved embarrassingly wrong, and he may have wanted to be sure he was correct. David Quammen has suggested all these factors may have contributed, and notes Darwin's large output of books and busy family life during that time. Answer:", - "ideal_response": "1838", - "category": "default", - "source": null - }, - "response": "1838", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "For what did Canadian natives use asphalt as a waterproofing material? Canada has the world's largest deposit of natural bitumen in the Athabasca oil sands and Canadian First Nations along the Athabasca River had long used it to waterproof their canoes. In 1719, a Cree Indian named Wa-Pa-Su brought a sample for trade to Henry Kelsey of the Hudson\u2019s Bay Company, who was the first recorded European to see it. However, it wasn't until 1787 that fur trader and explorer Alexander MacKenzie saw the Athabasca oil sands and said, \"At about 24 miles from the fork (of the Athabasca and Clearwater Rivers) are some bituminous fountains into which a pole of 20 feet long may be inserted without the least resistance.\" Answer:", - "ideal_response": "canoes", - "category": "default", - "source": null - }, - "response": "canoes", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Why was Jens Galschi\u00f8t made to leave Hong Kong? The Color Orange democracy group, led by Danish sculptor Jens Galschi\u00f8t, originally planned to join the Hong Kong Alliance relay and paint the \"Pillar of Shame\", a structure he built in Hong Kong to commemorate the 1989 Tiananmen Square protests. However, Galschi\u00f8t and two other people were denied entry to Hong Kong on April 26, 2008 due to \"immigration reasons\" and were forced to leave Hong Kong. In response, Lee Cheuk Yan, vice chairman of the Hong Kong Alliance in Support of Patriotic Democratic Movements in China, said, \"It's outrageous that the government is willing to sacrifice the image of Hong Kong because of the torch relay.\" Hollywood actress Mia Farrow was also briefly questioned at the Hong Kong airport though officials allowed her to enter. She later gave a speech criticizing China's relations with Sudan in Hong Kong, as there was also a small minority of people protesting about China's role in the crisis of Darfur. Legislator Cheung Man Kwong have also said the government's decision allowing Farrow to enter while denying others is a double standard and a violation to Hong Kong's one country, two systems policy. Answer:", - "ideal_response": "immigration reasons", - "category": "default", - "source": null - }, - "response": "immigration reasons", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is the usual masculine suffix? In gender inflection, the most notable feature is (compared to Portuguese, Spanish or Italian), the loss of the typical masculine suffix -o. Thus, the alternance of -o/-a, has been replaced by \u00f8/-a. There are only a few exceptions, like minso/minsa (\"scarce\"). Many not completely predictable morphological alternations may occur, such as: Answer:", - "ideal_response": "-o", - "category": "default", - "source": null - }, - "response": "-o", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Who came up with 'radical empiricism'? Around the beginning of the 20th century, William James (1842\u20131910) coined the term \"radical empiricism\" to describe an offshoot of his form of pragmatism, which he argued could be dealt with separately from his pragmatism \u2013 though in fact the two concepts are intertwined in James's published lectures. James maintained that the empirically observed \"directly apprehended universe needs ... no extraneous trans-empirical connective support\", by which he meant to rule out the perception that there can be any value added by seeking supernatural explanations for natural phenomena. James's \"radical empiricism\" is thus not radical in the context of the term \"empiricism\", but is instead fairly consistent with the modern use of the term \"empirical\". (His method of argument in arriving at this view, however, still readily encounters debate within philosophy even today.) Answer:", - "ideal_response": "William James", - "category": "default", - "source": null - }, - "response": "William James", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "How many enterprises have been made completely private since the agreement? Mali underwent economic reform, beginning in 1988 by signing agreements with the World Bank and the International Monetary Fund. During 1988 to 1996, Mali's government largely reformed public enterprises. Since the agreement, sixteen enterprises were privatized, 12 partially privatized, and 20 liquidated. In 2005, the Malian government conceded a railroad company to the Savage Corporation. Two major companies, Societ\u00e9 de Telecommunications du Mali (SOTELMA) and the Cotton Ginning Company (CMDT), were expected to be privatized in 2008. Answer:", - "ideal_response": "sixteen enterprises", - "category": "default", - "source": null - }, - "response": "sixteen", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What is intelligence at 53 more closely related to? Intelligence is an important factor in how the individual responds to education. Those who have higher intelligence tend to perform better at school and go on to higher levels of education. This effect is also observable in the opposite direction, in that education increases measurable intelligence. Studies have shown that while educational attainment is important in predicting intelligence in later life, intelligence at 53 is more closely correlated to intelligence at 8 years old than to educational attainment. Answer:", - "ideal_response": "intelligence at 8", - "category": "default", - "source": null - }, - "response": "intelligence at 8 years old", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What company owns XHDTV-TV and XHAS-TV? Due to the ratio of U.S. and Mexican-licensed stations, San Diego is the largest media market in the United States that is legally unable to support a television station duopoly between two full-power stations under FCC regulations, which disallow duopolies in metropolitan areas with fewer than nine full-power television stations and require that there must be eight unique station owners that remain once a duopoly is formed (there are only seven full-power stations on the California side of the San Diego-Tijuana market).[citation needed] Though the E. W. Scripps Company owns KGTV and KZSD-LP, they are not considered a duopoly under the FCC's legal definition as common ownership between full-power and low-power television stations in the same market is permitted regardless to the number of stations licensed to the area. As a whole, the Mexico side of the San Diego-Tijuana market has two duopolies and one triopoly (Entravision Communications owns both XHAS-TV and XHDTV-TV, Azteca owns XHJK-TV and XHTIT-TV, and Grupo Televisa owns XHUAA-TV and XHWT-TV along with being the license holder for XETV-TV, which is run by California-based subsidiary Bay City Television). Answer:", - "ideal_response": "Entravision Communications", - "category": "default", - "source": null - }, - "response": "Entravision Communications", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "Besides logic and epistemology, what else did Principia Mathematica connect? The ultimate substantive legacy of Principia Mathematica is mixed. It is generally accepted that Kurt G\u00f6del's incompleteness theorem of 1931 definitively demonstrated that for any set of axioms and inference rules proposed to encapsulate mathematics, there would in fact be some truths of mathematics which could not be deduced from them, and hence that Principia Mathematica could never achieve its aims. However, G\u00f6del could not have come to this conclusion without Whitehead and Russell's book. In this way, Principia Mathematica's legacy might be described as its key role in disproving the possibility of achieving its own stated goals. But beyond this somewhat ironic legacy, the book popularized modern mathematical logic and drew important connections between logic, epistemology, and metaphysics. Answer:", - "ideal_response": "metaphysics", - "category": "default", - "source": null - }, - "response": "logic, epistemology, and metaphysics", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "What types of tools did early farmers use for crops? Neolithic people were skilled farmers, manufacturing a range of tools necessary for the tending, harvesting and processing of crops (such as sickle blades and grinding stones) and food production (e.g. pottery, bone implements). They were also skilled manufacturers of a range of other types of stone tools and ornaments, including projectile points, beads, and statuettes. But what allowed forest clearance on a large scale was the polished stone axe above all other tools. Together with the adze, fashioning wood for shelter, structures and canoes for example, this enabled them to exploit their newly won farmland. Answer:", - "ideal_response": "sickle blades and grinding stones", - "category": "default", - "source": null - }, - "response": "sickle blades and grinding stones", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - }, - { - "input": { - "prompt": "People of what ethnicity were thrown out of Shusha? Gorbachev refused to make any changes to the status of Nagorno Karabakh, which remained part of Azerbaijan. He instead sacked the Communist Party Leaders in both Republics \u2013 on May 21, 1988, Kamran Baghirov was replaced by Abdulrahman Vezirov as First Secretary of the Azerbaijan Communist Party. From July 23 to September 1988, a group of Azerbaijani intellectuals began working for a new organization called the Popular Front of Azerbaijan, loosely based on the Estonian Popular Front. On September 17, when gun battles broke out between the Armenians and Azerbaijanis near Stepanakert, two soldiers were killed and more than two dozen injured. This led to almost tit-for-tat ethnic polarization in Nagorno-Karabakh's two main towns: The Azerbaijani minority was expelled from Stepanakert, and the Armenian minority was expelled from Shusha. On November 17, 1988, in response to the exodus of tens of thousands of Azerbaijanis from Armenia, a series of mass demonstrations began in Baku's Lenin Square, lasting 18 days and attracting half a million demonstrators. On December 5, 1988, the Soviet militia finally moved in, cleared the square by force, and imposed a curfew that lasted ten months. Answer:", - "ideal_response": "Armenian", - "category": "default", - "source": null - }, - "response": "Armenians", - "llm_name": null, - "inference_config_name": null, - "category_wise_inference_config": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/math/simple-math.csv b/services/evaluator/tests/datasets/math/simple-math.csv deleted file mode 100644 index d0f02a7510..0000000000 --- a/services/evaluator/tests/datasets/math/simple-math.csv +++ /dev/null @@ -1,4 +0,0 @@ -"question","answer","reference_answer" -What is 2+?,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 diff --git a/services/evaluator/tests/datasets/qa/questions.json b/services/evaluator/tests/datasets/qa/questions.json deleted file mode 100644 index 65e65614d9..0000000000 --- a/services/evaluator/tests/datasets/qa/questions.json +++ /dev/null @@ -1,123 +0,0 @@ -[ - { - "question": "What are my options if I can not support myself on a WHM visa?", - "passage": { - "passage_id": 567, - "source": "Australia", - "uri": "https://covid19.homeaffairs.gov.au/frequently-asked-questions", - "reference_type": "FAQ", - "reference": { - "page_title": "Frequently Asked Questions", - "section_headers": [ - "COVID-19 Pandemic - Australian Government Endorsed Event (AGEE) stream of the Temporary Activity (subclass 408) visa", - "Frequently Asked Questions", - "When can I apply for the COVID-19 Pandemic event visa?" - ], - "section_content": "You should only apply for this visa is you are unable to depart Australia,\nyour temporary visa expires in less than 28 days (or did not expire more than\n28 days ago) and you have no other visa options available to you.", - "selection_span": null, - "section_content_html": "

You should only apply for this visa is you are unable to depart Australia,\nyour temporary visa expires in less than 28 days (or did not expire more than\n28 days ago) and you have no other visa options available to you.

" - } - }, - "feedback": [ - "This answer does not address what one should do if they are on the WHM visa, and if they can't support themselves.", - "This is off task, the answer is more about an expired visa", - "This only talks about Visa application, it fails to talk about the topic" - ], - "rating": [ - "Bad", - "Bad", - "Bad" - ], - "domain": "Australia" - }, - { - "question": "I was a working Holiday Maker but lost my job; what should I do?", - "passage": { - "passage_id": 567, - "source": "Australia", - "uri": "https://covid19.homeaffairs.gov.au/frequently-asked-questions", - "reference_type": "FAQ", - "reference": { - "page_title": "Frequently Asked Questions", - "section_headers": [ - "COVID-19 Pandemic - Australian Government Endorsed Event (AGEE) stream of the Temporary Activity (subclass 408) visa", - "Frequently Asked Questions", - "When can I apply for the COVID-19 Pandemic event visa?" - ], - "section_content": "You should only apply for this visa is you are unable to depart Australia,\nyour temporary visa expires in less than 28 days (or did not expire more than\n28 days ago) and you have no other visa options available to you.", - "selection_span": null, - "section_content_html": "

You should only apply for this visa is you are unable to depart Australia,\nyour temporary visa expires in less than 28 days (or did not expire more than\n28 days ago) and you have no other visa options available to you.

" - } - }, - "feedback": [ - "Off topic this is more about an expired visa", - "There is not a lot of information here. It doesn't say at all what to do if you lost your job.", - "This talks about Visa expiration and does not answer our question on what should be done." - ], - "rating": [ - "Bad", - "Bad", - "Bad" - ], - "domain": "Australia" - }, - { - "question": "Is it practical to expect children to practice social distancing in childcare settings?", - "passage": { - "passage_id": 284, - "source": "Australia", - "uri": "https://www.health.gov.au/news/health-alerts/novel-coronavirus-2019-ncov-health-alert/how-to-protect-yourself-and-others-from-coronavirus-covid-19/physical-distancing-for-coronavirus-covid-19", - "reference_type": "Passage_only", - "reference": { - "page_title": "Physical distancing for coronavirus (COVID-19)", - "section_headers": [ - "In schools" - ], - "section_content": "If your child is sick, they must not go to school or childcare. You must keep\nthem at home and away from others.\nTo reduce the spread of viruses or germs in schools students and staff should\ncontinue to practise good hygiene.\nThe Australian Health Protection Principal Committee (AHPPC) has issued\nupdated advice on reducing the potential risk of COVID-19 transmission in\nschools.\nThe AHPPC also issued a statement on risk management for re-opening boarding\nschools and school-based residential colleges.\nFor more information on school\noperations, visit the\nDepartment of Education, Skills and Employment website.", - "selection_span": null, - "section_content_html": "

If your child is sick, they must not go to school or childcare. You must keep\nthem at home and away from others.

\n

To reduce the spread of viruses or germs in schools students and staff should\ncontinue to practise good hygiene.

\n

The Australian Health Protection Principal Committee (AHPPC) has issued\nupdated advice on reducing the potential risk of COVID-19 transmission in\nschools.

\n

The AHPPC also issued a statement on risk management for re-opening boarding\nschools and school-based residential colleges.

\n

For more information on school\noperations, visit the\nDepartment of Education, Skills and Employment website.

" - } - }, - "feedback": [ - "It didn't talk about how practical it is to expect children to practice social distancing.", - "This answer touches on children and the virus but doesn't really answer the question. There is nothing stating whether children should be expected to follow all the protocals.", - "This answer is more about kids are sick and not the initial question" - ], - "rating": [ - "Bad", - "Could be Improved", - "Bad" - ], - "domain": "Australia" - }, - { - "question": "Do I have to continue making gym membership payments if my gym has closed due to the coronavirus outbreak?", - "passage": { - "passage_id": 395, - "source": "Australia", - "uri": "https://www.accc.gov.au/consumers/consumer-rights-guarantees/covid-19-coronavirus-information-for-consumers?utm_source=twitter&utm_medium=social&utm_campaign=telco_faqs", - "reference_type": "FAQ", - "reference": { - "page_title": "COVID-19 (coronavirus) information for consumers", - "section_headers": [ - "Gym memberships", - "Can my gym charge me a membership \u2018freeze\u2019 or \u2018holding\u2019 fee for the period they are closed?" - ], - "section_content": "\nMembership \u2018freeze\u2019 or \u2018holding\u2019 fees may be charged by gyms when customers elect to pause their membership, if this is permitted by the terms and conditions.\nGiven many memberships are being paused due to the government restrictions preventing gyms from operating, rather than customers requesting a pause, the ACCC expects that gyms will not charge membership \u2018freeze\u2019 or \u2018holding\u2019 fees.\nThe ACCC also expects that gyms will refund any such holding fees incorrectly charged since the government restrictions came into effect.\n", - "selection_span": null, - "section_content_html": "
    \n
  • Membership \u2018freeze\u2019 or \u2018holding\u2019 fees may be charged by gyms when customers elect to pause their membership, if this is permitted by the terms and conditions.
  • \n
  • Given many memberships are being paused due to the government restrictions preventing gyms from operating, rather than customers requesting a pause, the ACCC expects that gyms will not charge membership \u2018freeze\u2019 or \u2018holding\u2019 fees.
  • \n
  • The ACCC also expects that gyms will refund any such holding fees incorrectly charged since the government restrictions came into effect.
  • \n
" - } - }, - "feedback": [ - "This justifies the answer to the gym membership payment issues", - "This is talking about what the gym is expected to do for their members concerning membership freeze during the pandemic.", - "This is a good answer. It gives examples of what a gym might do with fees if they are forced to close." - ], - "rating": [ - "Excellent", - "Could be Improved", - "Excellent" - ], - "domain": "Australia" - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/qa100/100-dummy-q.csv b/services/evaluator/tests/datasets/qa100/100-dummy-q.csv deleted file mode 100644 index fdb719f819..0000000000 --- a/services/evaluator/tests/datasets/qa100/100-dummy-q.csv +++ /dev/null @@ -1,101 +0,0 @@ -"question","answer","reference_answer" -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 -Square root of 256?,16, The answer is 16 -What power of 2 is 1024? ,10, The answer is 10 -What is 2+2,4, The answer is 4 \ No newline at end of file diff --git a/services/evaluator/tests/datasets/rag-retriever/dataset-eval-v2.jsonl b/services/evaluator/tests/datasets/rag-retriever/dataset-eval-v2.jsonl deleted file mode 100644 index 7bda84673b..0000000000 --- a/services/evaluator/tests/datasets/rag-retriever/dataset-eval-v2.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"question": ["What is the FY2018 capital expenditure amount (in USD millions) for 3M? Give a response to the question by relying on the details shown in the cash flow statement.", "Assume that you are a public equities analyst. Answer the following question by primarily using information that is shown in the balance sheet: what is the year end FY2018 net PPNE for 3M? Answer in USD billions.", "Is 3M a capital-intensive business based on FY2022 data?", "What drove operating margin change as of FY2022 for 3M? If operating margin is not a useful metric for a company like this, then please state that and explain why.", "If we exclude the impact of M&A, which segment has dragged down 3M's overall growth in 2022?", "Does 3M have a reasonably healthy liquidity profile based on its quick ratio for Q2 of FY2023? If the quick ratio is not relevant to measure liquidity, please state that and explain why.", "Which debt securities are registered to trade on a national securities exchange under 3M's name as of Q2 of 2023?", "Does 3M maintain a stable trend of dividend distribution?", "What is the FY2019 fixed asset turnover ratio for Activision Blizzard? Fixed asset turnover ratio is defined as: FY2019 revenue / (average PP&E between FY2018 and FY2019). Round your answer to two decimal places. Base your judgments on the information provided primarily in the statement of income and the statement of financial position.", "What is the FY2017 - FY2019 3 year average of capex as a % of revenue for Activision Blizzard? Answer in units of percents and round to one decimal place. Calculate (or extract) the answer from the statement of income and the cash flow statement.", "You are an investment banker and your only resource(s) to answer the following question is (are): the statement of financial position and the cash flow statement. Here's the question: what is the FY2015 operating cash flow ratio for Adobe? Operating cash flow ratio is defined as: cash from operations / total current liabilities. Round your answer to two decimal places.", "What is Adobe's year-over-year change in unadjusted operating income from FY2015 to FY2016 (in units of percents and round to one decimal place)? Give a solution to the question by using the income statement.", "What is the FY2017 operating cash flow ratio for Adobe? Operating cash flow ratio is defined as: cash from operations / total current liabilities. Round your answer to two decimal places. Please utilize information provided primarily within the balance sheet and the cash flow statement.", "Does Adobe have an improving operating margin profile as of FY2022? If operating margin is not a useful metric for a company like this, then state that and explain why.", "Does Adobe have an improving Free cashflow conversion as of FY2022?", "What is the quantity of restructuring costs directly outlined in AES Corporation's income statements for FY2022? If restructuring costs are not explicitly outlined then state 0.", "Roughly how many times has AES Corporation sold its inventory in FY2022? Calculate inventory turnover ratio for the FY2022; if conventional inventory management is not meaningful for the company then state that and explain why.", "Based on the information provided primarily in the statement of financial position and the statement of income, what is AES's FY2022 return on assets (ROA)? ROA is defined as: FY2022 net income / (average total assets between FY2021 and FY2022). Round your answer to two decimal places.", "What is Amazon's FY2017 days payable outstanding (DPO)? DPO is defined as: 365 * (average accounts payable between FY2016 and FY2017) / (FY2017 COGS + change in inventory between FY2016 and FY2017). Round your answer to two decimal places. Address the question by using the line items and information shown within the balance sheet and the P&L statement.", "What is Amazon's year-over-year change in revenue from FY2016 to FY2017 (in units of percents and round to one decimal place)? Calculate what was asked by utilizing the line items clearly shown in the statement of income.", "By drawing conclusions from the information stated only in the income statement, what is Amazon's FY2019 net income attributable to shareholders (in USD millions)?", "What is Amcor's year end FY2020 net AR (in USD millions)? Address the question by adopting the perspective of a financial analyst who can only use the details shown within the balance sheet.", "What was the key agenda of the AMCOR's 8k filing dated 1st July 2022?", "Has AMCOR's quick ratio improved or declined between FY2023 and FY2022? If the quick ratio is not something that a financial analyst would ask about a company like this, then state that and explain why.", "What are major acquisitions that AMCOR has done in FY2023, FY2022 and FY2021?", "What industry does AMCOR primarily operate in?", "Does AMCOR have an improving gross margin profile as of FY2023? If gross margin is not a useful metric for a company like this, then state that and explain why.", "What is the nature & purpose of AMCOR's restructuring liability as oF Q2 of FY2023 close?", "What Was AMCOR's Adjusted Non GAAP EBITDA for FY 2023", "How much was the Real change in Sales for AMCOR in FY 2023 vs FY 2022, if we exclude the impact of FX movement, passthrough costs and one-off items?", "Answer the following question as if you are an equity research analyst and have lost internet connection so you do not have access to financial metric providers. According to the details clearly outlined within the P&L statement and the statement of cash flows, what is the FY2015 depreciation and amortization (D&A from cash flow statement) % margin for AMD?", "Does AMD have a reasonably healthy liquidity profile based on its quick ratio for FY22? If the quick ratio is not relevant to measure liquidity, please state that and explain why.", "What are the major products and services that AMD sells as of FY22?", "What drove revenue change as of the FY22 for AMD?", "What drove operating margin change as of the FY22 for AMD? If operating margin is not a useful metric for a company like this, then please state that and explain why.", "Among operations, investing, and financing activities, which brought in the most (or lost the least) cash flow for AMD in FY22?", "From FY21 to FY22, excluding Embedded, in which AMD reporting segment did sales proportionally increase the most?", "Did AMD report customer concentration in FY22?", "Which debt securities are registered to trade on a national securities exchange under American Express' name as of 2022?", "What are the geographies that American Express primarily operates in as of 2022?", "Does AMEX have an improving operating margin profile as of 2022? If operating margin is not a useful metric for a company like this, then state that and explain why.", "What drove gross margin change as of the FY2022 for American Express? If gross margin is not a useful metric for a company like this, then please state that and explain why.", "How much has the effective tax rate of American Express changed between FY2021 and FY2022?", "What was the largest liability in American Express's Balance Sheet in 2022?", "Was American Express able to retain card members during 2022?", "How much (in USD billions) did American Water Works pay out in cash dividends for FY2020? Compute or extract the answer by primarily using the details outlined in the statement of cash flows.", "Basing your judgments off of the cash flow statement and the income statement, what is American Water Works's FY2021 unadjusted operating income + depreciation and amortization from the cash flow statement (unadjusted EBITDA) in USD millions?", "Does American Water Works have positive working capital based on FY2022 data? If working capital is not a useful or relevant metric for this company, then please state that and explain why.", "In agreement with the information outlined in the income statement, what is the FY2015 - FY2017 3 year average net profit margin (as a %) for Best Buy? Answer in units of percents and round to one decimal place.", "What is the year end FY2019 total amount of inventories for Best Buy? Answer in USD millions. Base your judgments on the information provided primarily in the balance sheet.", "Are Best Buy's gross margins historically consistent (not fluctuating more than roughly 2% each year)? If gross margins are not a relevant metric for a company like this, then please state that and explain why.", "What are major acquisitions that Best Buy has done in FY2023, FY2022 and FY2021?", "Among operations, investing, and financing activities, which brought in the most (or lost the least) cash flow for Best Buy in FY2023?", "Was there any drop in Cash & Cash equivalents between FY 2023 and Q2 of FY2024?", "Was there any change in the number of Best Buy stores between Q2 of FY2024 and FY2023?", "Which Best Buy product category performed the best (by top line) in the domestic (USA) Market during Q2 of FY2024?", "Considering the data in the balance sheet, what is Block's (formerly known as Square) FY2016 working capital ratio? Define working capital ratio as total current assets divided by total current liabilities. Round your answer to two decimal places.", "What is the FY2019 - FY2020 total revenue growth rate for Block (formerly known as Square)? Answer in units of percents and round to one decimal place. Approach the question asked by assuming the standpoint of an investment banking analyst who only has access to the statement of income.", "Using the cash flow statement, answer the following question to the best of your abilities: how much did Block (formerly known as Square) generate in cash flow from operating activities in FY2020? Answer in USD millions.", "We need to calculate a financial metric by using information only provided within the balance sheet. Please answer the following question: what is Boeing's year end FY2018 net property, plant, and equipment (in USD millions)?", "Are there any product categories / service categories that represent more than 20% of Boeing's revenue for FY2022?", "Has Boeing reported any materially important ongoing legal battles from FY2022?", "Does Boeing have an improving gross margin profile as of FY2022? If gross margin is not a useful metric for a company like this, then state that and explain why.", "Who are the primary customers of Boeing as of FY2022?", "Is Boeing's business subject to cyclicality?", "What production rate changes is Boeing forecasting for FY2023?", "How does Boeing's effective tax rate in FY2022 compare to FY2021?", "What is the FY2017 return on assets (ROA) for Coca Cola? ROA is defined as: FY2017 net income / (average total assets between FY2016 and FY2017). Round your answer to two decimal places. Give a response to the question by relying on the details shown in the balance sheet and the P&L statement.", "What is Coca Cola's FY2021 COGS % margin? Calculate what was asked by utilizing the line items clearly shown in the income statement.", "What is Coca Cola's FY2022 dividend payout ratio (using total cash dividends paid and net income attributable to shareholders)? Round answer to two decimal places. Answer the question asked by assuming you only have access to information clearly displayed in the cash flow statement and the income statement.", "Based on the information provided primarily in the balance sheet and the statement of income, what is FY2020 days payable outstanding (DPO) for Corning? DPO is defined as: 365 * (average accounts payable between FY2019 and FY2020) / (FY2020 COGS + change in inventory between FY2019 and FY2020). Round your answer to two decimal places.", "Taking into account the information outlined in the income statement, what is the FY2019 - FY2021 3 year average unadjusted operating income % margin for Corning? Answer in units of percents and round to one decimal place.", "How much has the effective tax rate of Corning changed between FY2021 and FY2022?", "Does Corning have positive working capital based on FY2022 data? If working capital is not a useful or relevant metric for this company, then please state that and explain why.", "Using only the information within the balance sheet, how much total assets did Costco have at the end of FY2021? Answer in USD millions.", "What is the FY2018 fixed asset turnover ratio for CVS Health? Fixed asset turnover ratio is defined as: FY2018 revenue / (average PP&E between FY2017 and FY2018). Round your answer to two decimal places. Calculate what was asked by utilizing the line items clearly shown in the P&L statement and the balance sheet.", "Is CVS Health a capital-intensive business based on FY2022 data?", "Has CVS Health reported any materially important ongoing legal battles from 2022, 2021 and 2020?", "Has CVS Health paid dividends to common shareholders in Q2 of FY2022?", "Does Foot Locker's new CEO have previous CEO experience in a similar company to Footlocker?", "Were there any board member nominees who had substantially more votes against joining than the other nominees?", "What is the FY2019 cash conversion cycle (CCC) for General Mills? CCC is defined as: DIO + DSO - DPO. DIO is defined as: 365 * (average inventory between FY2018 and FY2019) / (FY2019 COGS). DSO is defined as: 365 * (average accounts receivable between FY2018 and FY2019) / (FY2019 Revenue). DPO is defined as: 365 * (average accounts payable between FY2018 and FY2019) / (FY2019 COGS + change in inventory between FY2018 and FY2019). Round your answer to two decimal places. Address the question by using the line items and information shown within the income statement and the balance sheet.", "By drawing conclusions from the information stated only in the statement of financial position, what is General Mills's FY2020 working capital ratio? Define working capital ratio as total current assets divided by total current liabilities. Round your answer to two decimal places.", "According to the information provided in the statement of cash flows, what is the FY2020 free cash flow (FCF) for General Mills? FCF here is defined as: (cash from operations - capex). Answer in USD millions.", "We want to calculate a financial metric. Please help us compute it by basing your answers off of the cash flow statement and the income statement. Here's the question: what is the FY2022 retention ratio (using total cash dividends paid and net income attributable to shareholders) for General Mills? Round answer to two decimal places.", "Are JnJ's FY2022 financials that of a high growth company?", "What drove gross margin change as of FY2022 for JnJ? If gross margin is not a useful metric for a company like this, then please state that and explain why.", "Roughly how many times has JnJ sold its inventory in FY2022? Calculate inventory turnover ratio for FY2022; if conventional inventory management is not meaningful for the company then state that and explain why.", "Is growth in JnJ's adjusted EPS expected to accelerate in FY2023?", "How did JnJ's US sales growth compare to international sales growth in FY2022?", "Which business segment of JnJ will be treated as a discontinued operation from August 30, 2023 onward?", "What is the amount of the gain accruing to JnJ as a result of the separation of its Consumer Health business segment, as of August 30, 2023?", "What is the amount of the cash proceeds that JnJ realised from the separation of Kenvue (formerly Consumer Health business segment), as of August 30, 2023?", "Did JnJ's net earnings as a percent of sales increase in Q2 of FY2023 compared to Q2 of FY2022?", "Which of JPM's business segments had the lowest net revenue in 2021 Q1?", "If JPM went bankrupted by the end by 2021 Q1 and liquidated all of its assets to pay its shareholders, how much could each shareholder get?", "Are JPM's gross margins historically consistent (not fluctuating more than roughly 2% each year)? If gross margins are not a relevant metric for a company like this, then please state that and explain why.", "In 2022 Q2, which of JPM's business segments had the highest net income?", "Looking at VaR, did the risk that JPM faced in the second fiscal quarter of 2023 decrease compared to the same period in the prior year?", "What is Kraft Heinz's FY2019 inventory turnover ratio? Inventory turnover ratio is defined as: (FY2019 COGS) / (average inventory between FY2018 and FY2019). Round your answer to two decimal places. Please base your judgments on the information provided primarily in the balance sheet and the P&L statement.", "We need to calculate a reasonable approximation (or exact number if possible) of a financial metric. Basing your judgment by information plainly provided in the balance sheet and the P&L statement, what is Lockheed Martin's FY2020 asset turnover ratio? Asset turnover ratio is defined as: FY2020 revenue / (average total assets between FY2019 and FY2020). Round your answer to two decimal places.", "What is Lockheed Martin's FY2021 net working capital? Define net working capital as total current assets less total current liabilities. Answer in USD millions. Respond to the question by assuming the perspective of an investment analyst who can only use the details shown within the balance sheet.", "What is Lockheed Martin's 2 year total revenue CAGR from FY2020 to FY2022 (in units of percents and round to one decimal place)? Provide a response to the question by primarily using the statement of income.", "Basing your judgments off of the balance sheet, what is the year end FY2018 amount of accounts payable for MGM Resorts? Answer in USD millions.", "What is the FY2018 - FY2020 3 year average of capex as a % of revenue for MGM Resorts? Answer in units of percents and round to one decimal place. Please utilize information provided primarily within the statement of cash flows and the statement of income.", "Has MGM Resorts paid dividends to common shareholders in FY2022?", "Which region had the Highest EBITDAR Contribution for MGM during FY2022?", "What was MGM's interest coverage ratio using FY2022 Adjusted EBIT as the numerator and annual Interest Expense as the denominator?", "Which region had the worst topline performance for MGM during FY2022?", "Which type of debt received the largest investment among the short term investments for MGM in H1 FY2023?", "What is the FY2016 COGS for Microsoft? Please state answer in USD millions. Provide a response to the question by primarily using the statement of income.", "Has Microsoft increased its debt on balance sheet between FY2023 and the FY2022 period?", "We want to calculate a financial metric. Please help us compute it by basing your answers off of the statement of income and the statement of cash flows. Here's the question: what is the FY2015 unadjusted EBITDA % margin for Netflix? Calculate unadjusted EBITDA using unadjusted operating income and D&A (from cash flow statement).", "What is Netflix's year end FY2017 total current liabilities (in USD millions)? Base your judgments on the information provided primarily in the balance sheet.", "We need to calculate a reasonable approximation (or exact number if possible) of a financial metric. Basing your judgment by information plainly provided in the statement of income, what is Nike's three year average of cost of goods sold as a % of revenue from FY2016 to FY2018? Answer in units of percents and round to one decimal place.", "According to the details clearly outlined within the balance sheet, how much total current assets did Nike have at the end of FY2019? Answer in USD millions.", "When primarily referencing the income statement and the statement of financial position, what is the FY2021 inventory turnover ratio for Nike? Inventory turnover ratio is defined as: (FY2021 COGS) / (average inventory between FY2020 and FY2021). Round your answer to two decimal places.", "Among operations, investing, and financing activities, which brought in the most (or lost the least) cash flow for Nike in FY2023?", "Does Paypal have positive working capital based on FY2022 data? If working capital is not a useful or relevant metric for this company, then please state that and explain why.", "What is the FY2021 capital expenditure amount (in USD billions) for PepsiCo? Respond to the question by assuming the perspective of an investment analyst who can only use the details shown within the statement of cash flows.", "What are the geographies that Pepsico primarily operates in as of FY2022?", "Has Pepsico reported any materially important ongoing legal battles from FY2022 and FY2021?", "What is the quantity of restructuring costs directly outlined in Pepsico's income statements for FY2022? If restructuring costs are not explicitly outlined then state 0.", "What is the FY2022 unadjusted EBITDA less capex for PepsiCo? Define unadjusted EBITDA as unadjusted operating income + depreciation and amortization [from cash flow statement]. Answer in USD millions. Respond to the question by assuming the perspective of an investment analyst who can only use the details shown within the statement of cash flows and the income statement.", "What is the FY2022 unadjusted EBITDA % margin for PepsiCo? Calculate unadjusted EBITDA using unadjusted operating income and D&A (from cash flow statement). Give a response to the question by relying on the details shown in the statement of cash flows and the P&L statement.", "At the Pepsico AGM held on May 3, 2023, what was the outcome of the shareholder vote on the shareholder proposal for a congruency report by Pepsico on net-zero emissions policies?", "By how much did Pepsico increase its unsecured five year revolving credit agreement on May 26, 2023?", "As of May 26, 2023, what is the total amount Pepsico may borrow under its unsecured revolving credit agreements?", "As of FY2023Q1, why did Pepsico raise full year guidance for FY2023?", "As of FY2023Q1, by how many percentage points did Pepsico raise full year guidance in respect of core constant currency EPS growth?", "Did Pfizer grow its PPNE between FY20 and FY21?", "Were there any potential events that are not in Pfizer's standard business operations that substantially increased net income in 2019?", "What are three main companies acquired by Pfizer mentioned in this 10K report?", "How much does Pfizer expect to pay to spin off Upjohn in the future in USD million?", "For Pfizer, which geographic region had the biggest drop in Q22023 year over year revenues (on a percentage basis)?", "As of Q2'2023, is Pfizer spinning off any large business segments?", "Which debt securities are registered to trade on a national securities exchange under Ulta Beauty's name as of FY2023?", "What are major acquisitions that Ulta Beauty has done in FY2023 and FY2022?", "What drove the reduction in SG&A expense as a percent of net sales in FY2023?", "What drove the increase in Ulta Beauty's merchandise inventories balance at end of FY2023?", "What percent of Ulta Beauty's total spend on stock repurchases for FY 2023 occurred in Q4 of FY2023?", "Did Ulta Beauty's wages expense as a percent of net sales increase or decrease in FY2023?", "Among all of the derivative instruments that Verizon used to manage the exposure to fluctuations of foreign currencies exchange rates or interest rates, which one had the highest notional value in FY 2021?", "As of FY 2021, how much did Verizon expect to pay for its retirees in 2024?", "Does Verizon have a reasonably healthy liquidity profile based on its quick ratio for FY 2022? If the quick ratio is not relevant to measure liquidity, please state that and explain why.", "Is Verizon a capital intensive business based on FY 2022 data?", "Has Verizon increased its debt on balance sheet between 2022 and the 2021 fiscal period?", "What is FY2018 days payable outstanding (DPO) for Walmart? DPO is defined as: 365 * (average accounts payable between FY2017 and FY2018) / (FY2018 COGS + change in inventory between FY2017 and FY2018). Round your answer to two decimal places. Please base your judgments on the information provided primarily in the statement of financial position and the P&L statement.", "Based on the information provided primarily in the statement of income, what is the FY2018 - FY2019 change in unadjusted operating income % margin for Walmart? Answer in units of percents and round to one decimal place.", "What is the FY2018 - FY2020 3 year average unadjusted EBITDA % margin for Walmart? Define unadjusted EBITDA as unadjusted operating income + depreciation and amortization from the cash flow statement. Answer in units of percents and round to one decimal place. Calculate what was asked by utilizing the line items clearly shown in the P&L statement and the cash flow statement.", "What is the PCI Device ID of Quantum-3?", "Please list \u201cerror_code\u201d values for MCC register.", "Please describe Firmware Components update states", "Describe chassis management thermal protection", "What are the power capabilities supported by SwitchX?", "What is Spectrum-X?", "What are the key benefits of the Spectrum-X platform?", "How is the Spectrum-X physical network fabric designed?", "What congestion control mechanism is used for Spectrum-X, and how is it configured?", "What network protocols are used to deploy the compute fabric of the Spectrum-X platform?\n", "How to configure Adaptive Routing for Spectrum-X?\n", "How can I monitor switch buffer utilization in Spectrum-X fabric?", "How is the multi-tenancy deployed on Spectrum-X switch fabric?\n", "How is an AI Fabric different from a traditional Data Center Fabric?\n", "Why does Multi-tenancy matter for AI Fabrics?\n", "Why do we need BlueField-3 SuperNIC together with Spectrum-4 switches in Spectrum-X AI Fabric solution?", "What are the key characteristics of an AI Fabric?", "How do I configure RoCE lossless on a Spectrum switch?\n", "What do I need to configure on BlueField-3 SuperNIC for Spectrum-X ?", "Where can I find a list of NVIDIA sessions at CES 2024?", "What is GenSLMs?", "Who is the CEO of NVIDIA?", "Who is the CEO of Facebook?", "Who is Bryan Catanzaro?", "Who were the keynote speakers at GTC 2020?", "Who other than Jensen spoke at the GTC 2020 keynote?", "Where did GTC 2020 happen?", "What NVIDIA GPU powers the JUPITER Super computer?", "How much is the NVIDIA GeForce RTX 4070?", "What was NVIDIA's Q4 revenue in 2023?", "what was NVIDIA's Q3 revenue in fiscal 2024?", "what was NVIDIA's Q3 revenue in fiscal 2023?", "Was the change in revenue for NVIDIA in Q3 2024 versus 2023?", "Who is the CIO of NVIDIA?", "Who is the CFO at NVIDIA?", "What key collaborations did NVIDIA and Foxconn announce in 2023?", "When did NVIDIA acquire Deepmap?", "What is the latest drive system from NVIDIA?", "What car manufacturers are using digital twin technology?", "Who is the chief security officer at NVIDIA?", "is Mercedes Benz using NVIDIA's digital twin technology?", "what companies are using NVIDIA Drive platform?", "What companies are using digital twin technology in the autonomous driving space?", "How much did the revenue increase between Q1 of 2024 and Q2 of 2024?", "how much capital did we return to our shareholders in Q2 2024?", "What were the 3 key takeaways from Q2 of 2024?", "What was NVIDIA's gross margin in Q2 of FY24?", "What are NVIDIA's expected gross margins for the 3rd quarter of FY2024", "How much did NVIDIA's data center business grow in Q2 of 2024 on a year-over-year basis?", "What was NVIDIA's gross margin in Q2 of FY23?", "What are NVIDIA's expected gross margins for the 3rd quarter of FY2023", "How much did NVIDIA's data center business grow in Q2 of FY2022 on a year-over-year basis?", "What was NVIDIA's Q2 revenues in 2022?", "What was NVIDIA's gaming revenue in 2023 Q2?", "What was the increase in revenue quarter over quarter in Q2 of 2022?", "What was the increase in non-GAAP revenue quarter over quarter in Q2 of 2022?", "What was NVIDIA's gross margin in Q1 of FY24?", "What was NVIDIA's Q1 revenues in 2024?", "What was NVIDIA's gaming revenue in 2024 Q1?", "What was the increase in revenue quarter over quarter in Q1 of 2024?", "What was the increase in non-GAAP revenue quarter over quarter in Q1 of 2024?", "What was the revenue outlook for Q2 in Q1 of FY 2023?", "What was the actual revenue in Q2 2024 compared to forecast?", "Did NVIDIA announce any adition of DLSS games in Q2 of 2024?", "How much did NVIDIA revenue increase year over year in Q3 of FY 24?", "What were the non-GAAP diluted earnings per share in FY 24 Q3?", "How much was the increase in non-GAAP diluted earnings per share in FY 24 Q3, year over year?", "Where can I find a summary of the Q2 financial results for FY24?", "Where can I find a summary of the Q1 financial results for FY24?", "Where can I find a summary of the Q3 financial results for FY24?", "What is H200?", "How is H200 better than the previous generation?", "When wil H200 be available?", "who is using NVIDIA Spectrum-X?", "what is the roughput of NVIDIA Spectrum-X?", "who is using BioNemo?", "What factors led to gaming revenue growth in Q4 2024?", "What factors led to Automotive revenue growth in Q4 FY24?", "Were H100 revenues higher in Q4 23 than A100 revenues?", "What is driving the higher forecast for datacenter based on in Q4 FY23, for the coming year?", "What factors led to gaming revenue growth in Q1 2023?", "How has cryptocurrency minining contributed to gaming revenue in Q1 FY23?", "What was the Pro Viz revenue in Q1 23?", "What was the automotive revenue in Q1 FY23?", "What was the growth in data center revenue in Q1 FY23 over the past year?", "What are the main reasons for data center growth in Q1, FY23?", "how many transistors in H100?", "What was the amount on stock repurchase in Q1 FY23?", "What was the revenue forecast for Q2 in Q1 of FY23?", "What is NVIDIA's revenue in FY22?", "What were NVIDIA's Gross Margins in FY22?", "What were NVIDIA's operating expenses in FY22?", "What was NVIDIA's net income in FY22?", "What were NVIDIA's diluted earnings per share in FY22?", "What was NVIDIA's reported operating income in FY22?", "What is NVIDIA's revenue in FY21?", "What were NVIDIA's Gross Margins in FY21?", "What were NVIDIA's operating expenses in FY21?", "What was NVIDIA's net income in FY21?", "What were NVIDIA's diluted earnings per share in FY21?", "What was NVIDIA's reported operating income in FY21?", "What is NVIDIA's non-GAAP revenue in FY22?", "What were NVIDIA's non-GAAP Gross Margins in FY22?", "What were NVIDIA's non-GAAP operating expenses in FY22?", "What was NVIDIA's non-GAAP net income in FY22?", "What were NVIDIA's non-GAAP diluted earnings per share in FY22?", "What was NVIDIA's non-GAAP reported operating income in FY22?", "What is NVIDIA's GAAP revenue in FY22?", "What were NVIDIA's GAAP Gross Margins in FY22?", "What were NVIDIA's GAAP operating expenses in FY22?", "What was NVIDIA's GAAP net income in FY22?", "What were NVIDIA's GAAP diluted earnings per share in FY22?", "What was NVIDIA's GAAP reported operating income in FY22?", "What is NVIDIA's non-GAAP revenue in FY21?", "What were NVIDIA's non-GAAP Gross Margins in FY21?", "What were NVIDIA's non-GAAP operating expenses in FY21?", "What was NVIDIA's non-GAAP net income in FY21?", "What were NVIDIA's non-GAAP diluted earnings per share in FY21?", "What was NVIDIA's non-GAAP reported operating income in FY21?", "What is NVIDIA's GAAP revenue in FY21?", "What were NVIDIA's GAAP Gross Margins in FY21?", "What were NVIDIA's GAAP operating expenses in FY21?", "What was NVIDIA's GAAP net income in FY21?", "What were NVIDIA's GAAP diluted earnings per share in FY21?", "What was NVIDIA's GAAP reported operating income in FY21?", "How did termination of the ARM purchase affect NVIDIA financially?", "How much in dividends did NVIDIA pay to shareholders in FY21?", "What is NVIDIA's revenue in FY 2020?", "What were NVIDIA's Gross Margins in FY 2020?", "What were NVIDIA's operating expenses in FY 2020?", "What was NVIDIA's net income in FY 2020?", "What were NVIDIA's diluted earnings per share in FY 2020?", "What was NVIDIA's reported operating income in FY 2020?", "How much in dividends did NVIDIA pay to shareholders in FY20?", "How much in dividends did NVIDIA pay to shareholders in FY21?", "When did NVIDIA announce Q1 FY24 earnings?", "What is Project Helix?", "Does NVIDIA use RTX in GeForce NOW?", "What is GH200?", "Where can we buy RTX 40 series GPUs?", "How much did gross margins improve in fiscal 2023 vs 2022?", "How much did non-GAAP gross margins improve in fiscal 2023 vs 2022?", "How much did GAAP gross margins improve in fiscal 2023 vs 2022?", "What is FY24 Q4 revenue guide?", "What is FY24 Q4 opex guide?", "What is FY24 GAAP Q4 opex guide?", "What is FY24 non-GAAP Q4 opex guide?", "What is FY24 Q4 revenue outlook?", "What is FY24 Q4 opex outlook?", "What is FY24 GAAP Q4 opex outlook?", "What is FY24 non-GAAP Q4 opex outlook?", "What is FY 2024 Q4 GAAP GM outlook?", "What is FY 2024 Q4 non-GAAP GM outlook?", "What is FY 2024 Q4 GAAP gross margin outlook?", "What is FY 2024 Q4 non-GAAP gross margin outlook?", "What is FY 2024 Q4 GAAP gross margin guide?", "What is FY 2024 Q4 non-GAAP gross margin guide?", "What is FY 2024 Q4 GAAP GM guide?", "What is FY 2024 Q4 non-GAAP GM guide?", "What was GAAP OI in Q3 FY24?", "How much did gross margins expand in the current quarter?", "How much did gross margins reduce in the current quarter?", "How much did gross margins expand in the Q3 FY24?", "Did gross margins expand or contract in Q3 FY24?", "What was total 2023 data center revenue?", "What was the total gaming revenue in FY 22?", "What was the total data center revenue in FY 22?", "What was the total pro viz revenue in FY 22?", "What was the total gaming revenue in FY 23?", "What was the total data center revenue in FY 22?", "What was the total pro viz revenue in FY 23?", "What was the total gaming revenue in FY 21?", "What was the total data center revenue in FY 21?", "What was the total pro viz revenue in FY 21?", "What was the total automotive revenue in FY 21", "What's the revenue for gaming in FY 21?", "What's the revenue for data center in FY 21?", "What's the revenue for pro viz in FY 21?", "What's the revenue for automotive in FY 21", "Did pro viz revenue increase in 2022 from the previous year?", "Did gaming revenue increase in 2022 from the previous year?", "Did data center revenue increase in 2022 from the previous year?", "Did automotive revenue increase in 2022 from the previous year?", "What is the gaming revenue in 3Q 2024?", "What led to datacenter growth in Q1 fy24?", "How was the gaming business in Q1 FY24?", "What led to gaming growth in Q1 FY24?", "how did the data center business do in Q1 fy24?", "How much did we return to shareholders in dividends in q1 fy24?", "How is InfiniBand different than ethernet?", "Why is inference for generative AI a big opportunity for NVIDIA?", "Why did gaming decline in 2023?", "Why did the gaming revenue go down in 2023, from the prior year?", "how did gaming business do in 2023?", "who is the current ceo?", "who is the current ceo of nvidia?", "who is the chief financial officer at nvidia?", "who is the CFO at NVIDIA?", "who is the CFO?", "who is the current CFO?", "who is the current CFO at NVIDIA?", "Who is the COO at NVIDIA?", "Who is the head of operations at NVIDIA?", "who is the head of finance at NVIDIA?", "who is the EVP of operations at NVIDIA?", "who is the current head of operations at NVIDIA>", "who is the current head of operations", "why is data center a big opportunity for nvidia in 2024?", "What is the current revenue?", "What is the expected revenue this quarter?", "Who is Collette Kress?", "Who is collette kress?", "who is Collette Kress", "who is collette kress", "Who is COllette Kress?", "Who is Collette Kress", "how did nvidia perform in q2 2021?", "what is rag", "what is RAG?", "What is retrieval augmented generation?", "Who runs finance?", "who runs operations?", "who runs sales?", "Who runs finance", "who runs operations", "who runs sales", "How is generative AI used in the field of medicine?", "Can you help me find a formal shirt I can wear in a meeting? I'm a male who wears XL", "I'm looking to go camping. Any recommendations?", "Can you recommend some camping gear?", "Can you tell me about any women's workout gear you might have?", "I'm looking to get a gift for some clients. Any recommendations?", "I'm looking to get a gift for some clients. They like to golf. Any recommendations?", "Can you recommend some coffee mugs? I like cats.", "What's a fun gift to get for my nephew?", "What's a fun gift to get for my nephew? He has a two dogs and loves NVIDIA", "Can you recommend a men's t-shirt that is available in APAC?", "What's the difference between the Heroes of NVIDIA 3.0 tee shirt and the NVIDIA Duo-Tone Logo Unisex Tee tee shirt?", "What's the difference between the shield and the shield pro?", "Whats the difference between the Jetson nano and the jetson orin nano?", "What is the focus of the NSF's \"Leveraging Innovations From Evolution (LIFE)\" initiative?", "How is biocomputing defined in the EFRI BEGIN OI solicitation?", "What does the NSF report \"Federal Science and Engineering Support to Universities, Colleges, and Nonprofit Institutions: Fiscal Year 2021\" focus on?", "What significant change in classification of FFRDCs is discussed in \"nsf24312.pdf\"?", "What are the key findings in the \"Federal Science and Engineering Support to Higher Education Increased 10% in FY 2021\" report?", "What is the extent of R&D expenditure increase in the U.S. in 2021 and the estimated increase for 2022 as reported in \"nsf24317.pdf\"?", "What kind of data does \"National Patterns of R&D Resources: 2021\u201322 Data Update\" provide?", "What trends are evident in federal science and engineering support and R&D expenditure in the U.S.?", "How does the NSF support interdisciplinary research and development?", "What changes have occurred in the classification of research entities and funding patterns in federal R&D?", "How are federal R&D expenditures distributed and what are their projected trends?", "What are the key focuses of NSF's recent initiatives and reports?", "What has been the trend in federal obligations for S&E to universities and colleges from 1963 to 2021?", "How have federal obligations for S&E research and development changed over the years?", "What is the distribution of federal S&E support by state and outlying area in FY 2021?", "Which agencies are the primary contributors to federal S&E obligations?", "How have the types of activities funded by federal S&E obligations evolved over time?", "How has the federal obligation for R&D changed in FY 2021, particularly for FFRDCs?", "What is the trend in R&D expenditures at FFRDCs by source of funds from 2001 to 2021?", "How does the federal support for science and engineering to higher education institutions compare in FY 2021?", "What is the projected trend of R&D expenditure in the U.S. for 2021 and 2022?", "How does the federal obligation for intramural R&D performance change with and without FFRDCs in FYs 1967\u20132022?", "What are the national patterns of R&D resources in 2021\u201322 in the U.S.?", "Explain to me what is SteerLM?", "Compare SteerLM with RLHF", "How do I train a SteerLM model?", "What models does Nemo Aligner support?", "What are the alignment techniques does Nemo Aligner support?", "How to I set the optimal parameter for DPO training?", "Does Nemo Aligner support WandB reporting?", "What is SFT?", "How to resolve kernel finding error in Nemo Aligner?", "Describe the process of RLHF with Nemo Aligner", "How and where does Nemo Aligner schedule the execution of the 4 networks in PPO?", "What are the advantages of Nemo in training LLMs?", "What is sequence parallelism?", "What is the best way to set optimal hyperparameters for training?", "What is the optimal model size given 20 DGX nodes?", "What is the FY2018 capital expenditure amount (in USD millions) for 3M? Give a response to the question by relying on the details shown in the cash flow statement.", "Assume that you are a public equities analyst. Answer the following question by primarily using information that is shown in the balance sheet: what is the year end FY2018 net PPNE for 3M? Answer in USD billions.", "Is 3M a capital-intensive business based on FY2022 data?", "What drove operating margin change as of FY2022 for 3M? If operating margin is not a useful metric for a company like this, then please state that and explain why.", "If we exclude the impact of M&A, which segment has dragged down 3M's overall growth in 2022?", "Does 3M have a reasonably healthy liquidity profile based on its quick ratio for Q2 of FY2023? If the quick ratio is not relevant to measure liquidity, please state that and explain why.", "Which debt securities are registered to trade on a national securities exchange under 3M's name as of Q2 of 2023?", "Does 3M maintain a stable trend of dividend distribution?", "What is the FY2019 fixed asset turnover ratio for Activision Blizzard? Fixed asset turnover ratio is defined as: FY2019 revenue / (average PP&E between FY2018 and FY2019). Round your answer to two decimal places. Base your judgments on the information provided primarily in the statement of income and the statement of financial position.", "What is the FY2017 - FY2019 3 year average of capex as a % of revenue for Activision Blizzard? Answer in units of percents and round to one decimal place. Calculate (or extract) the answer from the statement of income and the cash flow statement.", "You are an investment banker and your only resource(s) to answer the following question is (are): the statement of financial position and the cash flow statement. Here's the question: what is the FY2015 operating cash flow ratio for Adobe? Operating cash flow ratio is defined as: cash from operations / total current liabilities. Round your answer to two decimal places.", "What is Adobe's year-over-year change in unadjusted operating income from FY2015 to FY2016 (in units of percents and round to one decimal place)? Give a solution to the question by using the income statement.", "What is the FY2017 operating cash flow ratio for Adobe? Operating cash flow ratio is defined as: cash from operations / total current liabilities. Round your answer to two decimal places. Please utilize information provided primarily within the balance sheet and the cash flow statement.", "Does Adobe have an improving operating margin profile as of FY2022? If operating margin is not a useful metric for a company like this, then state that and explain why.", "Does Adobe have an improving Free cashflow conversion as of FY2022?", "What is the quantity of restructuring costs directly outlined in AES Corporation's income statements for FY2022? If restructuring costs are not explicitly outlined then state 0.", "Roughly how many times has AES Corporation sold its inventory in FY2022? Calculate inventory turnover ratio for the FY2022; if conventional inventory management is not meaningful for the company then state that and explain why.", "Based on the information provided primarily in the statement of financial position and the statement of income, what is AES's FY2022 return on assets (ROA)? ROA is defined as: FY2022 net income / (average total assets between FY2021 and FY2022). Round your answer to two decimal places.", "What is Amazon's FY2017 days payable outstanding (DPO)? DPO is defined as: 365 * (average accounts payable between FY2016 and FY2017) / (FY2017 COGS + change in inventory between FY2016 and FY2017). Round your answer to two decimal places. Address the question by using the line items and information shown within the balance sheet and the P&L statement.", "What is Amazon's year-over-year change in revenue from FY2016 to FY2017 (in units of percents and round to one decimal place)? Calculate what was asked by utilizing the line items clearly shown in the statement of income.", "By drawing conclusions from the information stated only in the income statement, what is Amazon's FY2019 net income attributable to shareholders (in USD millions)?", "What is Amcor's year end FY2020 net AR (in USD millions)? Address the question by adopting the perspective of a financial analyst who can only use the details shown within the balance sheet.", "What was the key agenda of the AMCOR's 8k filing dated 1st July 2022?", "Has AMCOR's quick ratio improved or declined between FY2023 and FY2022? If the quick ratio is not something that a financial analyst would ask about a company like this, then state that and explain why.", "What are major acquisitions that AMCOR has done in FY2023, FY2022 and FY2021?", "What industry does AMCOR primarily operate in?", "Does AMCOR have an improving gross margin profile as of FY2023? If gross margin is not a useful metric for a company like this, then state that and explain why.", "What is the nature & purpose of AMCOR's restructuring liability as oF Q2 of FY2023 close?", "What Was AMCOR's Adjusted Non GAAP EBITDA for FY 2023", "How much was the Real change in Sales for AMCOR in FY 2023 vs FY 2022, if we exclude the impact of FX movement, passthrough costs and one-off items?", "Answer the following question as if you are an equity research analyst and have lost internet connection so you do not have access to financial metric providers. According to the details clearly outlined within the P&L statement and the statement of cash flows, what is the FY2015 depreciation and amortization (D&A from cash flow statement) % margin for AMD?", "Does AMD have a reasonably healthy liquidity profile based on its quick ratio for FY22? If the quick ratio is not relevant to measure liquidity, please state that and explain why.", "What are the major products and services that AMD sells as of FY22?", "What drove revenue change as of the FY22 for AMD?", "What drove operating margin change as of the FY22 for AMD? If operating margin is not a useful metric for a company like this, then please state that and explain why.", "Among operations, investing, and financing activities, which brought in the most (or lost the least) cash flow for AMD in FY22?", "From FY21 to FY22, excluding Embedded, in which AMD reporting segment did sales proportionally increase the most?", "Did AMD report customer concentration in FY22?", "Which debt securities are registered to trade on a national securities exchange under American Express' name as of 2022?", "What are the geographies that American Express primarily operates in as of 2022?", "Does AMEX have an improving operating margin profile as of 2022? If operating margin is not a useful metric for a company like this, then state that and explain why.", "What drove gross margin change as of the FY2022 for American Express? If gross margin is not a useful metric for a company like this, then please state that and explain why.", "How much has the effective tax rate of American Express changed between FY2021 and FY2022?", "What was the largest liability in American Express's Balance Sheet in 2022?", "Was American Express able to retain card members during 2022?", "How much (in USD billions) did American Water Works pay out in cash dividends for FY2020? Compute or extract the answer by primarily using the details outlined in the statement of cash flows.", "Basing your judgments off of the cash flow statement and the income statement, what is American Water Works's FY2021 unadjusted operating income + depreciation and amortization from the cash flow statement (unadjusted EBITDA) in USD millions?", "Does American Water Works have positive working capital based on FY2022 data? If working capital is not a useful or relevant metric for this company, then please state that and explain why.", "In agreement with the information outlined in the income statement, what is the FY2015 - FY2017 3 year average net profit margin (as a %) for Best Buy? Answer in units of percents and round to one decimal place.", "What is the year end FY2019 total amount of inventories for Best Buy? Answer in USD millions. Base your judgments on the information provided primarily in the balance sheet.", "Are Best Buy's gross margins historically consistent (not fluctuating more than roughly 2% each year)? If gross margins are not a relevant metric for a company like this, then please state that and explain why.", "What are major acquisitions that Best Buy has done in FY2023, FY2022 and FY2021?", "Among operations, investing, and financing activities, which brought in the most (or lost the least) cash flow for Best Buy in FY2023?", "Was there any drop in Cash & Cash equivalents between FY 2023 and Q2 of FY2024?", "Was there any change in the number of Best Buy stores between Q2 of FY2024 and FY2023?", "Which Best Buy product category performed the best (by top line) in the domestic (USA) Market during Q2 of FY2024?", "Considering the data in the balance sheet, what is Block's (formerly known as Square) FY2016 working capital ratio? Define working capital ratio as total current assets divided by total current liabilities. Round your answer to two decimal places.", "What is the FY2019 - FY2020 total revenue growth rate for Block (formerly known as Square)? Answer in units of percents and round to one decimal place. Approach the question asked by assuming the standpoint of an investment banking analyst who only has access to the statement of income.", "Using the cash flow statement, answer the following question to the best of your abilities: how much did Block (formerly known as Square) generate in cash flow from operating activities in FY2020? Answer in USD millions.", "We need to calculate a financial metric by using information only provided within the balance sheet. Please answer the following question: what is Boeing's year end FY2018 net property, plant, and equipment (in USD millions)?", "Are there any product categories / service categories that represent more than 20% of Boeing's revenue for FY2022?", "Has Boeing reported any materially important ongoing legal battles from FY2022?", "Does Boeing have an improving gross margin profile as of FY2022? If gross margin is not a useful metric for a company like this, then state that and explain why.", "Who are the primary customers of Boeing as of FY2022?", "Is Boeing's business subject to cyclicality?", "What production rate changes is Boeing forecasting for FY2023?", "How does Boeing's effective tax rate in FY2022 compare to FY2021?", "What is the FY2017 return on assets (ROA) for Coca Cola? ROA is defined as: FY2017 net income / (average total assets between FY2016 and FY2017). Round your answer to two decimal places. Give a response to the question by relying on the details shown in the balance sheet and the P&L statement.", "What is Coca Cola's FY2021 COGS % margin? Calculate what was asked by utilizing the line items clearly shown in the income statement.", "What is Coca Cola's FY2022 dividend payout ratio (using total cash dividends paid and net income attributable to shareholders)? Round answer to two decimal places. Answer the question asked by assuming you only have access to information clearly displayed in the cash flow statement and the income statement.", "Based on the information provided primarily in the balance sheet and the statement of income, what is FY2020 days payable outstanding (DPO) for Corning? DPO is defined as: 365 * (average accounts payable between FY2019 and FY2020) / (FY2020 COGS + change in inventory between FY2019 and FY2020). Round your answer to two decimal places.", "Taking into account the information outlined in the income statement, what is the FY2019 - FY2021 3 year average unadjusted operating income % margin for Corning? Answer in units of percents and round to one decimal place.", "How much has the effective tax rate of Corning changed between FY2021 and FY2022?", "Does Corning have positive working capital based on FY2022 data? If working capital is not a useful or relevant metric for this company, then please state that and explain why.", "Using only the information within the balance sheet, how much total assets did Costco have at the end of FY2021? Answer in USD millions.", "What is the FY2018 fixed asset turnover ratio for CVS Health? Fixed asset turnover ratio is defined as: FY2018 revenue / (average PP&E between FY2017 and FY2018). Round your answer to two decimal places. Calculate what was asked by utilizing the line items clearly shown in the P&L statement and the balance sheet.", "Is CVS Health a capital-intensive business based on FY2022 data?", "Has CVS Health reported any materially important ongoing legal battles from 2022, 2021 and 2020?", "Has CVS Health paid dividends to common shareholders in Q2 of FY2022?", "Does Foot Locker's new CEO have previous CEO experience in a similar company to Footlocker?", "Were there any board member nominees who had substantially more votes against joining than the other nominees?", "What is the FY2019 cash conversion cycle (CCC) for General Mills? CCC is defined as: DIO + DSO - DPO. DIO is defined as: 365 * (average inventory between FY2018 and FY2019) / (FY2019 COGS). DSO is defined as: 365 * (average accounts receivable between FY2018 and FY2019) / (FY2019 Revenue). DPO is defined as: 365 * (average accounts payable between FY2018 and FY2019) / (FY2019 COGS + change in inventory between FY2018 and FY2019). Round your answer to two decimal places. Address the question by using the line items and information shown within the income statement and the balance sheet.", "By drawing conclusions from the information stated only in the statement of financial position, what is General Mills's FY2020 working capital ratio? Define working capital ratio as total current assets divided by total current liabilities. Round your answer to two decimal places.", "According to the information provided in the statement of cash flows, what is the FY2020 free cash flow (FCF) for General Mills? FCF here is defined as: (cash from operations - capex). Answer in USD millions.", "We want to calculate a financial metric. Please help us compute it by basing your answers off of the cash flow statement and the income statement. Here's the question: what is the FY2022 retention ratio (using total cash dividends paid and net income attributable to shareholders) for General Mills? Round answer to two decimal places.", "Are JnJ's FY2022 financials that of a high growth company?", "What drove gross margin change as of FY2022 for JnJ? If gross margin is not a useful metric for a company like this, then please state that and explain why.", "Roughly how many times has JnJ sold its inventory in FY2022? Calculate inventory turnover ratio for FY2022; if conventional inventory management is not meaningful for the company then state that and explain why.", "Is growth in JnJ's adjusted EPS expected to accelerate in FY2023?", "How did JnJ's US sales growth compare to international sales growth in FY2022?", "Which business segment of JnJ will be treated as a discontinued operation from August 30, 2023 onward?", "What is the amount of the gain accruing to JnJ as a result of the separation of its Consumer Health business segment, as of August 30, 2023?", "What is the amount of the cash proceeds that JnJ realised from the separation of Kenvue (formerly Consumer Health business segment), as of August 30, 2023?", "Did JnJ's net earnings as a percent of sales increase in Q2 of FY2023 compared to Q2 of FY2022?", "Which of JPM's business segments had the lowest net revenue in 2021 Q1?", "If JPM went bankrupted by the end by 2021 Q1 and liquidated all of its assets to pay its shareholders, how much could each shareholder get?", "Are JPM's gross margins historically consistent (not fluctuating more than roughly 2% each year)? If gross margins are not a relevant metric for a company like this, then please state that and explain why.", "In 2022 Q2, which of JPM's business segments had the highest net income?", "Looking at VaR, did the risk that JPM faced in the second fiscal quarter of 2023 decrease compared to the same period in the prior year?", "What is Kraft Heinz's FY2019 inventory turnover ratio? Inventory turnover ratio is defined as: (FY2019 COGS) / (average inventory between FY2018 and FY2019). Round your answer to two decimal places. Please base your judgments on the information provided primarily in the balance sheet and the P&L statement.", "We need to calculate a reasonable approximation (or exact number if possible) of a financial metric. Basing your judgment by information plainly provided in the balance sheet and the P&L statement, what is Lockheed Martin's FY2020 asset turnover ratio? Asset turnover ratio is defined as: FY2020 revenue / (average total assets between FY2019 and FY2020). Round your answer to two decimal places.", "What is Lockheed Martin's FY2021 net working capital? Define net working capital as total current assets less total current liabilities. Answer in USD millions. Respond to the question by assuming the perspective of an investment analyst who can only use the details shown within the balance sheet.", "What is Lockheed Martin's 2 year total revenue CAGR from FY2020 to FY2022 (in units of percents and round to one decimal place)? Provide a response to the question by primarily using the statement of income.", "Basing your judgments off of the balance sheet, what is the year end FY2018 amount of accounts payable for MGM Resorts? Answer in USD millions.", "What is the FY2018 - FY2020 3 year average of capex as a % of revenue for MGM Resorts? Answer in units of percents and round to one decimal place. Please utilize information provided primarily within the statement of cash flows and the statement of income.", "Has MGM Resorts paid dividends to common shareholders in FY2022?", "Which region had the Highest EBITDAR Contribution for MGM during FY2022?", "What was MGM's interest coverage ratio using FY2022 Adjusted EBIT as the numerator and annual Interest Expense as the denominator?", "Which region had the worst topline performance for MGM during FY2022?", "Which type of debt received the largest investment among the short term investments for MGM in H1 FY2023?", "What is the FY2016 COGS for Microsoft? Please state answer in USD millions. Provide a response to the question by primarily using the statement of income.", "Has Microsoft increased its debt on balance sheet between FY2023 and the FY2022 period?", "We want to calculate a financial metric. Please help us compute it by basing your answers off of the statement of income and the statement of cash flows. Here's the question: what is the FY2015 unadjusted EBITDA % margin for Netflix? Calculate unadjusted EBITDA using unadjusted operating income and D&A (from cash flow statement).", "What is Netflix's year end FY2017 total current liabilities (in USD millions)? Base your judgments on the information provided primarily in the balance sheet.", "We need to calculate a reasonable approximation (or exact number if possible) of a financial metric. Basing your judgment by information plainly provided in the statement of income, what is Nike's three year average of cost of goods sold as a % of revenue from FY2016 to FY2018? Answer in units of percents and round to one decimal place.", "According to the details clearly outlined within the balance sheet, how much total current assets did Nike have at the end of FY2019? Answer in USD millions.", "When primarily referencing the income statement and the statement of financial position, what is the FY2021 inventory turnover ratio for Nike? Inventory turnover ratio is defined as: (FY2021 COGS) / (average inventory between FY2020 and FY2021). Round your answer to two decimal places.", "Among operations, investing, and financing activities, which brought in the most (or lost the least) cash flow for Nike in FY2023?", "Does Paypal have positive working capital based on FY2022 data? If working capital is not a useful or relevant metric for this company, then please state that and explain why.", "What is the FY2021 capital expenditure amount (in USD billions) for PepsiCo? Respond to the question by assuming the perspective of an investment analyst who can only use the details shown within the statement of cash flows.", "What are the geographies that Pepsico primarily operates in as of FY2022?", "Has Pepsico reported any materially important ongoing legal battles from FY2022 and FY2021?", "What is the quantity of restructuring costs directly outlined in Pepsico's income statements for FY2022? If restructuring costs are not explicitly outlined then state 0.", "What is the FY2022 unadjusted EBITDA less capex for PepsiCo? Define unadjusted EBITDA as unadjusted operating income + depreciation and amortization [from cash flow statement]. Answer in USD millions. Respond to the question by assuming the perspective of an investment analyst who can only use the details shown within the statement of cash flows and the income statement.", "What is the FY2022 unadjusted EBITDA % margin for PepsiCo? Calculate unadjusted EBITDA using unadjusted operating income and D&A (from cash flow statement). Give a response to the question by relying on the details shown in the statement of cash flows and the P&L statement.", "At the Pepsico AGM held on May 3, 2023, what was the outcome of the shareholder vote on the shareholder proposal for a congruency report by Pepsico on net-zero emissions policies?", "By how much did Pepsico increase its unsecured five year revolving credit agreement on May 26, 2023?", "As of May 26, 2023, what is the total amount Pepsico may borrow under its unsecured revolving credit agreements?", "As of FY2023Q1, why did Pepsico raise full year guidance for FY2023?", "As of FY2023Q1, by how many percentage points did Pepsico raise full year guidance in respect of core constant currency EPS growth?", "Did Pfizer grow its PPNE between FY20 and FY21?", "Were there any potential events that are not in Pfizer's standard business operations that substantially increased net income in 2019?", "What are three main companies acquired by Pfizer mentioned in this 10K report?", "How much does Pfizer expect to pay to spin off Upjohn in the future in USD million?", "For Pfizer, which geographic region had the biggest drop in Q22023 year over year revenues (on a percentage basis)?", "As of Q2'2023, is Pfizer spinning off any large business segments?", "Which debt securities are registered to trade on a national securities exchange under Ulta Beauty's name as of FY2023?", "What are major acquisitions that Ulta Beauty has done in FY2023 and FY2022?", "What drove the reduction in SG&A expense as a percent of net sales in FY2023?", "What drove the increase in Ulta Beauty's merchandise inventories balance at end of FY2023?", "What percent of Ulta Beauty's total spend on stock repurchases for FY 2023 occurred in Q4 of FY2023?", "Did Ulta Beauty's wages expense as a percent of net sales increase or decrease in FY2023?", "Among all of the derivative instruments that Verizon used to manage the exposure to fluctuations of foreign currencies exchange rates or interest rates, which one had the highest notional value in FY 2021?", "As of FY 2021, how much did Verizon expect to pay for its retirees in 2024?", "Does Verizon have a reasonably healthy liquidity profile based on its quick ratio for FY 2022? If the quick ratio is not relevant to measure liquidity, please state that and explain why.", "Is Verizon a capital intensive business based on FY 2022 data?", "Has Verizon increased its debt on balance sheet between 2022 and the 2021 fiscal period?", "What is FY2018 days payable outstanding (DPO) for Walmart? DPO is defined as: 365 * (average accounts payable between FY2017 and FY2018) / (FY2018 COGS + change in inventory between FY2017 and FY2018). Round your answer to two decimal places. Please base your judgments on the information provided primarily in the statement of financial position and the P&L statement.", "Based on the information provided primarily in the statement of income, what is the FY2018 - FY2019 change in unadjusted operating income % margin for Walmart? Answer in units of percents and round to one decimal place.", "What is the FY2018 - FY2020 3 year average unadjusted EBITDA % margin for Walmart? Define unadjusted EBITDA as unadjusted operating income + depreciation and amortization from the cash flow statement. Answer in units of percents and round to one decimal place. Calculate what was asked by utilizing the line items clearly shown in the P&L statement and the cash flow statement.", "How do the LEGO sets featured in the Fall 2023 and Summer 2023 catalogs compare in terms of themes and age groups targeted?", "What are the unique features of the LEGO DREAMZzz sets in the Fall 2023 catalog compared to other themes?", "How does the LEGO US Retail January 2024 catalog's approach to presenting LEGO Technic sets differ from the representation in the Fall 2023 catalog?", "What trends in LEGO themes can be observed by comparing the Summer 2023 and Fall 2023 catalogs with the January 2024 Retail catalog?", "How does LEGO's marketing strategy in the Summer 2023 catalog compare to that in the Fall 2023 and January 2024 catalogs in terms of promoting creativity and imagination?", "What role do licensed properties (like Harry Potter, Marvel, etc.) play in the LEGO catalogs across different seasons?", "How does LEGO's product offering in terms of complexity and target age group evolve from the Summer 2023 catalog to the January 2024 catalog?", "What differences are there in the way LEGO approaches the presentation of new releases in the Summer 2023 catalog compared to the Fall 2023 and January 2024 catalogs?", "What LEGO sets are suitable for kids aged 4+ from the LEGO Friends theme?", "Can young kids build LEGO City sets, and if so, what is the starting age?", "At what age can kids start building LEGO Marvel sets?", "What is the minimum age for building LEGO DC sets?", "Are there LEGO Sonic sets for young kids, and what is the starting age?", "What age group is LEGO Minecraft designed for?", "What LEGO sets are available for kids aged 6+?", "Can 4-year-olds build LEGO sets, and if so, what themes are available?", "What LEGO sets are recommended for kids aged 7+?", "What are some LEGO themes suitable for 5-year-old kids?", "I would like to use StrongSwan to configure IPSec encrypted communication between two hosts. It needs to be fully accelerated by DOCA. Can you explain me how I can do that?", "I want to create a DOCA GPUNetIO packet processing application. What would be the best HW configuration in my system to achieve the best performance?", "Why would someone use OVS-DOCA over OVS-DPDK?", "I am trying to build my DOCA application, but I keep getting the error message:\n \n\n Did not find CMake 'cmake'\n Found CMake: NO\n Run-time dependency doca found: NO (tried pkgconfig)\n \n\n allreduce/src/meson.build:18:0: ERROR: Dependency \"doca\" not found, tried pkgconfig\n \n\n What am I doing wrong?", "I want to manage my DOCA app, which is running on a BF3, from my x86 host using gRPC. Are there any examples for how to do this?", "I want to exchange information securely between the host and the DPU. How would I do that?", "Where is all the sample code for the DOCA applications?", "What are the new features offered by DOCA 2.5?", "What is the best generative ai session to attend?", "Is anyone from Google presenting?", "Can you suggest a session about machine learning?", "When is the session called Speech AI Demystified?", "Who is presenting session S62430?", "Who is presenting the session Insights from NVIDIA Research?", "Can you suggest a session about robotics?", "Can you suggest a session about deep learning?", "Can you suggest a session about ray tracing?", "Is there a session where I can learn more about Clara Parabricks?", "Can you suggest a session about reinforcement training?", "What session is Katie Luo presenting?", "Is it possible to attend both S62219 and S62779?", "Is it possible to attend both S62832 and S61276?"], "ground_truth": ["$1,577.00", "$8.70", "No, the company is managing its CAPEX and Fixed Assets pretty efficiently, which is evident from below key metrics:\nCAPEX/Revenue Ratio: 5.1%\nFixed assets/Total Assets: 20%\nReturn on Assets= 12.4%", "Operating Margin for 3M in FY2022 has decreased by 1.7% primarily due to: \n-Decrease in gross Margin\n-mostly one-off charges including Combat Arms Earplugs litigation, impairment related to exiting PFAS manufacturing, costs related to exiting Russia and divestiture-related restructuring\ncharges", "The consumer segment shrunk by 0.9% organically.", "No. The quick ratio for 3M was 0.96 by Jun'23 close, which needs a bit of an improvement to touch the 1x mark", "Following debt securities registered under 3M's name are listed to trade on the New York Stock Exchange:\n-1.500% Notes due 2026 (Trading Symbol: MMM26)\n-1.750% Notes due 2030 (Trading Symbol: MMM30)\n-1.500% Notes due 2031 (Trading Symbol: MMM31)", "Yes, not only they distribute the dividends on a routine basis, 3M has also been increasing the per share dividend for consecutive 65 years", "24.26", "1.90%", "0.66", "65.40%", "0.83", "No the operating margins of Adobe have recently declined from 36.8% in FY 2021 to 34.6% in FY2022. A drop by 2.2% in a year.", "Yes, the FCF conversion (using net income as the denominator) for Adobe has improved by ~13% from 143% in 2021 to 156% in 2022", "0", "AES has converted inventory 9.5 times in FY 2022.", "-0.02", "93.86", "30.80%", "$11,588.00", "$1,616.00", "Amcor Finance (USA), Inc. and Amcor Flexibles North America, Inc., entered into supplemental indentures relating to Guaranteed Senior Notes due 2026 and 2028. This involved the substitution of the Substitute Issuer (Amcor Flexibles North America) for the Former Issuer (Amcor Finance) and the assumption of covenants under the indentures. (In essence a novation agreement)", "The quick ratio has slightly improved from 0.67 times to 0.69 times between FY 2023 and FY 2022.(3.4% jump)", "Amcor completed these acquisitions during FY2023:\n-100% equity interest of a flexibles manufacturing company in the Czech Republic\n- 100% equity interest in a medical device packaging manufacturing site in\nShanghai, China.\n-acquisition of a New Zealand-based leading manufacturer of state-of-the-art, automated protein\npackaging machines.", "Amcor is a global leader in packaging production for various use cases.", "No. For AMCOR there has been a slight decline in gross margins by 0.8%.", "87% of the total restructuring liability is related Employee liabilities.", "AMCOR's Adj. EBITDA was $2,018mn in FY 2023", "The Real Growth was flat in FY 2023 vs FY 2022.", "4.20%", "Yes. The quick ratio is 1.57, calculated as (cash and cash equivalents+Short term investments+Accounts receivable, net+receivables from related parties)/ (current liabilities).", "AMD sells server microprocessors (CPUs) and graphics processing units (GPUs), data processing units (DPUs), Field Programmable Gate Arrays (FPGAs), and Adaptive System-on-Chip (SoC) products for data centers; CPUs, accelerated processing units (APUs) that integrate CPUs and GPUs, and chipsets for desktop and notebook personal computers; discrete GPUs, and semi-custom SoC products and development services; and embedded CPUs, GPUs, APUs, FPGAs, and Adaptive SoC products.", "In 2022, AMD reported Higher sales of their EPYC server processors, higher semi-custom product sales, and the inclusion of Xilinx embedded product sales", "The decrease in AMD's operating income was primarily driven by amortization of intangible assets associated with the Xilinx acquisition", "In 2022, AMD brought in the most cashflow from Operations", "Data Center", "Yes, one customer accounted for 16% of consolidated net revenue", "There are none", "United States, EMEA, APAC, and LACC", "Performance is not measured through operating margin", "Performance is not measured through gross margin", "The effective tax rate for American Express has changed/dropped from 24.6% in FY 2021 to 21.6% in FY 2022.", "Customer deposits", "Yes", "$0.40", "$1,832.00", "Yes. American Water Works had postivie working capital of $ 124Mn by FY 2022.", "2.80%", "$5,409.00", "Yes, the margins have been consistent, there has been a minor decline of 1.1% in gross margins between FY2022 and FY2023.", "Best Buy closed two acquisitions, both these companies were already partially owned by Best Buy, but Best Buy acquired all outstanding shares of these two companies during FY 2022: (1) Current Health Ltd and (2) Two Peaks, LLC d/b/a Yardbird Furniture", "Best Buy generated the most cash flow from operating activities in FY 2023 ($1.8 bn)", "Yes, there was a decline of ~42% between FY2023 and Q2 of FY 2024.", "Yes, there is decline in number stores by 1.32% from 982 stores in Q2 FY 2023 to 969 by the end of Q2 FY2024.", "The entertainment segment experienced the highest growth of 9% during Q2 FY2024, primarily from gaming division.", "1.73", "101.50%", "$382.00", "$12,645.00", "Yes. Boeing has product and service categories that represent more than 20% of Boeing's revenue for FY2022. These categories are Commercial Airplanes which comprises 39% of total revenue, Defence which comprises 35% of total revenue and Services which comprises 26% of total revenue.", "Yes. Multiple lawsuits have been filed against Boeing resulting from a 2018 Lion Air crash and a 2019 Ethiopian Airlines crash.", "Yes. Boeing has an improving gross margin profile as of FY2022. Gross profit improved from $3,017 million in FY2021 to $3,502 million in FY2022. Gross margin % improved from 4.8% in FY2021 to 5.3% in FY2022.", "Boeing's primary customers as of FY2022 are a limited number of commercial airlines and the US government. The US government accounted for 40% of Boeing's total revenues in FY2022.", "Yes, Boeing's business is subject to cyclicality due to its exposure to the airline industry which is a cyclical industry.", "Boeing forecasts an increase in the production rates for the 737, 777X and 787 aircrafts in 2023.", "Effective tax rate in FY2022 was 0.62%, compared to -14.76% in FY2021.", "0.01", "39.70%", "0.8", "63.86", "10.30%", "The effective tax rate of Corning has changed from 20% in FY2021 to 23% in FY 2022.", "Yes. Corning had a positive working capital amount of $831 million by FY 2022 close. This answer considers only operating current assets and current liabilities that were clearly shown in the balance sheet.", "$59,268.00", "17.98", "Yes, CVS Health requires an extensive asset base to operate, which is evident from its ROA of only 1.82% in 2022 and 3.39% in 2021, though it should be noted that a significant portion of this asset base is goodwill, and CVS's fixed assets/total assets ratio is on the lower side of 5.6%.", "Yes, CVS Health has been involved in multiple ongoing legal battles. Some notable legal dispute areas for CVS are: (1) usual and customary pricing litigation: where it's claimed that CVS\u2019s retail pharmacies overcharged for prescription drugs; (2) PBM litigation and investigations: where it's claimed that that rebate agreements between the drug manufacturers and PBMs caused inflated prices for certain drug products; and (3) controlled substances litigation: legal matters around opioids for which CVS has agreed to pay up to $4.3 billion to claimants in remediation and $625 million to attorneys and fees", "Yes, CVS paid a $ 0.55 dividend per share every quarter in FY2022", "Yes. She was previous CEO of Ulta Beauty which means she had to manage a large retail company that has brick and mortar + online business. So yes she was a CEO in a similar company to Foot Locker before this.", "Yes, his name is Richard A. Johnson", "-3.7", "0.68", "$3,215.00", "0.54", "No, JnJ's FY2022 financials are not of a high growth company as sales grew by 1.3% in FY2022.", "For FY22, JnJ had changes in gross margin due to: One-time COVID-19 vaccine manufacturing exit related costs, Currency impacts in the Pharmaceutical segment, Commodity inflation in the MedTech and Consumer Health segments, partially offset by Supply chain benefits in the Consumer Health segment.", "JnJ sold its inventory 2.7 times in FY2022.", "No, rate of growth in adjusted EPS is expected to decelerate slightly from 3.6% in FY2022 to 3.5% in FY2023.", "US sales increased 3.0% vs international sales decline of 0.6%.", "The Consumer Health business segment will be treated as a discontinued operation from August 30, 2023 onward.", "JnJ will make a gain of approximately $20 billion from the separation of its Consumer Health business segment.", "JnJ realised $13.2 billion in cash proceeds from the separation of Kenvue.", "Yes, net earnings as a percent of sales increased from 20% in Q2 of FY2022 to 20.1% in Q2 of FY2023.", "Corporate. Its net revenue was -$473 million.", "They could receive $66.56 per share.", "Since JPM is a financial institution, gross margin is not a relevant metric.", "Corporate & Investment Bank. Its net income was $3725 million.", "Yes. It decreased.", "6.25", "1.33", "$5,818.00", "0.40%", "$303.00", "7.90%", "Yes. MGM maintained 0.01$ per share annual dividend through out FY 2022.", "Las Vegas resorts contributed ~90% of company level EBITDAR during FY2022.", "As adjusted EBIT is negative, coverage ratio is zero", "MGM China experienced the worst topline performance amongst the other regions presented. Its revenue declined 44% in FY2022 whereas the other regions presented increased their revenues.", "the biggest short term investment is in corporate bonds (almost 82% of the total investment)", "$32,780.00", "No. Microsoft decreased its debt by $2.5bn in FY 2023 vs FY 2022.", "5.40%", "$5,466.00", "55.10%", "$16,525.00", "3.46", "Among the three, cash flow from operations was the highest for Nike in FY2023.", "Yes. Paypal has a positive working capital of $ 1.6Bn as of FY2022 end.", "$4.60", "As of FY2022, Pepsico primarily operates in the following geographies: North America, Latin America, Europe, Africa, Middle East, South Asia, Asia Pacific, Australia, New Zealand and China.", "No, Pepsico is not involved in material legal battles.", "Pepsico's restructuring costs in FY2022 amounted to $411 million .", "$9,068.00", "16.50%", "The shareholder proposal for a congruency report by Pepsico on net-zero emissions policies was defeated.", "$400,000,000 increase.", "Total amount Pepsico may borrow under unsecured revolving credit agreements = $8,400,000,000.", "Pepsico experienced a strong start to FY2023.", "Pepsico raised full year guidance in respect of core constant currency EPS growth by 1 percentage point.", "Yes, change in PPNE was positive year over year", "Yes, the gain on completion of Consumer Healthcare JV Transaction", "Trillium, Array, and Therachon", "77.78", "Developed Rest of the World", "Yes, it's spinning off Upjohn.", "There are none", "Ulta Beauty did not make any acquisitions in FY2023 and FY2022.", "Lower marketing expenses and leverage of incentive compensation due to higher sales. The answer here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although the company refers to this period as its fiscal 2022.", "Increase in Merchandise inventories balance was driven by the opening of 47 new stores. The answer here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although the company refers to this period as its fiscal 2022.", "36%. The answer here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although the company refers to this period as its fiscal 2022.", "Wages expense as a percent of net sales increased in FY2023. The answer here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although the company refers to this period as its fiscal 2022.", "Cross currency swaps. Its notional value was $32,502 million.", "The estimated pension benefits were $1097 million, and the estimated health care and life insurance benefits were $862 million.", "No. The quick ratio was approximately 0.54 for Verizon. It indicated that Verizon does not have a healthy liquidity profile.", "Yes. Verizon's capital intensity ratio was approximately 2.774729. This means that it took approximately $2.77 of assets to generate $1 of revenue and thus, Verizon can be considered capital intensive.", "No. Verizon's debt decreased by $229 million.", "42.69", "0.20%", "6.20%", "0xD2F4", "0x1: ERROR\n0x2: REJECTED_DIGEST_ERR\n0x3: REJECTED_NOT_APPLICABLE\n0x4: REJECTED_UNKNOWN_KEY\n0x5: REJECTED_AUTH_FAILED\n0x6: REJECTED_UNSIGNED\n0x7: REJECTED_KEY_NOT_APPLICABLE\n0x8: REJECTED_BAD_FORMAT\n0x9: BLOCKED_PENDING_RESET\n0xA: REJECTED_NOT_A_SECURED_FW\n0xB: REJECTED_MFG_BASE_MAC_NOT_LISTED\n0xC: REJECTED_NO_DEBUG_TOKEN\n0xD: REJECTED_VERSION_NUM_MISMATCH\n0xE: REJECTED_USER_TIMESTAMP_MISMATCH\n0xF: REJECTED_FORBIDDEN_VERSION\n0x10: FLASH_ERASE_ERROR\n0x11: REJECTED_REBURN_RUNNING_AND_RETRY\n0x12: REJECTED_LINKX_TYPE_NOT_SUPPORTED\n0x13: REJECTED_HOST_STORAGE_IN_USE\n0x14: REJECTED_LINKX_TRANSFER (see module\nindex in rejected_device_index)\n0x15: REJECTED_LINKX_ACTIVATE (see module index\nin rejected_device_index)\n0x16: REJECTED_INCOMPATIBLE_FLASH\n0x17: REJECTED_TOKEN_ALREADY_APPLIED\nOther values should be treated as an unknown error.", "A component may be in one of the following update states:\n\u2022 IDLE - component storage is not erased.\n\u2022 IN_PROGRESS - component is being updated.\n\u2022 APPLIED - component is ready for activation.\n\u2022 ACTIVE - component is in use.\n\u2022 ACTIVE_PENDING_RESET - component will be in use following device reset.\n\u2022 FAILED - last update attempt has failed.\n\u2022 CANCELED -last update attempt was canceled by the initiator.\n\u2022 BUSY - component cannot currently be updated.\nThe component state is not preserved through boot cycles. On boot, each component is\ninitialized to one of the states: ACTIVE, BUSY, IDLE.", "Chassis management software should protect the system components from over-temperature\ndamage by either polling or using one of the asynchronous notification mechanisms, and in\nresponse reduce the temperature using any scheme possible. Some actions that may be taken\nare the following:\n\u2022 Increasing fan speed\n\u2022 Reducing link\u2019s speed to reduce power consumption\n\u2022 Reducing core frequency\n\u2022 Turning off some of the ports when appropriate\n\u2022 Turning off either some of the device logic (e.g. some of the ports) or the entire\ndevice", "The following power capabilities are supported by SwitchX:\n\u2022 Link Speed Scaling\n\u2022 Link Width Scaling\n\u2022 Core Frequency Scaling\n\u2022 Voltage Scaling", "The NVIDIA\u00ae Spectrum\u2122-X Networking Platform is the first Ethernet platform designed\n specifically to improve the performance and efficiency of Ethernet-based AI clouds.\nIt is built on the tightly couple of the Spectrum-4 Ethernet switch with the NVIDIA BlueField\u00ae-3 SuperNIC to deliver better power efficiency and consistent, predictable\n performance in AI multi-tenant environments. This breakthrough technology achieves 1.6X improved network performance for massive AI workloads such as LLM, reduces run times of massive transformer-based generative AI models, and allows network engineers, data scientists, and cloud service providers to attain faster results and make informed decisions.\nLearn more about the Spectrum-X platform and its components on the NVIDIA Spectrum-X Networking Platform webpage \u2013 https://www.nvidia.com/en-eu/networking/spectrumx/", "The key benefits of Spectrum-X are:\n Improved AI Cloud Performance: Spectrum-X enhances AI cloud network performance by 1.6X.\nStandard Ethernet Connectivity: Spectrum-X is fully standards-based Ethernet and is completely interoperable with Ethernet-based stacks.\nIncreased Power Efficiency: By improving performance, Spectrum-X contributes to a more power-efficient AI environment.\nEnhanced Multi-Tenant Protection: Performance isolation in multi-tenant environments ensures that each tenant's workloads perform optimally and consistently, resulting in higher customer satisfaction and improved service quality.\nBetter AI Fabric Visibility: Visibility into the flows running across the AI cloud makes it possible to identify performance bottlenecks and is a key part of a modern, automated fabric-validation solution.\nHigher AI Scalability: Scales to 128X 400G ports in one hop or 8K ports in a two-tier leaf/spine topology, supporting the expansion of the AI cloud while maintaining high levels of performance.\nFaster Network Setup: The automated, end-to-end configuration of advanced networking functionality is fully tuned for AI workloads.", "Spectrum-X is the AI cluster compute (GPU) East-West Network. It is built from Scalable Units (SU) that consist of up to 32 HGX nodes (8 GPUs each), where every GPU on a given rail out of the eight rails of the HGX is one hop away from the respective GPUs on the other HGX systems within a given SU.\nThe HGX nodes are connected using a \u201crail-optimized\u201d design and specifically configured to maximize performance and efficiency. By grouping the GPUs (Bluefield NICs) into \"rails\" and optimizing the connectivity and communication within and across these rails, the network contention is minimized, bandwidth is maximized, and the costs for the AI fabric are reduced.\nThe HGX rails are grouped into 4 groups of two rails, so each rail group is connected by dedicated leaf and/or spine fabric switches: rail group00 [rails 1,5], rail group01 [rails 2,6], rail group02 [rails 3,7], and rail group03 [rails 4,8].\nThe network fabric design is defined with the cluster scale as the primary consideration. The number of GPUs (HGX nodes) in the east-west network directly affects the deployment topology architecture, cabling, rack design, and network configuration.\nThe switch fabric can be built in two- or Three-tier CLOS architecture.\n\u00b7 The Two-Tier architecture (leaf-spine) is used when building an AI cluster with up to 8K GPUs and cannot scale beyond that.\n\n\u00b7 The Three-Tier architecture (leaf-spine-super spine) is used when building an AI cluster with up to 512K GPUs.\n\nStarting with a three-tier network from day one is recommended if you plan to scale the cluster to more than 8K GPUs in the future.", "Spectrum-X deployments use Zero Touch RoCE Congestion Control (ZTRCC) to effectively manage the east-west RoCE GPU-to-GPU \u201celephant\u201d flows communication during congestion events. It is a powerful congestion control solution specially developed by NVIDIA to work with adaptive routing. It is tuned for AI fabrics to enhance network efficiency and accelerate AI workload performance.\nZTRCC works on the BlueField3 SuperNIC and uses Enhanced Congestion Notification (ECN) packets and Round-Trip Time (RTT) probes to track the end-to-end fabric congestion and adjust the transmission rate. This sophisticated congestion control mechanism on the SuperNIC is made possible by its seamless integration with the Spectrum-4 switch, which manages the transmission of ECN packets and RTT probes throughout the network fabric.\nCheck out this blog post from NVIDIA to learn more about ZTRCC - https://developer.nvidia.com/blog/scaling-zero-touch-roce-technology-with-round-trip-time-congestion-control/\nTo configure ZTRCC on the BlueField SuperNIC, run the following commands on the HGX node\nfor i in {0..7}; do mlxreg -d /dev/mst/mt41692_pciconf$i -y --set \"cmd_type=1\" --reg_name PPCC --indexes \"local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0\";done\nfor j in {1..8}; do for point in rp np ; do for i in {0..7} ; do echo 1 > /sys/class/net/eth$j/ecn/roce_${point}/enable/${i} ; done ; done; done \nAfter it is set, run the following commands on the HGX node to make sure it\u2019s tuned for AI.\nfor i in {0..7}; do sudo mlxreg -d /dev/mst/mt41692_pciconf$i -y --set \"cmd_type=8,value=0\" --reg_name PPCC --indexes \"local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=12\" ; done \nfor i in {0..7}; do sudo mlxreg -d /dev/mst/mt41692_pciconf$i -y --set \"cmd_type=8,value=18\" --reg_name PPCC --indexes \"local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=5\" ; done \nfor i in {0..7}; do sudo mlxreg -d /dev/mst/mt41692_pciconf$i -y --set \"cmd_type=8,value=30000\u201c --reg_name PPCC --indexes \"local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=7\" ; done \nfor i in {0..7}; do sudo mlxreg -d /dev/mst/mt41692_pciconf$i -y --set \"cmd_type=8,value=1\" --reg_name PPCC --indexes \"local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=11\" ; done \nfor i in {0..7}; do sudo mlxreg -d /dev/mst/mt41692_pciconf$i -y --set \"cmd_type=8,value=524288\" --reg_name PPCC --indexes \"local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=9\" ; done \n", "The East-West (E-W) network fabric for compute nodes is tailored for AI cloud environments accommodating multiple jobs and tenants. This fabric comprises two network types: the underlying physical network (underlay) and one or more virtualized networks (overlays) facilitating multi-tenancy and delivering full line-rate services.\nThe underlay network operates as a pure routed (layer 3) network using eBGP routing protocol, serving as the foundational infrastructure for overlays. If no overlays exist, it can also function as a \"single-tenant\" network.\nWhen overlays are deployed over fabric switches, they can be configured as layer 2 (bridged) or layer 3 (routed) networks, employing VXLAN data plane and bridged/routed EVPN control plane over the layer 3 underlay fabric. Alternatively, overlays can use Host Based Networking (HBN) with VXLAN or an OVN controller with Geneve as the data plane encapsulation protocol if deployed on hosts. In either scenario, the fabric switches operate as a routed underlay network.\nUtilizing a routed network infrastructure as its foundation, Spectrum-X seamlessly integrates sophisticated features such as Adaptive Routing load-balancing and ZTRCC congestion-control mechanisms, complemented by finely adjusted QoS settings. This cohesive blend of cutting-edge protocols and well-designed routing network architecture enables multiple tenants to execute numerous jobs simultaneously on a shared infrastructure. As a result, optimal performance is achieved while robust security measures are upheld, ensuring complete isolation and independence among tenants.\n", "Adaptive routing load balancing operates end-to-end and must be configured on the BlueField3 SuperNIC and the Spectrum-4 switch.\nOn the sender side, Bluefield marks packets for reordering eligibility, thus ensuring that inter-packet ordering can be enforced when the switch AR is required. The switch adaptive routing classifier can only classify these marked RoCE packets to be subjected to unique forwarding.\nAll switches and their inter-switch links (on all topology tiers) and BF3 SuperNICs in the E-W network must be globally configured with AR.\nTo configure AR on the switch side, use the following NVUE commands\nnv set router adaptive-routing enable on\nnv set router adaptive-routing profile profile-custom\nnv set interface router adaptive-routing enable on\nTo set the BF3 with AR run the following commands on all HGX BF devices\nfor i in {0..7} ; do mlxconfig -d /dev/mst/mt41692_pciconf$i -y s ROCE_ADAPTIVE_ROUTING_EN=1; done \nfor i in {0..7} ; do mlxfwreset -d /dev/mst/ mt41692_pciconf$i reset -y ; done \n", "NVIDIA Spectrum-4 provides a monitoring tool that collects and distributes data about the state of the ASIC. By polling the data at specific intervals and taking certain actions, it allows you to identify and respond to microbursts, buffer congestion, and issues with a particular switch, port, or traffic class.\nTo enable the ASIC telemetry, it must be set globally on the system\nnv set service telemetry enable on\nCumulus Linux provides ingress and egress queue length telemetry histograms that show information about the buffer utilization and port counters histograms to show the bandwidth utilization over time. \nThe queue histogram is a graphical representation of data divided into bins representing a range of queue lengths. A histogram is configured with its type (egress/ingress-buffer or counter), sampling interval, sampled ports, the minimum boundary size, and the total size (the maximum boundary size equals the addition of the minimum and the total sizes).\nThere are a total of 10 bins in a histogram that are numbered 0-9. Bin 0 represents queue lengths/counters up to the minimum size specified, including queue length 0. The last bin represents queue lengths of maximum and above. Bins 1 through 8 represent equal-sized ranges between the min and max (divided by 8).\nnv set service telemetry histogram bin-min-boundary \nnv set service telemetry histogram histogram-size \nnv set service telemetry histogram sample-interval \nThe ingress queue histograms monitor priority groups (PG) and set per specific PG of the port(s)\nnv set interface telemetry histogram ingress-buffer priority-group \nThe egress queue histograms monitor traffic-Classes (TC) and set per specific TC of the port(s)\nnv set interface telemetry histogram egress-buffer traffic-class \nThe counter histograms monitor specific counter-type(s) on a physical port(s)\nnv set interface telemetry histogram counter counter-type \nCumulus Linux also allows taking snapshots of the monitored data and store on the switch for review and analysis. These snapshots are taken periodically and include histogram bins information and timestamps.\n\nnv set service telemetry snapshot-file name /\nnv set service telemetry snapshot-file count \nnv set service telemetry snapshot-interval \nTo monitor the snapshots, use the interface level show commands to present the needed histogram type. \nnv show interface telemetry histogram ingress-buffer priority-group snapshot\nnv show interface telemetry histogram egress-buffer traffic-class snapshot\nnv show interface telemetry histogram counter counter-type snapshot\nCheck out the ASIC Monitoring documentation for more information - https://docs.nvidia.com/networking-ethernet-software/cumulus-linux/Monitoring-and-Troubleshooting/ASIC-Monitoring/\n", "Spectrum-X multi-tenant environment can be deployed over the network switch fabric using two virtualization approaches. As a layer 2 (bridged) or layer 3 (routed) network, employing VXLAN data plane and bridged/routed EVPN control plane over the layer 3 eBGP underlay fabric. \nTo enable the VXLAN data plane, the NVE interface must be enabled globally on the system and set with the tunnel source address (local leaf loopback IP). In addition, it must be configured with ARP suppression to allow the VTEP to respond to ARP requests locally without flooding them to the network.\nnv set nve vxlan enable on\nnv set nve vxlan source address \nnv set nve vxlan arp-nd-suppress on\nThe BGP-EVPN control plane provides tenant information exchange in virtualized environments. To enable an efficient overlay fabric, EVPN is enabled exclusively on the switches involved in overlay networks. Those switches are always the VTEPs (leafs) and two switches from the highest layer of the network, spines in two-tier or super-spines in three-tier topology. They are chosen based on the lowest BGP router-id and the lowest BGP router-id+1. Consequently, each VTEP in the fabric should ideally maintain only two EVPN sessions. For those switches to support EVPN routes, their BGP instances of the default VRF must be set with the L2VPN-EVPN address family.\nnv set evpn enable on\nnv set vrf default router bgp address-family l2vpn-evpn enable on\nThe EVPN sessions use numbered peering over loopback IPs and are set with a precise description and put within a separate peer group for the overlay neighbors.\nnv set vrf default router bgp neighbor
description \nnv set vrf default router bgp neighbor
peer-group \nnv set vrf default router bgp neighbor
type numbered\nThis overlay peer group uses the auto-BGP \"remote-as external\" configuring for eBGP peerings without the need to set per-neighbor ASN, a description, and BFD parameters. As the sessions are established between the loopback interfaces, the neighbors within the peer group must use the loopback as the session source IP and a multi-hop eBGP configuration based on the topology design (ttl=2 in two-tier, ttl=3 in three-tier).\nnv set vrf default router bgp peer-group remote-as external\nnv set vrf default router bgp peer-group description \nnv set vrf default router bgp peer-group bfd enable on\nnv set vrf default router bgp peer-group bfd detect-multiplier 3\nnv set vrf default router bgp peer-group bfd min-rx-interval \nnv set vrf default router bgp peer-group bfd min-tx-interval \nnv set vrf default router bgp peer-group update-source lo\nnv set vrf default router bgp peer-group multihop-ttl \nTo separate the overlay from the underlay and ensure an efficient, fast, and resilient overlay network, only the L2VPN-EVPN address family (AF) is enabled for this peer group ( IPv4 AF must be disabled).\nnv set vrf default router bgp peer-group address-family ipv4-unicast enable off\nnv set vrf default router bgp peer-group address-family l2vpn-evpn enable on\nIn the L2EVPN deployment, each tenant\u2019s data plane is created by mapping the tenant VLAN on the bridge to its unique L2VNI-ID. The BGP-EVPN control plane is responsible for exchanging the tenant\u2019s host MAC/IP information (EVPN type 2 routes) and the Inclusive multicast Ethernet tag with VTEP IPs to create the ingress replication list (EVPN type 3 routes) between all leafs (VTEPs). To distinguish between tenants in the EVPN routing table, a static Route Distinguisher (RD) is set for each L2VNI\nnv set bridge domain br_default type vlan-aware\nnv set bridge domain br_default vlan vni \nnv set evpn vni rd :\nTo assign GPUs to tenants, leaf downlink ports should be assigned to the tenant VLAN\nnv set interface bridge domain br_default access \nIn the L3EVPN deployment, each tenant is separated by a unique VRF with a unique L3VNI ID. this environment is designed as a pure routed EVPN network using IP-prefix EVPN type 5 routes. The BGP-EVPN control plane exchanges the tenant IP prefix Routes (EVPN type 5 routes) between all leafs (VTEPs). \nnv set vrf evpn enable on\nnv set vrf evpn vni \nA dedicated BGP instance with all parameters must be created to for the tenant VRF to enable its EVPN control plane. \nnv set vrf router bgp enable on\nnv set vrf router bgp address-family ipv4-unicast enable on\nnv set vrf router bgp address-family l2vpn-evpn enable on\nnv set vrf router bgp path-selection multipath aspath-ignore on\nTo advertise the tenant subnets into its VRF, they are redistributed into BGP with a route-map that matches only its subnets\nnv set vrf router bgp address-family ipv4-unicast redistribute connected enable on\nnv set vrf router bgp address-family ipv4-unicast redistribute connected route-map \nThen they must be injected as EVPN type 5 routes into the VRF. It is done by exploring them from the IPv4 address-familty to EVPN. And to distinguish between tenants in the EVPN routing table, a static Route Distinguisher (RD) is set for each tenant VRF BGP instance \nnv set vrf router bgp address-family ipv4-unicast route-export to-evpn enable on\nnv set vrf router bgp rd :\nTo assign GPUs to tenants, leaf downlink ports should be assigned to the tenant VRF\nnv set interface ip vrf \n\n\n", "A traditional data center fabric is loosely coupled from the workloads, it uses ECMP (Equal Cost Multipath) for load balancing and uses standard congestion control (DCQCN). However an AI Fabric is end-to-end optimized for AI performance, meaning fabric is tightly coupled with the workloads and it uses Adaptive Routing for load balancing. It has advanced programmable congestion control which is ZTRCC and it would achieve speed-of-light performance for AI workloads.\n\nAI clouds that use traditional Ethernet for their compute fabric can only achieve a fraction of the MLPerf performance that they would achieve with an optimized network. In multi-tenant environments where multiple AI jobs run simultaneously, performance isolation is critical to prevent further degradation of performance. And if there\u2019s a link fault, the traditional Ethernet fabric can cause the cluster\u2019s AI performance to drop by half. This is because traditional Ethernet has primarily been optimized for everyday enterprise workflows and isn\u2019t designed to meet the demands of high-performance AI applications that rely on the NVIDIA Collective Communications Library (NCCL).\nThese performance issues are due to factors inherent to traditional Ethernet:\nHigher switch latencies, common across commodity ASICs\nSplit buffer switch architecture, which can lead to bandwidth unfairness\nLoad balancing that\u2019s sub-optimized for the large flows generated by AI workloads\nPerformance isolation and noisy neighbor issues\n\nThe Spectrum-X networking platform, based on Spectrum-4 and BlueField-3, solves these issues with traditional Ethernet.\n", "Multi-tenancy matters for AI Fabrics because it is one of the essentials of a Cloud environment which would enable multiple customers, workload types to be segregated over the same fabric environment. The point here is to ensure performance isolation so that different tenants\u2019 traffic would not impact each other.\n", "Spectrum-X is the umbrella feature set of all AI enhancements of Nvidia\u2019s Ethernet based AI Fabric solution. The features like congestion control and adaptive routing rely on BlueField-3 as the hardware on the host side. BlueField-3 actively participates in both AR and CC features.", "Traffic is comprised of elephant flows with very low entropy\nCongestion in the fabric can occur at endpoints due to high load and inside the fabric due to sub-optimal load balancing of ECMP\nDelay and jitter sensitive\nRoCEv2 workloads in lossless environment\nReal-time telemetry is critical for the operation of the fabric\nAI Fabric is utilized over 90% during normal operation\nFabric topology is driven by NCCL collective operations\nRail optimized topology instead of non-rail optimized\nMultitenancy is a key component of an AI Fabric\nBlueField-3 SuperNIC plays an active role in SPC-X based AI Fabric", "RoCE uses the Infiniband (IB) Protocol over converged Ethernet. The IB global route header rides directly on top of the Ethernet header. The lossless Ethernet layer handles congestion hop by hop.\nTo configure RoCE with PFC and ECN:\nnv set qos roce enable on\nnv set qos roce mode lossless\nnv config apply\n\nNote\nNVUE defaults to roce mode lossless. The command nv set qos roce and nv set qos roce mode lossless are equivalent.\nIf you enable mode lossy, configuring nv set qos roce without a mode does not change the RoCE mode. To change to lossless, you must configure mode lossless.", "The NVIDIA\u00ae BlueField\u00ae-3 networking platform is designed to accelerate data center infrastructure workloads and usher in the era of accelerated computing and AI. Supporting both Ethernet and InfiniBand connectivity, BlueField-3 offers speeds up to 400 gigabits per second (Gb/s). It combines powerful computing with software-defined hardware accelerators for networking, storage, and cybersecurity\u2014all fully programmable through the NVIDIA DOCA\u2122 software framework. Drawing on the platform\u2019s robust capabilities, BlueField data processing units (DPUs) and BlueField SuperNICs revolutionize traditional computing environments, transforming them into secure, high-performance, efficient, and sustainable data centers suitable forany workload at any scale.\nThe BlueField-3 DPU is a cloud infrastructure processor that empowers organizations to build software-defined, hardware-accelerated data centers from the cloud to the edge. BlueField-3 DPUs offload, accelerate, and isolate software-defined networking, storage, security, and management functions, significantly enhancing data center performance, efficiency, and security. By decoupling data center infrastructure from business applications, BlueField-3 creates a secure, zero-trust data center infrastructure, streamlines operations, and reduces the total cost of ownership.\nThe BlueField-3 SuperNIC is a novel class of network accelerator that\u2019s purpose-built for supercharging hyperscale AI workloads. Designed for network-intensive, massively parallel computing, the BlueField-3 SuperNIC provides best-in-class remote direct-memory access over converged Ethernet (RoCE) network connectivity between GPU servers at up to 400Gb/s, optimizing peak AI workload efficiency. For modern AI clouds, the BlueField-3 SuperNIC enables secure multi-tenancy while ensuring deterministic performance and performance isolation between tenant jobs.\n\nAdaptive Routing\n# for i in {0..7} ; do mlxconfig -d /dev/mst/mt41692_pciconf$i -y s ROCE_ADAPTIVE_ROUTING_EN=1; done \n# for i in {0..7} ; do mlxfwreset -d /dev/mst/ mt41692_pciconf$i reset -y ; done \nRoCE (ToS 96 \u2013 prio3)\n# for i in {0,1,2,3,6,7,8,9}; do cma_roce_tos -d mlx5_$i -t 96; done \n# for i in {0,1,2,3,6,7,8,9}; do echo 96 > /sys/class/infiniband/mlx5_$i/tc/1/traffic_class; done \nRoCE lossless for prio3\n# for i in {1..8}; do mlnx_qos -i eth$i --pfc=0,0,0,1,0,0,0,0 --trust=dscp; done \nRoCE AR acceleration\n# for i in {0..7}; do mlxreg -d /dev/mst/mt41692_pciconf$i --reg_name ROCE_ACCL \u2013set / roce_adp_retrans_en=0x1,roce_tx_window_en=0x1,roce_slow_restart_en=0x0,/\n roce_slow_restart_idle_en=0x0,adaptive_routing_forced_en=0x1 --yes; done \n", "```https://www.nvidia.com/en-us/events/ces/``` OR ```https://www.nvidia.com/en-us/events/ces/```", "```A widely acclaimed large language model for genomic data has demonstrated its ability to generate gene sequences that closely resemble real-world variants of SARS-CoV-2, the virus behind COVID-19``` OR ```A widely acclaimed large language model for genomic data has demonstrated its ability to generate gene sequences that closely resemble real-world variants of SARS-CoV-2, the virus behind COVID-19.```", "```Jensen Huang``` OR ```Jensen Huang```", "```I'm only able to answer questions based on publicly availble knowledge on the NVIDIA Blog, NVIDIA news site, NVIDIA's SEC filings and earnings at this time.``` OR ```No answer ```", "```Vice President of Applied Deep Learning Research``` OR ```NVIDIA Vice President of Applied Deep Learning Research```", "```Jensen Huang``` OR ```NVIDIA founder and CEO Jensen Huang```", "```no one else``` OR ```No answer ```", "```Virtual Event``` OR ```online```", "```NVIDIA Grace Hopper or GH200``` OR ```NVIDIA Grace Hopper or NVIDIA GH200```", "```starts at 599``` OR ```prices starting at $599```", "```$6.05 billion``` OR ```$6.05 billion```", "```$18.12 billion``` OR ```$18.12 billion```", "```$5.93 billion``` OR ```$5.93 billion```", "```It was up 206 % from 5.93billion to 18.12 billion``` OR ```Up 206%```", "```No answer``` OR ```(no answer)```", "```Collette Kress``` OR ```Colette Kress```", "```Foxconn Smart EV will be built on NVIDIA DRIVE Hyperion\u2122 9, a next-generation platform for autonomous automotive fleets, powered by NVIDIA DRIVE Thor\u2122, its future automotive systems-on-a-chip.\n Foxconn Smart Manufacturing robotic systems will be built on the NVIDIA Isaac\u2122 autonomous mobile robot platform.\n Foxconn Smart City will incorporate the NVIDIA Metropolis intelligent video analytics platform.``` OR ```Foxconn will integrate NVIDIA technology to develop a new class of data centers powering a wide range of applications \u2014 including digitalization of manufacturing and inspection workflows, development of AI-powered electric vehicle and robotics platforms, and a growing number of language-based generative AI services.\n \n Foxconn is also developing its smart solution platforms based on NVIDIA technologies:\n \n Foxconn Smart EV will be built on NVIDIA DRIVE Hyperion\u2122 9, a next-generation platform for autonomous automotive fleets, powered by NVIDIA DRIVE Thor\u2122, its future automotive systems-on-a-chip.\n Foxconn Smart Manufacturing robotic systems will be built on the NVIDIA Isaac\u2122 autonomous mobile robot platform.\n Foxconn Smart City will incorporate the NVIDIA Metropolis intelligent video analytics platform.\n ```", "```in 2021``` OR ```NVIDIA completed its acquisition of DeepMap on Aug. 26, 2021```", "```DRIVE Hyperion 9``` OR ```NVIDIA DRIVE Hyperion 9 (this is the drive platform, not sure if drive system will give the same answer)```", "```BMW, Mercedes Benz``` OR ```BMW, Mercedes Benz```", "```DAVID REBER JR.``` OR ```DAVID REBER JR.```", "```yes``` OR ```Yes```", "```* Tesla\n * Volkswagen Group\n * NIO\n * Baidu\n * Jaguar Land Rover\n * Cruise Automation\n * Argo AI\n * BYTON\n * NVIDIA's own autonomous driving division``` OR ```* Tesla\n * Volkswagen Group\n * NIO\n * Baidu\n * Jaguar Land Rover\n * Cruise Automation\n * Argo AI\n * BYTON\n * NVIDIA's own autonomous driving division```", "`````` OR ```BMW, Mercedes Benz```", "```increase of 88% or 6.32 b (7.19b vs 13.51b)``` OR ```88% or $6.32B```", "```$3.38 billion``` OR ```$3.38B```", "```1. The company had a record Q2 revenue of $13.51 billion, which was up 88% sequentially and up 101% year-on-year, and above their outlook of $11 billion.\n 2. The Data Center revenue was a record $10.32 billion, up 141% sequentially and up 171% year-on-year, with large CSPs contributing a little bit more than 50% of their revenue within Q2.\n 3. The company expects supply to increase each quarter through the next year and they do not anticipate that additional export restrictions on their Data Center GPUs, if adopted, would have an immediate material impact to their financial results.``` OR ```Record revenue of $13.51 billion, up 88% from Q1, up 101% from year ago\n Record Data Center revenue of $10.32 billion, up 141% from Q1, up 171% from year ago```", "```70.1 % GAAP and 71.2% non-GAAP``` OR ```70.1% (GAAP) and 71.2% (non-GAAP)```", "```71.5% GAAP and 72.5% non-GAAP``` OR ```GAAP and non-GAAP gross margins are expected to be 71.5% and 72.5%, respectively, plus or minus 50 basis points.```", "```1.71``` OR ```1.71```", "```43.5 GAAP and 45.9 non-GAAP``` OR ```43.5% (GAAP) and 45.9% (non-GAAP)```", "```65.2% GAAP and 67.0% non-GAAP``` OR ```GAAP and non-GAAP gross margins are expected to be 62.4% and 65.0%, respectively, plus or minus 50 basis points```", "```0.35``` OR ```0.35```", "```6.51b``` OR ```$6.51B```", "```2.04b``` OR ```$2.04B```", "```15% or 6.51b vs 5.66b``` OR ```15% increase```", "```15% or 6.51b vs 5.66b``` OR ```15% increase```", "```64.6% GAAP and 66.8% non-GAAP``` OR ```64.6% (GAAP) and 66.8% (non-GAAP)```", "```7.19b``` OR ```$7.19B```", "```2.24b``` OR ```$2.24B```", "```19% or 7.19b vs 6.05b GAAP``` OR ```19% or $7.19B vs $6.05B (GAAP)```", "```19% or 7.19b vs 6.05b non-GAAP``` OR ```19% or $7.19B vs $6.05B (GAAP)```", "```8.1b``` OR ```Revenue is expected to be $11.00 billion, plus or minus 2%.```", "```13.52b actual vs 11b forecasted``` OR ```$13.51B vs. 11B forecast```", "```Added 35 DLSS games, including Diablo IV, Ratchet & Clank: Rift Apart, Baldur\u2019s Gate 3 and F1 23, as well as Portal: Prelude RTX, a path-traced game made by the community using NVIDIA\u2019s RTX Remix creator tool.``` OR ```Added 35 DLSS games, including Diablo IV, Ratchet & Clank: Rift Apart, Baldur\u2019s Gate 3 and F1 23, as well as Portal: Prelude RTX, a path-traced game made by the community using NVIDIA\u2019s RTX Remix creator tool.```", "```2.06``` OR ```2.06```", "```4.02``` OR ```4.02```", "```up 593% or $4.02 vs $0.58``` OR ```up nearly 6x or up 593%```", "```https://nvidianews.nvidia.com/news/nvidia-announces-financial-results-for-third-quarter-fiscal-2024``` OR ```https://nvidianews.nvidia.com/news/nvidia-announces-financial-results-for-second-quarter-fiscal-2024```", "```https://nvidianews.nvidia.com/news/nvidia-announces-financial-results-for-first-quarter-fiscal-2024``` OR ```https://nvidianews.nvidia.com/news/nvidia-announces-financial-results-for-first-quarter-fiscal-2024```", "```https://nvidianews.nvidia.com/news/nvidia-announces-financial-results-for-third-quarter-fiscal-2024``` OR ```https://nvidianews.nvidia.com/news/nvidia-announces-financial-results-for-third-quarter-fiscal-2024```", "```Tensor Core GPU, based on the NVIDIA Hopper architecture, with advanced memory to handle large data for generative AI and high performance computing.``` OR ```NVIDIA today announced it has supercharged the world\u2019s leading AI computing platform with the introduction of the NVIDIA HGX\u2122 H200. Based on NVIDIA Hopper\u2122 architecture, the platform features the NVIDIA H200 Tensor Core GPU with advanced memory to handle massive amounts of data for generative AI and high performance computing workloads. The NVIDIA H200 is the first GPU to offer HBM3e \u2014 faster, larger memory to fuel the acceleration of generative AI and large language models, while advancing scientific computing for HPC workloads. With HBM3e, the NVIDIA H200 delivers 141GB of memory at 4.8 terabytes per second, nearly double the capacity and 2.4x more bandwidth compared with its predecessor, the NVIDIA A100.\n \n ```", "```The NVIDIA Hopper architecture delivers an unprecedented performance leap over its predecessor and continues to raise the bar through ongoing software enhancements with H100, including the recent release of powerful open-source libraries like NVIDIA TensorRT\u2122-LLM.\n \n The introduction of H200 will lead to further performance leaps, including nearly doubling inference speed on Llama 2, a 70 billion-parameter LLM, compared to the H100. Additional performance leadership and improvements with H200 are expected with future software updates.``` OR ```The NVIDIA Hopper architecture delivers an unprecedented performance leap over its predecessor and continues to raise the bar through ongoing software enhancements with H100, including the recent release of powerful open-source libraries like NVIDIA TensorRT\u2122-LLM. The introduction of H200 will lead to further performance leaps, including nearly doubling inference speed on Llama 2, a 70 billion-parameter LLM, compared to the H100. Additional performance leadership and improvements with H200 are expected with future software updates.```", "```Q2 of 2024``` OR ```The NVIDIA H200 will be available from global system manufacturers and cloud service providers starting in the second quarter of 2024```", "```Dell, Lenovo, HP``` OR ```Dell Technologies, Hewlett Packard Enterprise and Lenovo ```", "``` 51Tb/sec``` OR ```51Tb/sec (FYI - since this is noted as the througput for Spectrum-4 in the article so it may or may not return this correctly)```", "```Genentech, part of Roche Group using it for accelarating drug discovery using generative AI``` OR ```Genentech OR\n Genentech, a member of the Roche Group```", "```Gaming revenue 1.83b up 16% Q/Q and down 46% Y/Y. \n \n Y/Y decline reflects impact of channel inventory correction, which is largely behind us now.\n \n Q/Q growth based on strong reception of 40 series GeForce RTX GPUs based on Ada Lovelace architecture. Many retail and online shops are sold out. RTX 490 shot up in popularity on Steam, reflecting gamers' desire for high performance graphics.``` OR ```Gaming revenue 1.83b up 16% Q/Q and down 46% Y/Y. \n \n Y/Y decline reflects impact of channel inventory correction, which is largely behind us now.\n \n Q/Q growth based on strong reception of 40 series GeForce RTX GPUs based on Ada Lovelace architecture. Many retail and online shops are sold out. RTX 490 shot up in popularity on Steam, reflecting gamers' desire for high performance graphics.```", "```Sequential growth was driven primarily by AI automotive solutions. New program ramps at both electric\n vehicle and traditional OEM customers helped drive this growth. Fiscal year revenue of $903 million was up 60%.``` OR ```Sequential growth was driven primarily by AI automotive solutions. New program ramps at both electric\n vehicle and traditional OEM customers helped drive this growth. Fiscal year revenue of $903 million was up 60%.```", "```yes. H100 was the focus of many of our CSPs within Q4 and they were all wanting to get both\n it up and running in cloud instances and so we actually saw less of A100 in Q4 of what we saw in H100``` OR ```yes. H100 was the focus of many of our CSPs within Q4 and they were all wanting to get both\n it up and running in cloud instances and so we actually saw less of A100 in Q4 of what we saw in H100```", "```we have multiple product cycles coming to market. We have H100\n in market now. We are continuing with our networking launches as well that are sometimes fueled with our GPU\n computing with our networking. And then we have Grace coming likely in the second half of the year.\n Additionally, generative AI it's sparked interest definitely among our customers, whether those be CSPs, whether\n those be enterprises, whether those be start-ups. We expect that to be a part of our revenue growth this year.\n And then lastly, let's just not forget they that given the end of Moore's Law, there's an era here of focusing on AI,\n focusing on accelerated computing, so as the economy improves, this is probably very important to the\n enterprises and it can be fueled by the existence of cloud first for the enterprises as they open up.``` OR ```we have multiple product cycles coming to market. We have H100\n in market now. We are continuing with our networking launches as well that are sometimes fueled with our GPU\n computing with our networking. And then we have Grace coming likely in the second half of the year.\n Additionally, generative AI it's sparked interest definitely among our customers, whether those be CSPs, whether\n those be enterprises, whether those be start-ups. We expect that to be a part of our revenue growth this year.\n And then lastly, let's just not forget they that given the end of Moore's Law, there's an era here of focusing on AI,\n focusing on accelerated computing, so as the economy improves, this is probably very important to the\n enterprises and it can be fueled by the existence of cloud first for the enterprises as they open up.```", "```Gaming, revenue of $3.6 billion rose 6% sequentially and 31% year-on-year year-on-year powered by the\n GeForce RTX 30 Series product cycle. Since launching in the fall of 2020, the RTX 30 Series has been our best\n Gaming product cycle ever.\n ``` OR ```Gaming, revenue of $3.6 billion rose 6% sequentially and 31% year-on-year year-on-year powered by the\n GeForce RTX 30 Series product cycle. Since launching in the fall of 2020, the RTX 30 Series has been our best\n Gaming product cycle ever.\n ```", "```The extent in which cryptocurrency mining contributed to gaming demand is difficult for us to quantify with any\n reasonable degree of precision. The reduced pace of increase in Ethereum network hash rate likely reflects lower\n mining activity on GPUs. We expect a diminishing contribution going forward.``` OR ```The extent in which cryptocurrency mining contributed to gaming demand is difficult for us to quantify with any\n reasonable degree of precision. The reduced pace of increase in Ethereum network hash rate likely reflects lower\n mining activity on GPUs. We expect a diminishing contribution going forward.```", "```$622 million,``` OR ```$622 million```", "```$138 million``` OR ```$138 million```", "```Revenue was 3.8b, up 83% from an year ago``` OR ```$3.75 billion, up 83% from a year ago```", "```Customers remain supply-constrained in their infrastructure needs and continue to add capacity as they try to\n keep pace with demand. Revenue from vertical industries grew a strong double digit percentage from last year.\n Top verticals driving growth this quarter include consumer internet companies, financial services, and telecom.\n Overall, Data Center growth was driven primarily by strong adoption of our A100 GPU for both training and\n inference with large volume deployments by hyperscale customers and broadening adoption across the vertical\n industries. Top workloads include recommender systems, conversational AI, large language models, and cloud\n graphics.\n Networking revenue accelerated on strong broad-based demand for our next generation 25, 50 and 100-gig\n Ethernet adapters. Customers are choosing NVIDIA's networking products for their leading performance and\n robust software functionality. In addition, networking revenue is benefiting from growing demand for DGX\n SuperPOD cross selling opportunities. Customers are increasingly combining our compute and networking\n products to build what are essentially modern AI factories with data as the raw material input and intelligence as\n the output.``` OR ```Customers remain supply-constrained in their infrastructure needs and continue to add capacity as they try to\n keep pace with demand. Revenue from vertical industries grew a strong double digit percentage from last year.\n Top verticals driving growth this quarter include consumer internet companies, financial services, and telecom.\n Overall, Data Center growth was driven primarily by strong adoption of our A100 GPU for both training and\n inference with large volume deployments by hyperscale customers and broadening adoption across the vertical\n industries. Top workloads include recommender systems, conversational AI, large language models, and cloud\n graphics.\n Networking revenue accelerated on strong broad-based demand for our next generation 25, 50 and 100-gig\n Ethernet adapters. Customers are choosing NVIDIA's networking products for their leading performance and\n robust software functionality. In addition, networking revenue is benefiting from growing demand for DGX\n SuperPOD cross selling opportunities. Customers are increasingly combining our compute and networking\n products to build what are essentially modern AI factories with data as the raw material input and intelligence as\n the output.```", "```80 billion``` OR ```80 billion```", "```$2b or 2.1b``` OR ```$2.10B```", "```$8.1b``` OR ```$8.10 billion, plus or minus 2%```", "```26.91b GAAP & non-GAAP``` OR ```$26.91B```", "```64.9% GAAP and 66.8% non-GAAP``` OR ```64.9% (GAAP) and 66.8% (non-GAAP)```", "```7.43b GAAP and 5.28b non-GAAP``` OR ```$7,434 million (GAAP) and $5,279 million (non-GAAP)```", "```9.75b GAAP and 11.26b non-GAAP``` OR ```$9,752 million (GAAP) and $11,259 million (non-GAAP)```", "```$3.85 GAAP and $4.44 non-GAAP``` OR ```$3.85 (GAAP) and $4.44 (non-GAAP)```", "```10.04b GAAP and 12.69b non-GAAP``` OR ```$10,041 million (GAAP) and $12,690 million (non-GAAP)```", "```16.68b GAAP & non-GAAP``` OR ```$16.68B```", "```62.3% GAAP and 65.6% non-GAAP``` OR ```62.3% (GAAP) and 65.6% (non-GAAP)```", "```5.86b GAAP and 4.14b non-GAAP``` OR ```$5,864 million (GAAP) and $4,144 million (non-GAAP)```", "```4.33b GAAP and 6.28b non-GAAP``` OR ```$4,332 million (GAAP) and $6,277 (non-GAAP)```", "```$6.90 (GAAP) and $10.00 (non-GAAP)``` OR ```$6.90 (GAAP) and $10.00 (non-GAAP)```", "```4.53b GAAP and 6.8b non-GAAP``` OR ```$4,532 million (GAAP) and $6,803 million (non-GAAP)```", "```26.91b non-GAAP``` OR ```$26.91B or $26,914 million```", "```66.8% non-GAAP``` OR ```0.668```", "```5.28b non-GAAP``` OR ```$5,279 million```", "```11.26b non-GAAP``` OR ```$11,259 million```", "```$4.44 non-GAAP``` OR ```$4.44 ```", "```12.69b non-GAAP``` OR ```$12,690 million```", "```26.91b GAAP``` OR ```$26.91B or $26,914 million```", "```64.9% GAAP``` OR ```0.649```", "```7.43b GAAP``` OR ```$7,434 million```", "```9.75b GAAP``` OR ```$9,752 million```", "```$3.85 GAAP``` OR ```3.85```", "```10.04b GAAP``` OR ```$10,041 million```", "```16.68b``` OR ```$16.68B or $16,675 million```", "```65.6% non-GAAP``` OR ```0.656```", "```4.14b non-GAAP``` OR ```$4,144 million```", "```6.28b non-GAAP``` OR ```$6,277 million```", "```10``` OR ```10```", "```6.8b non-GAAP``` OR ```$6,803 million```", "```16.68b ``` OR ```$16.68B or $16,675 million```", "```0.623``` OR ```62.3%%```", "```5.86b ``` OR ```$5,864 million```", "```4.33b ``` OR ```$4,332 million```", "```6.9``` OR ```6.9```", "```4.53b ``` OR ```$4,532 million```", "```NVIDIA recorded a $1.36 b charge in operating expenses``` OR ```$1.36 billion in operating expenses recorded in the first quarter of fiscal 2023 reflecting the write-off of the prepayment provided at signing in September 2020. \n \n ```", "```$395 million``` OR ```$395 million```", "```10.92b GAAP & non-GAAP``` OR ```$10.92B```", "```62% GAAP and 62.5% non-GAAP``` OR ```62% (GAAP) and 62.5% (non-GAAP)```", "```3.92b GAAP and 3.09b non-GAAP``` OR ```$3,922 million (GAAP) and $3,086 million (non-GAAP)```", "```2.78b GAAP and 3.58b non-GAAP``` OR ```$2,796 million (GAAP) and $3,580 million (non-GAAP)```", "```$4.52 GAAP and $5.79 non-GAAP``` OR ```$4.52 (GAAP) and $5.79 (non-GAAP)```", "```2.85b GAAP and 3.74b non-GAAP``` OR ```$2,846 million (GAAP) and $3,735 million (non-GAAP)```", "```390 million``` OR ```$390 million```", "```395 million``` OR ```$395 million```", "```45070``` OR ```May 24, 2023```", "```joint initiative between Dell and NVIDA to make it easy for businesses to build and use Generative AI models on-premises.``` OR ```Project Helix is a joint initiative between Dell Technologies (NYSE: DELL) and NVIDIA (NASDAQ: NVDA) to make it easier for businesses to build and use generative AI models on premises to quickly and securely deliver better customer service, market intelligence, enterprise search, and a range of other capabilities.\n \n Project Helix delivers a series of full-stack solutions with technical expertise and pre-built tools based on Dell and NVIDIA infrastructure and software. It includes a complete blueprint to help enterprises use their proprietary data and more easily deploy generative AI responsibly and accurately. ```", "```yes, NVIDIA announced on 01/23/23 that it is beinging RTX 4080 to GeForce NOW``` OR ```yes, RTX 4080```", "```GH200 is the next-generation Grace Hopper Superchip by NVIDIA for the era of accelarated computing and generative AI``` OR ```next-generation NVIDIA GH200 Grace Hopper\u2122 platform \u2014 based on a new Grace Hopper Superchip with the world\u2019s first HBM3e processor \u2014 built for the era of accelerated computing and generative AI.```", "```Cards with RTX 4090 and 4080 GPUs will be avilable from from top add-in card providers such as ASUS, Colorful, Gainward, Galaxy, GIGABYTE, Inno3D, MSI, Palit, PNY and Zotac``` OR ```The GeForce RTX 4090 and 4080 GPUs will be available as custom boards, including stock-clocked and factory-overclocked models, from top add-in card providers such as ASUS, Colorful, Gainward, Galaxy, GIGABYTE, Inno3D, MSI, Palit, PNY and Zotac. The RTX 4090 and RTX 4080 (16GB) are also produced directly by NVIDIA in limited Founders Editions for fans wanting the NVIDIA in-house design. ```", "```NVIDIA's GAAP gross margins in FY 23 were 56.9% versus 64.9% in FY22\n \n NVIDIA's non-GAAP gross margins in FY 23 were 59.2% versus 66.8% in FY22``` OR ```Down 8.0 points (GAAP) and down 7.6 points (non-GAAP) in FY23 vs. FY22\n \n NVIDIA's GAAP gross margins in FY 23 were 56.9% versus 64.9% in FY22\n \n NVIDIA's non-GAAP gross margins in FY 23 were 59.2% versus 66.8% in FY22\"```", "```NVIDIA's non-GAAP gross margins in FY 23 were 59.2% versus 66.8% in FY22``` OR ```Down 7.6 points in FY23 vs. FY22, NVIDIA's non-GAAP gross margins in FY 23 were 59.2% versus 66.8% in FY22```", "```NVIDIA's GAAP gross margins in FY 23 were 56.9% versus 64.9% in FY22``` OR ```Down 8.0 points in FY23 vs. FY22, NVIDIA's GAAP gross margins in FY 23 were 56.9% versus 64.9% in FY22```", "```$20b plus or minus 2%``` OR ```expected to be $20.00 billion, plus or minus 2%```", "```3.17b GAAP and 2.2 b non-GAAP``` OR ```approximately $3.17 billion (GAAP) and $2.20 billion (non-GAAP)```", "```3.17b ``` OR ```$3.17 billion```", "```2.2 b``` OR ```$2.20 billion```", "```$20b plus or minus 2%``` OR ```expected to be $20.00 billion, plus or minus 2%```", "```3.17b GAAP and 2.2 b non-GAAP``` OR ```approximately $3.17 billion (GAAP) and $2.20 billion (non-GAAP)```", "```3.17b ``` OR ```$3.17 billion```", "```2.2 b``` OR ```$2.20 billion```", "```0.745``` OR ```0.745```", "```0.755``` OR ```0.755```", "```0.745``` OR ```0.745```", "```0.755``` OR ```0.755```", "```0.745``` OR ```0.745```", "```0.755``` OR ```0.755```", "```0.745``` OR ```0.745```", "```0.755``` OR ```0.755```", "```10.4b``` OR ```$10,417 million or $10.4B```", "```Gross margins were up 3.8 pts to 75% in Q3 of FY 24``` OR ```Gross margins were up 3.8 pts to 75% in Q3 of FY 24```", "```Gross margins actually expanded and were up 3.8 pts to 75% in Q3 of FY 24``` OR ```Gross margins expanded and were up 3.8 pts to 75% in Q3 of FY 24 (non-GAAP)```", "```Gross margins were up 3.8 pts to 75% in Q3 of FY 24``` OR ```Gross margins expanded and were up 3.8 pts to 75% in Q3 of FY 24 (non-GAAP)```", "```Gross margins actually expanded and were up 3.8 pts to 75% in Q3 of FY 24``` OR ```Gross margins expanded and were up 3.8 pts to 75% in Q3 of FY 24```", "```$15.01b``` OR ```$15.01 billion```", "```12.46b``` OR ```$12.46 billion```", "```10.61b``` OR ```$10.61 billion```", "```2.11 b``` OR ``` $2.11 billion```", "```9.07 b``` OR ```$9.07 billion```", "```$10.61 billion``` OR ```$10.61 billion```", "```1.54b``` OR ``` $1.54 billion```", "```7.76b``` OR ```$7.76 billion```", "```6.7b``` OR ```$6.70 billion```", "```1.05b``` OR ```$1.05 billion```", "```536 million``` OR ```$536 million```", "```7.76b``` OR ```$7.76 billion```", "```6.7b``` OR ```$6.70 billion```", "```1.05b``` OR ```$1.05 billion```", "```536 million``` OR ```$536 million```", "```Yes, it increased to 2.11b versus 1.05b from 2021``` OR ```yes, Fiscal-year revenue rose 100 percent to a record $2.11 billion```", "```Yes, it increased 61% to 12.46b``` OR ```yes, Fiscal-year revenue rose 61 percent to a record $12.46 billion```", "```Yes, it increased 58% to 10.61b``` OR ```yes, Fiscal-year revenue rose 58 percent to a record $10.61 billion```", "```Yes, it increased 6% to 566 million``` OR ```yes, Fiscal-year revenue rose 6 percent to $566 million```", "```$2.86 billion``` OR ```$2.86 billion```", "```Generative AI is driving exponential growth in\n compute requirements and a fast transition to NVIDIA accelerated computing.\n \n CSPs around the world are racing to deploy our flagship Hopper and Ampere architecture GPUs to meet the\n surge in interest from both enterprise and consumer AI applications for training and inference.\n \n consumer internet companies are also at the forefront of adopting generative AI and deep-learning-\n \n enterprise demand for AI and accelerated computing is strong. We are seeing momentum in verticals such\n as Automotive, Financial Service, Health Care and Telcom where AI and accelerated computing with quickly\n becoming integral to customers innovation roadmaps and competitive positioning.``` OR ``````", "```Gaming revenue of $2.24 billion was up 22% sequentially and down 38% year-on-\n year, strong sequential growth was driven by sales of the 40 Series GeForce RTX GPUs for both notebooks and\n \n desktops. Overall, end demand was solid and consistent with seasonality, demonstrating resilience against a\n challenging consumer spending backdrop.``` OR ``````", "```strong sequential growth was driven by sales of the 40 Series GeForce RTX GPUs for both notebooks and\n \n desktops. Overall, end demand was solid and consistent with seasonality, demonstrating resilience against a\n challenging consumer spending backdrop.``` OR ``````", "```Record revenue of $4.28 billion was up 18% sequentially and up 14% year-on-year on\n strong growth of our accelerated computing platform worldwide. Generative AI is driving exponential growth in\n compute requirements and a fast transition to NVIDIA accelerated computing, which is the most versatile, most\n energy-efficient and the lowest TCO approach to train and deploy AI.``` OR ``````", "```We returned $99 million to shareholders in the form of cash dividends.``` OR ``````", "```InfiniBand and Ethernet are both networking technologies, but they have different features and use cases. InfiniBand is a high-performance computing interconnect technology designed for high-bandwidth and low-latency applications, such as high-performance clusters, supercomputers, and data centers. It provides features like remote direct memory access (RDMA), which allows data to be transferred directly between the memories of two nodes without involving the CPU, resulting in high efficiency.\n \n Ethernet, on the other hand, is a more general-purpose networking technology used for local area networks (LANs), wide area networks (WANs), and the Internet. It is widely adopted due to its simplicity, low cost, and versatility. Ethernet supports various speeds, from 10 Mbps to 400 Gbps, and is commonly used for connecting devices like computers, servers, switches, and routers.\n \n In summary, InfiniBand is optimized for high-performance computing and data-intensive applications, while Ethernet is a more versatile technology for general-purpose networking.``` OR ``````", "```You're never done with training. Every time you deploy, you're collecting new data.\n When you collect new data, you train with the new data, and so you're never done training. You're never done\n producing and processing a vector database that augments the large language model. You're never done with\n vectorizing all of the collected unstructured data that you have and so whether you're building a recommender\n system, a large language model, a vector database, these are probably the three major applications, the three\n core engines, if you will, of the future of computing.``` OR ``````", "```The year-on-year decline reflects the impact\n of channel inventory correction which is largely behind us in q4 of fy23.``` OR ``````", "```The year-on-year decline reflects the impact\n of channel inventory correction which is largely behind us in q4 of fy23.``` OR ``````", "```In q4 of fy23, Gaming revenue of $1.83 billion was up 16% sequentially and down 46% from a year ago. Fiscal\n year revenue of $9.07 billion was down 27%. Sequential growth was driven by the strong reception of our 40\n series GeForce RTX GPUs based on the Ada Lovelace architecture. The year-on-year decline reflects the impact\n of channel inventory correction which is largely behind us. And demand in the seasonally strong fourth quarter\n was solid in most regions. While China was somewhat impacted by disruption related to COVID, we are\n encouraged by the early signs of recovery in that market.``` OR ``````", "```Jensen Huang``` OR ``````", "```Jensen huang``` OR ``````", "```Collette Kress``` OR ``````", "```Collette Kress``` OR ``````", "```Collette Kress``` OR ``````", "```Collette Kress``` OR ``````", "```Collette Kress``` OR ``````", "```Deborah Shoquist``` OR ``````", "```Deborah Shoquist``` OR ``````", "```Collette Kress``` OR ``````", "```Deborah Shoquist``` OR ``````", "```Deborah Shoquist``` OR ``````", "```Deborah Shoquist``` OR ``````", "```NVIDIA's data center business is expected to grow in 2024 due to several reasons. The increasing demand for AI and high-performance computing (HPC) workloads is driving the need for powerful and efficient data center solutions. NVIDIA's GPU-accelerated platforms are well-positioned to address these demands, as they offer superior performance and energy efficiency compared to traditional CPUs.\n \n Moreover, the growing adoption of cloud computing and the proliferation of edge computing are also contributing to the growth of the data center market. NVIDIA's partnerships with major cloud service providers, such as Amazon Web Services (AWS), Microsoft Azure, and Google Cloud, enable the company to tap into the growing demand for cloud-based AI and HPC services.\n \n Furthermore, the increasing adoption of NVIDIA's software platforms, such as the NVIDIA CUDA toolkit, TensorRT, and NGC containers, is also expected to drive the growth of the data center business. These software platforms enable developers and data scientists to build, optimize, and deploy AI and HPC applications more efficiently, thereby increasing the demand for NVIDIA's data center solutions.\n \n In summary, the growing demand for AI and HPC workloads, the proliferation of cloud and edge computing, and the increasing adoption of NVIDIA's software platforms are the primary factors driving the growth of NVIDIA's data center business in 2024.``` OR ``````", "```NVIDIA has not announced the results for the last quarter, Q4 for FY24. The revenue for Q3 of FY24 is $18.12 billion.``` OR ``````", "```Looking at the last completed quarter, Q3 of FY24, the revenue forecast for Q4 is 20 billion``` OR ``````", "```CFO of NVIDIA``` OR ``````", "```CFO of NVIDIA``` OR ``````", "```CFO of NVIDIA``` OR ``````", "```CFO of NVIDIA``` OR ``````", "```CFO of NVIDIA``` OR ``````", "```CFO of NVIDIA``` OR ``````", "```In the second quarter of fiscal year 2021, NVIDIA reported record revenue of $3.87 billion, up 50% from the same period last year and 26% from the previous quarter. The company's non-GAAP net income was $1.37 billion, representing a 79% year-over-year increase. NVIDIA's gross margin was 66.0%, up 590 basis points from the second quarter of the previous fiscal year``` OR ``````", "```Retrieval-augmented generation is a method that combines the use of generative models with retrieved information from a specific domain or dataset to generate more accurate and contextually relevant responses. In this approach, the model first retrieves relevant documents or data based on the input query, and then uses this information to guide the generation process. This can help to ensure that the generated output is not only coherent and fluent, but also factually correct and informed by the latest available data.``` OR ``````", "```Retrieval-augmented generation is a method that combines the use of generative models with retrieved information from a specific domain or dataset to generate more accurate and contextually relevant responses. In this approach, the model first retrieves relevant documents or data based on the input query, and then uses this information to guide the generation process. This can help to ensure that the generated output is not only coherent and fluent, but also factually correct and informed by the latest available data.``` OR ``````", "```Retrieval-augmented generation is a method that combines the use of generative models with retrieved information from a specific domain or dataset to generate more accurate and contextually relevant responses. In this approach, the model first retrieves relevant documents or data based on the input query, and then uses this information to guide the generation process. This can help to ensure that the generated output is not only coherent and fluent, but also factually correct and informed by the latest available data.``` OR ``````", "```Collette Kress``` OR ``````", "```Deborah Shoquist``` OR ``````", "```Jay Puri``` OR ``````", "```Collette Kress``` OR ``````", "```Deborah Shoquist``` OR ``````", "```Jay Puri``` OR ``````", "```Generative AI is implemented in the medical field in several ways, including:\n \n Training AI models on clinical data: Large language models (LLMs) like GatorTronGPT are trained on de-identified clinical notes and various English texts to generate synthetic clinical text that focuses on clinical factors and reads like real clinical notes.\n Drug discovery: Generative AI is used in drug discovery factories to generate, predict, and model complex biological relationships, shortening the time to discover and improving the quality of clinically viable drug candidates.\n Surgical assistants: Generative AI is used to create surgical assistants that combine instruments, imaging, robotics, and real-time patient data with AI, leading to better surgeon training, more personalization during surgery, and better safety with real-time feedback and guidance.``` OR ``````", "Certainly! I would recommend either the Cotton Touch Polo Men's or the Nike 2.0 Polo Men's. \n\nThe Nike 2.0 Polo Men's option is slightly more expensive but comes with the trusted quality of Nike and Dri-FIT technology, which could be a plus if you're looking for comfort and a brand name. The design is sporty yet can be formal enough for casual business environments. \n\nThe Cotton Touch Polo Men's is more affordable and offers a blend of polyester and spandex, which gives it a comfortable, slightly stretchy feel. The moisture management and odor-controlling technology are practical features, especially for long days or if the meeting involves physical activity or travel. If you prioritize brand recognition and the benefits of Dri-FIT technology, the NIKE 2.0 POLO MEN'S might be the better choice for you, especially for warmer climates or if you tend to sweat during presentations or meetings. It's slightly more formal with its design and the Nike branding adds a touch of professionalism in environments where that's appreciated.\n\nHowever, if you're looking for value and comfort with a cotton-like feel, the COTTON TOUCH POLO MEN'S is a great option. It's more affordable and still offers features that are conducive to a professional setting, such as moisture management and odor control.\n\nBoth shirts are suitable for a business casual environment, but the final choice would depend on your specific needs, the expected dress code of the meeting, and whether brand and fabric technology are important factors for you.", "Great! I'd be happy to help you find some camping gear. \uf3d5\ufe0f\n\nTo make sure I can give you the best recommendations, could you tell me a bit more about what you're looking for? Here are a few questions to get us started:\n\nWhat type of camping will you be doing? (e.g. backpacking, car camping, RV camping)\nHow many people will be camping?\nDo you have any specific products in mind, or are you looking for general recommendations?\nDo you have a budget range you'd like to stay within?\nOnce I have this information, I can help you find the perfect camping gear for your needs. \uf60a", "Sure, I'd be happy to help you find some camping gear! Based on the products you've provided, I can recommend the Timbuk2 Laptop Sleeve for keeping your electronics safe and organized while camping. It comes in two sizes, one that fits up to most 13\" laptops and one that fits up to most 16\" laptops, and is made of 100% recycled nylon from pre-consumer material with extra padding inside to protect all your contents.\n\nIf you're looking for something to keep your food and drinks cool, the Igloo Coast Cooler is a great option. It has a 36 can capacity, dual zippered opening to the main compartment, dual side pockets for water bottles, and a deep, gusseted front zippered pocket for additional storage. It also features MaxCold\u00ae insulation with 25% more foam to keep drinks and food cooler longer, and a PEVA heat-sealed lining that is PVC and Phthalate free.\n\nBoth of these products are highly rated and would be a great addition to any camping trip. Let me know if you have any other questions or if there's anything else I can help you with.", "Absolutely! I'd be happy to tell you about some of our women's workout gear.\n\nFirst, we have the Women's Beyond Yoga Spacedye Racerback Cropped Tank in Darkest Night. This tank is made from performance fabric that offers UPF 50+ protection, a built-in bra with medium support, and soft straps that won't dig in. The racerback design adds a touch of athleticism, while the cropped length and reflective NVIDIA logo on the back make it a stylish choice for any workout. You can find it here for $60, and it has a rating of 4.37.\n\nWe also carry the Women's Beyond Yoga In-Stride Pullover in Black. This ultra-light, breezy pullover is made from our new airy performance fabric and features a front kangaroo pocket and elastic waist for a perfect fit. The reflective NVIDIA logo on the back of the collar adds a subtle touch of style. The pullover is available here for $128 and has a rating of 4.48.\n\nBoth of these items are designed to provide comfort and style during any workout, and they feature reflective NVIDIA logos to help you stay visible and safe. Let me know if you have any questions about these products or if there's anything else I can help you with!", "Sure thing! I'd be happy to help you find the perfect gift for your clients. \uf381\n\nTo get started, could you tell me a bit more about your clients? For example, what are their interests or hobbies? Do they have any favorite brands or products? And what is your budget for the gift? \uf4b8\n\nThis information will help me narrow down the options and suggest some gifts that your clients are sure to love. \uf495", "If your clients enjoy golfing, I would highly recommend the TITLEIST\u00ae PRO V1\u00ae HALF DOZEN GOLF BALLS and the CLUBMAN SUNGLASSES.\n\n1. TITLEIST\u00ae PRO V1\u00ae HALF DOZEN GOLF BALLS\n\nPros: These are premium golf balls known for their exceptional performance, combining a soft feel with precise spin control. Their high rating of 4.67 underscores their quality and customer satisfaction. Assembled in the USA, they resonate well with those who value American craftsmanship.\nCons: Priced at $45 for six, they are on the higher end, but for a good reason given their elite status among golfers.\nIdeal For: Making a high-end impression, showing deep appreciation for your clients' golfing passion.\n\n2. CLUBMAN SUNGLASSES\n\nPros: These sunglasses offer both style and functionality, featuring UV400 protection and a unique vintage design customized for NVIDIA. At a price of $12, they represent an affordable yet thoughtful gift option.\nCons: The lower price might not convey the same level of prestige as more expensive gifts. The specific style and finish may not suit everyone's taste.\nIdeal For: A budget-friendly, yet thoughtful gift that combines practicality with a personal touch.\nRecommendation:\n\nIf your goal is to impress with a premium choice that underscores quality and a shared enthusiasm for golf, the Titleist Pro V1 golf balls are the way to go. They're not just a gift but a statement of excellence and appreciation for the finer aspects of the game.\n\nFor a more accessible option that still offers a thoughtful nod to your clients' interests, the Clubman Sunglasses are a fantastic pick. They're practical for golfers and come with a unique design that sets them apart.\n\nIn essence, your choice should align with the message you wish to convey and the level of appreciation you want to express. Whether it's the unparalleled quality of the Pro V1 golf balls or the unique style and utility of the Clubman Sunglasses, both gifts are sure to be appreciated by any golf enthusiast.", "Sure, I'd be happy to help you find a coffee mug that fits your preferences! Based on your interest in cats, I would recommend the \"14 OZ. VISUAL PURR-CEPTION MUG\" which is inspired by NVIDIA Engineer Robert Bond and features a cute cat design. This mug has a 14 oz. capacity, a deep learning theme, and is microwave safe. It's priced at $12.00 and has a rating of 4.58 out of 5.\n\nHere are the details for the mug:\n\n3-5/8\" H x 3-5/8 (5 w/handle)\"\nHand wash recommended\nMicrowave safe\nCannot be shipped to APAC\nURL: https://gear.nvidia.com/14-oz-Visual-Purr-Ception-Mug-P614.aspx\nPrice: $12.00\nRating: 4.58\nI hope this helps, and let me know if you have any other questions or if there's anything else I can help you with!", "Hello! I'm glad you reached out to me for gift ideas. \uf381 To help you find the perfect gift for your nephew, could you please tell me a bit more about him? Here are a few questions that might help:\n\nHow old is your nephew?\nDoes he have any hobbies or interests that he's particularly passionate about? (e.g. sports, video games, science, art, etc.)\nIs he into any specific characters or franchises, like superheroes, dinosaurs, or cartoons?\nDo you have a budget in mind for the gift?\nOnce I have this information, I can help you find a fun and exciting gift that your nephew is sure to love! \uf60a", "Sure, I'd be happy to help! I would recommend the S'WELL 16OZ PET BOWL. This bowl is made by S'well, a well-known brand that specializes in durable and stylish hydration products. The bowl has a capacity of 16 ounces, which should be sufficient for most dogs. It is made from BPA/BPS-free and reusable materials, and it is dishwasher safe for easy cleaning. The bowl also has a non-slip bottom and wide stance for improved stability, which is especially important for active dogs. Overall, the S'WELL 16OZ PET BOWL is a great choice for your nephew's dog. You can find more information and purchase the bowl from the NVIDIA Gear store at the following URL: https://gear.nvidia.com/Swell-16oz-Pet-Bowl-P724.aspx The price is $35.00 and it has a rating of 4.56 out of 5.", "Certainly! I would recommend the \"I AM AI TEE MEN'S\" as a great men's t-shirt option that is available in APAC. This tee is made of 100% cotton jersey, making it soft and comfortable to wear. It features a fine rib trim at the neck and has a straight fit that hits at the hip. The \"I AM AI\" design on the front of the tee is a great way to express your love for AI. The tee is machine washable and imported. It is available for purchase at https://gear.nvidia.com/I-Am-AI-Tee-Mens--P360.aspx for just $16.00 and has a rating of 4.5 out of 5 stars.", "I'm happy to help you compare the Heroes of NVIDIA 3.0 Unisex Tee and the NVIDIA Duo-Tone Logo Unisex Tee.\n\nThe Heroes of NVIDIA 3.0 Unisex Tee is made of 100% cotton jersey and features a fine rib trim at the neck. It has a straight fit that hits at the hip and is machine washable. The tee is imported and priced at $20.00 with a rating of 4.53.\n\nOn the other hand, the NVIDIA Duo-Tone Logo Unisex Tee is made of 4.2 oz., 100% airlume combed and ringspun cotton. It features shoulder taping, sideseamed construction, and a tear-away label. The tee has a retail fit with unisex sizing and is pre-shrunk. It is priced at $18.00 with a rating of 4.51.\n\nIn summary, the main differences between the two tees are the material, fit, and design. The Heroes of NVIDIA 3.0 Unisex Tee is made of 100% cotton jersey with a straight fit, while the NVIDIA Duo-Tone Logo Unisex Tee is made of airlume combed and ringspun cotton with a retail fit. The Heroes of NVIDIA 3.0 Unisex Tee features a fine rib trim at the neck, while the NVIDIA Duo-Tone Logo Unisex Tee has shoulder taping and sideseamed construction. The Heroes of NVIDIA 3.0 Unisex Tee is priced at $20.00, while the NVIDIA Duo-Tone Logo Unisex Tee is priced at $18.00.", "The NVIDIA SHIELD TV and NVIDIA SHIELD TV Pro are both powerful streaming media players, but there are some key differences between the two.\n\nThe NVIDIA SHIELD TV Pro (https://gear.nvidia.com/NVIDIA-SHIELD-TV-PRO-2019-bNAb-P522.aspx) is a more advanced model, with additional features and capabilities. It has more storage space than the standard SHIELD TV, with 16GB compared to 8GB. It also has two USB 3.0 ports for expandability, which can be used for storage expansion, USB cameras, USB keyboards and controllers, TV tuners, and more. The SHIELD TV Pro also comes with Plex Media Server, which allows you to easily manage and stream your personal media collection. Additionally, it is SmartThings hub-ready, so you can easily connect and control a wide range of smart home devices. The SHIELD TV Pro is also capable of AAA Android gaming, Twitch broadcasting, and has 3GB of RAM.\n\nThe NVIDIA SHIELD TV (https://gear.nvidia.com/NVIDIA-SHIELD-TV-2019-bNAb-P524.aspx) is a more compact and stealthy model, designed to disappear behind your entertainment center. It has the same powerful NVIDIA Tegra X1+ processor as the SHIELD TV Pro, but with less storage space and without the additional features such as USB ports, Plex Media Server, SmartThings hub-ready, AAA Android gaming, Twitch broadcasting, and 3GB of RAM.\n\nIn summary, the main differences between the NVIDIA SHIELD TV and NVIDIA SHIELD TV Pro are the storage space, expandability, Plex Media Server, SmartThings hub-ready, AAA Android gaming, Twitch broadcasting, and RAM. The SHIELD TV Pro is more advanced and feature-rich, while the standard SHIELD TV is more compact and affordable.", "The NVIDIA Jetson Nano Developer Kit and the NVIDIA Jetson Orin Nano Developer Kit are two different developer kits that are part of the NVIDIA Jetson family of products.\n\nThe Jetson Nano Developer Kit is a powerful and easy-to-use platform for running modern AI models, and it's available for just $149. It features a 128-core NVIDIA Maxwell GPU, a quad-core ARM Cortex-A57 CPU, and 4GB of LPDDR4 memory. The Jetson Nano Developer Kit is capable of running multiple neural networks in parallel for applications like image classification, object detection, segmentation, and speech processing.\n\nThe Jetson Orin Nano Developer Kit is a more powerful version of the Jetson Nano Developer Kit, and it features a 2048-core NVIDIA Ampere GPU, a six-core ARM Cortex-A78AE CPU, and 8GB of LPDDR5 memory. The Jetson Orin Nano Developer Kit is capable of running more complex AI models and is suitable for more demanding applications.\n\nI hope this helps to clarify the difference between the Jetson Nano Developer Kit and the Jetson Orin Nano Developer Kit. Let me know if you have any other questions.", "The NSF's LIFE initiative focuses on understanding adaptive traits evolved in response to various pressures, encouraging cross-disciplinary collaboration, and studying diverse organisms to address environmental challenges and sustainability.", "Biocomputing is defined as using biological 'intelligent systems', including the capture of real-world input, autonomous processing in an engineered biological construct, and generating an output that drives an engineered system.", "The report focuses on detailing the federal obligations for science and engineering to universities, colleges, and nonprofit institutions, including funding trends, activity types, and agency contributions over the years.", "The document discusses the reclassification of FFRDCs from extramural performers to intramural performers of R&D, reflecting a change in their role in federal R&D activities.", "The report highlights a 10% increase in federal science and engineering support to higher education in FY 2021, with details on the types of support and the leading funding agencies.", "The U.S. R&D expenditure increased by $72 billion in 2021, reaching $789 billion, with an estimated further increase to $886 billion in 2022.", "It provides detailed statistics on R&D performance and funding in the U.S., including expenditures by sector, source of funds, and state-level data.", "Federal science and engineering support to higher education increased by 10% in FY 2021, and U.S. R&D expenditure increased by $72 billion in 2021, with an estimated further increase to $886 billion in 2022.", "The NSF's LIFE initiative encourages cross-disciplinary collaboration in understanding adaptive traits evolved in response to various pressures, and the EFRI BEGIN OI program defines biocomputing using biological 'intelligent systems' for interdisciplinary applications.", "FFRDCs have been reclassified from extramural to intramural performers of R&D, and there's an increase in federal science and engineering support to higher education institutions.", "In 2021, U.S. R&D expenditures increased significantly, with further increases projected for 2022, and the federal government continues to increase its support to higher education institutions for science and engineering.", "The NSF focuses on evolutionary innovations and biocomputing, as seen in the LIFE and BEGIN OI programs, and it tracks and reports on national R&D trends and federal support to educational institutions.", "The data shows a general increasing trend in federal obligations for science and engineering to universities and colleges over this period.", "There has been a notable increase in federal obligations for science and engineering research and development, reflecting a growing emphasis on these areas.", "The tables illustrate the distribution of federal science and engineering support across different states and outlying areas, highlighting regional variations in funding.", "The data tables indicate the leading federal agencies contributing to science and engineering obligations, such as the Department of Defense and the National Institutes of Health.", "The tables show an evolution in the types of activities funded, with an increasing focus on research and development activities over time.", "In FY 2021, federal obligations for R&D totaled over $190 billion, with FFRDCs being reclassified as intramural performers, indicating a significant role in federal R&D activities.", "There has been a steady increase in R&D expenditures at FFRDCs, predominantly funded by federal sources, showing a growing reliance on federal funding over the years.", "The federal science and engineering support to higher education institutions showed a 10% increase in FY 2021, indicating a growing emphasis on these sectors.", "The U.S. R&D expenditure showed a substantial increase in 2021 and is projected to further increase in 2022, reflecting a significant growth in R&D investment.", "The inclusion of FFRDCs in federal intramural R&D obligations significantly raises the overall level, highlighting the impact of their reclassification on federal R&D statistics.", "The national patterns in 2021-22 show an increase in R&D expenditures across various sectors, with detailed statistics on the levels and key trends of R&D performance and funding.", "SteerLM is a novel approach developed by the NVIDIA NeMo Team, introduced as part of NVIDIA NeMo Alignment methods. It simplifies the customization of large language models (LLMs) and empowers users with dynamic control over model outputs by specifying desired attributes. \n\nSteerLM provides a novel technique for realizing a new generation of AI systems aligned with human preferences in a controllable manner. Its conceptual simplicity, performance gains, and customizability highlight the transformative possibilities of user-steerable AI. To learn more, please check out our paper SteerLM: Attribute Conditioned SFT as an (User-Steerable) Alternative to RLHF.", "Reinforcement Learning from Human Feedback (RLHF) and SteerLM are two methods aimed at aligning language models to human preferences. RLHF trains language models by providing positive or negative feedback on generated responses, reinforcing good behaviors. Specifically, the model is encouraged to generate more text similar to responses that receive positive feedback, and less like those with negative feedback. SteerLM takes a different approach to model alignment. Rather than solely reinforcing \u201cgood\u201d behaviors, it categorizes the space of possible model responses using steering labels. At inference time, the model generates based on these categorical labels that steer its output. So while RLHF uses direct feedback on model generations, SteerLM aligns by mapping responses into labeled categories associated with human preferences. The two methods tackle model alignment from different angles - RLHF by directly reinforcing desired model behaviors, and SteerLM by steering generation based on categorical labels. Both aim to produce language model outputs better aligned with human values and preferences.", "Training a SteerLM model includes the following 4 steps:\n\n1. Data download and preprocessing\n\n2. Training the attribute prediction model (aka regression reward model)\n\n3. Training the attribute-conditioned SFT\n\n4. Inference on the SteerLM model with different attribute values", "All algorithms in NeMo Aligner will work with any GPT based model that is from mcore (i.e in the config it has mcore_gpt=True). Example include the 2B GPT and LLama2 7B models.", "Nemo Aligner supports 4 main techniques:\n1. Model Alignment by Supervised Fine-Tuning (SFT)\n2. Model Alignment by RLHF\n3. Model Alignment by SteerLM Method\n4. Model Alignment by Direct Preference Optimisation (DPO)", "When it comes to ideal hyperparameters for DPO training, much will depend on the characteristics of your SFT (or base/foundation) model, so there are no one-size-fits-all parameters which will work in all cases. However, the following the following is a brief overview of which hyperparameters we have perturbed for various model sizes and their effects:\n\n- global_batch_size: generally, we have found that, all other parameters held equal, lower GBS performs worse. GBS of 256 or 512 seems to be the sweet spot for most models we trained\n\n- epochs: highly sensitive to training data size. We recommend you start with 1 epoch and then add on from there. We did not see any improvements beyond 3 epochs.\n\n- learning rate: we tested cosine annealing with a warmup of 10 steps, followed by a slow decay to a constant rate. That constant rate should be fairly low, we saw best performance with 9e-7 and 5-e7\n\n- ref_policy_kl_penalty: we generally saw better performance with lower values of 0.1, 0.2, 0.5, and 1.0. Occassionally values as high as 5.0 worked too.", "Yes, Nemo Aligner, and Nemo Framework by and large, support WandB reporting. Usually, you can enable WandB by adding the following parameter into the training script parameters:\n```\n exp_manager.create_wandb_logger=false \\\n exp_manager.wandb_logger_kwargs.project=dpo_training \\\n exp_manager.wandb_logger_kwargs.name=dpo_training \\\n```\nFor example, for DPO training, the training command looks as follows:\n```\nexport GPFS=\"/path/to/nemo-aligner-repo\"\nexport TRAIN_DATA_PATH=\"/path/to/train_dpo_format.jsonl\"\nexport VALID_DATA_PATH=\"/path/to/valid_dpo_format.jsonl\"\n\npython -u ${GPFS}/examples/nlp/gpt/train_gpt_dpo.py \\\n trainer.num_nodes=1 \\\n trainer.devices=8 \\\n ++model.micro_batch_size=1 \\\n ++model.global_batch_size=512 \\\n pretrained_checkpoint.restore_from_path=/path/to/megatron_gpt_sft.nemo \\\n \"model.data.data_prefix={train: [${TRAIN_DATA_PATH}], validation: [${VALID_DATA_PATH}], test: [${VALID_DATA_PATH}]}\" \\\n exp_manager.create_wandb_logger=false \\\n exp_manager.wandb_logger_kwargs.project=dpo_training \\\n exp_manager.wandb_logger_kwargs.name=dpo_training \\\n exp_manager.explicit_log_dir=/results \\\n ++trainer.dpo.max_epochs=1 \\\n ++model.dpo.ref_policy_kl_penalty=0.1\n```\n", "Supervised Fine-Tuning (SFT) is the process of fine-tuning a model\u2019s parameters on supervised data of inputs and outputs. It teaches the model how to follow user specified instructions. It is typically done after model pre-training. It is also an important prerequisite step in Reinforcement Learning from Human Feedback (RLHF) and Direct Preference Optimization (DPO).", "Mcore models use Transformer engine as a backend, and it tries to find efficient kernels. But depending on the GPU you have it may not find them. If you ever face errors that relate to kernel finding set these variables on top of your script.\n\nexport NVTE_MASKED_SOFTMAX_FUSION=0\nexport NVTE_FLASH_ATTN=0\nexport NVTE_FUSED_ATTN=0", "The RLHF process is implemented in 3 phases:\n- Phase 1: RLHF is usually started by a Supervised Fine-Tuning (SFT) phase. Follow the Prerequisite guide and the SFT guide to train the SFT model which you can use for Phase 2 and 3.\n- Phase 2: Reward Model Training. The reward model is used to score how good a response is. It is trained using a pairwise comparison loss and therefore requires a dataset of response pairs, where one response in the pair is ranked higher than the other. A good reward model is cruical for the success of the PPO training. The Reward model is often initiated from the SFT model.\n- Phase 3: PPO Training. After you have fine-tuned a model using Supervised Fine-Tuning (SFT), and trained a reward model, you can start doing RLHF with the PPO algorithm.", "During PPO training, we conceptually have 4 models interacting with each other:\n- The PPO Actor Network (also known as the Policy Network)\n- The Reward Model (RM) Network (also known as a Preference Model (PM))\n- The PPO Critic Network (also known as the Value Network)\n- The Initial Policy Network (also known as the Reference Model)\nIn the most optimized configuration, Aligner will run the actor and initial policy within the same job and the critic and reward model within the same job. To optimize memory usage, it will then use cpu offloading to load back the corresponding model when needed.", "Some major advantages of NVIDIA Nemo framework for training LLMs are:\n- Scale: It can effectively train and scale language models to billions of parameters. \n- Diversity: Many model styles ares supported: you can train different variants of the GPT, BERT, and T5 style models. Notable recent models include LLama, Gemma, Baichuan2 and Falcon. Nemo also supports multimodal models.\n- Optimization: NeMo software stack is optimized for DGX SuperPOD configurations using NVIDIA InfiniBand technology to provide efficient on-premises compute for training and inferring complex workloads.\n- Performance: Two new techniques, sequence parallelism and selective activation recomputation, yield up to ~30% faster training time for GPT models ranging from 20B to 1T parameters.", "Sequence parallelism expands tensor-level model parallelism by noticing that the regions of a transformer layer that have not previously been parallelized are independent along the sequence dimension. By splitting these layers along the sequence dimension it can distribute the computing load, and most importantly the activation memory, for these regions across the tensor parallel devices.", "Nemo offers AutoConfigurator, a tool to search for the hyperparameters (HPs) that achieve the highest throughput for training and inference for Large Language Models (LLMs) using the NeMo framework. AutoConfigurator is intended to iterate over different model configurations quickly and find the best configuration, i.e. the one that costs the least in time and money.", "AutoConfigurator can recommend a model size for your use case. If you know the number of GPUs, TFLOPS per GPU, the maximum time to train, and number of tokens to train for, it can recommend a model size that can be trained with the specified hardware and time constraints.\nFor example, if you had 20 NVIDIA DGX nodes available (in 80 GB GPU memory), and wanted to train a GPT model for a maximum of 5 days, AutoConfigurator would recommend using a 5B parameter GPT model.", "$1,577.00", "$8.70", "No, the company is managing its CAPEX and Fixed Assets pretty efficiently, which is evident from below key metrics:\n CAPEX/Revenue Ratio: 5.1%\n Fixed assets/Total Assets: 20%\n Return on Assets= 12.4%", "Operating Margin for 3M in FY2022 has decreased by 1.7% primarily due to: \n -Decrease in gross Margin\n -mostly one-off charges including Combat Arms Earplugs litigation, impairment related to exiting PFAS manufacturing, costs related to exiting Russia and divestiture-related restructuring\n charges", "The consumer segment shrunk by 0.9% organically.", "No. The quick ratio for 3M was 0.96 by Jun'23 close, which needs a bit of an improvement to touch the 1x mark", "Following debt securities registered under 3M's name are listed to trade on the New York Stock Exchange:\n -1.500% Notes due 2026 (Trading Symbol: MMM26)\n -1.750% Notes due 2030 (Trading Symbol: MMM30)\n -1.500% Notes due 2031 (Trading Symbol: MMM31)", "Yes, not only they distribute the dividends on a routine basis, 3M has also been increasing the per share dividend for consecutive 65 years", "24.26", "1.90%", "0.66", "65.40%", "0.83", "No the operating margins of Adobe have recently declined from 36.8% in FY 2021 to 34.6% in FY2022. A drop by 2.2% in a year.", "Yes, the FCF conversion (using net income as the denominator) for Adobe has improved by ~13% from 143% in 2021 to 156% in 2022", "0", "AES has converted inventory 9.5 times in FY 2022.", "-0.02", "93.86", "30.80%", "$11,588.00", "$1,616.00", "Amcor Finance (USA), Inc. and Amcor Flexibles North America, Inc., entered into supplemental indentures relating to Guaranteed Senior Notes due 2026 and 2028. This involved the substitution of the Substitute Issuer (Amcor Flexibles North America) for the Former Issuer (Amcor Finance) and the assumption of covenants under the indentures. (In essence a novation agreement)", "The quick ratio has slightly improved from 0.67 times to 0.69 times between FY 2023 and FY 2022.(3.4% jump)", "Amcor completed these acquisitions during FY2023:\n -100% equity interest of a flexibles manufacturing company in the Czech Republic\n - 100% equity interest in a medical device packaging manufacturing site in\n Shanghai, China.\n -acquisition of a New Zealand-based leading manufacturer of state-of-the-art, automated protein\n packaging machines.", "Amcor is a global leader in packaging production for various use cases.", "No. For AMCOR there has been a slight decline in gross margins by 0.8%.", "87% of the total restructuring liability is related Employee liabilities.", "AMCOR's Adj. EBITDA was $2,018mn in FY 2023", "The Real Growth was flat in FY 2023 vs FY 2022.", "4.20%", "Yes. The quick ratio is 1.57, calculated as (cash and cash equivalents+Short term investments+Accounts receivable, net+receivables from related parties)/ (current liabilities).", "AMD sells server microprocessors (CPUs) and graphics processing units (GPUs), data processing units (DPUs), Field Programmable Gate Arrays (FPGAs), and Adaptive System-on-Chip (SoC) products for data centers; CPUs, accelerated processing units (APUs) that integrate CPUs and GPUs, and chipsets for desktop and notebook personal computers; discrete GPUs, and semi-custom SoC products and development services; and embedded CPUs, GPUs, APUs, FPGAs, and Adaptive SoC products.", "In 2022, AMD reported Higher sales of their EPYC server processors, higher semi-custom product sales, and the inclusion of Xilinx embedded product sales", "The decrease in AMD's operating income was primarily driven by amortization of intangible assets associated with the Xilinx acquisition", "In 2022, AMD brought in the most cashflow from Operations", "Data Center", "Yes, one customer accounted for 16% of consolidated net revenue", "There are none", "United States, EMEA, APAC, and LACC", "Performance is not measured through operating margin", "Performance is not measured through gross margin", "The effective tax rate for American Express has changed/dropped from 24.6% in FY 2021 to 21.6% in FY 2022.", "Customer deposits", "Yes", "$0.40", "$1,832.00", "Yes. American Water Works had postivie working capital of $ 124Mn by FY 2022.", "2.80%", "$5,409.00", "Yes, the margins have been consistent, there has been a minor decline of 1.1% in gross margins between FY2022 and FY2023.", "Best Buy closed two acquisitions, both these companies were already partially owned by Best Buy, but Best Buy acquired all outstanding shares of these two companies during FY 2022: (1) Current Health Ltd and (2) Two Peaks, LLC d/b/a Yardbird Furniture", "Best Buy generated the most cash flow from operating activities in FY 2023 ($1.8 bn)", "Yes, there was a decline of ~42% between FY2023 and Q2 of FY 2024.", "Yes, there is decline in number stores by 1.32% from 982 stores in Q2 FY 2023 to 969 by the end of Q2 FY2024.", "The entertainment segment experienced the highest growth of 9% during Q2 FY2024, primarily from gaming division.", "1.73", "101.50%", "$382.00", "$12,645.00", "Yes. Boeing has product and service categories that represent more than 20% of Boeing's revenue for FY2022. These categories are Commercial Airplanes which comprises 39% of total revenue, Defence which comprises 35% of total revenue and Services which comprises 26% of total revenue.", "Yes. Multiple lawsuits have been filed against Boeing resulting from a 2018 Lion Air crash and a 2019 Ethiopian Airlines crash.", "Yes. Boeing has an improving gross margin profile as of FY2022. Gross profit improved from $3,017 million in FY2021 to $3,502 million in FY2022. Gross margin % improved from 4.8% in FY2021 to 5.3% in FY2022.", "Boeing's primary customers as of FY2022 are a limited number of commercial airlines and the US government. The US government accounted for 40% of Boeing's total revenues in FY2022.", "Yes, Boeing's business is subject to cyclicality due to its exposure to the airline industry which is a cyclical industry.", "Boeing forecasts an increase in the production rates for the 737, 777X and 787 aircrafts in 2023.", "Effective tax rate in FY2022 was 0.62%, compared to -14.76% in FY2021.", "0.01", "39.70%", "0.8", "63.86", "10.30%", "The effective tax rate of Corning has changed from 20% in FY2021 to 23% in FY 2022.", "Yes. Corning had a positive working capital amount of $831 million by FY 2022 close. This answer considers only operating current assets and current liabilities that were clearly shown in the balance sheet.", "$59,268.00", "17.98", "Yes, CVS Health requires an extensive asset base to operate, which is evident from its ROA of only 1.82% in 2022 and 3.39% in 2021, though it should be noted that a significant portion of this asset base is goodwill, and CVS's fixed assets/total assets ratio is on the lower side of 5.6%.", "Yes, CVS Health has been involved in multiple ongoing legal battles. Some notable legal dispute areas for CVS are: (1) usual and customary pricing litigation: where it's claimed that CVS\u2019s retail pharmacies overcharged for prescription drugs; (2) PBM litigation and investigations: where it's claimed that that rebate agreements between the drug manufacturers and PBMs caused inflated prices for certain drug products; and (3) controlled substances litigation: legal matters around opioids for which CVS has agreed to pay up to $4.3 billion to claimants in remediation and $625 million to attorneys and fees", "Yes, CVS paid a $ 0.55 dividend per share every quarter in FY2022", "Yes. She was previous CEO of Ulta Beauty which means she had to manage a large retail company that has brick and mortar + online business. So yes she was a CEO in a similar company to Foot Locker before this.", "Yes, his name is Richard A. Johnson", "-3.7", "0.68", "$3,215.00", "0.54", "No, JnJ's FY2022 financials are not of a high growth company as sales grew by 1.3% in FY2022.", "For FY22, JnJ had changes in gross margin due to: One-time COVID-19 vaccine manufacturing exit related costs, Currency impacts in the Pharmaceutical segment, Commodity inflation in the MedTech and Consumer Health segments, partially offset by Supply chain benefits in the Consumer Health segment.", "JnJ sold its inventory 2.7 times in FY2022.", "No, rate of growth in adjusted EPS is expected to decelerate slightly from 3.6% in FY2022 to 3.5% in FY2023.", "US sales increased 3.0% vs international sales decline of 0.6%.", "The Consumer Health business segment will be treated as a discontinued operation from August 30, 2023 onward.", "JnJ will make a gain of approximately $20 billion from the separation of its Consumer Health business segment.", "JnJ realised $13.2 billion in cash proceeds from the separation of Kenvue.", "Yes, net earnings as a percent of sales increased from 20% in Q2 of FY2022 to 20.1% in Q2 of FY2023.", "Corporate. Its net revenue was -$473 million.", "They could receive $66.56 per share.", "Since JPM is a financial institution, gross margin is not a relevant metric.", "Corporate & Investment Bank. Its net income was $3725 million.", "Yes. It decreased.", "6.25", "1.33", "$5,818.00", "0.40%", "$303.00", "7.90%", "Yes. MGM maintained 0.01$ per share annual dividend through out FY 2022.", "Las Vegas resorts contributed ~90% of company level EBITDAR during FY2022.", "As adjusted EBIT is negative, coverage ratio is zero", "MGM China experienced the worst topline performance amongst the other regions presented. Its revenue declined 44% in FY2022 whereas the other regions presented increased their revenues.", "the biggest short term investment is in corporate bonds (almost 82% of the total investment)", "$32,780.00", "No. Microsoft decreased its debt by $2.5bn in FY 2023 vs FY 2022.", "5.40%", "$5,466.00", "55.10%", "$16,525.00", "3.46", "Among the three, cash flow from operations was the highest for Nike in FY2023.", "Yes. Paypal has a positive working capital of $ 1.6Bn as of FY2022 end.", "$4.60", "As of FY2022, Pepsico primarily operates in the following geographies: North America, Latin America, Europe, Africa, Middle East, South Asia, Asia Pacific, Australia, New Zealand and China.", "No, Pepsico is not involved in material legal battles.", "Pepsico's restructuring costs in FY2022 amounted to $411 million .", "$9,068.00", "16.50%", "The shareholder proposal for a congruency report by Pepsico on net-zero emissions policies was defeated.", "$400,000,000 increase.", "Total amount Pepsico may borrow under unsecured revolving credit agreements = $8,400,000,000.", "Pepsico experienced a strong start to FY2023.", "Pepsico raised full year guidance in respect of core constant currency EPS growth by 1 percentage point.", "Yes, change in PPNE was positive year over year", "Yes, the gain on completion of Consumer Healthcare JV Transaction", "Trillium, Array, and Therachon", "77.78", "Developed Rest of the World", "Yes, it's spinning off Upjohn.", "There are none", "Ulta Beauty did not make any acquisitions in FY2023 and FY2022.", "Lower marketing expenses and leverage of incentive compensation due to higher sales. The answer here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although the company refers to this period as its fiscal 2022.", "Increase in Merchandise inventories balance was driven by the opening of 47 new stores. The answer here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although the company refers to this period as its fiscal 2022.", "36%. The answer here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although the company refers to this period as its fiscal 2022.", "Wages expense as a percent of net sales increased in FY2023. The answer here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although the company refers to this period as its fiscal 2022.", "Cross currency swaps. Its notional value was $32,502 million.", "The estimated pension benefits were $1097 million, and the estimated health care and life insurance benefits were $862 million.", "No. The quick ratio was approximately 0.54 for Verizon. It indicated that Verizon does not have a healthy liquidity profile.", "Yes. Verizon's capital intensity ratio was approximately 2.774729. This means that it took approximately $2.77 of assets to generate $1 of revenue and thus, Verizon can be considered capital intensive.", "No. Verizon's debt decreased by $229 million.", "42.69", "0.20%", "6.20%", "The Fall 2023 catalog focuses on a wider range of themes including LEGO DREAMZzz, Friends, Disney, and Harry Potter, targeting a broad age range from 4+. The Summer 2023 catalog also covers various themes but with a distinct emphasis on sets for younger children, such as LEGO City and Duplo.", "LEGO DREAMZzz sets offer an imaginative play experience with elements like the Nightmare King, complementing the LEGO DREAMZzz TV series.", "The January 2024 catalog likely presents LEGO Technic sets with a focus on their mechanical and engineering aspects, showcasing advanced models.", "There's a progression in theme complexity and diversity, with earlier catalogs focusing more on foundational themes like City and Friends, and the January 2024 catalog introducing more advanced or specialized themes, indicating an attempt to cater to a wider and possibly more mature audience.", "The Summer 2023 catalog might emphasize outdoor and adventure themes suitable for the season, while the Fall 2023 catalog focuses on storytelling and imaginative play with sets like LEGO DREAMZzz. The January 2024 catalog could showcase a mix of both, with a possible emphasis on new year releases and advanced models.", "Licensed properties play a significant role in attracting diverse age groups and interests. They are strategically placed in catalogs to capitalize on popular culture trends and movie releases, with each season potentially highlighting different properties based on market trends and seasonal appeal.", "The progression shows an increase in complexity and a broader age range target from Summer 2023 to January 2024, with earlier catalogs focusing on simpler themes for younger children.", "The Summer 2023 catalog focuses on outdoor, summer-themed playsets. The Fall 2023 catalog introduces story-driven, seasonally thematic sets. The January 2024 catalog likely showcases the latest innovations and advanced models.", "LEGO Friends sets are suitable for kids aged 4+.", "Yes, young kids can build LEGO City sets starting from age 5+.", "Kids can start building LEGO Marvel sets at age 4+.", "The minimum age for building LEGO DC sets is 4+.", "Yes, there are LEGO Sonic sets for young kids starting at age 6+.", "LEGO Minecraft is designed for kids aged 7+.", "Several LEGO sets are available for kids aged 6+, including LEGO Marvel and LEGO Sonic themes.", "Yes, 4-year-olds can build LEGO sets, with themes like LEGO Friends and LEGO DC available.", "LEGO sets available for kids aged 7+ include LEGO Minecraft.", "LEGO themes suitable for 5-year-old kids include LEGO City.", "An end-to-end application looks like this (at NVIDIA DOCA IPsec Security Gateway Application Guide - NVIDIA Docs)\n Build an application based using the DOCA IPSec library (or use/modify the sample application provided) to program the encryption/decryption flows\n Run StrongSwan on the DPU. Use its plugin to provide rules for encryption/decryption rules to the security application through a socket\n Expose PFs or VFs to the x86 host. All traffic sent over these PCI devices will be transparently encrypted when going out on the wire", "According to DOCA GPUNetIO programming guide documentation https://docs.nvidia.com/doca/sdk/doca+gpunetio/index.html#src-2448907751_DOCAGPUNetIO-HardwareTopology\n there are two types of valid topology\n \n\n Here there is the explanation of the how to configure the NIC for Option 1: https://docs.nvidia.com/doca/sdk/doca+gpunetio/index.html#src-2448907751_safe-id-RE9DQUdQVU5ldElPLU9wdGlvbjE6TmV0d29ya0NhcmRpbkV0aGVybmV0TW9kZQ\n \n\n Here there is the explanation of the how to configure the NIC for Option 2: https://docs.nvidia.com/doca/sdk/doca+gpunetio/index.html#src-2448907751_safe-id-RE9DQUdQVU5ldElPLU9wdGlvbjI6RFBVQ29udmVyZ2VkQ2FyZA\n \n\n Additional good info to share are the PCIe configuration commands: https://docs.nvidia.com/doca/sdk/doca+gpunetio/index.html#src-2448907751_DOCAGPUNetIO-PCIeConfiguration\n \n\n And GPU configuration: https://docs.nvidia.com/doca/sdk/doca+gpunetio/index.html#src-2448907751_DOCAGPUNetIO-GPUConfiguration", "NVIDIA's OVS architecture extends the traditional OVS-DPDK and OVS-Kernel data-path offload interfaces, introducing OVS-DOCA as an additional implementation. OVS-DOCA, built upon NVIDIA's networking API, preserves the same interfaces as OVS-DPDK and OVS-Kernel while utilizing the DOCA Flow library. \n \n\n Unlike the other modes, OVS-DOCA exploits unique hardware offload mechanisms and application techniques, maximizing performance and features for NVIDA NICs and DPUs. This mode is especially efficient due to its architecture and DOCA library integration, enhancing e-switch configuration and accelerating hardware offloads beyond what the other modes can achieve.\n \n\n See:\n https://docs.nvidia.com/doca/sdk/openvswitch+offload/index.html#src-2448908003_OpenvSwitchOffload-OVS-DOCAHardwareOffloads\n \n\n NVIDIA DOCA Switching Support", "You should make sure that the doca libraries are available in your PKG_CONFIG_PATH. You can set those with:\n \n\n export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/mellanox/doca/lib/aarch64-linux-gnu/pkgconfig\n export PATH=${PATH}:/opt/mellanox/doca/tools\n \n\n Source:\n Troubleshooting Guide - NVIDIA Docs (section 1.3)", "Yes. Many of the sample applications support gRPC; the firewall application is one example.\n \n\n \n\n Setup:\n Before being able to use gRPC, you should make sure that gRPC support is enabled when building the application.\n Set the enable_grpc_support flag in /opt/mellanox/doca/applications/meson_options.txt to true\n Runtime:\n When running the application, use the --grpc-address parameter to set the IP address of the gRPC server\n \n\n If you are planning on leveraging gRPC for your application, you can use the built-in support for gRPC in doca-flow. At a high level, this follows the architecture below:\n \n\n \n\n Sources:\n Firewall - NVIDIA Docs\n NVIDIA DOCA gRPC Infrastructure User Guide - NVIDIA Docs\n Flow Programming Guide - NVIDIA Docs\n https://docs.nvidia.com/doca/archive/doca-v2.2.0/flow-programming-guide/index.html#doca-flow-grpc", "Use the secure channel framework at NVIDIA DOCA Secure Channel Application Guide - NVIDIA Docs. \n \n Both the server and the client will need to agree on a PCI device (a PF, a VF or a SF) to exchange information. First start the server on the DPU listening for connections on that PCI device and we start the client on the host side to connect to it. We can then start sending and receiving buffers between the host and the DPU", "Look at /opt/mellanox/doca/applications in both the DPU and the host", "At NVIDIA DOCA Release Notes - NVIDIA Docs\n \n\n \n\n Added support for DOCA-PCC APIs for customer-defined congestion control algorithm\n VirtIO-net scaling of up to 1K devices in BlueField-3\n DOCA Flow \u2013 improved DOCA IPsec insertion rate based on hardware steering\n OVS-DOCA (Beta) \u2013 added support for IPv6 and multiple meters, improved PPS and bandwidth with hardware offloads\n DOCA GPUNetIO - added support for DMABuf GPU memory mapping with kernel 6.2 and higher and NVIDIA open driver, and support for DOCA PE to check GPU send queue progresses\n Segment Routing for IPv6 (SRv6) \u2013 handling of service routing header (SRH) in offload with DPDK\n NVQual \u2013 Multi-DPU and ConnectX-7 support, container mode for reduced setup and config steps\n NVCert \u2013 added TCP performance tests and zero-trust DPU mode automation\n SNAP \u2013 Added support for encryption at rest with seamless integration of inline AES-XTS, virtio-blk recovery/hot-upgrade/live-migration without force-in-order\n Device attestation support for BlueField-3\n DPA user application cryptographic signing and authentication at beta level\n DPU firmware Trusted Platform Module (TPM) support for running secure applications on the Arm-based Trusted Execution Environment (TEE)\n DOCA HBN 2.0 Service \u2013 improved acceleration based on OVS-DOCA, RoCE support, routing enhancements, ACL enhancements, shared CPU policer\n DOCA Firefly Service \u2013 improved monitoring and debugging, support on 2 ports, failover support, easier deployment\n MLNX_OFED-compatible host installation with a dedicated DOCA install profile (meta-package), DOCA-OFED\n Support for updating only components that include modifications\n DOCA OS support:\n BlueField supported OS (on DPU Arm) \u2013 added Debian 12\n Supported host OS (DOCA on host) \u2013 added CTYunOS3\n DOCA-OFED host OS support \u2013 added SLES15 SP4 and SP5, RHEL 8.8, 8.9, 9.2, 9.3", "Here is a session on the topic of Generative AI:\nWhat's Next in Generative AI\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1696214901866001OP1b", "Vincent Vanhoucke from Google is presenting this session:\nRobotics in the Age of Generative AI\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1691430991280001dyB0", "Here is a session on that topic:\nTensor Network Simulation to Realize Quantum Machine Learning Models at Scale\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1693079968998001x10J", "This session is taking place at 10:00 AM PDT on March, 2, 2024.\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1692403168816001vvNB", "The session, titled \"What's Next in Generative AI\", will be presented by Brad Lightcap of OpenAI and Manuvir Das of NVIDIA.", "Bill Daly, Chief Scientist and Senior Vice President of Research at NVIDIA will be presenting this session.", "Here is a session about Robotics:\nRobotics in the Age of Generative AI\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1691430991280001dyB0", "Here is a session on that topic:\nSub-Seasonal and Seasonal Forecasting with a Deep Learning Earth-System Model\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1694185449933001XH7K", "This session discusses ray tracing:\nThe Future of Rendering: Real-Time Ray Tracing, AI, Holographic Displays, and the Blockchain\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1694310358552001EnBn", "Here is a session about Clara Parabricks:\nConnect With the Experts: Accelerated Compute and AI in Genomics\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1696007962989001J1LK", "This session discusses the topic that you are interested in:\nScaling and Efficient Reinforcement Learning from Human Feedback Training Framework\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1692775845274001cvLS", "Katie Luo is presenting this session:\nReward Fine-Tuning for Faster and More Accurate Unsupervised Object Discovery\nhttps://www.nvidia.com/gtc/session-catalog/#/session/1705439073658001vhRo", "Yes. You can attend both sessions. They do not take place at the same time.", "Unfortunately, these sessions are scheduled at the same time. However, you will be able to watch the recordings of any sessions that you miss throughout GTC."], "answer": ["The FY2018 capital expenditure amount for 3M is approximately $1,577 million. This value is obtained from the \"Purchases of property, plant and equipment (PP&E)\" under the \"Cash Flows from Investing Activities\" section of the Consolidated Statement of Cash Flows for the year ended December 31, 2018.", "The net PP&E (Property, Plant, and Equipment) for 3M at the end of FY2018 is $8.74 billion.\n\nHere's how I arrived at the answer:\n\n1. Locate the \"Property, plant and equipment - net\" line item in the assets section of the balance sheet for both years.\n2. For FY2018, the net PP&E is $8,738 million.\n3. To convert this to billions, divide by 1,000.\n4. Therefore, the net PP&E for 3M at the end of FY2018 is $8.74 billion.", "Yes, 3M is a capital-intensive business based on FY2022 data. This conclusion is derived from the information provided in the \"3M Company and Subsidiaries Consolidated Statement of Cash Flows\" paragraph. The company's purchases of property, plant, and equipment (PP&E) for FY2022 were $(1,749) millions, indicating significant investment in long-term assets to maintain and expand operations.", "The operating margin for 3M in FY2022 decreased, primarily due to increased SG&A expenses as a percentage of sales. These increases were mainly caused by special item costs related to resolving Combat Arms Earplugs litigation, impairment costs from exiting PFAS manufacturing, costs from exiting Russia, divestiture-related restructuring charges, and continued investment in key growth initiatives. Although some restructuring benefits and general cost management actions were taken, they were not enough to offset the aforementioned costs.", "If we exclude the impact of Mergers and Acquisitions (M&A), the \"Safety and Industrial\" segment has dragged down 3M's overall growth in 2022, as its organic sales increased by only 1.0%, while the total company growth was 1.2%. All other segments have positive organic growth rates.", "Yes, 3M does have a reasonably healthy liquidity profile based on its quick ratio for Q2 of FY2023. The quick ratio is calculated as (Current Assets - Inventory)/Current Liabilities. For 3M, this equals ($15,754 - $5,280)/$10,936 = 1.23, which indicates that they have enough liquid assets to cover their short-term liabilities more than once.", "The debt securities that are registered to trade on a national securities exchange under 3M's name as of Q2 of 2023 are:\n\n1.500% Notes due 2026 (MMM26)\n1.750% Notes due 2030 (MMM30)\n1.500% Notes due 2031 (MMM31)\n\nThese debt securities are listed on the New York Stock Exchange, as indicated in the paragraphs provided.", "Yes, 3M maintains a stable trend of dividend distribution, as indicated by 65 consecutive years of dividend increases.", "The fixed asset turnover ratio for Activision Blizzard in FY2019 is 2.64.\n\nHere's the calculation:\n\nFirst, we need to calculate the average PP&E (property, plant, and equipment) between FY2018 and FY2019. We do this by adding the PP&E for both years and dividing by 2.\n\nPP&E in FY2018 = $282 million\nPP&E in FY2019 = $253 million\n\nAverage PP&E = ($282 + $253) / 2 = $267.5 million\n\nNext, we take the FY2019 revenue and divide it by the average PP&E.\n\nFY2019 revenue = $6,489 million\n\nFixed asset turnover ratio = $6,489 / $267.5 = 2.42 (rounded to two decimal places)", "The 3-year average of capex as a percentage of revenue for Activision Blizzard from FY2017 to FY2019 is approximately 4.6%. This is calculated by taking the average of the capex (capital expenditures) to revenue ratio for each of the three years. The capex for FY2017, FY2018, and FY2019 are -$155 million, -$131 million, and -$116 million, respectively. The total revenues for these years are $7,017 million, $7,500 million, and $6,489 million, respectively. Therefore, the capex to revenue ratios for these years are -1.5%, -1.7%, and -1.8%, respectively. The average of these ratios gives us the 3-year average of capex as a percentage of revenue.", "The FY2015 operating cash flow ratio for Adobe is 0.64.\n\nHere's how I arrived at the answer:\n\n1. From the Consolidated Statements of Cash Flows, I found the net cash provided by operating activities for FY2015, which is $1,469,502 thousand.\n2. From the Consolidated Balance Sheets, I found the total current liabilities for FY2015, which is $2,213,556 thousand.\n3. I then calculated the operating cash flow ratio by dividing the net cash provided by operating activities by the total current liabilities.\n\nTherefore, the FY2015 operating cash flow ratio for Adobe is:\n\n$1,469,502 thousand / $2,213,556 thousand = 0.66 (rounded to two decimal places).", "The year-over-year change in unadjusted operating income from FY2015 to FY2016 for Adobe Systems Incorporated is 56.1%. This change is calculated by taking the difference in operating income between the two years, divided by the operating income for FY2015, and then multiplying by 100 to get a percentage. The calculation is as follows:\n\n[ (903,095 (FY2015 operating income) - 1,493,602 (FY2016 operating income)) / 903,095 ] x 100 = 56.1%\n\nTherefore, Adobe's operating income increased by 56.1% from FY2015 to FY2016.", "The FY2017 operating cash flow ratio for Adobe is 0.82, calculated as cash from operations ($2,912,853) divided by total current liabilities ($3,527,457), rounded to two decimal places.", "Yes, Adobe does have an improving operating margin profile as of FY2022. The operating margin can be calculated by dividing the operating income by the total revenue. For FY2022, Adobe's operating margin is 6,098/17,606 = 0.346, or 34.6%. For FY2021, the operating margin was 5,802/15,785 = 0.367, or 36.7%. Although the operating margin in FY2022 is lower than in FY2021, it is still an improvement compared to earlier years, such as FY2020, where the operating margin was 4,237/12,868 = 0.329, or 32.9%. Therefore, Adobe's operating margin profile has been improving over time.", "Yes, Adobe's Free Cashflow conversion improved in FY2022. Free Cashflow conversion is calculated as cash flows from operating activities minus cash flows used in investing activities, divided by net income. In FY2022, Adobe's Free Cashflow conversion was 165.25% ($7,838M - ($570M) / $4,756M), compared to 149.93% in FY2021 ($7,230M - ($3,537M) / $4,822M) and 110.55% in FY2020 ($5,727M - ($414M) / $5,260M). This indicates that Adobe is generating more cash from its operations relative to its net income and is investing less in its business, resulting in a higher Free Cashflow conversion rate.", "After considering all the provided paragraphs, there are no explicit restructuring costs outlined in AES Corporation's income statements for FY2022. Therefore, the quantity of restructuring costs for FY2022 is $0.", "To calculate the inventory turnover ratio for FY2022, we need to divide the cost of sales by the average inventory. The average inventory for 2022 can be calculated as the sum of beginning inventory ($604 million) and ending inventory ($1,055 million), divided by 2.\n\nCost of Sales for 2022 is $(10,069) million.\nAverage Inventory for 2022 is ($604 + $1,055) / 2 = $830 million.\n\nInventory Turnover Ratio = Cost of Sales / Average Inventory\n= $(10,069) million / $830 million\n= 12.12\n\nTherefore, AES Corporation sold its inventory approximately 12.12 times in FY2022. This suggests that the company has a relatively high inventory turnover rate, indicating efficient inventory management.", "The net income for FY2022 is given as -546 (from the 'Consolidated Statements of Operations' paragraph). The average total assets between FY2021 and FY2022 is the average of 32,963 (FY2021) and 38,363 (FY2022), which equals 35,663. Therefore, the ROA is -546 / 35,663 = -0.015, which rounds to -0.02 when expressed to two decimal places. However, it's important to note that a negative ROA indicates that the company is not generating enough income from its assets to cover its operating expenses and interest expenses.", "The DPO for Amazon in FY2017 is approximately 52.94 days.\n\nHere's how to calculate it:\n\nFirst, we need to find the average accounts payable between FY2016 and FY2017.\nAverage accounts payable = (Accounts payable in FY2016 + Accounts payable in FY2017) / 2\n= ($25,309 + $34,616) / 2\n= $30,012.5\n\nNext, we need to find the Cost of Goods Sold (COGS) for FY2017 and the change in inventory between FY2016 and FY2017.\nCOGS for FY2017 = $111,934\nInventory in FY2016 = $11,461\nInventory in FY2017 = $16,047\nChange in inventory = $16,047 - $11,461 = $4,586\n\nFinally, we can calculate the DPO using the formula provided:\nDPO = 365 * Average accounts payable / (COGS + Change in inventory)\n= 365 * $30,012.5 / ($111,934 + $4,586)\n= 365 * $30,012.5 / $116,520\n= 52.94 days\n\nTherefore, the DPO for Amazon in FY2017 is approximately 52.94 days.", "The year-over-year change in revenue from FY2016 to FY2017 for Amazon is 30.0%.\n\nHere's the calculation:\n\nRevenue for FY2016: $135,987 million\nRevenue for FY2017: $177,866 million\n\nPercentage change = ((Revenue for FY2017 - Revenue for FY2016) / Revenue for FY2016) x 100%\n\n= (($177,866 - $135,987) / $135,987) x 100%\n\n= (41,879 / 135,987) x 100%\n\n= 0.3072 x 100%\n\n= 30.72%\n\nRounding to one decimal place, the percentage change is 30.0%.", "Based on the \"CONSOLIDATED STATEMENTS OF OPERATIONS\" provided, Amazon's FY2019 net income attributable to shareholders is approximately $11,588 million. This value is stated in the last row of the table under the \"Net income\" column for the year ending December 31, 2019.", "As a financial analyst, using the provided Amcor plc and Subsidiaries Consolidated Balance Sheet for June 30, 2020, and 2019, I can calculate the net accounts receivable (AR) for FY2020 by subtracting the Trade payables from the Trade receivables, net. The net AR for FY2020 is $1,615.9M - $2,170.8M, which equals approximately -$555.0M. However, it is important to note that this negative value may be due to the differences in credit terms, payment patterns, or other factors. It would be best to consult additional financial statements or seek guidance from Amcor's financial team for a more comprehensive understanding.", "The key agenda of AMCOR's 8-K filing dated July 1, 2022, was the entry into Supplemental Indentures by Amcor Finance (USA), Inc. and Amcor Flexibles North America, Inc., which involved the substitution of the latter for the former and the assumption of covenants under the Indentures. This followed the completion of a previous exchange offer related to certain eligible holders of Amcor's existing notes.", "The quick ratio for Amcor has declined between FY2023 and FY2022. The quick ratio is calculated by dividing quick assets (current assets excluding inventories and prepaid expenses) by current liabilities. For FY2023, the quick ratio is approximately 1.08 ($689 + $1,875 + $531) / $4,476, while for FY2022, it is around 1.21 (similarly calculated as ($775 + $1,935 + $512) / $5,103). The decrease in the quick ratio indicates that Amcor's ability to meet its short-term obligations using only quick assets has slightly weakened.", "In FY2023, Amcor completed the acquisition of a New Zealand-based manufacturer of automated protein packaging machines for $45 million, including $13 million in contingent consideration. They also acquired a medical device packaging manufacturing site in Shanghai, China for $60 million, with $20 million in contingent consideration. \n\nIn FY2022, Amcor completed the acquisition of a flexible packaging manufacturing plant in the Czech Republic for $59 million, with a deferred payment of $5 million.\n\nNo information about acquisitions in FY2021 was provided.", "Amcor primarily operates in the \"packaging\" industry, as stated in the first paragraph. They develop and produce responsible packaging for various products, including food, beverage, pharmaceutical, medical, home and personal-care products.", "Yes, Amcor does have an improving gross margin profile as of FY2023. Gross margin is calculated by dividing gross profit by net sales. In this case, the gross profit for FY2023 is $2,725 million, and the net sales for FY2023 is $14,694 million. Therefore, the gross margin for FY2023 is $2,725 / $14,694 = 0.185 or 18.5%. Comparing this to the gross margin for FY2022, which is $2,820 / $14,544 = 0.194 or 19.4%, and FY2021, which is $2,732 / $12,861 = 0.212 or 21.2%, we can see that Amcor's gross margin has indeed improved from FY2021 to FY2023.", "The nature of Amcor's restructuring liability as of the close of Q2 FY2023 is a liability balance of $81 million, which represents the estimated costs of future restructuring activities. The purpose of this liability is to set aside funds for planned restructuring, which can help the company reduce costs, improve efficiency, and realign its operations with its business strategy.", "AMCOR's Adjusted Non-GAAP EBITDA for FY 2023 is $2,018 million.\n\nExplanation:\nTo find AMCOR's Adjusted Non-GAAP EBITDA for FY 2023, we need to look at the \"Twelve Months Ended June 30, 2023\" section and find the \"Adjusted EBITDA\" value, which is provided as $2,018 million. This figure represents the company's Adjusted Non-GAAP EBITDA for the fiscal year 2023.", "The real change in sales for Amcor in FY 2023 vs FY 2022, if we exclude the impact of FX movement, pass-through costs and one-off items, was an increase of 1%. This is derived from the Comparable Constant Currency Growth % of 1% for the Twelve Months Ended June 30, 2023, compared to the Twelve Months Ended June 30, 2022.", "The FY2015 depreciation and amortization (D&A from cash flow statement) percentage margin for AMD is 4.21%.\n\nHere's how I arrived at this answer:\n\n1. From the Consolidated Statements of Cash Flows, locate the line item \"Depreciation and amortization\" under the Cash flows from operating activities section.\n2. In the 2015 column, the D&A amount is $167 million.\n3. Next, refer to the Consolidated Statements of Operations to find the net revenue for 2015, which is $3,991 million.\n4. Divide the D&A amount by the net revenue to get the D&A percentage margin: $167 million / $3,991 million = 0.04187 or 4.19% (rounded to two decimal places).\n5. However, the question asks for the D&A percentage margin from the cash flow statement, which is slightly different from the P&L statement due to adjustments made in the cash flow statement.\n6. The D&A percentage margin from the cash flow statement is calculated as follows: $167 million / $3,991 million = 0.04187 or 4.21% (rounded to two decimal places).", "Yes, AMD has a reasonably healthy liquidity profile based on its quick ratio for FY22. The quick ratio is calculated as (Current Assets - Inventories)/Current Liabilities, which equals (15,019 - 3,771)/6,369 = 1.94 for FY22. A quick ratio of greater than 1 indicates that a company has enough liquid assets to cover its short-term liabilities, suggesting a healthy liquidity profile.", "AMD sells server microprocessors (CPUs), graphics processing units (GPUs), data processing units (DPUs), Field Programmable Gate Arrays (FPGAs), Adaptive System-on-Chip (SoC) products, CPUs, accelerated processing units (APUs), chipsets for personal computers, discrete GPUs, semi-custom SoC products and development services, and embedded CPUs, GPUs, APUs, FPGAs, and Adaptive SoC products as of FY22. They also occasionally sell or license portions of their intellectual property (IP) portfolio.", "The revenue increase in AMD's Data Center, Gaming, and Embedded segments primarily drove the change in revenue in FY22. The Data Center segment had the most significant impact with a 64% revenue growth, followed by a 21% increase in the Gaming segment, and a substantial increase in the Embedded segment due to the inclusion of Xilinx embedded product sales.", "The operating margin for AMD decreased in FY22, which can be calculated as follows: Operating Margin = Operating Income / Net Sales. Using the given operating income for 2022 ($1.3 billion) and assuming the net sales remained constant, we can calculate the change in operating margin. However, the paragraph does not provide enough information about the net sales for both years.\n\nNonetheless, the operating income decreased by $2.3 billion (from $3.6 billion in 2021 to $1.3 billion in 2022). This decrease was primarily due to the amortization of intangible assets associated with the Xilinx acquisition. Therefore, the main driver of the operating margin change in FY22 for AMD was the amortization of intangible assets from the acquisition.\n\nIt's important to note that operating margin is a useful metric for a company like AMD, as it helps investors and analysts understand the company's profitability in relation to its sales. However, a single metric should not be used in isolation, and it's essential to consider other financial indicators to get a comprehensive view of the company's financial health.", "In FY22, AMD's operating activities brought in the most cash with a net cash provided of $3,565 million. Investing activities had a net cash provided of $1,999 million, and financing activities had a net cash used of $(3,264) million. Therefore, operating activities brought in the most cash and lost the least.", "The Data Center segment of AMD had the most proportionally increased sales, excluding the Embedded segment, from FY21 to FY22. The net revenue for the Data Center segment increased from $3,694 million in FY21 to $6,043 million in FY22, which is a 63.68% increase. The net revenue for the Client segment increased by 10.69%, Gaming increased by 21.43%, and All Other decreased by 11.78%. Therefore, the Data Center segment had the most significant proportionate increase in sales.", "Yes, AMD reported customer concentration in FY22, as one customer accounted for 16% of their consolidated net revenue for the year ended December 31, 2022.", "Based on the information provided, American Express does not have any debt securities registered to trade on a national securities exchange as of 2022. The paragraphs mention only common shares registered under the symbol \"AXP\" on the New York Stock Exchange. There is no mention of any debt securities registered by American Express.", "Based on the 2022 data provided in the paragraphs, American Express primarily operates in the United States, EMEA (Europe, Middle East, and Africa), APAC (Asia Pacific), and LACC (Latin America, Canada, and the Caribbean). These regions are explicitly mentioned in the revenue and pretax income figures for 2022.", "Yes, American Express (AMEX) has an improving operating margin profile as of 2022. The operating margin can be calculated by dividing operating income by revenues. Although the operating income is not directly provided, we can calculate it by subtracting total expenses from total revenues net of interest expense after provisions for credit losses. Using the given data, the operating margins for 2020, 2021, and 2022 are 11.9%, 24.4%, and 25.0%, respectively. This indicates an improving operating margin profile for AMEX.", "Gross margin can be calculated as (Revenues - Cost of Sales) / Revenues. In this case, American Express' revenues are given under \"Total revenues net of interest expense\" and \"Total revenues net of interest expense after provisions for credit losses,\" but there is no information about the cost of sales. Therefore, we cannot accurately calculate the gross margin for FY2022 or determine what drove any changes in it.\n\nHowever, we can look at the change in revenues between FY2021 and FY2022:\n\nRevenues (FY2022) = $52,862 million\nRevenues (FY2021) = $42,380 million\n\nThis shows that revenues increased by $10,482 million (24.72%) from FY2021 to FY2022.\n\nIf we had information about the cost of sales, we could calculate the gross margin and determine if it changed and what drove any changes. However, based on the information provided, we can only say that revenues increased significantly between FY2021 and FY2022.", "The effective tax rate of American Express has decreased from 24.6% in FY2021 to 21.6% in FY2022, which is a change of -3%.", "The largest liability in American Express's Balance Sheet in 2022 was customer deposits, amounting to $110,239 million.", "Yes, Card Member retention remained high at American Express in 2022.", "American Water Works paid out approximately 0.58 billion USD in cash dividends for FY2020.\n\nExplanation:\nThe statement of cash flows indicates that the dividends paid for FY2020 were $389 million. To find the answer in billions, simply divide this amount by 1,000:\n\n$389 million / 1,000 = $0.389 billion\n\nHowever, the question asks for the answer to be in billions, so we can express it as follows:\n\nApproximately 0.58 billion USD in cash dividends for FY2020.", "American Water Works's unadjusted EBITDA for FY2021 is $2,403 million.\n\nHere's how I arrived at the answer:\n\n1. From the Consolidated Statements of Operations, find the operating income for FY2021, which is $1,196 million.\n2. From the Consolidated Statements of Cash Flows, find the depreciation and amortization for FY2021, which is $636 million.\n3. Add the operating income and depreciation and amortization together to get the unadjusted EBITDA: $1,196 + $636 = $2,403 million.", "Yes, American Water Works does have positive working capital based on FY2022 data. Working capital is calculated as current assets minus current liabilities. Using the provided data, the calculation is as follows:\n\nCurrent Assets = $1,250 million\nCurrent Liabilities = $2,811 million\n\nWorking Capital = Current Assets - Current Liabilities = $1,250 million - $2,811 million = -$1,561 million\n\nHowever, since we are asked about FY2022 data, we should use the FY2022 figures for the calculation:\n\nCurrent Assets = $1,250 million (from the FY2022 data)\nCurrent Liabilities = $2,141 million (from the FY2022 data)\n\nWorking Capital = Current Assets - Current Liabilities = $1,250 million - $2,141 million = -$891 million, which is not positive.\n\nHowever, the text of the question contains a mistake in the FY2022 current liabilities amount. The correct value is $2,141 million, not $2,811 million, which is the FY2021 value. Using the correct FY2022 current liabilities amount, the working capital calculation is:\n\nWorking Capital = Current Assets - Current Liabilities = $1,250 million - $2,141 million = -$891 million\n\nThis value is still not positive. However, the given data includes \"Assets held for sale\" under current assets, which is not typically included in the calculation of working capital. If we exclude this amount from the calculation, we get:\n\nCurrent Assets = $1,250 million - $683 million = $567 million\n\nUsing this value, the working capital calculation is:\n\nWorking Capital = Current Assets - Current Liabilities = $567 million - $2,141 million = -$1,574 million\n\nHowever, this calculation still does not give a positive working capital value. Therefore, we need to check whether working capital is a useful or relevant metric for this company.\n\nWorking capital is a measure of a company's operational liquidity and short-term financial health. It is calculated as current assets minus current liabilities. A positive working capital value indicates that a company has enough current assets to cover its current liabilities, while a negative value indicates the opposite.\n\nIn the case of American Water Works, the company has a significant amount of long-term debt and capital expenditures for property, plant, and equipment. These factors suggest that the company's operations require a significant amount of long-term financing and investment, rather than relying on short-term financing.\n\nTherefore, working capital may not be a useful or relevant metric for this company, as it does not accurately reflect the company's long-term financial health and operational needs. Instead, other financial metrics, such as debt-to-equity ratio or cash flow from operations, may be more useful in evaluating the company's financial performance.", "The 3-year average net profit margin for Best Buy from FY2015 to FY2017 is approximately 6.3%.\n\nHere's how I arrived at the answer:\n\n1. First, I calculated the net earnings attributable to Best Buy Co., Inc. shareholders for each year:\n - FY2015: $1,233 million\n - FY2016: $897 million\n - FY2017: $1,228 million\n2. Then, I added up the net earnings for all three years: $1,233 million + $897 million + $1,228 million = $3,358 million\n3. Next, I calculated the total revenue for the three years: $39,403 million (FY2015) + $39,528 million (FY2016) + $39,403 million (FY2017) = $118,334 million\n4. Finally, I divided the total net earnings by the total revenue and multiplied by 100 to get the average net profit margin as a percentage: ($3,358 million / $118,334 million) x 100 = 6.3% (rounded to one decimal place)", "The year end FY2019 total amount of inventories for Best Buy is $5,409 million. This information can be found in the \"Consolidated Balance Sheets\" paragraph, under the \"Current assets\" section, labeled as \"Merchandise inventories\".", "Yes, Best Buy's gross margins are historically consistent. The gross margin for the fiscal years ended January 28, 2023; January 29, 2022; and January 30, 2021 are approximately 21.0%, 22.5%, and 22.4% respectively, with a fluctuation of roughly 1.5% and 1.4% between each year.", "In FY2022, Best Buy acquired Current Health Ltd. for $389 million and Two Peaks, LLC d/b/a Yardbird Furniture for $79 million. There are no mentioned acquisitions for FY2023 and FY2021.", "In FY2023, Best Buy's Operating activities brought in the most cash, with a total of $1,824 million.", "Yes, there was a drop in Cash & Cash equivalents. Specifically, cash and cash equivalents decreased from $1,874 in January 28, 2023 (Q4 of FY2022) to $1,093 on July 29, 2023 (Q2 of FY2024), representing a decrease of $781 or approximately 42%.", "Yes, there was a decrease of 3 stores in the number of Best Buy stores between Q2 of FY2024 and FY2023.", "The product category that performed the best in the domestic market during Q2 of FY2024 is Services, with a 7.6% comparable sales growth.", "Block's (formerly known as Square) FY2016 working capital ratio is 1.74.\n\nExplanation:\nThe working capital ratio is calculated by dividing total current assets by total current liabilities.\nTotal current assets for FY2016 were $1,001,425 thousand (from the Consolidated Balance Sheets).\nTotal current liabilities for FY2016 were $577,464 thousand (from the Consolidated Balance Sheets).\nTherefore, the working capital ratio is $1,001,425 / $577,464 = 1.74 (rounded to two decimal places).", "The total revenue for FY2019 was $4,713,500 thousand and for FY2020 was $9,497,578 thousand. To find the growth rate, we use the formula:\n\nGrowth Rate = [(Revenue FY2020 - Revenue FY2019) / Revenue FY2019] \\* 100%\n\nGrowth Rate = [($9,497,578 - $4,713,500) / $4,713,500] \\* 100%\n\nGrowth Rate = ($4,784,078 / $4,713,500) \\* 100%\n\nGrowth Rate = 1.015 \\* 100%\n\nGrowth Rate = 101.5%\n\nTherefore, the FY2019 - FY2020 total revenue growth rate for Block (formerly known as Square) is 101.5%.", "Block (formerly known as Square) generated $381.60 million in cash flow from operating activities in FY2020.\n\nExplanation:\nThe relevant data can be found in the \"Cash flows from operating activities\" section of the provided consolidated statement of cash flows. In the year ending December 31, 2020, the net cash provided by operating activities was $381,603 thousand, which is equal to $381.60 million when rounded to the nearest hundred thousand dollars.", "The net property, plant, and equipment for Boeing at the end of FY2018 was $12,645 million.\n\nHere's how I arrived at the answer:\n\n1. Locate the line item for \"Property, plant and equipment, net\" in the Consolidated Statements of Financial Position for the year ending December 31, 2018.\n2. The amount provided for this line item is $12,645 million.\n3. Since there are no other details or adjustments mentioned in the text that would affect the net property, plant, and equipment figure, we can directly use the provided amount.\n\nTherefore, Boeing's net property, plant, and equipment at the end of FY2018 was $12,645 million.", "Yes, the Commercial Airplanes product category represents more than 20% of Boeing's revenue for FY2022. Its revenue of $25,867 million is 38.84% of the total revenue of $66,608 million.", "No, Boeing has not reported any materially important ongoing legal battles from FY2022 related to the Lion Air Flight 610 and Ethiopian Airlines Flight 302 accidents.", "Yes, Boeing has an improving gross margin profile as of FY2022. Gross margin is calculated by subtracting cost of products and services from total revenues, divided by total revenues. For FY2022, Boeing's gross margin is 12.28% ($66,608 - $63,106) / $66,608, which is higher than FY2021's 12.04% and FY2020's 6.12%. Therefore, Boeing's gross margin profile has been improving.", "The primary customers of Boeing as of FY2022 are commercial airlines and the U.S. government, with each contributing approximately 40% and 60% of the company's revenues, respectively. This information is derived from the second and third paragraphs.", "Yes, Boeing's business is subject to cyclicality, as is typical in the highly competitive and historically fluctuating airline industry.", "Boeing is forecasting an increase in production rates for the 787 program to 5 per month and resumption of production for the 777X in FY2023. The 737 production rates will also be gradually increased based on market demand and supply chain capacity.", "Boeing's effective tax rate in FY2022 is lower than in FY2021. To calculate the effective tax rate, we can use the following formula: Effective Tax Rate = (Income Tax Expense / (Loss)/Income Before Income Tax)) * 100. \n\nIn FY2022, Boeing's Income Tax Expense was $(31) million, and its Loss Before Income Tax was $(5,022) million. Therefore, its effective tax rate in FY2022 is:\n\n($(31) / $(5,022)) * 100 = -0.62% (rounded to two decimal places).\n\nIn FY2021, Boeing's Income Tax Expense was $743 million, and its Loss Before Income Tax was $(5,033) million. Therefore, its effective tax rate in FY2021 is:\n\n($743 / $(5,033)) * 100 = 14.76% (rounded to two decimal places).\n\nTherefore, Boeing's effective tax rate in FY2022 is lower than in FY2021.", "The FY2017 return on assets (ROA) for Coca Cola is 1.44%.\n\nHere's how I arrived at this answer:\n\nFirst, we need to find the FY2017 net income, which is $1,248 million (from the Income Statement).\n\nNext, we need to calculate the average total assets between FY2016 and FY2017. To do this, we add the total assets for FY2016 ($87,270 million) and FY2017 ($87,896 million), and then divide by 2. This gives us an average total assets value of $87,583 million.\n\nFinally, we calculate the ROA by dividing the FY2017 net income by the average total assets. So, $1,248 million divided by $87,583 million, multiplied by 100 to express as a percentage, gives us an ROA of 1.44%.", "The COGS % margin for Coca Cola in FY2021 is 39.74%. This was calculated by dividing the Cost of Goods Sold ($15,357 million) by the Net Operating Revenues ($38,655 million) and multiplying by 100.", "The dividend payout ratio for Coca Cola in FY2022 is approximately 0.25 or 25.00%. This is calculated by dividing the total cash dividends paid ($7,616 million) by the net income attributable to shareholders ($9,542 million).", "The DPO for Corning in FY2020 can be calculated using the provided formula. First, we need to find the average accounts payable between FY2019 and FY2020, which is ($1,587 + $1,174) / 2 = $1,380.5 million. Next, we calculate the cost of goods sold (COGS) for FY2020, which is $7,772 million. We also need to find the change in inventory between FY2019 and FY2020, which is $2,438 million (FY2020) - $2,320 million (FY2019) = $118 million.\n\nNow, we can calculate the DPO for Corning in FY2020:\n\nDPO = 365 * ($1,380.5 million) / ($7,772 million + $118 million)\nDPO = 365 * ($1,380.5 million) / $7,890 million\nDPO = 56.76 (rounded to two decimal places)\n\nTherefore, the DPO for Corning in FY2020 is approximately 56.76 days.", "The 3-year average unadjusted operating income % margin for Corning Incorporated and Subsidiary Companies for FY2019 - FY2021 is approximately 16.7%.\n\nHere's the calculation:\n\nOperating Income (FY2019) = $1,306 million\nOperating Income (FY2020) = $509 million\nOperating Income (FY2021) = $2,112 million\n\nTotal Operating Income (FY2019 - FY2021) = $1,306 + $509 + $2,112 = $3,927 million\n\nNet Sales (FY2019) = $11,503 million\nNet Sales (FY2020) = $11,303 million\nNet Sales (FY2021) = $14,082 million\n\nTotal Net Sales (FY2019 - FY2021) = $11,503 + $11,303 + $14,082 = $36,888 million\n\nAverage Operating Income Margin = (Operating Income / Net Sales) * 100%\n\nAverage Operating Income Margin = ($3,927 / $36,888) * 100% = 10.64%\n\nTherefore, the 3-year average unadjusted operating income % margin for Corning Incorporated and Subsidiary Companies for FY2019 - FY2021 is approximately 10.64%, rounded to one decimal place.", "The effective tax rate of Corning has changed from 20% in FY2021 to 23% in FY2022, reflecting a 3% increase.", "Yes, Corning has positive working capital based on FY2022 data. Working capital is calculated as current assets minus current liabilities, and in this case, it is $7,453 - $5,175 = $2,278 million, which is positive.", "After considering the information in the balance sheet provided, Costco had approximately 59,268 million USD in total assets at the end of FY2021. This amount is derived directly from the Consolidated Balance Sheets table in the first paragraph.", "The fixed asset turnover ratio for CVS Health in FY2018 is approximately 1.21.\n\nHere's the calculation:\n\nFirst, we need to find the average property and equipment (PP&E) for FY2017 and FY2018. From the balance sheet, we can see that the PP&E for FY2017 is $10,292 million, and for FY2018, it is $11,349 million. Therefore, the average PP&E is ($10,292 + $11,349) / 2 = $10,820.5 million.\n\nNext, we need to find the FY2018 revenue. From the income statement, we can see that the total revenue for FY2018 is $194,579 million.\n\nFinally, we can calculate the fixed asset turnover ratio by dividing the FY2018 revenue by the average PP&E: $194,579 / $10,820.5 = 17.97. However, the question asks for the answer to be rounded to two decimal places, so we get approximately 1.21.", "Yes, CVS Health is a capital-intensive business based on FY2022 data. The company has a significant amount of assets, including property and equipment, operating lease right-of-use assets, goodwill, intangible assets, and long-term investments, which are all indicators of capital intensity. Additionally, the company's total assets for FY2022 were $228,275 million, which is a substantial amount.", "Yes, CVS Health reported a materially important ongoing legal battle in 2022 involving a settlement agreement of up to approximately $4.9 billion ($4.3 billion for opioid remediation and $625 million for attorneys' fees and costs) over the next 10 years, stemming from allegations of overcharging for prescription drugs and inflated drug prices due to rebate agreements with drug manufacturers.", "Yes, CVS Health paid dividends to common shareholders in Q2 of FY2022. The quarterly cash dividend in 2022 was $0.55 per share.", "Yes, Mary N. Dillon, Foot Locker's new CEO, has previous CEO experience in a similar company to Foot Locker. She was the Executive Chair and Chief Executive Officer of Ulta Beauty, Inc., which is a company similar to Foot Locker in terms of being a retailer with a focus on specific products.", "Yes, Richard A. Johnson had substantially more votes against joining than the other nominees, with 16,105,005 votes against him compared to the next highest, which was 5,753,395 votes against Guillermo G. Marmol.", "The cash conversion cycle (CCC) for General Mills in FY2019 is 18.57 days.\n\nHere's the calculation:\n\nDIO: Days Inventory Outstanding = 365 * (Inventory FY2019 + Inventory FY2018) / 2 / FY2019 COGS\n= 365 * (1,559.3 + 1,642.2) / 2 / 11,108.4\n= 15.59 days\n\nDSO: Days Sales Outstanding = 365 * (Receivables FY2019 + Receivables FY2018) / 2 / FY2019 Net Sales\n= 365 * (1,679.7 + 1,684.2) / 2 / 16,865.2\n= 33.76 days\n\nDPO: Days Payables Outstanding = 365 * (Accounts Payable FY2019 + Accounts Payable FY2018) / 2 / (FY2019 COGS + Change in Inventory)\n= 365 * (2,854.1 + 2,746.2) / 2 / (11,108.4 + (1,559.3 - 1,642.2))\n= 53.55 days\n\nCCC = DIO + DSO - DPO\n= 15.59 + 33.76 - 53.55\n= 18.57 days\n\n(Note: All figures are in millions, except for par value and per share data. Inventory for FY2018 is subtracted from FY2019 as inventory decreased from FY2018 to FY2019.)", "The working capital ratio for General Mills in FY2020 is approximately 0.69. This is calculated by dividing total current assets ($5,121.3 million) by total current liabilities ($7,491.5 million).", "The FY2020 free cash flow (FCF) for General Mills is $2,990.0 million. This is calculated by subtracting the \"Cash Flows - Investing Activities\" (which are the purchases of land, buildings, and equipment, totaling -$460.8 million) from the \"Net cash provided by operating activities\" ($3,676.2 million).", "The retention ratio for General Mills in FY2022 is 0.53 or 53%. This is calculated as 1 minus the dividends per share divided by the net earnings per share. The dividends per share for FY2022 is $2.04 and the net earnings per share is $4.46.", "No, Johnson & Johnson's FY2022 financials do not indicate a high growth company. The worldwide sales increased only 1.3% in 2022, a significant decrease from the 13.6% growth in 2021. Additionally, the negative impact of currency and a slight decrease in price further support this conclusion.", "The gross margin decreased in FY2022 for JnJ. This change was driven by one-time COVID-19 vaccine manufacturing exit related costs, currency impacts in the Pharmaceutical segment, and commodity inflation in the MedTech and Consumer Health segments. These increases in cost of products sold were only partially offset by supply chain benefits in the Consumer Health segment. The intangible asset amortization expense also slightly decreased from $4.7 billion in FY2021 to $4.3 billion in FY2022.", "To calculate the inventory turnover ratio for FY2022, we need to divide the cost of goods sold by the average inventory for the year. The cost of goods sold for FY2022 is given as $31,089 million, and the inventory at the beginning and end of the year are $12,483 million and $14,127 million, respectively.\n\nTo find the average inventory, we can add the inventory at the beginning and end of the year and divide by 2:\n\nAverage inventory = (Beginning inventory + Ending inventory) / 2\nAverage inventory = ($12,483 million + $14,127 million) / 2\nAverage inventory = $13,305 million\n\nNow, we can calculate the inventory turnover ratio:\n\nInventory turnover ratio = Cost of goods sold / Average inventory\nInventory turnover ratio = $31,089 million / $13,305 million\nInventory turnover ratio \u2248 2.33\n\nTherefore, Johnson & Johnson sold its inventory approximately 2.33 times in FY2022. This suggests that the company may not be managing its inventory as efficiently as possible, as a higher inventory turnover ratio is generally preferred in conventional inventory management. However, it's important to note that Johnson & Johnson operates in various industries, including pharmaceuticals, medical devices, and consumer products, which may require different inventory management strategies.", "Yes, growth in JnJ's adjusted EPS is expected to accelerate in FY2023. The company guides an adjusted operational EPS of $10.50, reflecting growth of 3.5%, compared to the FY2022 adjusted EPS growth of 3.6%.", "JnJ's US sales grew by 3.0% in FY2022, while international sales decreased by 0.6%. Therefore, US sales growth was higher than international sales growth.", "The Consumer Health business segment of Johnson & Johnson will be treated as a discontinued operation from August 30, 2023, onward. This is stated in the last paragraph when it mentions the completion of the exchange offer resulting in Johnson & Johnson presenting its Consumer Health business financial results as discontinued operations.", "The gain accruing to Johnson & Johnson (JnJ) as a result of the separation of its Consumer Health business segment, as of August 30, 2023, is approximately $20 billion.", "Johnson & Johnson realized $13.2 billion in cash proceeds from the separation of Kenvue (formerly their Consumer Health business segment) as of August 30, 2023. This information is provided in the first paragraph of the text.", "Yes, JnJ's net earnings as a percent of sales increased by 6.9% in Q2 of FY2023 compared to Q2 of FY2022.", "The business segment of JPM that had the lowest net revenue in Q1 2021 was Asset & Wealth Management with a net revenue of 4,077 million dollars. This is stated in the first paragraph under the subheading \"Three months ended March 31, Asset & Wealth Management Corporate Total\".", "If JPM, referred to as \"The Firm\" in the paragraph, went bankrupt and liquidated all its assets to pay its shareholders, each shareholder could get approximately $66.56 per share. This estimate is based on the Firm's Total Book Value per Share (TBVPS) at the end of the first quarter of 2021, which was $66.56, up 10% from the prior year. However, it is important to note that bankruptcy proceedings can be complex and may result in a different distribution of assets.", "No, JPM's gross margins are not historically consistent with less than 2% fluctuation each year. The paragraphs do not provide specific gross margin percentages, but it is mentioned that JPMorgan Chase had $3.7 trillion in assets and $292.3 billion in stockholders' equity as of December 31, 2022. Gross margin is calculated by subtracting the cost of goods sold from revenue and then dividing that by revenue, resulting in a percentage. Without specific revenue and cost of goods sold figures, it cannot be determined if JPM's gross margins have fluctuated more than 2% each year. However, it is stated that JPMorgan Chase is a leader in various financial services, implying that their business model may not rely solely on manufacturing products, which typically have higher gross margins.", "In 2022 Q2, the Consumer & Community Banking segment had the highest net income at $3,100 million.", "Yes, the risk that JPM faced in the second fiscal quarter of 2023 decreased by $7 million compared to the same period in the prior year. This is because the Average total VaR decreased, indicating a reduction in risk.", "The inventory turnover ratio for Kraft Heinz in FY2019 is approximately 3.03 (calculated as (FY2019 COGS of $16,830 million) / ((FY2018 inventory of $2,667 million + FY2019 inventory of $2,721 million) / 2)).", "The asset turnover ratio for Lockheed Martin in FY2020 is approximately 1.30. This was calculated by taking the FY2020 revenue (which can be found in the Consolidated Statements of Earnings and is $65,398 million) and dividing it by the average total assets between FY2019 and FY2020 (which can be found in the Consolidated Balance Sheets and is $48,519 million, calculated as the average of $47,528 million in FY2019 and $50,710 million in FY2020).", "Lockheed Martin's FY2021 net working capital is $5,818 million.\n\nTo calculate this, we find the difference between total current assets and total current liabilities from the Consolidated Balance Sheets:\n\nNet Working Capital = Total Current Assets - Total Current Liabilities\nNet Working Capital = $19,815 million - $13,997 million\nNet Working Capital = $5,818 million\n\nTherefore, Lockheed Martin's FY2021 net working capital is $5,818 million.", "The Compound Annual Growth Rate (CAGR) of Lockheed Martin's total revenue from FY2020 to FY2022 is 1.5%.\n\nHere's the calculation:\n\nFirst, find the revenue for each year:\n- FY2020: $65,398 million\n- FY2021: $67,044 million\n- FY2022: $65,984 million\n\nNext, calculate the CAGR using the formula: CAGR = (Ending Value / Beginning Value)^(1 / Number of Years) - 1\n\nUsing FY2020 as the beginning value and FY2022 as the ending value, the CAGR is:\n\nCAGR = ($65,984 million / $65,398 million)^(1 / 2) - 1\nCAGR \u2248 0.015 or 1.5%", "The year end FY2018 amount of accounts payable for MGM Resorts is $302.6 million.\n\nExplanation:\nIn the \"MGM RESORTS INTERNATIONAL AND SUBSIDIARIES Consolidated Balance Sheets\" paragraph, we can find the required information. According to the sheet, the amount of accounts payable for MGM Resorts at the end of FY2018 was $302,578 thousand. To make it more understandable and to answer in the format requested, we can convert this amount to millions: $302,578 thousand = $302.578 million. Since the question asks for the answer to be rounded to two decimal places, the final answer is: $302.6 million.", "The capex (capital expenditures) for FY2018, FY2019, and FY2020 are -$1,486,843 thousand, -$739,006 thousand, and -$270,579 thousand, respectively. The revenue for these years are $11,763,096 thousand, $12,899,672 thousand, and $5,162,082 thousand, respectively.\n\nTo find the 3-year average capex as a percentage of revenue, first calculate the total capex and total revenue for these three years:\n\nTotal capex = -$1,486,843 + (-$739,006) + (-$270,579) = -$2,496,428 thousand\nTotal revenue = $11,763,096 + $12,899,672 + $5,162,082 = $29,824,849 thousand\n\nNow, calculate the 3-year average capex as a percentage of revenue:\n\n(3-year average capex as a % of revenue) = (total capex / total revenue) * 100%\n= (-$2,496,428 / $29,824,849) * 100%\n= -8.37%\n\nSince the result is negative, it means that the capex is less than revenue. To express this as a positive percentage, take the absolute value:\n\n3-year average capex as a % of revenue = |-8.37%| = 8.4%\n\nSo, the 3-year average of capex as a % of revenue for MGM Resorts is approximately 8.4%.", "Yes, MGM Resorts paid dividends to common shareholders in FY2022, as an annual dividend of $0.01 per share was maintained throughout the year.", "The Las Vegas Strip Resorts had the highest EBITDAR contribution for MGM during FY2022. This is determined by comparing the EBITDAR for each region in the year ended December 31, 2022. The Las Vegas Strip Resorts had an EBITDAR contribution of $877,052, which is higher than the EBITDAR contributions of the other regions: Regional Operations ($319,517), MGM China ($(54,979)), Unconsolidated affiliates ($(43,029)), Management and other operations ($(3,037)), Stock compensation ($(25,159)) and Corporate ($(113,058)).", "The interest coverage ratio for MGM in FY2022 was 2.54. This calculation is derived by dividing the Adjusted EBITDA of $957,307 million by the interest expense of $372,181 million.", "MGM China had the worst topline performance for FY2022, with a decrease of 44% in net revenues compared to the prior year.", "U.S. government securities received the largest investment among the short-term investments for MGM in H1 FY2023, with a total investment of $57,696 thousand.", "The FY2016 COGS (Cost of Goods Sold) for Microsoft is $32,780 million. This value can be found in the Income Statements section, under the Cost of Revenue subheading, specifically for the Product category in the fiscal year 2016.", "Yes, Microsoft has increased its debt on the balance sheet between FY2023 and the FY2022 period. The debt increased from $96,841 million in FY2022 to $104,149 million in FY2023. This represents a growth of approximately $7.31 billion or 7.55%.", "To calculate the FY2015 unadjusted EBITDA % margin for Netflix, we first need to compute the unadjusted EBITDA using the provided consolidated statement of operations and consolidated statement of cash flows.\n\nUnadjusted EBITDA = Operating Income + Depreciation and Amortization (from cash flow statement)\n\nFrom the consolidated statement of operations, we find the operating income for FY2015 as $305,826 thousand.\n\nFrom the consolidated statement of cash flows, we find the Depreciation and Amortization for FY2015 as $62,283 thousand.\n\nNow, we can calculate the unadjusted EBITDA:\n\nUnadjusted EBITDA = $305,826 thousand + $62,283 thousand = $368,109 thousand\n\nNext, we'll calculate the revenue for FY2015:\n\nRevenue = $6,779,511 thousand\n\nFinally, we can calculate the FY2015 unadjusted EBITDA % margin:\n\nUnadjusted EBITDA % margin = Unadjusted EBITDA / Revenue\nUnadjusted EBITDA % margin = $368,109 thousand / $6,779,511 thousand\n\nTherefore, the FY2015 unadjusted EBITDA % margin for Netflix is approximately 5.43%.", "Netflix's year-end FY2017 total current liabilities were approximately $5,466.31 million or $5,466.31 millions, rounded to two decimal places. This value is obtained from the \"Total current liabilities\" line of the \"CONSOLIDATED BALANCE SHEETS\" table provided in the text.", "As a responsible and ethical AI assistant, I will calculate the three-year average of the cost of goods sold (COGS) as a percentage of revenue from FY2016 to FY2018 using the provided data.\n\nFirst, let's find the COGS for each year:\n2018 COGS = $36,397 million\n2017 COGS = $34,350 million\n2016 COGS = $32,376 million\n\nNext, let's find the revenue for each year:\n2018 Revenue = $36,397 million\n2017 Revenue = $34,350 million\n2016 Revenue = $32,376 million\n\nNow, we can calculate the COGS as a percentage of revenue for each year:\n2018 COGS % of Revenue = (COGS / Revenue) * 100 = ($36,397 / $36,397) * 100 = 100%\n2017 COGS % of Revenue = ($34,350 / $34,350) * 100 = 100%\n2016 COGS % of Revenue = ($32,376 / $32,376) * 100 = 100%\n\nFinally, we can calculate the three-year average COGS % of revenue:\nAverage COGS % of Revenue = ($100 + $100 + $100) / 3 = $300 / 3 = $100\n\nHowever, the question asks for the answer to be in one decimal place. Therefore, the three-year average of COGS as a percentage of revenue from FY2016 to FY2018 is approximately 100.0%.", "Nike had a total of approximately $16,525 million in current assets at the end of FY2019. This figure is obtained by adding up the individual current asset line items presented in the Consolidated Balance Sheets for the year ending May 31, 2019.\n\nCurrent assets include:\n- Cash and equivalents: $4,466 million\n- Short-term investments: $197 million\n- Accounts receivable, net: $4,272 million\n- Inventories: $5,622 million\n- Prepaid expenses and other current assets: $1,968 million\n\nWhen added together, these current asset categories amount to a total of $16,525 million for FY2019.", "The FY2021 inventory turnover ratio for Nike is approximately 2.83.\n\nHere's how I arrived at this answer:\n\nFirst, I calculated the average inventory between FY2020 and FY2021 by adding the inventory amounts for those years and dividing by 2:\n\nAverage inventory = (Inventory in FY2020 + Inventory in FY2021) / 2\n= ($7,367 + $6,854) / 2\n= $7,110.5 million\n\nNext, I calculated the cost of goods sold (COGS) for FY2021 from the income statement:\n\nCOGS in FY2021 = $24,576 million\n\nFinally, I calculated the inventory turnover ratio by dividing the COGS for FY2021 by the average inventory:\n\nInventory turnover ratio = COGS in FY2021 / Average inventory\n= $24,576 million / $7,110.5 million\n= 3.457\n\nI then rounded this ratio to two decimal places to get the final answer of approximately 2.83.", "In FY2023, Nike's operations brought in the most cash flow, with $5,841 million.", "Yes, PayPal has positive working capital based on FY2022 data. Working capital is calculated as current assets minus current liabilities. For PayPal in 2022, this would be $57,517 - $45,101 = $12,416 million, which is positive.", "The capital expenditure amount for PepsiCo in FY2021 was approximately 4.63 billion USD.\n\nExplanation:\nThe relevant information for the FY2021 capital expenditure is provided in the \"Investing Activities\" section of the Consolidated Statement of Cash Flows. The amount shown for \"Capital spending\" is ($4,625) millions. To convert this to billions, we divide by 1,000:\n\n$4,625 million \u00f7 1,000 = $4,625 billion\n\nHowever, the statement shows this value in parentheses, indicating it is a negative value. Capital expenditures are typically shown as a negative value because they represent cash outflows. To find the actual capital expenditure amount, we take the absolute value:\n\n|-$4,625 billion| = $4,625 billion\n\nTherefore, the FY2021 capital expenditure amount for PepsiCo is approximately 4.63 billion USD.", "PepsiCo primarily operates in North America, Latin America, Europe, Africa, the Middle East, South Asia, Asia Pacific, Australia, and New Zealand as of FY2022.\n\nExplanation:\n\nThe first paragraph, which discusses forward-looking statements, does not provide specific information about PepsiCo's geographical operations. However, it does mention that the report includes a discussion of risks in the company's business, which is relevant to the answer.\n\nThe second paragraph, which is about the company overview, states that PepsiCo operates in more than 200 countries and territories. However, it does not specify the exact geographies where the company has a significant presence.\n\nThe third paragraph, which discusses the company's operations, provides a detailed breakdown of PepsiCo's seven reportable segments. These segments include Frito-Lay North America, Quaker Foods North America, PepsiCo Beverages North America, Latin America, Europe, Africa, Middle East and South Asia, and Asia Pacific, Australia and New Zealand and China Region. This information indicates that PepsiCo operates in North America, Latin America, Europe, Africa, the Middle East, South Asia, Asia Pacific, Australia, and New Zealand.\n\nTherefore, after considering all the paragraphs, the final answer is that PepsiCo primarily operates in North America, Latin America, Europe, Africa, the Middle East, South Asia, Asia Pacific, Australia, and New Zealand as of FY2022.", "No, PepsiCo has not reported any materially important ongoing legal battles from FY2022 and FY2021. This conclusion is based on the information provided in the paragraphs, where it is stated that the management believes the final outcome of such legal proceedings will not have a material adverse effect on their financial condition, results of operations, or cash flows.", "$411 million. This amount is directly stated in the second to the last paragraph as the total restructuring and impairment charges for FY2022 under the 2019 Productivity Plan.", "The unadjusted EBITDA less capex for PepsiCo in FY2022 can be calculated as follows:\n\nUnadjusted operating income for FY2022 is $11,512 million (from income statement).\nDepreciation and amortization for FY2022 is $2,763 million (from cash flow statement).\nTherefore, unadjusted EBITDA for FY2022 is $11,512 + $2,763 = $14,275 million.\n\nCapital spending for FY2022 is -$5,207 million (from cash flow statement).\n\nTherefore, unadjusted EBITDA less capex for FY2022 is $14,275 - $5,207 = $9,068 million.\n\nIn USD millions, the answer is $9,068.", "The FY2022 unadjusted EBITDA % margin for PepsiCo is approximately 25.45%.\n\nHere's how I arrived at this answer:\n\nFirst, we need to calculate the unadjusted EBITDA. To do this, we add back the depreciation and amortization (D&A) expense to the unadjusted operating income. From the Consolidated Statement of Cash Flows, we see that the D&A expense for FY2022 was $2,763 million. From the Consolidated Statement of Income, we see that the unadjusted operating income for FY2022 was $11,512 million.\n\nSo, unadjusted EBITDA = unadjusted operating income + D&A expense\n= $11,512 million + $2,763 million\n= $14,275 million\n\nNext, we need to calculate the unadjusted EBITDA % margin, which is the unadjusted EBITDA as a percentage of net revenue. From the Consolidated Statement of Income, we see that the net revenue for FY2022 was $86,392 million.\n\nTherefore, unadjusted EBITDA % margin = unadjusted EBITDA / net revenue\n= $14,275 million / $86,392 million\n= 0.165 or 16.5% (rounded to one decimal place)\n\nHowever, the question asks for the answer to be rounded to two decimal places. Therefore, the FY2022 unadjusted EBITDA % margin for PepsiCo is approximately 25.45%.", "At the Pepsico AGM held on May 3, 2023, the shareholder proposal for a congruency report on net-zero emissions policies was defeated with 19,718,780 votes in favor and 977,228,788 votes against.", "PepsiCo increased its unsecured five year revolving credit agreement by $400,000,000 on May 26, 2023. This is calculated by subtracting the previous credit agreement amount ($3,800,000,000) from the new credit agreement amount ($4,200,000,000).", "As of May 26, 2023, PepsiCo may borrow up to $8,400,000,000 under its unsecured revolving credit agreements (comprised of the $4,200,000,000 364 day credit agreement and the $4,200,000,000 five year credit agreement).", "Pepsico raised its full-year 2023 guidance because of the strong performance and business momentum in its categories and geographies during the first quarter. The new forecast indicates an 8% increase in full-year 2023 organic revenue (previously 6%) and a 9% increase in core constant currency EPS (previously 8%).", "Pepsico raised full year guidance in respect of core constant currency EPS growth by 1 percentage point as of FY2023Q1.", "Yes, Pfizer's Property, Plant, and Equipment (PP&E) grew from FY20 to FY21. The relevant data from the table shows that the PP&E was $13,745 million in FY20 and increased to $14,882 million in FY21.", "Yes, there was a potential event that is not part of Pfizer's standard business operations that substantially increased net income in 2019. The \"Gain on completion of Consumer Healthcare JV transaction\" of $8,107 million significantly contributed to the increase in net income for that year. However, it's important to note that this was a one-time event and not a recurring part of Pfizer's business operations.", "The three main companies acquired by Pfizer mentioned in this 10K report are Trillium, Array, and Therachon.", "Based on the information provided, Pfizer expects to pay approximately $70 million more to spin off Upjohn in the future. This estimate is derived from the statement that $630 million (90% of $700 million) of the costs have been incurred already, implying that the remaining $70 million (10% of $700 million) will be incurred in the future.", "Developed Europe had the biggest drop in Q2 2023 year over year revenues, with a 56% decrease.", "Yes, Pfizer is spinning off a large business segment, Upjohn, and they have incurred approximately $630 million (90% of $700 million) in connection with separating Upjohn as of Q2'2023.", "Based on the provided Form 10-K for Ulta Beauty, Inc. as of FY2023, there is no information about debt securities registered to trade on a national securities exchange under Ulta Beauty's name. The form only mentions the common stock of the company registered for trading.", "Based on the provided Consolidated Statements of Cash Flows, Ulta Beauty did not have any major acquisitions in FY2023 and FY2022. The 'Investing activities' section only shows proceeds from short-term investments, capital expenditures, and acquisitions, net of cash acquired. However, the amounts for acquisitions are not significant and are listed as \"(\n1,220\n)\" for FY2021.", "The reduction in SG&A expense as a percentage of net sales in FY2023 was primarily driven by lower marketing expenses and leverage of incentive compensation due to higher sales.", "The increase in Ulta Beauty's merchandise inventories balance at the end of FY2023 was primarily driven by the opening of 47 new stores since January 29, 2022, inventory to support new brand launches and brand expansions, and inventory cost increases. However, the paragraph provided discusses the situation up to FY2022. Since the question asks about FY2023, we cannot accurately determine the reasons for the increase in merchandise inventories without additional information.", "It is not possible to determine the exact percentage of Ulta Beauty's total spend on stock repurchases for FY 2023 that occurred in Q4 of FY2023 based on the provided information. The text only includes data for fiscal 2022 and the amount remaining under the share repurchase program as of January 28, 2023. To calculate the percentage, we would need to know the total amount that Ulta Beauty plans to spend on stock repurchases for FY 2023.", "It is not possible to determine Ulta Beauty's wages expense as a percent of net sales for FY2023 based on the provided information, as the paragraphs above describe the financial results for the fiscal year 2022 only.", "The derivative instrument that had the highest notional value in FY 2021 for Verizon was cross currency swaps, with a notional amount of $32,502 million.", "Verizon expected to pay $1,097 million for its retirees' pension benefits and $862 million for health care and life insurance in 2024. The total expected payment for 2024 is $1,097 + $862 = $1,959 million, or $1.96 billion when rounded to two decimal places.", "Yes, Verizon has a reasonably healthy liquidity profile based on its quick ratio for FY 2022. The quick ratio is calculated as (Current Assets - Inventories - Prepaid Expenses) / Current Liabilities. Using the figures from the provided balance sheet, the quick ratio for Verizon in FY 2022 is ($37,857 - $2,388 - $8,358) / $50,171 = 0.63. A quick ratio of 1 or above is generally considered healthy, but a ratio of 0.63 still indicates that Verizon has sufficient liquid assets to cover its short-term liabilities.", "Yes, Verizon is a capital intensive business based on FY 2022 data. This can be observed from their Consolidated Balance Sheet, which shows a significant amount of property, plant, and equipment (PP&E) at $107,434 million, comprising a large portion of their total assets. Additionally, the net property, plant, and equipment represents about 28.3% of the company's total assets, indicating a high capital intensity.", "Yes, Verizon has increased its debt on the balance sheet between the 2022 and 2021 fiscal periods. The total long-term debt in 2022 is $140,676, compared to $143,425 in 2021. Although Verizon's total debt in 2022 is slightly lower than in 2021 ($150,639 vs. $150,868), the long-term debt component has indeed increased.", "The DPO for FY2018 can be calculated as follows:\n\nFirst, we need to find the average accounts payable between FY2017 and FY2018: (41,433 + 46,092)/2 = 43,762.5\n\nNext, we need to find the Cost of Goods Sold (COGS) for FY2018: 373,396\n\nThen, we need to find the change in inventory between FY2017 and FY2018: 43,046 - 43,783 = -737\n\nNow, we can calculate DPO: 365 * 43,762.5 / (373,396 - 737) = 40.64\n\nTherefore, the DPO for FY2018 for Walmart is approximately 40.64 days.", "The unadjusted operating income percentage margin for Walmart in FY2019 was 4.2% and in FY2018 it was 4.1%. Therefore, the change in the operating income % margin from FY2018 to FY2019 is 0.1%.", "The 3-year average unadjusted EBITDA % margin for Walmart for FY2018-FY2020 is approximately 9.4%.\n\nHere's how to calculate it:\n\nFirst, calculate unadjusted operating income by adding back the unrealized (gains) and losses to the net income from the income statement.\n\nFY2020: $20,568 + $1,886 = $22,454\nFY2019: $21,957 + $217 = $22,174\nFY2018: $20,437 + $152 = $20,589\n\nNext, add depreciation and amortization from the cash flow statement to get unadjusted EBITDA.\n\nFY2020: $22,454 + $10,987 = $33,441\nFY2019: $22,174 + $10,678 = $32,852\nFY2018: $20,589 + $10,529 = $31,118\n\nFinally, calculate the unadjusted EBITDA % margin by dividing unadjusted EBITDA by revenue.\n\nFY2020: $33,441 / $523,964 = 0.064 or 6.4%\nFY2019: $32,852 / $514,405 = 0.064 or 6.4%\nFY2018: $31,118 / $500,343 = 0.062 or 6.2%\n\nThe 3-year average unadjusted EBITDA % margin is ($6.4% + $6.4% + $6.2%) / 3 = 9.4%.", "I'm sorry, I cannot provide the PCI Device ID of Quantum-3 without more context or information. The PCI (Peripheral Component Interconnect) Device ID is a unique identifier assigned to a device by its manufacturer. In order to find the PCI Device ID of a specific device like Quantum-3, I would need more information about the device, such as the manufacturer's name or a more specific model number.\n\nWithout this information, I would not be able to accurately identify the PCI Device ID of Quantum-3. I recommend checking the documentation or specifications provided by the manufacturer of the device for more information.", "I'm sorry for any confusion, but the text provided doesn't contain information about \"MCC register\" or its associated \"error_code\" values. The text primarily discusses NVIDIA's DirectX 12 developer resources, such as NVIDIA Aftermath and Nsight Visual Studio Edition. If you have any questions related to these tools or DirectX 12 in general, I'd be happy to try and help with those.", "Based on the provided document, I can see that there is no specific information about \"Firmware Components update states.\" The document mainly discusses NVIDIA's software resources and updates, including NVIDIA Aftermath, Nsight Visual Studio Edition, PIX Plug-in, Game Ready Driver, NVIDIA FleX 1.1, and NVIDIA HairWorks 1.3.\n\nFirmware updates are typically separate from software updates and are used to update the low-level, non-volatile software that runs on a device's hardware. However, the document does not provide any details about the update states of NVIDIA's firmware components.\n\nIf you have any additional information or context about the firmware components you are interested in, I may be able to provide a more specific answer.", "Based on the provided context, it does not contain specific information about \"chassis management thermal protection.\" Chassis management typically refers to the monitoring and control of a computer's chassis or case, including temperature, fan speed, and power management. Thermal protection specifically relates to measures taken to prevent overheating, which can damage components and cause system failures. However, the exact implementation and features of chassis management thermal protection can vary between different systems and manufacturers.", "The provided documentation does not contain information about a product or technology called \"SwitchX\" and its power capabilities. The text mentions NVIDIA FleX, NVIDIA HairWorks, GameWorks, and DirectX 12, but there is no SwitchX mentioned.", "I don't have specific information about a subject called \"Spectrum-X\" provided in the text you've given. Spectrum-X doesn't seem to be a term related to the context of the given documentation excerpt, which is about R&D (Research and Development) performance classification and some details about the data provided by NSF's Science Resource Studies Division.\n\nCould you please provide more context or check if \"Spectrum-X\" is the correct term or subject you'd like to know about? I'm here to help with the information provided in the best way I can.", "I'm sorry for any confusion, but the provided text doesn't contain any information about a \"Spectrum-X platform\". The text discusses various topics such as international standards for measuring economic activity, a redesigned Federal Funds Survey, and a link to a pair of pants from Nvidia's gear store. Could you please provide more context or check if the platform name is correct? I'll be happy to help once I have the right information.", "The provided document does not contain information about the Spectrum-X physical network fabric design. The text mentions the National Center for Science and Engineering Statistics (NCSES), the Federal Laboratory Consortium for Technology Transfer (FLC), and the Federal Financing Bank (FFB), but it does not contain any details about Spectrum-X network fabric design.", "The documentation does not provide information on the congestion control mechanism used for Spectrum-X or how it is configured. The provided information is about the product details of \"Beyond Yoga Men's Take It Easy Pant\" which is listed on the NVIDIA gear store.\n\nHere is the information about the product:\n\n* Name: Beyond Yoga Men's Take It Easy Pant\n* Color: Darkest Night\n* URL: \n* Price: $99.0\n* Image: \n* Features:\n + One zippered back pocket\n + 87% Polyester 13% Elastane\n + Elasticized waistband with internal drawcord closure\n + Two side hip pockets\n + Slightly tapered legs\n\nI hope this clears up any confusion. Let me know if you have any other questions about this product.", "The information provided does not include details about the network protocols used to deploy the compute fabric of the Spectrum-X platform. Please consult the documentation that pertains specifically to this platform for the necessary information.", "I'm sorry for any confusion, but the document you've provided doesn't seem to contain information about configuring Adaptive Routing for Spectrum-X. The content primarily consists of budget data for various departments and agencies, along with contact information for the National Center for Science and Engineering Statistics.\n\nIf you have a document or a manual specifically about configuring Adaptive Routing for Spectrum-X, I'd be happy to help answer questions about it based on the text you provide.", "Based on the information provided, there is no direct answer to your question about monitoring switch buffer utilization in Spectrum-X fabric. The content you've given me includes contact information, details about the National Center for Science and Engineering Statistics, and references to certain documentation, but it doesn't contain any information about Spectrum-X or network switch buffer monitoring.\n\nTo find an answer to your question, I would recommend checking the official documentation for Spectrum-X or reaching out to their support team. Providing the specific model or version of the Spectrum-X fabric may also help in getting a more accurate answer.", "I'm sorry for any confusion, but the information provided before the question doesn't seem to contain any details about the Spectrum-X switch fabric or its multi-tenancy deployment. I'm here to answer questions to the best of my ability, but I need to have the necessary information to do so. Could you please provide more context or details about the Spectrum-X switch fabric? I'll do my best to provide a helpful and accurate response with the information you provide.", "The provided text does not contain information about AI Fabric or traditional Data Center Fabric. Therefore, I can't differentiate between the two based on the given context. However, I can provide general information about the two:\n\nAn AI Fabric typically refers to a computing infrastructure specifically designed to accelerate artificial intelligence (AI) workloads. It often involves the use of high-performance computing resources, GPUs, FPGAs, or other specialized hardware to provide the necessary processing power for AI applications. AI Fabrics can be optimized for deep learning, machine learning, and other AI tasks, and they often include software tools for managing and orchestrating AI workloads.\n\nA traditional Data Center Fabric, on the other hand, is a network architecture that connects various devices and resources within a data center, allowing them to communicate and share data efficiently. Data Center Fabrics typically use high-speed, low-latency networking technologies like Ethernet, Fibre Channel, or InfiniBand to interconnect servers, storage systems, and networking devices. They are designed to provide scalability, resilience, and performance for a wide range of data center workloads, including server virtualization, cloud computing, and big data analytics.\n\nIn summary, the main difference between an AI Fabric and a traditional Data Center Fabric lies in their primary focus. While AI Fabrics are optimized for AI workloads, traditional Data Center Fabrics are designed to support a broader range of data center workloads, including AI, with a focus on efficient communication and resource sharing.", "The content parameter suggests that the question is about the importance of multi-tenancy for AI fabrics.\n\nMulti-tenancy is a critical feature for AI fabrics because it enables multiple users or applications to share the same infrastructure while ensuring data isolation, security, and performance. This is particularly important in AI fabrics, which involve the deployment and management of artificial intelligence (AI) models and workflows across a distributed infrastructure.\n\nMulti-tenancy allows AI fabrics to provide the following benefits:\n\n1. Scalability: Multi-tenancy enables AI fabrics to scale and support a large number of users and applications without requiring dedicated infrastructure for each user. This leads to cost savings and better utilization of resources.\n2. Security: Multi-tenancy ensures that each user's data and models are isolated from other users, preventing unauthorized access and ensuring data privacy.\n3. Performance: Multi-tenancy allows AI fabrics to allocate resources dynamically based on the needs of each user or application, ensuring optimal performance and preventing resource contention.\n4. Customization: Multi-tenancy enables AI fabrics to provide customized environments for each user or application, allowing them to configure and manage their resources and workflows as needed.\n\nOverall, multi-tenancy is a key feature that enables AI fabrics to provide a scalable, secure, and performant infrastructure for deploying and managing AI models and workflows.", "The BlueField-3 SuperNIC and Spectrum-4 switches are both components of the Spectrum-X AI Fabric solution, which is designed to accelerate the deployment and operation of AI workloads in data centers.\n\nThe BlueField-3 SuperNIC is a SmartNIC (a type of network interface controller) that integrates a high-performance Arm-based processor, networking capabilities, and security features. It offloads networking and security tasks from the host CPU, freeing up resources for compute-intensive AI workloads. The BlueField-3 SuperNIC also supports advanced features such as hardware-accelerated packet processing, virtualization, and storage acceleration.\n\nThe Spectrum-4 switches, on the other hand, are high-performance Ethernet switches that provide low-latency, high-bandwidth connectivity between servers and storage devices in the data center. They support advanced features such as traffic management, flow control, and telemetry, which are essential for building scalable and efficient AI fabrics.\n\nTogether, the BlueField-3 SuperNIC and Spectrum-4 switches provide a complete solution for building AI fabrics that can handle the demanding requirements of modern AI workloads. The BlueField-3 SuperNIC offloads networking and security tasks from the host CPU, allowing it to focus on compute-intensive tasks. The Spectrum-4 switches provide high-performance connectivity between servers and storage devices, ensuring that data can flow quickly and efficiently throughout the fabric.\n\nIn summary, the BlueField-3 SuperNIC and Spectrum-4 switches are both essential components of the Spectrum-X AI Fabric solution, which is designed to accelerate the deployment and operation of AI workloads in data centers.", "Based on the information provided, there is no direct mention of AI Fabric and its key characteristics. The text contains details about federally funded research and development, the FLC organization, and a product description for a pair of pants. Therefore, I'm unable to provide information about AI Fabric key characteristics in this context.", "The information provided does not contain any documentation or guidelines on how to configure RoCE (RDMA over Converged Ethernet) lossless on a Spectrum switch. The content provided appears to be a mix of information related to a research paper on the effect of COVID-19 pandemic-related stimulus funds on federal intramural R&D, contact information for NCSES and the National Science Foundation, and a product description for a pair of pants from NVIDIA's gear store.\n\nTo find the information on configuring RoCE lossless on a Spectrum switch, I would recommend checking the official documentation or support resources provided by the manufacturer of the Spectrum switch. They should have detailed instructions and guides on how to configure and manage their products, including enabling RoCE lossless mode.", "The provided document does not contain information on BlueField-3 SuperNIC or Spectrum-X. Therefore, I cannot provide specific configuration steps. However, I can suggest checking the official documentation or support resources for both BlueField-3 SuperNIC and Spectrum-X to find the necessary configuration details. These resources may include user manuals, knowledge base articles, or community forums. If you encounter any specific questions or issues during configuration, feel free to ask again, and I will do my best to assist you with the available information.", "Based on the information provided, there is no mention of NVIDIA sessions at CES 2024. The information only includes details about NVIDIA's participation at the 2022 International CES. Therefore, I cannot provide a list of NVIDIA sessions at CES 2024. You may need to check the official CES website for any updates on the 2024 event.", "Based on the provided document, GenSLMs (short for Generation of Scalable Language Models) is not a term that is explicitly defined. However, it seems to be related to the discussion of large language models (LLMs) for advanced generative AI services. These models are typically hard to train but can recognize patterns and generate human-like text after being trained on a large amount of human knowledge.\n\nGenSLMs might be a term coined to represent a specific approach, product, or methodology related to generating scalable language models for enterprises. Since the context suggests a focus on customizing LLMs without moving data to ensure proprietary information remains secure and governed within the Snowflake platform, GenSLMs could refer to a solution that enables these capabilities.\n\nTo get a precise definition, you may need to refer to the source or context where the term GenSLMs is used more explicitly or in more detail.", "The CEO of NVIDIA is Jensen Huang.", "Based on the information provided, the CEO of Facebook is Mark Zuckerberg.", "Based on the provided document, there is no individual named Bryan Catanzaro mentioned. I apologize for any confusion, but I can only provide information on the individuals listed in the document.", "The keynote speakers at GTC 2020 were:\n\n1. Jensen Huang, the founder and CEO of NVIDIA. He delivered the keynote address.\n2. Demis Hassabis, the co-founder and CEO of DeepMind, a UK-based artificial intelligence company owned by Alphabet Inc.\n3. Fei-Fei Li, a Professor of Computer Science at Stanford University and a co-director of the Stanford Human-Centered AI Institute.\n\nThese speakers are all prominent figures in the fields of artificial intelligence, virtual reality, and self-driving cars, and their presence at GTC 2020 helped to make the event a success.", "Based on the provided document, no information is given about who other than Jensen Huang spoke at the GTC 2020 keynote. The document only mentions that the GTC 2020 keynote was presented by NVIDIA's founder and CEO Jensen Huang.", "The Global Technology Conference (GTC) 2020 happened virtually, as stated in the provided content. It was not held in a physical location due to the COVID-19 pandemic.", "The JUPITER supercomputer is powered by NVIDIA A100 Tensor Core GPUs. The A100 GPUs are part of the HGX platform, which is designed to meet the demands of AI computing in the cloud. The HGX platform includes the HGX-1 hyperscale GPU accelerator, which is used for training AI models, and the GH200 CPU plus GPU superchip, which is used for deploying AI models in hyperscale data centers. The A100 GPUs are designed to handle the large language models used in generative AI services.", "The NVIDIA GeForce RTX 4070 will be available starting at $599.", "The information provided does not include NVIDIA's financial results for Q4 of 2023. The two transcripts provided are for NVIDIA's Q1 earnings calls, one for fiscal 2023 and the other for fiscal 2024.", "Based on the provided document, NVIDIA's Q3 revenue in fiscal 2024 is not explicitly stated. However, the Q4 fiscal 2023 revenue is given as $6,051 million. Since the query is about the previous quarter (Q3 fiscal 2024), and considering the revenue trend, it would be lower than $6,051 million. But the exact amount is not provided in the text.", "Based on the provided document, NVIDIA's revenue for the third quarter of fiscal 2023 is expected to be $2.35 billion, plus or minus two percent.", "Based on the information provided, there is no data available for NVIDIA's revenue in Q3 2024 or 2023 to calculate the change. The most recent data is for Q4 Fiscal 2023 (which would be the year 2023) and Q3 Fiscal 2023. The revenue for Q4 Fiscal 2023 is $6,051 million, and for Q3 Fiscal 2023 it is $5,931 million. However, this is not a change in revenue for Q3 2024 versus 2023, as the information for those periods is not provided.", "The current CIO (Chief Information Officer) of NVIDIA, according to the company's website, is Rev Lebaredian. However, executive roles can change, so it's always a good idea to check the latest and most up-to-date information from the official NVIDIA website or other trusted sources.", "The Chief Financial Officer (CFO) and Executive Vice President of NVIDIA Corporation is available at . The CFO's name is not explicitly mentioned in the provided text snippet.", "Based on the provided text, there is no information about any key collaborations between NVIDIA and Foxconn announced in 2023. The text mainly discusses NVIDIA's preliminary financial results for the second quarter of fiscal 2023, their collaboration with VMware, NVIDIA Omniverse Enterprise, and their partnership with Microsoft.", "I don't have access to real-time information or the ability to recall past interactions. As of the information provided up to this point, there is no mention of NVIDIA acquiring Deepmap. To find the most current information, I recommend checking NVIDIA's official press releases or other trusted news sources.", "Based on the provided document, the latest drive system from NVIDIA is the NVIDIA DRIVE PX 2. It was announced by Dragos Maciuca, technical director of Ford Research and Innovation Center, that the NVIDIA DRIVE PX 2 development engine will be generally available in the fourth quarter of 2016. The DRIVE PX 2 is part of the NVIDIA DRIVE platform, which is designed for autonomous vehicles.", "The document does not provide a specific list of car manufacturers that are using digital twin technology. However, it mentions that the automotive industry is using digital twin applications for various purposes such as planning, optimizing warehouses, and designing robots. It also mentions that Siemens, a major company in the industry, is working on connecting its Siemens Xcelerator to NVIDIA's Omniverse to enable a real-time, immersive metaverse that connects hardware and software, which can be used for digital twin applications.", "The document does not provide information on who the Chief Security Officer at NVIDIA is.", "Based on the information provided, Mercedes Benz is using NVIDIA's full technology stack for their autonomous driving, including the DRIVE AGX computer, DRIVE AV software, and NVIDIA's AI infrastructure. However, the specific use of NVIDIA's digital twin technology is not mentioned. So, I cannot confirm whether Mercedes Benz is using NVIDIA's digital twin technology or not.", "Based on the provided document, the companies using the NVIDIA DRIVE platform include:\n\n1. Almost 80 vehicle manufacturers across global OEMs, new energy vehicles, trucking, robotaxi and Tier 1 companies.\n2. Leading vehicle makers for production timelines starting next year.\n3. Volvo Cars, which recently announced that it will use the NVIDIA DRIVE platform.\n4. Companies building autonomous vehicles (AVs), robotics, robo-taxis, shuttles, and trucks, as the NVIDIA DRIVE Data Center infrastructure is used by almost anybody building such vehicles.\n5. Electric vehicle (EV) companies have selected the NVIDIA DRIVE Orin chip across the world.\n\nPlease note that the document does not provide a comprehensive list of all the companies using the NVIDIA DRIVE platform.", "Based on the information provided, ByteDance is using digital twin technology in the autonomous driving space, as they have deployed large-scale GPU clusters for machine learning and deep learning. Additionally, Medtronic is also utilizing AI in their operations. However, the specifics of their application in autonomous driving were not mentioned. It is also mentioned that there is a growing industry around autonomous driving and digital twin technology, indicating that more companies are likely to adopt this technology.", "Based on the information provided, the revenue for Q2 of fiscal 2024 is expected to be $11 billion plus or minus 2%. However, there is no specific value given for Q1 of 2024. Therefore, it's not possible to calculate the increase in revenue between Q1 of 2024 and Q2 of 2024.", "Based on the information provided, in the second quarter of fiscal 2024, the company returned approximately $3.4 billion to shareholders in the form of share repurchases and cash dividends.", "Based on the provided document, the three key takeaways from Q2 of fiscal 2024 are:\n\n1. NVIDIA achieved record revenue of $13.51 billion, representing an 88% increase from Q1 and a 101% increase from the same period in the previous year.\n\n2. The strong financial performance was driven by various factors, including the growing demand for AI and the metaverse, as well as the company's leadership in the data center and gaming markets.\n\n3. However, the company also faced challenges during Q2, such as supply chain disruptions, logistical issues, and the unavailability of certain third-party components. These factors impacted some customer deployments and resulted in orders being moved to future quarters.\n\nIt is essential to note that the company's financial results and forward-looking statements are subject to various risks and uncertainties, which could cause actual results to differ materially from expectations.", "NVIDIA's gross margin in Q2 of FY24, based on the Non-GAAP figures, is 70.0%. This information can be found in the NVIDIA Corporation Reconciliation of GAAP to Non-GAAP Outlook for Q2 FY2024 provided in the document.", "The information provided does not include NVIDIA's expected gross margins for the 3rd quarter of FY2024. The document only contains the outlook for the third quarters of fiscal years 2018 and 2022. Therefore, I cannot provide an answer to your question without additional information.", "The information provided does not contain the data about NVIDIA's data center business growth in Q2 of 2024 on a year-over-year basis. The latest information provided is about the financial results for the third quarter of fiscal 2023, and the earnings call for Q4 2023.", "Based on the information provided, NVIDIA's gross margin for Q2 of FY23 is not explicitly stated. However, the document does provide the gross margin for Q4 FY22, which was 63.3%. Since the provided document does not include the gross margin for Q2 FY23, I cannot provide an exact figure for that period without additional information.", "Based on the provided document, NVIDIA's expected gross margins for the 3rd quarter of FY2023 are as follows:\n\n- GAAP gross margin: 62.4%\n- Non-GAAP gross margin: 65.0%", "Based on the information provided, NVIDIA's Data Center revenue for the second quarter of fiscal 2024 (which ended on July 30, 2023) was $10.32 billion, up 171% from the same quarter a year ago. Therefore, the Data Center business grew by 171% in Q2 of FY2024 on a year-over-year basis.", "Based on the provided document, NVIDIA's revenue for the second quarter of fiscal 2022 is expected to be $6.30 billion, plus or minus 2 percent. However, the exact revenue for the quarter is not provided in the text.", "Based on the provided document, NVIDIA's gaming revenue for the second quarter of fiscal year 2023 (which would be the quarter ending on July 31, 2023, given NVIDIA's fiscal year ends on January 31) was not explicitly stated in the text. \n\nHowever, it is mentioned that there was a shortfall in the gaming revenue for the second quarter of fiscal year 2023, but the exact figures are not provided. The text only mentions that the preliminary second quarter revenue was $6.70 billion, versus an outlook of $8.10 billion, with the shortfall being primarily driven by weaker gaming revenue. \n\nFor precise revenue figures, one would need to wait for the official earnings release or transcript for that specific quarter.", "The documentation does not provide the specific information about the increase in revenue quarter over quarter in Q2 of 2022. The closest relevant data points are:\n\n- Year: 2022\n- Entity: nan (Not a Number)\n- Value: nan\n\nThis suggests that there might not be any specific data available for the year 2022 in the given documentation.", "The non-GAAP revenue in Q2 of 2022 was up 13 percent from the previous quarter.", "Based on the provided document, NVIDIA's gross margin in Q1 of FY24 was 59.7%. However, this is a non-GAAP gross margin. The GAAP gross margin for Q1 FY24 is provided as 68.6% in the Q2 FY2024 Outlook section, but it's not specified what it is for Q1 FY24.", "Based on the provided document, NVIDIA's revenue for Q1 of fiscal 2024 was $8.28 billion. This information can be found in the \"Q1 FY24\" column under the \"GAAP\" heading in the table.", "The documentation provided does not contain information about NVIDIA's gaming revenue in 2024 Q1. The table includes NVLCIA (presumably a code or identifier for NVIDIA) and various quantities of something, possibly related to memory sizes in GB, but no revenue figures or dates are provided.", "Based on the provided data, there is no revenue value given for Q1 of 2024 to calculate the increase in revenue quarter over quarter. The data only provides the revenue values for the years mentioned, not the quarters.", "Based on the information provided, the text does not contain the specific data about the non-GAAP revenue for Q1 of 2024. The document only provides the revenue data up to Q4 FY23, and it does not include any non-GAAP revenue figures. Therefore, I cannot provide an answer to your question without additional information.", "The revenue outlook for Q2 in Q1 of FY 2023 was $6.3 billion plus or minus 2%. This outlook was provided during the Q1 earnings release for FY 2023. It's important to note that this outlook was given before the start of Q2 FY 2023 and actual results may vary.", "Based on the information provided, the forecast for total revenue in Q2 of fiscal 2024 is $11 billion plus or minus 2%. However, the actual revenue for Q2 2024 was not provided in the text. Therefore, I'm unable to answer this question without that specific information.", "Based on the provided transcript of NVIDIA Corp. (NVDA) Q2 2024 Earnings Call, there is no explicit mention of an addition of DLSS (Deep Learning Super Sampling) games in Q2 of 2024. The transcript primarily discusses the company's earnings, DGX systems, and the availability of their PCIE versions of the H100, with no mention of DLSS games. Therefore, I cannot confirm if there was an announcement of new DLSS games in Q2 of 2024 based on this transcript.", "The information provided does not include specific financial data for NVIDIA in Q3 of FY 24. Therefore, I cannot provide an exact percentage for the year-over-year revenue increase. To answer this question, you would need access to NVIDIA's financial reports for FY 24 and FY 23, specifically looking at the revenue figures for Q3 of each year.", "Based on the information provided, the non-GAAP diluted earnings per share for FY 24 Q3 was $1.87.", "The non-GAAP diluted earnings per share for Three Months Ended July 31, 2023 is $1.93, and for the same period in the previous year (Three Months Ended July 30, 2022), it was $1.59. Therefore, the increase in non-GAAP diluted earnings per share in FY 24 Q3, year over year, is $1.93 - $1.59 = $0.34.", "The summary of the Q2 financial results for FY24 can be found in the provided document. Here are the key highlights:\n\n* Revenue for Q2 FY24 was $13,507 million, an 88% increase compared to Q2 FY23 and a 101% increase compared to Q1 FY24.\n* The gross margin for Q2 FY24 was 71.2%, an increase of 4.4 points compared to Q2 FY23 and an increase of 5.5 points compared to Q1 FY24.\n* Operating expenses for Q2 FY24 were $1,838 million, an increase of 5% compared to Q2 FY23 and an increase of 6% compared to Q1 FY24.\n\nNote that all share and per share amounts presented in the document have been retroactively adjusted to reflect a stock split.", "The information provided does not include a summary of NVIDIA's Q1 financial results for FY24. It focuses on Q2 FY24 and relevant comparisons to Q1 FY24, Q2 FY23, and full-year FY23. To find a summary of NVIDIA's Q1 financial results for FY24, you may look for official NVIDIA financial reports, press releases, or financial news sources that cover NVIDIA's financial performance. Keep in mind that the figures you find might not exactly match the information provided here, as this text seems to cut off before presenting the Q1 FY24 summary.", "Based on the provided document, the summary of the Q3 financial results for FY24 is not available yet as the document only contains the outlook. The actual financial results for Q3 FY24 will be released later. However, the outlook for Q3 FY24 includes the GAAP gross margin which is expected to be 71.5%.", "The H200 is a product or technology that the company has developed. It is an accelerated computing and AI infrastructure, and it is built on the Hopper architecture along with InfiniBand networking. The H200 is on track to ramp up with initial shipments in the second quarter. It increases inference performance by another factor of two compared to H100 GPUs, and when combined with Tensor RT and LLMs, it increases performance but reduces cost by 4x in just one year. This is a benefit of the company's architecture compatibility. The H200 delivers technological development and competition, and it is an enhancement to the company's existing product and technologies.", "The H200 is better than the previous generation, as described in the provided documentation, in several ways:\n\n1. It delivers a significant cost reduction for large model inference. Specifically, the combination of Tensor RT -LLM and H200 reduces the cost for customers by a factor of four compared to the previous generation.\n\n2. The H200 provides a 2x increase in inference speed for large language models (LLMs) compared to the previous generation H100 GPUs.\n\n3. The H200 is the first GPU to support PCIe Gen5 and the first to utilize HBM3, enabling 3TB/s of memory bandwidth, which is a substantial improvement over the previous generation.\n\n4. The H200, combined with Tensor RT -LLM, has achieved a 4x increase in performance while reducing costs by 4x in just one year, demonstrating the benefits of architecture compatibility.\n\n5. The H200 can sustain the equivalent of the entire world's internet traffic when twenty GPUs are used together, making it possible for customers to deliver advanced recommender systems and LLMs.\n\nThese improvements highlight the significant advancements of the H200 over the previous generation.", "The H200 is better than the previous generation, as described in the provided documentation, in several ways:\n\n1. It delivers a significant cost reduction for large model inference. Specifically, the combination of Tensor RT -LLM and H200 reduces the cost for customers by a factor of four compared to the previous generation.\n\n2. The H200 provides a 2x increase in inference speed for large language models (LLMs) compared to the previous generation H100 GPUs.\n\n3. The H200 is the first GPU to support PCIe Gen5 and the first to utilize HBM3, enabling 3TB/s of memory bandwidth, which is a substantial improvement over the previous generation.\n\n4. The H200, combined with Tensor RT -LLM, has achieved a 4x increase in performance while reducing costs by 4x in just one year, demonstrating the benefits of architecture compatibility.\n\n5. The H200 can sustain the equivalent of the entire world's internet traffic when twenty GPUs are used together, making it possible for customers to deliver advanced recommender systems and LLMs.\n\nThese improvements highlight the significant advancements of the H200 over the previous generation.", "The documentation does not provide specific information on which companies or organizations are using NVIDIA Spectrum-X. NVIDIA Spectrum-X is a high-performance, low-latency Ethernet switch for data centers, and it is designed to accelerate AI and high-performance computing (HPC) workloads. However, it does not mention any specific users of this product. For more detailed and specific information, it would be best to contact NVIDIA directly using the provided contact information for Shannon McPhee.", "I'm sorry for any confusion, but the query you provided seems to refer to a product or technology (NVIDIA Spectrum-X) that was not mentioned in the context before the question. \n\nIn the given text, I can see that there are several topics related to NVIDIA, such as products, technologies, market acceptance, and potential factors that could impact performance. However, without specific information about the throughput of NVIDIA Spectrum-X, I'm unable to provide an accurate or reliable answer. I would recommend checking NVIDIA's official resources or documentation for the most accurate and up-to-date information about their products.", "Based on the provided document, pharmaceutical companies and drug discovery startups are using BioNeMo today. One of the world's leading biotechnology companies is also using the BioNeMo Service to advance its research and development efforts.", "The documentation does not provide specific factors that led to gaming revenue growth in Q4 2024. However, it does mention that there was high demand for gaming and the company believed they would continue to grow between Q4 and Q1 2024, which they usually do not. It can be inferred that these factors, along with others, may have contributed to the gaming revenue growth in Q4 2024.", "The information provided does not include the Q4 FY24 financials. I can provide information on the factors that led to Automotive revenue growth up to Q2 FY23:\n\nQ2 FY23:\n- Strong growth in auto AI solutions, particularly self-driving revenue\n- New energy vehicle design wins ramping up\n- Shipments of Orin-based products just started\n\nQ1 FY23:\n- Increase in AI Cockpit and self-driving revenue\n- New energy vehicle design wins\n\nQ4 FY22:\n- Increase in automotive revenue, driven by AI cockpit and self-driving solutions\n\nQ3 FY22:\n- AI cockpit and self-driving solutions contributed to automotive revenue growth\n\nQ4 FY21:\n- Automotive revenue growth was driven by AI cockpit and self-driving solutions\n\nPlease provide the correct fiscal year and quarter for the Automotive revenue growth inquiry so I can give you accurate information.", "Based on the information provided, H100 revenues were higher than A100 revenues in Q4 2023. This is stated when the speaker compared the performance of H100 and A100 in Q4, saying \"it was a strong quarter for H100.\" Additionally, the speaker mentioned that they began initial shipments of H100 in Q3 and Q4 was an important time for production level, which supports the idea that H100 had a strong performance in Q4. However, it is not explicitly stated if this is an overall statement or only for Q4.", "The higher forecast for datacenter revenue in Q4 FY23 and for the coming year is primarily driven by the tremendous and broad-based demand for the Data Center platform for AI across various industries and customers. This demand visibility extends into next year. Additionally, the supply over the next several quarters is expected to continue ramping up as the company lowers cycle times and works with supply partners to add capacity. The full availability of Hopper in fiscal 4Q is expected to further drive Data Center growth. However, the contribution to Q4 revenue from new products in the next couple of months is expected to be relatively limited, but it could potentially contribute to re-acceleration and growth for Data Center in April and beyond. The price points of these new products will determine their contribution to revenue going forward.", "Based on the provided documentation, the factors that led to gaming revenue growth in Q1 2023 include:\n\n1. New Gaming Product Introductions: The company launched new gaming products in Q1 2023, which contributed to the revenue growth.\n2. High Demand for Gaming: There was still high demand for gaming in Q1 2023, which the company believed would continue from Q4 2022.\n3. Strength of Overall Demand: The company had the strength of overall demand to grow, which also supported the gaming revenue growth in Q1 2023.", "Based on the information provided, it is difficult to quantify the contribution of cryptocurrency mining to gaming revenue in Q1 FY23 with a reasonable degree of precision. However, the text does mention that the reduced pace of increase in Ethereum network hash rate likely reflects lower mining activity on GPUs, which could suggest a diminishing contribution from cryptocurrency mining to gaming revenue. It's important to note that the text also mentions a decline in gaming revenue sequentially in Q2, which may or may not be related to cryptocurrency mining.", "The provided document does not explicitly state the Pro Visualization (Pro Viz) revenue for Q1 FY23. However, it mentions that the revenue for Q1 FY2023 is expected to be $8.1B, with Gaming and Data Center contributing to growth. Since Pro Viz is part of the two main areas that may decline, it's not likely to significantly contribute to the growth. To get the exact Pro Viz revenue for Q1 FY23, you may need to refer to the CFO Commentary published on NVIDIA's Investor Relations website, as suggested in the transcript.", "Based on the provided document, NVIDIA Corp. (NVDA) Q1 2023 Earnings Call Corrected Transcript on May 25, 2022, the document does not provide specific automotive revenue for Q1 FY23. However, it does mention that the company's revenue for Q1 FY23 was $7,643 million.", "Based on the information provided, the data center revenue in Q1 FY23 grew 71% from a year earlier.", "Based on the provided documentation, the main reasons for data center growth in Q1 of FY23 are:\n\n1. Sequential growth: The data center is expected to have a sequential growth in terms of revenue from April to July.\n2. Year-over-year growth: In addition to sequential growth, the data center is also expected to have a growth year-over-year, which may even accelerate past Q1.\n\nThe vast majority of the sequential increase in revenue this quarter is expected to come from the data center. However, the specific key drivers for this growth from April to July are not mentioned in the provided text.\n\nThe document also mentions that there is visibility into the second half of the year, but it is more related to a supply problem rather than the growth of the data center.", "The NVIDIA H100 has nearly a trillion (1,000,000,000,000) transistors in combination.", "The amount on stock repurchase in Q1 FY23 was $2 billion.", "The revenue forecast for Q2 in Q1 of FY23 was $6.3 billion, plus or minus 2%.", "Based on the provided document, NVIDIA's revenue for fiscal year 2022 (FY22) is not explicitly stated. However, the revenues for specific quarters are provided. The revenues for Q4 FY22 are $7,643 million. If you need the revenue for another specific quarter, please provide the quarter.", "Based on the provided document, NVIDIA's gross margins for fiscal year 2022 were not explicitly stated. However, the gross margins for specific quarters within that fiscal year are available. \n\nFor the fourth quarter of fiscal year 2022 (Q4 FY22), the gross margin was 60.2%. For the third quarter of fiscal year 2022 (Q3 FY22), the gross margin was 53.6%. For the fourth quarter of the previous fiscal year (Q4 FY21), the gross margin was 66.0%. \n\nPlease note that gross margins can vary from quarter to quarter, so it's important to consider these figures in the context of the specific periods they represent.", "Based on the provided document, NVIDIA's total operating expenses for FY2022 (fiscal year 2022) were as follows:\n\n- GAAP operating expenses: $5,405 million\n- Non-GAAP operating expenses: $4,215 million\n\nThese figures were calculated by adding the respective items in the \"FY2021 Outlook\" and \"Q4 2023 Earnings Call Corrected Transcript\" sections. Please note that the \"Q4 2023 Earnings Call Corrected Transcript\" section provides the operating expense figures for Q4 FY2023, but since the full FY2022 data is not available, we assume that the Q4 FY2023 figures can be used as a proxy for the missing period in FY2022.", "Based on the information provided, there is no specific net income value given for FY22 (Fiscal Year 2022) for NVIDIA. The documents contain the outlook for Q2 FY2024 and the GAAP operating expenses for FY2021, but no net income value for FY22.", "I'm sorry for any confusion, but the provided document only contains reconciliation data for Q2 FY2017 and Q1 FY2018. There is no information about NVIDIA's diluted earnings per share in FY22. I would recommend checking the latest financial reports or SEC filings from NVIDIA's official website or the SEC's EDGAR database to find this information.", "The provided document does not include the operating income for NVIDIA for the full fiscal year 2022 (FY22). It only provides the GAAP gross profit for the three months ended May 1, 2022. To find the operating income for FY22, you would need to look at NVIDIA's full financial statements for that fiscal year.", "The provided document does not contain the specific revenue of NVIDIA for the full fiscal year 2021 (FY21). It only mentions the expected GAAP operating expenses for Q3 and Q4 of FY21, and the GAAP and non-GAAP operating expenses for the full year, but not the revenue. To find the revenue information, you would need to refer to a different or more complete source.", "Based on the provided document, the following are the gross margins for NVIDIA in FY21:\n\n- Q1 FY2021 Outlook:\n - GAAP gross margin: 65.0%\n - Non-GAAP gross margin: 65.4%\n- Q3 FY2021 Outlook:\n - GAAP gross margin: 62.5%\n - Non-GAAP gross margin: 65.5% (62.5% + 3.0%)\n- Q4 FY2021 Outlook:\n - GAAP gross margin: 62.8%\n - Non-GAAP gross margin: 65.5% (62.8% + 2.7%)\n\nPlease note that the non-GAAP gross margin for Q3 and Q4 includes the impact of stock-based compensation expense, acquisition-related costs, and other costs. The document does not provide the non-GAAP gross margin for Q1, but it can be calculated as 65.0% + 0.4% = 65.4%.", "Based on the provided document, NVIDIA's GAAP operating expenses for FY2021 are expected to be approximately $5,700 million, and the non-GAAP operating expenses for FY2021 are expected to be approximately $4,100 million.", "The provided document does not include the net income for NVIDIA in FY21. The information given is about the GAAP operating expenses and Non-GAAP operating expenses for FY21. To find the net income, you would need to look at the income statement for FY21, which is not provided in this text.", "The provided document does not include the diluted earnings per share (EPS) for NVIDIA's FY21. The document contains reconciliation tables for GAAP to non-GAAP outlook for Q1 FY2021 and Q2 FY2017, but it does not have the required information for FY21 diluted EPS. To find this information, you would need to look at NVIDIA's official financial statements for FY21.", "The provided document does not include the reported operating income for NVIDIA in FY21. It only provides the outlook for GAAP and non-GAAP operating expenses. The GAAP operating expenses for FY21 are expected to be around $5,700 million, while the non-GAAP operating expenses are expected to be around $4,100 million. To find the reported operating income, you would need to refer to the actual financial report for FY21.", "Based on the information provided, the question is asking about the non-GAAP revenue for NVIDIA in fiscal year 2022 (FY22). However, the information provided only includes the reconciliation of GAAP to non-GAAP gross margin for Q1 and Q2 of FY2022, as well as the reconciliation of GAAP to non-GAAP outlook for Q2 of FY2024.\n\nThere is no information provided about the non-GAAP revenue for NVIDIA in FY22. Therefore, I cannot provide an answer to this question without additional information.", "Based on the information provided, NVIDIA's non-GAAP Gross Margin outlook for Q2 FY2022 is not explicitly stated. However, it can be calculated by subtracting the Impact of stock-based compensation from the GAAP gross margin.\n\nThe document states:\nGAAP gross margin: 64.6%\nImpact of stock-based compensation: Not explicitly stated\n\nAssuming the Impact of stock-based compensation is a reduction to the gross margin, we can calculate the non-GAAP Gross Margin as follows:\n\nNon-GAAP Gross Margin = GAAP gross margin - Impact of stock-based compensation\n\nNon-GAAP Gross Margin = 64.6% - Impact of stock-based compensation\n\nThe Impact of stock-based compensation is not explicitly provided, so I cannot give a specific non-GAAP Gross Margin percentage for FY22. However, the document does provide the non-GAAP Gross Margin for Q3 FY2021, which is:\n\nNon-GAAP Gross Margin (Q3 FY2021) = 62.5% + 3.0% (Impact of stock-based compensation, acquisition-related costs, and other costs)\nNon-GAAP Gross Margin (Q3 FY2021) = 65.5%\n\nSo, NVIDIA's non-GAAP Gross Margin for Q3 FY2021 was 65.5%.", "I'm sorry for any confusion, but the information provided in the context only discusses the financial results for the first quarter of fiscal 2021. It does not include the non-GAAP operating expenses for FY22 (Fiscal Year 2022). To provide an accurate response, I would need access to the financial documentation for the specific periods you're interested in. Could you please provide more context or specify the correct fiscal year?", "The information provided does not include the actual non-GAAP net income for NVIDIA in FY22. The table shows the reconciliation of GAAP to non-GAAP outlook for Q2 FY2022 and Q1 FY2022, but it does not provide the actual non-GAAP net income for FY22. To find this information, you would need to refer to NVIDIA's financial statements for FY22.", "The information provided does not include the actual non-GAAP diluted earnings per share for NVIDIA in FY22. The text only contains the outlook for Q2 FY2022 and Q1 FY2022, which includes the GAAP gross margin and the impact of stock-based compensation. The income tax impact of non-GAAP adjustments, including the recognition of excess tax benefits or deficiencies related to stock-based compensation under GAAP accounting standard (ASU 2016-09) is also provided. However, the actual non-GAAP diluted earnings per share for FY22 is not available in the text.", "The information provided does not include NVIDIA's non-GAAP reported operating income for FY22. To access this information, you can refer to the reconciliation of non-GAAP financial measures to GAAP financial measures in the CFO Commentary posted on NVIDIA's website.", "Based on the document provided, NVIDIA's GAAP revenue for the fiscal year 2022 (FY22) is not explicitly stated. However, the GAAP revenue for the three months ended May 1, 2022, is given as $5,079 million. To get the GAAP revenue for the entire fiscal year 2022, you would need the monthly or quarterly revenue data for the whole fiscal year. If the revenues for the remaining months or quarters are available, you could calculate the total GAAP revenue for FY22. Unfortunately, the document does not provide this information.", "Based on the provided document, NVIDIA's GAAP gross margins for FY22 (fiscal year 2022) were as follows:\n\n- Q2 FY22: 64.6%\n- Q3 FY22: 65.2%\n- Q4 FY22: Not provided directly in the document, but it can be inferred to be 53.6% based on the Q4 FY23 gross margin of 63.3% and the note that it decreased from the prior year (FY22 Q4 to FY23 Q4).\n\nPlease note that this information is based on the provided document and may not include any updates or changes that occurred after the document was created.", "Based on the information provided, NVIDIA's GAAP operating expenses for the fiscal year 2022 (FY22) are not explicitly stated. However, the text does provide the GAAP operating expenses for the second quarter of fiscal year 2024 (Q2 FY2024) as $2,710 million and for fiscal year 2021 (FY2021) as $5,700 million. FY22 operating expenses fall between these two values. Without further context or more detailed data, I cannot provide a more specific answer. I recommend checking NVIDIA's official financial statements or contacting their investor relations department for the most accurate information.", "Based on the information provided, the document does not contain specific GAAP net income values for fiscal year 2022 (FY22). It only provides the GAAP net income for the first quarter of fiscal 2021 ($1,120 million). To answer your question, I would need access to more recent data or information about NVIDIA's financial performance in FY22.", "I'm sorry for any confusion, but the provided document only contains information up to Q2 FY2017. It does not contain the GAAP diluted earnings per share information for FY22. To get this information, you would need to refer to NVIDIA's official financial statements or reports for FY22, which should be available on their investor relations website.", "Based on the information provided, the non-GAAP gross margin for NVIDIA in FY21 (fiscal year 2021) can be calculated as follows:\n\nFor Q3 FY2021, the GAAP gross margin was given as 62.5%. The reconciliation of GAAP to non-GAAP outlook indicated an impact of 3.0% for stock-based compensation expense, acquisition-related costs, and other costs. Therefore, the non-GAAP gross margin for Q3 FY2021 would be:\n\n62.5% (GAAP gross margin) - 3.0% (non-GAAP adjustments) = 59.5% (non-GAAP gross margin)\n\nHowever, the information for other quarters in FY21 is not provided. Therefore, I can only provide the non-GAAP gross margin for Q3 FY2021.", "The provided document does not include the information about NVIDIA's non-GAAP revenue for FY21. The document contains reconciliations of GAAP to non-GAAP outlook for gross margin and operating expenses for certain quarters of FY21, but not revenue.", "Based on the information provided, the non-GAAP gross margin for NVIDIA in FY21 (fiscal year 2021) can be calculated as follows:\n\nFor Q3 FY2021, the GAAP gross margin was given as 62.5%. The reconciliation of GAAP to non-GAAP outlook indicated an impact of 3.0% for stock-based compensation expense, acquisition-related costs, and other costs. Therefore, the non-GAAP gross margin for Q3 FY2021 would be:\n\n62.5% (GAAP gross margin) - 3.0% (non-GAAP adjustments) = 59.5% (non-GAAP gross margin)\n\nHowever, the information for other quarters in FY21 is not provided. Therefore, I can only provide the non-GAAP gross margin for Q3 FY2021.", "Based on the provided document, NVIDIA's non-GAAP operating expenses for fiscal year 2021 were not explicitly stated. However, the document does provide the non-GAAP operating expenses for the first quarter of fiscal 2021, which were $1.83 billion. \n\nTo get the non-GAAP operating expenses for the entire fiscal year 2021, we would need additional information which is not provided in the text. Therefore, I'm unable to provide the full year non-GAAP operating expenses based on the given document.", "The provided document does not contain specific financial information for NVIDIA's fiscal year 2021 (FY21) in terms of non-GAAP net income. The document contains financial outlooks for Q1 FY2021 and Q4 FY2021, as well as comparisons of GAAP and non-GAAP measures for fiscal years 2020 (FY20) and 2019 (FY19). However, it does not provide the non-GAAP net income for FY21. To find this information, you would need to refer to NVIDIA's official earnings release or financial statements for FY21 when they become available.", "The provided document does not include the information necessary to answer this question. The reconciliation tables are for Q2 FY2017 and Q3 FY2021 outlooks, and they do not contain any data about FY21 earnings. Additionally, the tables do not include any diluted earnings per share data, GAAP or non-GAAP, for any of the periods mentioned.", "The information provided does not include the non-GAAP operating income for NVIDIA in FY21. The text only provides the non-GAAP gross margin for Q1 FY2021 Outlook and the GAAP operating expenses for Q1 FY2021 Outlook and full year. To find the non-GAAP operating income for FY21, additional information is required.", "Based on the provided document, NVIDIA's GAAP revenue for the first quarter of fiscal year 2021 (three months ended May 2, 2021) is $5,661 million.\n\nHere's where I found this information:\n- The document contains condensed consolidated statements of income for NVIDIA Corporation.\n- In the table, there are two rows labeled \"Revenue\" with their respective amounts in millions.\n- The first row, labeled \"Revenue,\" shows the amount $5,661 for the three months ended May 2, 2021, which is the GAAP revenue for FY21 Q1.", "Based on the provided document, the GAAP gross margins for NVIDIA in FY2021 were 62.5% for Q3 and 62.8% for Q4. However, the GAAP gross margins for the full FY2021 are not provided in the document.", "NVIDIA's GAAP operating expenses for FY21 are expected to be approximately $5,700 million. This amount includes stock-based compensation expense, acquisition-related costs, and other costs.", "The provided document does not include the specific financial information for NVIDIA's fiscal year 2021 (FY21) GAAP net income. It only contains the outlook for Q1 FY2021. To get the full FY21 GAAP net income, you would need to refer to NVIDIA's annual report for that fiscal year.", "Based on the provided document, NVIDIA's GAAP diluted earnings per share for FY21 was $1.47.", "Based on the information provided, NVIDIA's GAAP operating expenses for FY21 are expected to be approximately $5,700 million. However, the reported GAAP operating income is not provided in the text. To find this information, you would need to look at NVIDIA's full financial report for FY21. The GAAP operating income can be calculated by subtracting the GAAP operating expenses from the GAAP revenue.", "Based on the information provided, the termination of the ARM purchase did not have a direct financial impact on NVIDIA, as the deal did not go through. However, the termination may have had indirect financial consequences, such as the potential loss of financial benefits and other benefits that NVIDIA expected to realize from the transaction. Additionally, NVIDIA may have incurred costs associated with the termination of the agreement, such as legal fees and other expenses.\n\nIt's also worth noting that the termination of the ARM purchase may have had broader financial implications for NVIDIA, such as the impact on its business relationships, operating results, and business generally. The announcement or pendency of the transaction may have caused delays, disruptions, or increased costs in the integration of Arm's technology in existing or new products. Additionally, the short- and longer-term effects of the COVID-19 pandemic and negative changes in general economic conditions in the regions or the industries in which NVIDIA operates may have also affected NVIDIA's financial performance.\n\nHowever, without further information, it is difficult to provide a more specific answer to your question.", "NVIDIA paid a total of $396 million in dividends to shareholders in FY21.\n\nHere's the calculation:\n\nIn the third quarter of FY21, NVIDIA paid $99 million in dividends.\nIn the fourth quarter of FY21, NVIDIA paid $297 million in dividends (as per the given data, the revenue for Q4 FY21 is $5,665 million, and the dividends per share are $0.16; using this information, we can calculate the total dividends paid in Q4 FY21: $5,665 million * ($0.16 / $4.00) = $297 million, assuming a share price of $4.00 for the dividend calculation).\n\nSo, the total dividends paid in FY21 are $99 million (Q3) + $297 million (Q4) = $396 million.", "NVIDIA's revenue in FY 2020 (which I'm assuming is the fiscal year 2020) was $10,918 million. This information is provided in the text before the question.", "NVIDIA's gross margin in FY20 (fiscal year 2020) was 62.5%. This information can be found in the table provided, under the column labeled 'FY20' for 'Gross margin'.", "Based on the provided document, the operating expenses for NVIDIA Corp. (NVDA) for FY 2020 are not explicitly stated. However, it does mention that for Q1 2021, GAAP operating expenses are expected to be approximately $2.53 billion and non-GAAP operating expenses are expected to be approximately $1.78 billion. Since Q1 is the first quarter of the fiscal year, these figures could be indicative of the operating expenses for the entire fiscal year. However, this is an assumption and the actual figures for FY 2020 could be different.", "NVIDIA's net income in FY 2020 was $3,580 million. This information can be found in the 'NVIDIA CORPORATION CONDENSED CONSOLIDATED STATEMENTS OF INCOME' table provided in the documentation. Under the column 'FY20' in the 'Net income' row, the value $3,580 is listed.", "The provided document does not contain the specific information about NVIDIA's diluted earnings per share in FY 2020. The reconciliation table is for Q2 FY2017 only. To find the diluted earnings per share for FY 2020, please refer to NVIDIA's official financial statements or financial reports for that fiscal year.", "NVIDIA's reported operating income in FY 2020 was $3,735 million. This information can be found in the documentation provided, in the FY20 row under the 'Operating income' column.", "Based on the information provided, NVIDIA paid a total of $99 million in dividends in the third quarter of the fiscal year 2021 (FY20). However, the documentation does not provide information about the dividends paid in other quarters of FY20. Therefore, it is not possible to give a complete answer to your question using the provided information alone.", "NVIDIA paid a total of $396 million in dividends to shareholders in FY21.\n\nHere's the calculation:\n\nIn the third quarter of FY21, NVIDIA paid $99 million in dividends.\nIn the fourth quarter of FY21, NVIDIA will pay $0.16 per share in dividends to all shareholders of record on December 4, 2020. To calculate the total dividends paid in Q4 FY21, we need more information about the number of shares and the record date.\n\nHowever, since the question asks for the total dividends paid in FY21, we can use the information provided for Q3 FY21 and assume that the dividends per share for the other quarters in FY21 are the same as Q3 FY21.\n\nTherefore, the total dividends paid in FY21 would be:\n\nQ3 FY21: $99 million\nQ4 FY21: $99 million (assuming the same dividends per share as Q3 FY21)\nQ1 FY22: $99 million (assuming the same dividends per share as Q3 FY21)\nQ2 FY22: $99 million (assuming the same dividends per share as Q3 FY21)\n\nAdding up the dividends paid in each quarter of FY21, we get:\n\n$99 million + $99 million + $99 million + $99 million = $396 million\n\nSo, NVIDIA paid a total of $396 million in dividends to shareholders in FY21.", "NVIDIA announced the earnings for the first quarter of fiscal year 2024 on May 24, 2023.", "Project Helix is a joint initiative by Dell and NVIDIA that delivers full-stack solutions with technical expertise and pre-built tools. It is designed to help enterprises use their proprietary data and deploy generative AI responsibly and accurately. The project provides purpose-built AI models for quickly building topical, safe, and secure generative AI chatbots using a large language model framework. It also includes security and privacy features built into foundational components, such as Secured Component Verification, which can be done on-premises. Project Helix will be integrated into third-party services, such as those offered by ServiceNow and Adobe, enabling the creation of generative AI content.", "Yes, NVIDIA uses RTX technology in GeForce NOW. This includes real-time ray tracing and AI-powered graphics. The Ada architecture features DLSS 3, NVIDIA's third generation AI-powered graphics, which significantly boosts performance. For example, the game Cyberpunk 2077 recently added DLSS 3, enabling a 3x to 4x boost in frame rate performance at 4K resolution.", "Based on the provided document, GH200 is a new accelerated computing platform from NVIDIA designed to meet the surging demand for generative AI. It offers 3.5x more memory capacity and 3x more bandwidth than the current generation. Specifically, it comprises a single server with 144 Arm Neoverse cores, eight petaflops of AI performance, and 282GB of the latest HBM3e memory technology. It will be available to several customers, including Taiwan manufacturers, who will bring to market a wide variety of systems for HPC workloads. The GH200-powered systems join more than 400 system configurations powered by different combinations of NVIDIA's latest CPU, GPU, and DPU architectures, including NVIDIA Grace, Hopper, Ada Lovelace, and BlueField.", "The text provided does not contain information about the availability or purchase locations for the RTX 40 series GPUs, as they are not yet released. The text only mentions the availability of the GeForce RTX 30 series GPUs, which can be purchased from add-in card providers such as ASUS, Colorful, EVGA, Gainward, Galaxy, Gigabyte, Innovision 3D, MSI, Palit, PNY and Zotac, as well as from the Nvidia website (www.nvidia.com) and in gaming systems built by various manufacturers. The RTX 3080 will be available starting Sept. 17 and the RTX 3090 will be available starting Sept.\n\nPlease check the manufacturer's website or contact them directly for the most up-to-date information on the availability of the RTX 40 series GPUs.", "The non-GAAP gross margin in fiscal 2023 (which includes Q2) is guided to be 66%, while in fiscal 2022, the non-GAAP gross margins were 55.7%. Therefore, gross margins improved by 66% - 55.7% = 10.3 percentage points in fiscal 2023 compared to fiscal 2022.", "The document states that the non-GAAP gross margins for fiscal 2023 are being guided at 66%, which would be a record for the company. However, it does not provide specific information about how much non-GAAP gross margins improved in fiscal 2023 compared to 2022. Therefore, I cannot provide an answer to this question without additional information.", "The information provided does not include specific data on how GAAP gross margins improved in fiscal 2023 compared to 2022. The text mentions that Q2 non-GAAP gross margins are expected to be at 66%, which would be a record gross margin quarter. It also states that for the remainder of the year, gross margins are expected to return to the mid-70s percent range. However, it does not provide a direct comparison to fiscal 2022 GAAP gross margins.", "The revenue guidance for the fourth quarter of fiscal year 2024 (FY24 Q4) is expected to be $13,507 million, plus or minus 2%. This information was provided in the context of a discussion about the company's financial results and outlook, and it is the most current and relevant information available. It is important to note that this guidance is subject to change and may be affected by various factors, including changes in market conditions and the company's business operations.", "Based on the provided documentation, the outlook for FY24 Q4 OpEx reflects incremental expenses in primarily two different areas: compensation and depreciation. However, the exact figures or specific breakdowns are not provided in the text. Furthermore, the text mentions that there is usually seasonality in Gaming that results in a downward trend from Q4 to Q1. Still, due to supply constraints in Q4, the actual impact on OpEx remains to be seen. The OpEx is expected to be relatively flat as the company moves from Q4 to Q1. But again, the exact OpEx guidance for FY24 Q4 is not explicitly stated in the text.", "Based on the information provided, the company expects to grow non-GAAP operating expenses at a similar percentage as in FY2022 for the FY. However, there is no specific guide mentioned for GAAP Q4 operating expenses (GAAP OpEx) for FY24. The closest guide available is for the full year FY24, where the company has mentioned an approximate GAAP level expense of $1.55 billion. This includes stock-based compensation and the accounting for an expected $1.6 billion. Additionally, both GAAP and non-GAAP other operating, other income and expenses are expected to be an expense of approximately $55 million, excluding gains and losses on non-affiliated investments.\n\nTherefore, without further information, it is not possible to provide a specific guide for FY24 GAAP Q4 opex.", "Based on the information provided, the document does not include a specific guide for FY24 non-GAAP Q4 operating expenses. The information provided covers preliminary results for Q2 FY23 and expectations for the full FY23, but it does not extend to FY24.", "Based on the provided document, the outlook for the fourth quarter of fiscal 2024 is not mentioned. The document provides the outlook for Q4 of fiscal 2021, Q4 of fiscal 2022, and the expectation of sequential growth in Q1 of fiscal 2024, but it does not mention the revenue outlook for Q4 of fiscal 2024.", "The outlook for FY24 Q4 Operational Expenses (OpEx) is expected to reflect incremental OpEx in primarily two different areas: compensation and depreciation. The company has slowed OpEx growth, balancing investments for long-term revenue growth while managing near-term profitability. The full year non-GAAP OpEx is expected to grow over 30%. However, the exact figures for FY24 Q4 OpEx were not provided in the text.", "Based on the provided documentation, the outlook for FY24 GAAP Q4 operating expenses (opex) is approximately $2.59 billion.", "Based on the information provided, the non-GAAP operating expenses (OpEx) outlook for Q4 FY2024 is $1,900 million. This information can be found in the Q2 FY2024 Outlook section of the text.", "The FY 2024 Q4 GAAP GM (Gross Margin) outlook was not provided in the given context. The context only contains the query and does not have any associated documentation or information to provide an answer.", "Based on the information provided, the outlook for FY 2024 Q4 non-GAAP gross margin is expected to be 67%. This measure is a non-GAAP financial measure and is not meant to be considered in isolation or as a substitute for the company's financial results prepared in accordance with GAAP. The company's non-GAAP measures may be different from those filed on Form 8-K with the Securities and Exchange Commission.", "Based on the information provided, the outlook for FY 2024 Q4 GAAP gross margin was not mentioned. The text only provides the outlook for Q3 FY2024 GAAP gross margin, which is 71.5%. For Q2, the non-GAAP gross margin is guided to be 66%, and for the remainder of the year, gross margins are expected to return to the mid-70s percent range. However, specific details about Q4 GAAP gross margin were not provided.", "Based on the information provided, the outlook for Q4 FY2024 non-GAAP gross margin was not mentioned. The outlook provided was for Q3 FY2024 with a non-GAAP gross margin of 72.5%. The company did mention a guidance for Q2 non-GAAP gross margins at 66%, but there is no information available for Q4.", "Based on the information provided, there is no specific guide for FY 2024 Q4 GAAP gross margin. The document provides the GAAP gross margin for Q3 FY2024 at 71.5%, and it mentions that gross margins are expected to return to the mid-70s percent range for the remainder of the year. However, it does not provide a specific GAAP gross margin guide for Q4 FY2024.", "Based on the information provided, the non-GAAP gross margin guide for Q4 FY2024 is not available. The outlook provided in the text only covers Q3 FY2024. The non-GAAP gross margin for Q3 FY2024 is guided to be 72.5%.", "The GAAP gross margin (GM) for the fourth quarter of fiscal year 2024 is expected to be in a range of 64.1%, plus or minus 50 basis points.", "Based on the information provided, the specific guidance for FY 2024 Q4 non-GAAP Gross Margin (GM) was not given. The text mentions that Q2 non-GAAP gross margins are guided at 66%, and for the remainder of the year, gross margins are expected to return to the mid-70s percent range. However, it does not mention the GM guide for FY 2024 Q4.", "The GAAP Operating Income (OI) for Q3 FY24 is $0.94 million.", "Based on the information provided, the non-GAAP gross margin for the current quarter (Q2) is guiding at 66%, which is a 40 basis points expansion from a year earlier. However, the GAAP gross margin for the first quarter was down 100 basis points from a year earlier. The rest of the P&L and gross margin for Q3 were not provided in the text.", "Based on the information provided, the gross margins are guided to reduce by 50 basis points sequentially in the current quarter (which is the October quarter). However, the exact numerical value of the gross margin for the current quarter was not provided in the text.", "Based on the information provided, the GAAP gross margin for Q3 FY2024 is expected to be 71.5%, and the Non-GAAP gross margin is expected to be 72.5%. This represents a 1.0% expansion due to the impact of stock-based compensation expense, acquisition-related costs, and other costs being excluded in the Non-GAAP gross margin calculation.", "Based on the provided document, the non-GAAP gross margin for Q3 FY2024 is expected to be 72.5%, which is 1.0% higher than the GAAP gross margin that includes stock-based compensation expense, acquisition-related costs, and other costs. Therefore, we can infer that gross margins are expected to expand in Q3 FY24.", "Based on the information provided in the document, the total 2023 data center revenue was not given. The document only provides the data center revenue for the third quarter of fiscal 2023, which was $3.75 billion. Additionally, the document mentions that the outlook for the fourth quarter of fiscal 2023 is for data center revenue to reflect early production shipments, but the specific revenue amount is not provided. Therefore, I am unable to provide the total 2023 data center revenue based on the information given.", "The total gaming revenue in FY 22 was $12.5B, which was up 61% from the previous fiscal year. This information can be inferred from the statement that \"The fiscal-year revenue of $12.5B was up 61%\" and the context provided in the question.", "The exact total data center revenue for the fiscal year 2022 (FY 22) was not provided in the text. The text only mentions that a vast majority of the sequential increase in revenue this quarter will come from Data Center and that the outlook for the fourth quarter of fiscal 2023 expects Data Center revenue to reflect early production shipments.", "The total Pro Visualization revenue in FY 22 is not explicitly provided in the text. However, it is mentioned that the Pro Visualization business is expected to be \"flattish\" in Q2 FY22, meaning it might not grow compared to the previous quarter. But there is no information on the revenue for the entire FY22.", "The total gaming revenue in FY 23 (fiscal year 2023) was $12.5 billion. This information can be found in the provided documentation, where it states \"Fiscal-year revenue of $12.5B was up 61%\" under the section for Gaming.", "The exact total data center revenue for the fiscal year 2022 (FY 22) was not provided in the text. The text only mentions that a vast majority of the sequential increase in revenue this quarter will come from Data Center and that the outlook for the fourth quarter of fiscal 2023 expects Data Center revenue to reflect early production shipments.", "The total Pro Viz revenue in FY 23 is not provided in the content you've given. The content only contains the instruction for me to use the information provided before the question, but no such information is provided.", "The total gaming revenue in FY 21 was $12.5B, which was up 61% from the previous fiscal year. This information can be inferred from the statement that \"the fiscal-year revenue of $12.5B was up 61%\" and the context of the discussion being focused on gaming revenue.", "Based on the information provided, the total Data Center revenue for fiscal year 2021 was not explicitly given. However, it was mentioned that the Data Center revenue for the third quarter of fiscal 2021 is expected to be up in the low to mid-single digits sequentially. The sequential growth is calculated by comparing the revenue of one quarter to the revenue of the immediately preceding quarter. \n\nTo find the total Data Center revenue for FY 21, you would need to know the Data Center revenue for at least one other quarter in FY 21, preferably the quarter immediately preceding the third quarter, to calculate the sequential growth and apply it to the third quarter's Data Center revenue. \n\nWithout that information, I cannot provide the total Data Center revenue for FY 21.", "Based on the provided documentation, the total Pro Visualization (Pro Viz) revenue for Fiscal Year 2021 (FY 21) is not explicitly stated. However, it does mention that Pro Viz is expected to be \"flattish\" and likely not growing in FY 21. The total revenue for FY 21 is given as $16,675 million. If you have the revenue for Pro Viz in FY 20, you could potentially estimate the FY 21 revenue based on the \"flattish\" comment, but that would be an approximation at best.", "I don't have access to specific financial data about automotive revenues for FY 21. You may be able to find this information from financial news sources, company financial reports, or financial databases.", "The revenue for gaming in FY 21 (fiscal year 2021) is $7,137 million. This information can be found in the provided document under the \"Gaming\" section, which lists the revenue for each quarter of FY 21. To find the total revenue for FY 21, simply add the revenue for each quarter together.\n\nHere is the revenue for gaming for each quarter of FY 21:\n\n* Q1: $2,070 million\n* Q2: $2,270 million\n* Q3: $2,277 million\n* Q4: $2,520 million\n\nTotal revenue for gaming in FY 21 = $2,070 + $2,270 + $2,277 + $2,520 = $7,137 million.", "The revenue for gaming in FY 21 (fiscal year 2021) is $7,137 million. This information can be found in the provided document under the \"Gaming\" section, which lists the revenue for each quarter of FY 21. To find the total revenue for FY 21, simply add the revenue for each quarter together.\n\nHere is the revenue for gaming for each quarter of FY 21:\n\n* Q1: $2,070 million\n* Q2: $2,270 million\n* Q3: $2,277 million\n* Q4: $2,520 million\n\nTotal revenue for gaming in FY 21 = $2,070 + $2,270 + $2,277 + $2,520 = $7,137 million.", "The revenue for Pro Viz in FY 21 was $6,507 million, as per the provided Q2 FY22 and Q3 FY21 financial documentation.", "The revenue for automotive in FY 21 is $111 million.", "To answer this question, we need to look at the revenue figures for Proviz for the year 2022 and compare it to the revenue figure for the previous year. However, the provided document does not contain specific revenue figures for Proviz. Therefore, I am unable to provide an answer to this question based on the information given.", "Based on the information provided, the gaming revenue for the fiscal year 2022 (which ended on January 30, 2022) was $12.5 billion, which represents a 61% increase from the previous fiscal year. Therefore, yes, gaming revenue did increase in 2022 from the previous year. However, it's important to note that the most recent quarterly revenue for gaming (Q2 of fiscal year 2023) was down 44% sequentially and 33% from the prior year, primarily reflecting weaker than forecasted Gaming revenue.", "The documentation provided does not contain information about data center revenue for the year 2022 or its comparison to the previous year. The data provided is as follows:\n\n* \"2020123793153844\"\n* \"202013922701263953\"\n* \"20171113001206496\"\n* \"2012012787424940\"\n* \"2016941138059906\"\n* \"2016014447784981\"\n* \"201595142279215\"\n* \"199531429122662\"\n* \"201412278701205\"\n* \"214322474244494\"\n* \"201312185114382\"\n* \"199419682090735\"\n\nAdditionally, the questions in the documentation are not related to data center revenue. They are:\n\n* \"what is in this image?\"\n* \"how many images have been downloaded of the session so far?\"\n* \"what is in this image?\"\n\nTherefore, I cannot answer the question about data center revenue increase in 2022 from the previous year.", "Yes, the documentation states that there was strong growth in the automotive revenue in 2022, with a sequential increase of 59% and a year-over-year increase of 45%. This growth was driven by AI solutions for the automotive industry, particularly in self-driving technology and new energy vehicle design wins. Therefore, it can be inferred that the automotive revenue did increase in 2022 from the previous year.", "The provided document does not contain the gaming revenue for 3Q 2024.", "The documentation states that the Colette, in the question, attributes the vast majority of the sequential increase in revenue in Q1 fy24 to the Datacenter business. However, the specific details about what led to this datacenter growth in Q1 fy24 are not provided in the question. Therefore, I don't have enough information to answer this question. It would be best to refer to the documentation for specific details about the growth drivers of the Datacenter business in Q1 fy24.", "The provided document does not contain the specific information about the gaming business in Q1 FY24. The only given information about the gaming segment is that it will contribute to the growth in Q1 FY2023, with revenue expected to be $8.1B, but it does not mention the performance of the gaming business in Q1 FY24. For more detailed information about the gaming business in Q1 FY24, please refer to the latest updates or financial reports on the company's Investor Relations website.", "The document does not explicitly provide information on what led to gaming growth in Q1 FY24. However, it does mention that there was high demand for gaming, which likely contributed to the growth.", "Based on the information provided, the data center business is expected to have a sequential growth in Q1 of fiscal year 24, and also a year-over-year growth. In fact, the year-over-year growth for the data center business is expected to accelerate beyond Q1. However, there are still some supply constraints in certain areas, and the company is working to improve this for future quarters.", "Based on the information provided, NVIDIA returned approximately $1.15 billion to shareholders in the form of share repurchases and cash dividends in the third quarter of fiscal 2024. However, the specific amount of dividends returned to shareholders in Q1 FY24 is not provided in the text. Therefore, I cannot accurately answer this question without additional information.", "InfiniBand is different than Ethernet in several ways. Firstly, InfiniBand is not just a network but also a computing fabric, which means it includes software-defined capabilities including computation. It can perform 40-point calculations and computation right on the switch and in the data centers.\n\nSecondly, InfiniBand has a low latency and high bandwidth, making it ideal for high-performance computing, artificial intelligence, and machine learning workloads. It has an adaptive routing feature that enables it to optimize traffic flow, reducing latency and improving performance.\n\nThirdly, InfiniBand has built-in reliability, availability, and serviceability (RAS) features, which are essential for mission-critical applications. It has end-to-end flow control, which ensures that data is transmitted reliably, even in congested networks.\n\nLastly, InfiniBand has a different physical layer than Ethernet, which allows it to achieve higher speeds over shorter distances. It uses a switched fabric topology, which enables it to scale better than Ethernet in large-scale systems.\n\nIn summary, InfiniBand is a high-performance, low-latency, and reliable computing fabric that is optimized for high-performance computing, artificial intelligence, and machine learning workloads. It is fundamentally different from Ethernet in several ways, including its physical layer, topology, and software-defined capabilities.", "The provided document discusses the potential of generative AI's diverse set of inference workloads and how NVIDIA platforms are optimized for these tasks. The L4 platform, specifically designed for AI video, can deliver 120 times more AI-powered video performance than CPUs. This indicates that NVIDIA's specialized hardware and software for generative AI inference can significantly outperform traditional CPUs.\n\nThe interviewee, JH, also mentions that \"inference will be the way software is operated in the future,\" implying that inference's importance will grow as software development and deployment evolve.\n\nGiven this information, it can be inferred that inference for generative AI is a significant opportunity for NVIDIA because their optimized platforms can provide substantial performance benefits for these workloads. As the demand for generative AI applications grows, so will the market opportunity for NVIDIA's inference solutions.\n\nHowever, the document does not explicitly address the consumer AI GPU market. While NVIDIA's gaming GPUs, like the 4090, can be used for some generative AI tasks, a consumer-focused AI GPU may offer additional features and optimizations tailored to this specific use case. NVIDIA might see a market opportunity in creating a dedicated AI GPU for consumers as the demand for generative AI applications increases.", "The information provided does not include specific data for the year 2023. However, it does mention that there was a sudden slowdown in consumer demand for gaming due to macroeconomic headwinds across the world, which led to a decline in Gaming GPU revenue in a certain quarter. This decline was sharper than anticipated and was driven by both lower units and lower ASPs (average selling prices).\n\nAs for the future outlook, it is expected that Gaming will decrease not in the dollar amount that it decreased between Q1 and Q2 of the fiscal year. For the third quarter of fiscal 2021, it is expected that Gaming will be up just over 25% sequentially.\n\nTherefore, based on the information provided, it is not possible to answer why gaming declined in 2023.", "Based on the provided document, the gaming revenue in 2023 was down 46% from the previous year. This was explained by Colette M. Kress, Executive Vice President & Chief Financial Officer, NVIDIA Corp. She stated that the fiscal year revenue of $9.07 billion was down 27%. However, the specific reasons for this decrease were not provided in the text. Therefore, I cannot answer this question without speculating.", "The information provided does not include specific details about the gaming business in 2023. The only information given about the gaming business is for the third quarter of fiscal 2021, where it is expected to be up just over 25% sequentially. To provide an accurate answer, I would need more specific information about the gaming business in 2023.", "The current CEO, as mentioned in the provided documentation, is Jensen Huang, who is the President, Chief Executive Officer, and Director of NVIDIA Corp.", "Based on the provided document, the current CEO of NVIDIA is Jensen Huang.", "The Chief Financial Officer at NVIDIA is Colette M. Kress.", "The Chief Financial Officer (CFO) and Executive Vice President of NVIDIA Corporation is available at . The CFO's name is not explicitly mentioned in the provided text snippet.", "The Chief Financial Officer (CFO) is Colette M. Kress, as stated in both provided text snippets.", "Based on the information provided, the current Chief Financial Officer (CFO) is the person responsible for managing the financial risks of the organization. However, I cannot provide a specific name because the documentation did not specify who the current CFO is.", "Based on the provided document, Kress is the current Chief Financial Officer (CFO) and Executive Vice President at NVIDIA Corp. This information can be found in the opening lines of the text.", "The provided document does not contain information about the Chief Operating Officer (COO) of NVIDIA.", "The documentation does not provide information on the head of operations at NVIDIA. The executive officers and directors mentioned are Jensen Huang (President and CEO), Colette Kress (CFO and EVP), and Michael A. Hara (Director). There is no explicit mention of a head of operations.", "The Head of Finance at NVIDIA is Colette M. Kress, who is the Chief Financial Officer & Executive Vice President.", "The EVP (Executive Vice President) of Operations at NVIDIA is John Burns, as of the information available up to 2021. However, I would recommend checking the most recent and official NVIDIA corporate leadership webpage or contact to confirm, as executive roles can change.", "The text provided does not explicitly mention who the current head of operations at NVIDIA is. It mentions the retirement of Shannon Taylor and the appointment of Brian Cabrera as the senior vice president and general counsel, but it does not mention the head of operations. You may need to look at more recent documentation or contact NVIDIA directly to find this information.", "The provided text does not contain information about the current head of operations.", "Based on the information provided, the data center is a significant opportunity for NVIDIA in 2024 due to the following reasons:\n\n1. Strength across the board in data centers: NVIDIA is experiencing strong demand for its data center products and solutions from both hyperscale and enterprise customers.\n2. Diversified product offerings: NVIDIA's data center portfolio includes a range of applications such as scientific computing, data analytics, cloud computing, and cloud graphics. This diversified product offering allows NVIDIA to cater to various industry needs and requirements.\n3. Growing market: The data center market is expected to grow significantly in the coming years, driven by the increasing demand for cloud services, AI, and machine learning applications.\n4. Software-defined company: NVIDIA is a software-defined company with rich software products and technologies. This software focus enables NVIDIA to provide value-added services and solutions to its data center customers.\n5. Newer buckets within Data Center: NVIDIA is expanding its data center offerings to include newer areas such as software and sovereign AI. These new areas have the potential to drive growth and revenue for NVIDIA in the long term.\n\nTherefore, given NVIDIA's strong outlook for its data center business, its diversified product offerings, growing market, software focus, and expansion into newer areas, the data center presents a significant opportunity for NVIDIA in 2024.", "Based on the information provided, there is no specific revenue data given. The information contains cash flows from operating, investing, and financing activities, as well as details on income, expenses, and tax. However, it does not include the current revenue.", "The expected revenue for this quarter (the fourth quarter of fiscal 2022) is $7.4 billion, plus or minus 2%.", "Collette Kress is the Executive Vice President and Chief Financial Officer of NVIDIA Corp. A. She is responsible for the financial functions of the company, including financial reporting, tax, treasury, internal audit, investor relations, and corporate development. She has been an important figure in NVIDIA's growth and success in the technology industry.", "Collette Kress is the Executive Vice President and Chief Financial Officer of NVIDIA Corp. She is a key figure in the company and is responsible for its financial strategies and operations. She has been mentioned several times in the provided text, which discusses the complexity of NVIDIA's products and the importance of software to their accelerated platforms.", "Colette M. Kress is the Chief Financial Officer & Executive Vice President of NVIDIA Corp. She is mentioned in the text as providing information during a discussion or presentation, but there is no detailed information about her role or background provided in the text.", "Based on the provided text, there is no direct mention or introduction of a person named Collette Kress. Therefore, I cannot provide information about who Collette Kress is. If there is any context or additional information related to Collette Kress in the documentation, please share it, and I will do my best to provide an answer based on that.", "Colette M. Kress is the Executive Vice President and Chief Financial Officer of NVIDIA Corp. She is an important figure in the company and is involved in discussions about the complexity of their products, particularly those related to software for their accelerated platforms.", "Collette M. Kress is the Executive Vice President and Chief Financial Officer of NVIDIA Corp.", "Based on the provided documentation, NVIDIA's performance in Q2 of fiscal 2021 was as follows:\n\n1. Revenue: It was $8.21 billion, representing an increase of 45% compared to the previous year.\n2. Operating Income: It was $2.557 billion, an increase of 22% or 112% compared to the previous year.\n3. Net Income: It was $2.313 billion, an increase of 18% or 107% compared to the previous year.\n4. Diluted Earnings per Share: It was $3.66, an increase of 18% or 103% compared to the previous year.\n\nIt is important to note that the Q2 fiscal 2021 outlook includes the impact from the acquisition of Mellanox, which closed on the first day of the second quarter.", "RAG, as mentioned in the provided text, stands for Retrieval Augmented Generation. It is a technology that integrates a generative AI model with proprietary or factual data. This allows the AI model to refer to and utilize this data before generating responses or outputs. In the context of the text, RAG is a significant part of the system being described, which also includes computing nodes, network, management software, orchestration software, distributed computing software, and various algorithms.", "Based on the information provided, there is no context or definition given for the acronym \"RAG.\" It is not mentioned in the text you've shared about materials and instrumentation cost in Track 2 proposals, supplementary documents, or Focus Area 2: Quantum Metrology and Control.\n\nRAG could potentially be an abbreviation for various terms, depending on the context. Without further information, I cannot provide an accurate definition for this acronym.", "Retrieval Augmented Generation (RAG) is a new way of computing that involves the use of a generative AI model in conjunction with proprietary or factual data. This is achieved by creating computing nodes that have both fast and large memory, specifically in the areas of vector databases or semantic search. The generative AI model is able to refer to this data before it generates responses, resulting in more accurate and informed outputs. This technology is being used in various applications such as base article generation based on customer case summaries, chat summarization for faster hand-off, resolution and wrap-up, and improving the employee experience by identifying growth opportunities.", "Based on the provided documentation, Colette M. Kress is the Chief Financial Officer. Therefore, she runs the finance department.", "Based on the provided documentation, the operations of the company's products and services, particularly in relation to artificial intelligence (AI), are handled by the company itself. They take responsibility for fine-tuning the AI, operating the AIs, and continuously training the AI based on the effectiveness of the content and data received. They work with various companies like AWS, OCI, and others, adapting to their specific needs and APIs to function as a systems company. However, the documentation does not specify any individual or department responsible for operations.", "The document does not provide specific information on who runs sales for the company. It would be best to check the company's official website or contact them directly for this information.", "Based on the provided document, Colette M. Kress is the Chief Financial Officer & Executive Vice President at NVIDIA Corp. She is responsible for running the finance department.", "Based on the provided document, the person who runs operations for NVIDIA's AI is not explicitly mentioned. However, it is stated that NVIDIA is an \"open platform\" and they operate at \"every layer\" of the market, including managing software, orchestration software, and distributed computing software. Therefore, it can be inferred that there are teams or individuals within NVIDIA who are responsible for running these operations.", "Based on the provided information, the sales for the company's products are run by both the company's own sales force and its partners. The partners could be specialized service providers, broad industrial service providers, or even other companies like Azure, GCP, AWS, or Salesforce. The company works closely with these partners in selling their products, with the partners often taking the actual product to market. However, the specific details about who leads the sales for the company and its partners have not been provided in the text.", "Generative AI holds enormous promise for the life science and pharmaceutical industries. It can be used in drug discovery to generate new target and drug molecules, predict how potential drugs might behave in the body, and discard dead-end compounds before they leave the computer. This could significantly reduce the cost and time associated with drug discovery, which currently costs about $2B per drug and takes 10+ years with a 90% failure rate. Generative AI has already been adopted by companies such as Amgen, Icahn School of Medicine at Mount Sinai, and London College of Fashion for drug discovery and other medical research purposes.", "Based on the provided documentation, I'm unable to provide a direct answer to your question as it pertains to clothing and not networking equipment. However, I can tell you that there are no formal shirt options listed in the provided document. It contains details for two Long Sleeve Performance Shirts, one for men and one for women, both of which are designed for comfort and may not be suitable for a formal meeting. You may want to look into other sources for a formal shirt in XL size.", "Based on the information you provided, I'm unable to provide a direct recommendation for camping equipment. However, I can tell you that Timbuk2 Copilot Roller Luggage is a lightweight and easy-to-pack luggage, which might be useful for travel associated with camping. It has a clamshell structure for easy packing and repacking, and its durable water-repellent (DWR) finish could offer some protection for your belongings in case of wet weather.\n\nFor camping-specific gear recommendations, I would suggest looking into tents, sleeping bags, and backpacks that are designed for outdoor use, and have features such as waterproofing, durability, and comfort. Always check product reviews and ratings before making a purchase.", "Based on the provided document, there is no specific information about camping gear. However, I can recommend the TIMBUK2 VAPOR BACKPACK TOTE - GRAPHITE as a versatile bag that can be used for various purposes, including camping. It is made of 100% recycled nylon and polyester, has a padded laptop sleeve, and features multiple pockets for storage. Additionally, it can be worn as a backpack or carried as a tote, making it a convenient option for carrying camping equipment.\n\nAnother option is the TIMBUK2 COPILOT ROLLER LUGGAGE, which is lightweight and easy to pack. It has a clamshell structure, making it easy to organize camping gear, and its broad-base skateboard wheels provide a smooth roll.\n\nPlease note that these recommendations are based on the general features of the bags and not on specific camping gear requirements.", "Yes, we have several women's workout gear options available. Here are a few:\n\n1. Women's Logo Tee: This is a relaxed fit t-shirt made from 100% Airlume combed and ring-spun cotton. It is available for $22.\n\n2. Long Sleeve Performance Shirt Women's: This crew neck shirt is perfect for exercising or lounging around. It is made from a stretchy and comfortable 90% polyester and 10% spandex fabric with decorative and functional reflective pockets. It is available for $65.\n\n3. Women's Beyond Yoga Spacedye Racerback Cropped Tank: This tank top is made from performance fabric featuring UPF 50+ protection and a built-in bra offering medium support. It is available for an unspecified price.\n\nPlease note that the exact prices and product details may vary, and I recommend checking the product pages for the most up-to-date information.", "Based on the information provided, which does not include specific preferences or interests of your clients, I cannot give a personalized recommendation. However, here are some general gift ideas that might be suitable for business clients:\n\n1. High-quality office supplies or accessories, such as a leather-bound notebook, a fountain pen, or a stylish desk organizer.\n2. A gift basket filled with gourmet foods, fine wines, or artisanal chocolates.\n3. A book or a subscription to a professional journal or magazine that is relevant to their industry.\n4. A unique or memorable experience, such as tickets to a concert, play, or sporting event.\n5. A charitable donation in their name to a cause that they care about.\n6. A personalized or customized gift, such as a monogrammed briefcase, a custom-made business card holder, or a name-engraved pen.\n\nRemember to consider your clients' tastes, preferences, and values when choosing a gift, and to ensure that it is appropriate for the occasion and the nature of your business relationship.", "Based on the information you provided, I would recommend the TITLEIST\u00ae PRO V1\u00ae HALF DOZEN GOLF BALLS. This product is the top selling golf ball in the industry and offers a soft, fast core, spin control ionomer casing, and a soft, thin urethane elastomer cover. Each box contains two sleeves, with three balls per sleeve. The product is available for $45.00 and can be found in the Lifestyle category. You can view the product and its details at the following URL: . Here is an image of the product: . I hope this recommendation meets your needs and helps you find the perfect gift for your clients. Let me know if you have any other questions.", "Based on your preference for cats, I would recommend the \"14 OZ. VISUAL PURR-CEPTION MUG.\" This mug is inspired by NVIDIA Engineer Robert Bond and features a deep learning design with a cat theme. It has a capacity of 14 oz, and its dimensions are 3-5/8\" H x 3-5/8\" (5 w/handle). It is hand wash recommended, microwave safe, and has a gloss colored interior. You can find it at the price of $9.50 at the following URL: . The product image can be viewed at: .", "I'm sorry for any confusion, but the content you provided doesn't seem to relate to the context and review criteria mentioned earlier. I'm here to help answer questions about the documentation, specifically in the context of review criteria.\n\nTo answer your actual question, a fun gift for a nephew could depend on his age, interests, and your budget. Here are a few general suggestions:\n\n1. For a younger nephew (up to around 8 years old), consider educational toys that can help him learn and have fun at the same time, like building blocks, science experiment kits, or puzzle games.\n\n2. For an older nephew (around 9-12 years old), consider gifts that cater to his hobbies and interests, such as books, sports equipment, art supplies, or board games.\n\n3. For a teenage nephew, consider gifts that allow for creativity and self-expression, like musical instruments, video games, or electronics kits.\n\nRemember, the best gift is one that shows you know and care about his interests and personality. It's always a good idea to ask his parents for ideas or specific requests if you're unsure.", "Based on the content provided, a fun gift for your nephew could be an NVIDIA SHIELD TV streaming device. It's a great way for him to enjoy his favorite shows and movies, and it's made by NVIDIA, which he already has an interest in. Additionally, since he has two dogs, you might consider getting him some NVIDIA-themed pet accessories, like a dog collar or a toy, to make his dogs a part of his NVIDIA fandom.", "Based on the provided documentation, I can recommend the \"MEN'S LOGO TEE\". It is a 100% cotton jersey t-shirt with a fine rib trim at the neck and a straight fit. This t-shirt is part of the Apparel category under the Mens subcategory, and it is available in unisex sizing, making it suitable for various customers in the APAC region.\n\nFor more information, you can visit the product page at . The page includes additional details, product images, pricing, and a tear-away label for a comfortable wearing experience.", "Based on the provided documentation, here are the differences between the Heroes of NVIDIA 3.0 tee shirt and the NVIDIA Duo-Tone Logo Unisex Tee tee shirt:\n\n1. Material: The Heroes of NVIDIA 3.0 tee shirt is made of 100% cotton jersey, while the NVIDIA Duo-Tone Logo Unisex Tee tee shirt is made of 4.2 oz., 100% airlume combed and ringspun cotton.\n\n2. Fit: The Heroes of NVIDIA 3.0 tee shirt has a straight fit, while the NVIDIA Duo-Tone Logo Unisex Tee tee shirt has a retail fit.\n\n3. Neckline: The Heroes of NVIDIA 3.0 tee shirt has a fine rib trim at the neck, while the NVIDIA Duo-Tone Logo Unisex Tee tee shirt does not have this feature.\n\n4. Design: The Heroes of NVIDIA 3.0 tee shirt features a design representing the Heroes of NVIDIA, while the NVIDIA Duo-Tone Logo Unisex Tee tee shirt features a duo-tone NVIDIA logo.\n\n5. Price: The Heroes of NVIDIA 3.0 tee shirt is priced at $20.0, while the NVIDIA Duo-Tone Logo Unisex Tee tee shirt is priced at $18.0.\n\n6. Other details: The NVIDIA Duo-Tone Logo Unisex Tee tee shirt has shoulder taping, sideseamed, tear away label, and is pre-shrunk, while the Heroes of NVIDIA 3.0 tee shirt does not have these details mentioned.", "The main differences between the NVIDIA SHIELD TV and the NVIDIA SHIELD TV Pro are as follows:\n\n1. Storage: The NVIDIA SHIELD TV has 16GB of internal storage, while the NVIDIA SHIELD TV Pro has 3GB of RAM and 16GB of internal storage. However, the Pro model also includes two USB 3.0 ports for expandability, allowing for additional storage, USB cameras, USB keyboards and controllers, TV tuners, and more.\n\n2. Plex Media Server: The NVIDIA SHIELD TV Pro comes with a Plex Media Server, which allows users to manage and stream their personal media collections.\n\n3. SmartThings hub-ready: The NVIDIA SHIELD TV Pro is SmartThings hub-ready, meaning that users can add a SmartThings Link to control and monitor their smart home devices.\n\n4. AAA Android gaming and Twitch broadcasting: The NVIDIA SHIELD TV Pro supports AAA Android gaming and Twitch broadcasting, providing a more robust gaming experience than the standard NVIDIA SHIELD TV.\n\n5. Price: The NVIDIA SHIELD TV Pro is priced at $199.99, while the standard NVIDIA SHIELD TV is priced at $149.99.\n\nOverall, the NVIDIA SHIELD TV Pro is a more advanced and feature-rich streaming media player than the standard NVIDIA SHIELD TV, but it comes at a higher price point.", "The NVIDIA Jetson Nano and the NVIDIA Jetson Orin Nano are both developer kits from NVIDIA for building AI-powered devices. However, the Jetson Orin Nano offers significantly more performance than the Jetson Nano.\n\nThe Jetson Orin Nano provides up to 40 TOPS (trillion operations per second) of AI performance, which is up to 80 times greater than the Jetson Nano's 0.5 TOPS. This performance increase enables the Jetson Orin Nano to run modern AI models, including those for transformer and advanced robotics, which may be too demanding for the Jetson Nano.\n\nIn summary, the main differences between the NVIDIA Jetson Nano and the NVIDIA Jetson Orin Nano are the performance capabilities and the ability to run more advanced AI models.", "The focus of the NSF's \"Leveraging Innovations From Evolution (LIFE)\" initiative is to catalyze research that leverages the full diversity and complexity of life to discover molecular and evolutionary mechanisms that have permitted organisms to innovate and thrive in hostile and changing environments. This initiative aims to speed discoveries of nature-based solutions that will benefit scientific research and society.", "The EFRI BEGIN OI solicitation defines biocomputing as the use of biological 'intelligent systems' to include capture of real-world input, autonomous processing in an engineered biological circuit, and output of a desired response. The program encourages broad and creative approaches to the realization of novel in vitro biological intelligent systems, which do not need to be overly constrained by terminology. The bounds of 'intelligence' and 'learning' needed to achieve responsive and adaptive biological computing and control in engineered systems should be defined by the investigators. Biocomputing in this context can involve a range of cell types and does not have to be mammalian, for example, deploying 3D plant cell- or biofilm-based constructs for biocomputing is allowable. Learning/memory is not essential, and a closed-loop controller is acceptable.", "The NSF report \"Federal Science and Engineering Support to Universities, Colleges, and Nonprofit Institutions: Fiscal Year 2021\" focuses on providing detailed information about the federal obligations for science and engineering to universities, colleges, and nonprofit institutions in the fiscal year 2021. The report includes tables and data on federal obligations for various type of activities and agencies, as well as rankings of universities and colleges based on the total amount of federal obligations received. The main objective of the report is to offer insights into the trends and patterns of federal support for scientific and engineering research and development at universities, colleges, and nonprofit institutions in the United States.", "The significant change in classification of Federally Funded Research and Development Centers (FFRDCs) discussed in the \"nsf24312.pdf\" document is the reclassification of FFRDCs from extramural performers to intramural performers of R&D for the Federal Funds Survey. This change is in alignment with existing standards of control and financial dependence and brings the Federal Funds Survey in line with other existing classifications of FFRDCs as part of the government sector. The reclassification took effect in Volume 71 (FYs 2021\u201322) of the Federal Funds Survey, and past years in the trend tables of the survey results have been adjusted to reflect this current classification.", "Based on the provided document, \"Federal Science and Engineering Support to Higher Education Increased 10% in FY 2021,\" here are the key findings:\n\n1. Federal agency obligations to higher education institutions for science and engineering (S&E) activities increased by 10.5% from FY 2020 to FY 2021, rising from $39.1 billion to $43.2 billion.\n\n2. S&E support is categorized into five main groups: research and development, facilities and equipment, R&D plant, education and training, and other.\n\n3. The Department of Defense (DOD) accounts for more than 90% of its development obligations reported for universities and colleges.\n\n4. In FY 2021, the National Science Foundation (NSF) was the second-largest provider of federal S&E support to higher education institutions, with obligations amounting to $8.5 billion, or 19.7% of the total.\n\n5. Principal investigators (PIs) are required to use NSF's electronic project-reporting system, available through Research.gov, for preparing and submitting annual and final project reports. These reports should include information on accomplishments, project participants, and other relevant details.\n\n6. The report submitted by the PI will be posted on the NSF website exactly as it is submitted.\n\n7. The report serves as a brief summary, prepared specifically for the public, of the nature and outcomes of the project.\n\n8. More comprehensive information on NSF Reporting Requirements and other important information on the administration of NSF awards can be found in the NSF Proposal & Award Policies & Procedures Guide.", "According to the document \"nsf24317.pdf\", the R&D expenditure in the U.S. for 2021 was 4.5 billion constant 2017 dollars, an increase from the 4.3 billion constant 2017 dollars reported for 2020. For 2022, the R&D expenditure is estimated to be 4.7 billion constant 2017 dollars. Therefore, there is an estimated increase of 4.4% from 2021 to 2022. Please note that these figures are in constant 2017 dollars and have been adjusted for inflation.", "The \"National Patterns of R&D Resources: 2021\u201322 Data Update\" provides current data on the levels and key trends of R&D resources in the United States. This documentation presents information on research and development (R&D) expenditures, human resources, and R&D facilities. The data is collected from various sources, including businesses, federal and nonfederal government agencies, higher education institutions, and nonprofit organizations.\n\nThe document also includes data on state GDP from the U.S. Bureau of Economic Analysis. The data is presented in a series of tables and figures, allowing users to analyze trends and patterns in R&D resources across different sectors, states, and over time.\n\nIn summary, this document offers comprehensive data on R&D resources in the United States, providing valuable insights into the country's investment in research and development activities.", "Based on the data provided in Table 6 of the National Center for Science and Engineering Statistics | NSF 24-318, the following trends are evident in federal science and engineering support and R&D expenditure in the U.S.:\n\n1. Federal support as a percentage of total U.S. R&D expenditures has decreased over time, from 68.2% in 1953 to 24.5% in 2019.\n2. Businesses have consistently been the largest performing sector for R&D expenditures, with a steady increase from 32.0% in 1953 to 72.9% in 2019.\n3. Higher education institutions have seen a decrease in their share of total R&D expenditures, from 35.6% in 1953 to 13.6% in 2019.\n4. Federal R&D expenditures have fluctuated over the years but have generally been on a downward trend since the 1960s, decreasing from 68.2% in 1953 to 24.5% in 2019.\n\nRegarding longer-term trends in Table 2 of the National Center for Science and Engineering Statistics | NSF 24-317, the data shows that:\n\n1. From 1991 to 2022, the annual change in R&D expenditures for the federal government has been negative in most years, with an average decrease of -0.4% per year.\n2. The business sector has had the most significant growth in R&D expenditures, with an average annual increase of 4.3% from 1991 to 2022.\n3. Higher education institutions have experienced moderate growth in R&D expenditures, with an average annual increase of 1.9% from 1991 to 2022.\n\nIn summary, federal support for R&D expenditures has decreased over time, while business and higher education sectors have seen an increase in their shares of total R&D expenditures. The federal government's annual change in R&D expenditures has been negative in most years, while the business sector has shown consistent growth.", "The National Science Foundation (NSF) supports interdisciplinary research and development by fostering integration of research and education through its programs, projects, and activities. It encourages collaboration between different fields of science, engineering, and technology to tackle complex challenges and achieve breakthroughs that may not be possible within the boundaries of a single discipline. The NSF's merit review process evaluates proposals based on their intellectual merit and broader impacts, which includes considering the potential of interdisciplinary efforts to advance knowledge and education.\n\nFurthermore, the NSF has specific programs and initiatives dedicated to interdisciplinary research, such as the NSF INCLUDES program, which aims to enhance U.S. leadership in science and engineering by broadening participation in these fields, and the NSF Big Ideas, which are long-term research and development initiatives that focus on interdisciplinary areas of science, engineering, and education.\n\nIn summary, the NSF supports interdisciplinary research and development by providing funding, facilitating collaboration, and evaluating proposals based on their potential to advance knowledge and education across multiple disciplines.", "I don't have access to real-time or historical data about changes in the classification of research entities and funding patterns in federal R&D. However, I can provide an answer based on the information given in the text you provided.\n\nThe text does not contain information about changes in the classification of research entities and funding patterns in federal R&D. It focuses on the major categories of R&D funding, including federal government, nonfederal government, business, higher education, and NPOs. The text also explains that business sources of R&D funding include the own funds of domestic R&D-performing businesses, funds from other domestic businesses, and funds from foreign businesses. For more details on the R&D performers, the text refers to table 2 and its footnotes (a\u2013f).\n\nTo provide an accurate answer, I would need access to more specific information about changes in the classification of research entities and funding patterns in federal R&D.", "Federal R&D expenditures are distributed into three main types: basic research, applied research, and experimental development. Over the 2011-21 period, the share of applied research ranged between 18% and 21%, the share of basic research remained in the 15%-17% range, and experimental development's share ranged between 62% and 67%.\n\nIn terms of fields of R&D, the Federal Funds Survey data provide detailed obligations by federal agency, performer, type of R&D, geographical area, and field of science and engineering. The fields of R&D include computer sciences, geosciences, life sciences, engineering, and others.\n\nAs for trends, federal funding for R&D has been growing at a 1.5% rate, while GDP has grown at a 4.2% rate over the same period. Notably, the higher education sector's funding of R&D grew at 6.1% over the same period. However, federally funded R&D as a percentage of GDP has generally declined since peaking in the 1960s at 1.86% in 1964. Since 2014, federal funding for R&D has remained at or below 0.2% of Federal Funds for Research and Development.\n\nAccording to Table 2, the annual change in U.S. R&D expenditures and gross domestic product by performing sectors shows mixed results, with some periods of growth and decline. However, the most recent years have seen a positive trend, with the national center for science and engineering statistics projecting a 2.0% increase in R&D expenditures and a 4.3% increase in gross domestic product for the 2001-11 period.\n\nIt is important to note that these trends and distributions are subject to change based on various factors, including federal budget allocations, economic conditions, and technological advancements.", "The National Science Foundation (NSF) has identified several key focuses in its recent initiatives and reports. These include:\n\n1. Advancing multi-sector collaboration and community partnerships: NSF aims to bring together various sectors and communities to work towards common goals and tackle national, societal, and geostrategic challenges.\n2. Researching and shaping key technologies: NSF supports research and development of emerging technologies to address pressing issues and maintain U.S. competitiveness.\n3. STEM workforce training: NSF prioritizes programs that recruit, train, and prepare a diverse STEM workforce to advance scientific discovery and participate in the U.S. technology-based economy.\n4. Ethical and responsible use of technology: NSF encourages proposals that consider the ethical implications of technological advancements and ensure their responsible use.\n5. Fostering integration of research and education: NSF supports initiatives that integrate research and education, recognizing the importance of training the next generation of scientists and engineers.\n6. Strategic partnerships: NSF collaborates with other federal agencies, academic institutions, and industry partners to leverage resources and expertise to achieve shared objectives.\n7. Diversity, equity, and inclusion: NSF prioritizes diversity, equity, and inclusion in its programs and initiatives, aiming to broaden participation in STEM fields and ensure equal opportunities for all.\n8. Transparency and accountability: NSF values transparency in its merit review process and reporting requirements, ensuring that the public can access and understand the foundation's contributions to scientific research and innovation.\n\nFor more comprehensive information on NSF's reporting requirements, administration of NSF awards, and the merit review process, you can refer to the NSF website at:\n\n\n\n\n\n", "The content provided does not include the specific trend in federal obligations for Science and Engineering (S&E) to universities and colleges from 1963 to 2021. However, it does mention that figure 2 and figure 3 provide related information. Figure 2 is about federal obligations for S&E to universities and colleges by type of activity and agency from FYs 1963-2021, and figure 3 is about federal obligations for S&E to universities and colleges by state and outlying area from FYs 2013-2021. To answer your question accurately, these figures would need to be analyzed.\n\nHowever, the content does mention that the Department of Defense (DOD) states that more than 90% of its development obligations reported for universities and colleges science and engineering were to universities and colleges. This suggests a significant contribution from the DOD in S&E funding to universities and colleges over the years.", "Based on the information provided, federal obligations for science and engineering (S&E) research and development to universities and colleges have been tracked since the 1960s. \n\nIn the table \"5 Department of Defense obligations for science and engineering research and development to universities and colleges, by type of activity: FYs 1990\u20132021\", it can be observed that the Department of Defense's obligations for S&E R&D have fluctuated over the years, with a general increasing trend.\n\nThe table \"6 Federal obligations for science and engineering research and development to universities and colleges, by type of activity: FYs 1963\u20132021\" provides a broader view, showing that federal obligations for S&E R&D have significantly increased from the 1960s to the 2000s, but have seen a slight decrease or stabilization in the 21st century.\n\nThe table \"2 Federal obligations for science and engineering to universities and colleges, by type of activity and agency: FYs 1963\u20132021\" breaks down the obligations by agency, showing that different federal agencies have different levels of commitment to S&E R&D over the years.\n\nHowever, the tables do not provide a detailed analysis of why these changes occurred. They could be due to a variety of factors, including changes in federal policy, availability of funding, and shifts in research priorities.", "Based on the document provided, the distribution of federal S&E (Science and Engineering) support by state and outlying area in FY 2021 is presented in Table 10 of the document. However, the specific values are not presented as a table in the text you provided. Here is the text that describes the table:\n\n\"Table 10. Federal obligations for science and engineering to universities and colleges, by state, outlying area, and agency: FY 2021 (Dollars in thousands)\"\n\nTo get the specific distribution, you would need to access the original document or report where Table 10 is presented in a tabular format. The text provided does not contain enough information to answer this question without referring to the original document.", "Based on the document, the primary contributors to federal S&E (Science and Engineering) obligations are the Department of Health and Human Services (HHS), the Department of Defense (DOD), and the National Aeronautics and Space Administration (NASA). These three agencies accounted for the majority of federal S&E obligations to universities and colleges in FY 2021. However, it's important to note that the DOD states that more than 90% of its development obligations reported for universities and colleges are for science and engineering.", "Based on the provided document, the types of activities funded by federal S&E obligations have evolved over time in the following way:\n\nTable 2 in the document provides a breakdown of federal obligations for S&E to universities and colleges by type of activity and agency for fiscal years 1963-2021. The table shows that the types of activities funded have changed over the years, with new categories being added and some categories being removed.\n\nFor example, the table includes categories such as \"Applied Research,\" \"Development,\" \"R&D Centers,\" and \"Graduate Student Support,\" among others. The table also shows the funding amounts for each activity type and agency for each fiscal year.\n\nHowever, the table does not provide a detailed analysis of how the types of activities have evolved over time. To get a better understanding of this, one would need to analyze the data in the table and look for trends and patterns.\n\nOverall, the table provides a comprehensive overview of the types of activities funded by federal S&E obligations over time, but further analysis is needed to fully understand how these activities have evolved.", "Based on the information provided, the federal obligation for R&D in FY 2021 has changed due to the treatment of Federal Funds Survey's obligations to FFRDCs as a type of intramural performer, rather than extramural performers. This change is a result of FFRDCs being reliant on federal funding and being controlled by a governmental unit. However, the exact numerical value of this change for FY 2021 is not provided in the text. The text only includes a chart showing federal obligations for intramural R&D performance, with and without FFRDCs, from FYs 1967-2022, but it does not break down the changes for each fiscal year.", "Based on the information provided in NSF 24-312, the total R&D expenditures at FFRDCs (federally funded research and development centers) have fluctuated between fiscal years 2001 and 2021. While I cannot generate a graph or visual representation, I can provide a textual summary of the trends.\n\nFrom 2001 to 2021, R&D expenditures at FFRDCs from all sources show some variation. Here is a summary of the trends for each source of funds:\n\n1. Federal government: The R&D expenditures from the federal government have generally increased from 2001 to 2021, with a few minor decreases in some years.\n\n2. State and local governments: Expenditures from state and local governments have experienced ups and downs, with a general increasing trend from 2001 to 2021.\n\n3. Businesses: R&D expenditures from businesses have shown a fluctuating trend, with a general increase from 2001 to 2009, followed by a decrease and then a slight increase until 2021.\n\n4. Nonprofit organizations: Expenditures from nonprofit organizations have also fluctuated, with a general increasing trend from 2001 to 2021, but with some minor decreases in a few years.\n\n5. Other sources: R&D expenditures from other sources have shown a fluctuating trend, with a general increase from 2001 to 2021, but with some minor decreases in a few years.\n\nIt is essential to note that the exact numerical values and specific fluctuations are not provided in the text, so this summary is based on the general trends mentioned.", "In FY 2021, federal agency obligations to higher education institutions for science and engineering (S&E) activities increased 10.5% from FY 2020, reaching $43.2 billion. This support was distributed across five main categories: research and development, instruction, facilities and equipment, other sponsored activities, and general support for S&E. Research and development (R&D) accounted for the largest share, with $34.1 billion or 79.0% of all federal S&E support to higher education institutions. The top 100 institutions received 81.0%, or $34.8 billion, of all federal funding to higher education institutions for S&E support.", "The provided documentation does not contain the projected trend of R&D expenditure in the U.S. for 2021 and 2022. It includes the title \"SO<0x0A>P\" and some numerical values for the years 2004, 2008, and 2016, but it does not provide any information relevant to the query.", "Based on the information provided in NSF 24-312, the total R&D expenditures at FFRDCs (federally funded research and development centers) have fluctuated between fiscal years 2001 and 2021. Here's a summary of the trends for each source of funds:\n\n1. Federal: The federal government has consistently been the primary source of funds for R&D expenditures at FFRDCs. Expenditures increased from approximately $10.2 billion in 2001 to a peak of $17.8 billion in 2010, then slightly decreased to $16.1 billion in 2021.\n\n2. State and local governments: R&D expenditures funded by state and local governments have shown a general increasing trend, from about $0.4 billion in 2001 to $1.1 billion in 2021.\n\n3. Businesses: R&D expenditures funded by businesses have fluctuated over the years, with a slight increasing trend overall. Expenditures increased from approximately $1.1 billion in 2001 to $2.1 billion in 2021.\n\n4. Nonprofit organizations: R&D expenditures funded by nonprofit organizations have remained relatively low and stable, ranging from about $0.1 billion to $0.3 billion between 2001 and 2021.\n\n5. Other sources: R&D expenditures from other sources have shown a fluctuating trend, with a slight decrease from approximately $0.5 billion in 2001 to $0.4 billion in 2021.\n\nIn summary, federal funding has been the primary source of R&D expenditures at FFRDCs, with a general increasing trend from 2001 to 2010, followed by a slight decrease to 2021. State and local governments, businesses, and nonprofit organizations have shown increasing trends in funding, while other sources have shown a slight decrease.", "The National Center for Science and Engineering Statistics (NCSES) publishes information on the national patterns of R&D resources in the U.S. However, the most recent data available for R&D expenditures is for the year 2020. The data for 2021 and 2022 are estimates and are likely to be revised later.\n\nIn 2020, the total R&D expenditures in the U.S. were $658.2 billion, an increase of 5.9% from 2019. The business sector performed the largest portion of R&D, with $413.4 billion in expenditures, followed by higher education ($86.6 billion), federal government ($150.6 billion), and nonfederal government ($7.6 billion).\n\nThe R&D-to-GDP ratio in the U.S. in 2020 was 3.35%, up from 3.15% in 2019.\n\nBasic research expenditures in the U.S. in 2020 were $98.1 billion, with the federal government being the largest source of funds ($49.9 billion), followed by the business sector ($34.5 billion), higher education ($12.9 billion), and nonfederal government ($0.8 billion).\n\nNote that annual changes in nonfederal government R&D expenditures are included in the \"All performing sectors\" category but not shown separately because they are less than $0.1 billion.\n\nSources:\n\n* National Center for Science and Engineering Statistics, National Patterns of R&D Resources (annual series).\n* National Science Board. (2022). Science and Engineering Indicators 2022. NSB 2022-1. National Science Foundation. Alexandria, VA. Available at .", "SteerLM is a language model alignment approach that utilizes supervised fine-tuning to enable user control over model responses during inference. It addresses the limitations of previous alignment methods by offering a more user-steerable alternative to Reinforcement Learning with Human Feedback (RLHF). SteerLM categorizes the space of possible model responses using steering labels, which guide the model's output generation at inference time. This method allows for better alignment with human values and preferences, making it easier to tailor large language models (LLMs) to specific needs and preferences. You can find more details about SteerLM in the paper `SteerLM: Attribute Conditioned SFT as an (User-Steerable) Alternative to RLHF `_.", "Sure, I'd be happy to compare SteerLM with RLHF (Reinforcement Learning with Human Feedback) based on the provided document.\n\nSteerLM and RLHF are both techniques aimed at aligning language models with human values, but they approach this problem in different ways.\n\nRLHF is a reinforcement learning approach that uses human feedback to train a language model. It involves collecting human preferences on model-generated text, and then using these preferences to train a reward model. The language model is then fine-tuned using reinforcement learning with the reward model as the reward function. RLHF can be effective at aligning language models with human values, but it can be challenging to implement and may require significant computational resources.\n\nSteerLM, on the other hand, is a supervised fine-tuning approach that allows for more straightforward control of language model responses during inference. SteerLM categorizes the space of possible model responses using steering labels, and at inference time, the model generates responses based on these categorical labels. This approach can make it easier to tailor language models to specific needs and preferences, and can be more computationally efficient than RLHF.\n\nThe document suggests that SteerLM may be a good starting point for those looking to align language models with human values, as it can be simpler to implement and use than RLHF. However, it also notes that RLHF may be more optimal for certain applications, particularly those where direct feedback on model generations is available.\n\nIn summary, SteerLM and RLHF are both techniques for aligning language models with human values, but SteerLM is a supervised fine-tuning approach that allows for more straightforward control of language model responses during inference, while RLHF is a reinforcement learning approach that uses human feedback to train a language model. Both techniques have their strengths and weaknesses, and the choice between them may depend on the specific application and resources available.", "To train a SteerLM model, you would need to follow the steps outlined in the given document. Here is a summary of the process:\n\n1. **Data Download and Preprocessing**: The first step is to download and preprocess the dataset for training. The SteerLM model uses the HelpSteer dataset, which is a multi-attribute helpfulness dataset. You can refer to the paper `HelpSteer: Multi-attribute Helpfulness Dataset for SteerLM `_ for more details about the dataset.\n\n2. **Training the Attribute Prediction Model (Regression Reward Model)**: The next step is to train an attribute prediction model, also known as the regression reward model. This model is used to predict the helpfulness of a response based on certain attributes.\n\n3. **Training the Attribute-conditioned SFT (Supervised Fine-Tuning)**: After training the attribute prediction model, the next step is to train the attribute-conditioned SFT. This is a supervised fine-tuning step where the model is trained to generate responses based on the given attributes and the input prompt.\n\n4. **Inference on the SteerLM Model with Different Attributes**: Once the model is trained, you can use it for inference. During inference, you can control the responses generated by the model by providing different attributes.\n\nThe document provides more details about each step, including the specific commands and configurations to use. It also discusses the limitations of prior alignment methods and explains how SteerLM overcomes these limitations.", "The Nemo Aligner supports any GPT based model that has `mcore_gpt=True` in its configuration. Specifically, it is recommended to start with one of the two following pretrained models:\n\n1. `nvidia_nemo.models.nlp.mcore.mcore_gpt:2B`\n2. `nvidia_nemo.models.nlp.mcore.mcore_gpt:6B`\n\nThese models can be found in the Nemo model library and are suitable for use with the Nemo Aligner.", "The passage provided does not mention the specific alignment techniques that NeMo Aligner supports. It only mentions that NeMo Aligner works with any GPT based model that has 'mcore_gpt' set to True in its configuration and that it is used in the DPO pipeline. For more detailed information about the alignment techniques supported by NeMo Aligner, I would recommend checking the official documentation or reaching out to the support team.", "The optimal parameters for DPO (Data Perturbation Optimization) training can vary greatly depending on the specific characteristics of your SFT (Supervised Fine Tuning) or base model. Therefore, there are no one-size-fits-all parameters for DPO training.\n\nHowever, you can follow these general guidelines for setting DPO training parameters:\n\n1. Disable masked softmax fusion, flash attention, and fused attention in the TransformerEngine by setting the following environment variables to 0:\n\n ```bash\n export NVTE_MASKED_SOFTMAX_FUSION=0\n export NVTE_FLASH_ATTN=0\n export NVTE_FUSED_ATTN=0\n ```\n\n2. Ensure that your TransformerEngine training runs are deterministic by setting the appropriate flag. This is important for consistent parameter perturbation during DPO training.\n\n3. Start with a supervised fine-tuned model rather than the base model for best DPO training performance.\n\n4. Monitor your training metrics closely, and adjust your parameters as needed based on the performance of your model. Pay particular attention to the difference in metrics between the training and validation sets, as a larger difference generally indicates better performance.\n\n5. Keep in mind that DPO training involves iteratively perturbing the parameters of your model and evaluating the results, so be prepared to experiment with different parameter settings and evaluate the results carefully.", "Yes, NeMo Aligner supports Weights and Biases (WandB) reporting. To enable WandB logging, you need to modify the `wandb` parameters in the `conf/config.yaml` file. Set `enable` to `True` and provide the path to the file containing the WandB API key in the `api_key_file` field. The project name is set to `nemo-megatron-autoconfig` by default.\n\nHere's the relevant part of the `conf/config.yaml` file:\n\n```yaml\nwandb: # Weights and Biases (W&B) logging.\n enable: True \n api_key_file: null\n project: nemo-megatron-autoconfig\n```\n\nPlease note that the provided code snippet seems to contain a placeholder value for `api_key_file`. You should replace `null` with the actual path to your WandB API key file.\n\nAlso, the NeMo Aligner launcher supports using the `pyxis` Slurm extension for container images and mounts, but it is not required.", "Sure, I'd be happy to explain! SFT, or Supervised Fine-Tuning, is a process used to customize a pre-trained model for specific tasks or styles. In the context of language models, SFT involves training the model on a dataset of input-output pairs, where the input is a prompt and the output is the desired response. This process helps the model to learn the specific format, style, or type of response that is desired for a given task.\n\nFor example, in the context of question answering, SFT might involve training a language model on a dataset of questions and their corresponding answers. The model would learn to generate answers in the same format and style as the training data, and would also learn to associate specific types of questions with corresponding answers.\n\nSFT can be used for a variety of tasks and formats, including question answering, summarization, and chat. In the chat format, SFT might involve training a model on multi-turn conversations between different roles, such as a customer service agent and a customer. The model would learn to generate responses in the style and format of the training data, and would also learn to respond appropriately to different types of inputs and prompts.\n\nOverall, SFT is a powerful technique for customizing pre-trained language models for specific tasks and styles, and can help to improve the quality and relevance of model outputs.", "To resolve the kernel finding error in NeMo Aligner, you can set the following variables at the top of your script:\n\n```bash\nPROJECT=\"ppo_run\"\nCONTAINER=<<>> # use the latest NeMo Training container, Aligner will work there\nMOUNTS=\"--container-mounts=${GPFS}:${GPFS},${TRAIN_DATA_PATH}:${TRAIN_DATA_PATH},${VALID_DATA_PATH}:${VALID_DATA_PATH},${PRETRAINED_CHECKPOINT_NEMO_FILE}:${PRETRAINED_CHECKPOINT_NEMO_FILE}\"\n\nRESULTS_DIR=\"/path/to/result_dir\"\n\nGPFS=\"/path/to/nemo-aligner-repo\"\nMOUNTS=\"--container-mounts=MOUNTS\" # mounts\n\nCONTAINER=<<>> # use the latest NeMo Training container, Aligner will work there\n\nPROJECT=ppo_run\n\nCRITIC_LOG_DIR=\"${RESULTS_DIR}/critic_results\"\n```\n\nNote that it is not necessary to use the ``mcore_gpt.nemo`` file to use NeMo Aligner. It can work in regular Python environments as well.\n\nIf you continue to face errors related to kernel finding, it may be because the Mcore models use Transformer engine as a backend and try to find efficient kernels. However, depending on the GPU you have, it may not find them. In that case, you may need to consult the NeMo Aligner documentation or seek further assistance from the NeMo Aligner community.", "Reinforcement Learning from Human Feedback (RLHF) with Nemo Aligner involves several steps. Here's a brief overview:\n\n1. **Prerequisites**: Before starting with RLHF, you need to follow the Prerequisite guide and the Supervised Fine-Tuning (SFT) guide provided in the Nemo-Aligner documentation. These steps ensure that you have the necessary setup and a pre-trained model to start the RLHF process.\n\n2. **Supervised Fine-Tuning (SFT)**: After the prerequisites, the first step in RLHF is SFT. This step involves fine-tuning a pre-trained model using human-annotated data. The model learns to mimic human responses, thereby aligning its outputs with human preferences.\n\n3. **Reward Model Creation**: The next step is to create a reward model. This model is trained to predict human preferences based on the input and output pairs. It is trained on data collected from human evaluations of the model's outputs.\n\n4. **Proximal Policy Optimization (PPO) Training**: The final step in RLHF is to train the model using PPO. This is a type of reinforcement learning algorithm that optimizes the policy based on the rewards provided by the reward model. The model learns to generate outputs that maximize the expected rewards, thereby aligning its outputs with human preferences.\n\nThroughout this process, Nemo Aligner provides tools and guidelines to help you launch the necessary servers, prepare your data, and train your models. It also supports two types of SFT formats: Prompt-Response and Dialog, giving you flexibility in how you fine-tune your models.", "Nemo Aligner schedules the execution of the 4 networks in PPO through a PyTriton server. The components of the RL model, including the PPO actor and the 3 other networks (CriticServerTrainer, RL reward model, and ValueServerTrainer), are hosted on this server. The PPO actor coordinates between the different servers to manage the training process.", "The Nemo framework offers several advantages in training Large Language Models (LLMs):\n\n1. **Model Parallelism**: Nemo supports model parallelism, which allows training of large models that do not fit into the memory of a single GPU. It distributes different parts of the model across multiple GPUs, enabling the training of larger and more complex models.\n\n2. **Activation Checkpointing**: This technique is used to reduce memory usage during backpropagation. It saves some intermediate outputs (activations) during the forward pass and recomputes them during the backward pass, instead of storing all activations in memory.\n\n3. **AMP O2**: Automatic Mixed Precision (AMP) is a technique that uses a mix of float16 and float32 data types during training to make it faster and use less memory. The O2 configuration is a specific setting within AMP that provides a good balance between speed and precision.\n\n4. **Flash Attention**: This is a highly efficient attention mechanism that significantly reduces the memory and compute requirements for transformer models. It allows for faster training and inference, especially for large models and sequences.\n\n5. **Support for Large Models**: Nemo supports training of very large models, such as the LLAMA2 70B model, which are beyond the capacity of many other frameworks.\n\n6. **AutoConfigurator**: This tool helps find the optimal configuration for training LLMs, by searching for the hyperparameters that achieve the highest throughput for both training and inference.\n\n7. **Reinforcement Learning**: Nemo supports advanced reinforcement learning techniques like SteerLM and Direct Preference Optimization, which can further enhance the training of LLMs.\n\n8. **Holistic Approach**: Unlike traditional language models that focus solely on textual processing, Nemo's successor, NeVA, adopts a holistic approach that bridges visual and linguistic comprehension.", "Based on the provided documentation, sequence parallelism is not directly defined. However, given that this is a subcategory of parallelism, it typically refers to the ability to execute multiple tasks or operations within a single sequence or workflow concurrently. This can lead to performance improvements as it allows for the simultaneous execution of independent operations.\n\nHowever, in the context of the given document, sequence parallelism is specified as 'No', which might indicate that this particular system or framework does not support or utilize sequence parallelism. To fully understand the implications of this, additional context or documentation would be required.", "To set the optimal hyperparameters for training, you can follow a multi-step process. Here's a simplified version of the steps provided in the documentation:\n\n1. **Identify your constraints and goals**: Understand your available resources, such as the number of GPUs, the total training time, and the training budget. Your goal might be to find the model size that provides the highest throughput given these constraints.\n\n2. **Choose a model size**: Based on your constraints and goals, select a model size to optimize. This could be a smaller or larger model, depending on your resources and objectives.\n\n3. **Prepare your configuration file**: Use the `config.yaml` file to specify the model size and any other relevant parameters. If you want to search for the optimal hyperparameters for this model size, you can specify this in the \"search_config\" section of the \"defaults\" section.\n\n4. **Launch the grid search**: With your modified `config.yaml` file, you can launch a grid search to find the optimal hyperparameters for your chosen model size. This will involve training multiple models in parallel with different hyperparameters to determine the best configuration.\n\n5. **Evaluate the results**: Once the grid search is complete, evaluate the results to find the model with the highest throughput that meets your constraints and goals. The documentation provides an example of how this might look: \"You can train a 2.42B parameter model in 50 days using 32 GPUs. This result assumes you are training to 1000B tokens, and each GPU achieves 140 TFLOPS.\"\n\nRemember, the specific hyperparameters you need to tune will depend on the model architecture and the task at hand. The `config.yaml` file should provide options to control various aspects of the model and the training process.", "Based on the information provided, if you have 20 DGX nodes and each node has 8 GPUs with 80GB of GPU memory each, and you want to train a GPT model for a maximum of 5 days, the AutoConfigurator would recommend using a 5B parameter GPT model.\n\nTo determine the optimal model size for your specific use case, you can follow these steps:\n\n**Step 1**\n\nGo to the `search_config/t5/unknown_size.yaml` file.\n\n**Step 2**\n\nModify the `unknown_size.yaml` file by specifying the following:\n\n- Set `model_size_in_b` to null.\n- Specify the number of nodes (`Num_nodes`), GPUs per node (`gpus_per_node`), and GPU memory per node (`gpu_memory_gb`). In this case, you can set `Num_nodes` to 20, `gpus_per_node` to 8, and `gpu_memory_gb` to 80.\n- Specify the maximum number of training days (`max_training_days`) to 5.\n\nPlease note that the actual optimal model size may depend on various factors, including the specific model architecture, batch size, learning rate, and other hyperparameters. The recommended model size is a starting point and may need to be adjusted based on your specific requirements and constraints.", "Based on the information provided, I can infer that the cash flow statement refers to the financial documentation for the fiscal year 2018. To find the capital expenditure amount for 3M, you would look for the line item named \"Capital Expenditures\" or \"Property, Plant, and Equipment\" under the investing activities section of the cash flow statement.\n\nHowever, without the actual data or a specific table to reference, I cannot give you the exact capital expenditure amount for 3M in USD millions. You would need to access the FY2018 financial documentation for 3M to find this information.", "Yes, 3M can be considered a capital-intensive business based on FY2022 data. The company had significant investments in property, plant, and equipment, as well as substantial inventories and current assets such as cash, cash equivalents, and marketable securities. Additionally, 3M's capital spending for 2023 was expected to be approximately $1.5 billion to $1.8 billion, indicating continued investment in capital expenditures.", "Yes, 3M can be considered a capital-intensive business based on FY2022 data. The company had significant investments in property, plant, and equipment, as well as substantial inventories and current assets such as cash, cash equivalents, and marketable securities. Additionally, 3M's capital spending for 2023 was expected to be approximately $1.5 billion to $1.8 billion, indicating continued investment in capital expenditures. However, it is important to note that capital intensity can vary by industry and company, and a comprehensive analysis would require considering other factors as well.", "To answer your question, I would need the specific data for 3M's operating margin in FY2022. However, I can provide information based on the text you've given.\n\nThe text mentions that 3M's disclosed measure of segment profit/loss (business segment operating income) was updated for all comparative periods presented, aligning with the update to how the CODM assesses performance and allocates resources for the Company\u2019s business segments. This could potentially impact the operating margin.\n\nOperating margin is a useful metric to assess a company's operating efficiency as it shows the proportion of revenue that is left after deducting the cost of sales and operating expenses. However, its usefulness can depend on the context and the specific company.\n\nIn the case of 3M, if the update in the measure of segment profit/loss is significant and consistently applied across all periods, it could still be a useful metric. However, if the update is selectively applied to certain periods, it might distort the comparison of operating margins across different periods. Therefore, it's important to consider the nature and the reason behind the update when interpreting the operating margin.\n\nIn conclusion, while operating margin is generally a useful metric, its applicability and usefulness in the case of 3M would depend on the specific details of the update in the measure of segment profit/loss.", "Based on the information provided, the document does not specify which segment has dragged down 3M's overall growth in 2022 when excluding the impact of Mergers and Acquisitions (M&A). The document only mentions that from a business segment perspective, 3M achieved total sales growth in three business segments and organic local-currency sales growth in all five business segments. However, it does not provide a comparison to the previous year or specify the overall growth rate. Therefore, I cannot provide an answer to this question without additional information.", "Based on the information provided, there is no specific quick ratio given for Q2 of FY2023 for 3M. However, it is mentioned that 3M maintains a strong liquidity profile and the primary short-term liquidity needs are met through cash on hand and U.S. commercial paper issuances.\n\nThe quick ratio is a measure of a company's ability to meet its short-term obligations using only its most liquid assets (cash, marketable securities, and accounts receivable). It is calculated by dividing quick assets by current liabilities.\n\nIf the quick ratio for Q2 of FY2023 is not provided in future updates, it would not be possible to directly answer the question about 3M's liquidity based on that specific ratio. However, based on the information given, we can infer that 3M has a strong focus on maintaining liquidity through cash and commercial paper issuances.\n\nIn summary, while the quick ratio for Q2 of FY2023 is not provided, the information suggests that 3M maintains a strong liquidity profile.", "Based on the information provided, there is no data available about debt securities registered to trade on a national securities exchange under 3M's name as of Q2 2023. The data provided is only for the fair value of certain securities and assets as of a certain date in Q2 2023. It does not include information about securities registered for trading on an exchange.", "Yes, based on the information provided, 3M has consistently declared and paid dividends since 1916. The cash dividends paid to shareholders have increased over the years, from $4.44 per share in 2016 to $5.44 per share in 2018. There is a stable trend of dividend distribution, with dividends typically declared and paid in the same quarter each year. However, there may be variations in the dividend amounts from year to year. The company did not utilize derivative instruments linked to its stock as of the documentation date.", "I'm an AI language model, and I don't have direct access to the specific financial statements or data you're referring to. However, I can help you calculate the FY2019 fixed asset turnover ratio if you provide the necessary data.\n\nThe fixed asset turnover ratio is calculated as follows:\n\nFY2019 Revenue / Average Net Property, Plant, and Equipment (PP&E) for FY2018 and FY2019\n\nFrom the information provided, we can see the FY2019 revenue, but we don't have the PP&E data. I'll show you how to calculate the ratio once we have the PP&E data:\n\n1. Find the PP&E data for FY2018 and FY2019. This information is typically found in the statement of financial position.\n2. Calculate the average PP&E for FY2018 and FY2019 by adding the PP&E for FY2018 and FY2019 and then dividing by 2.\n3. Divide the FY2019 revenue by the average PP&E.\n\nIf you provide the PP&E data for FY2018 and FY2019, I can help you calculate the FY2019 fixed asset turnover ratio.", "To calculate the 3-year average of capital expenditures (capex) as a percentage of revenue for Activision Blizzard from FY2017 to FY2019, we need to first find the capex for each year and the corresponding revenue. However, the provided document does not contain the cash flow statements for the years mentioned. Therefore, I cannot provide the exact answer.\n\nTo calculate the capex as a percentage of revenue, you would typically follow these steps:\n\n1. Obtain the net property and equipment (or similar line item) from the cash flow statements for FY2017, FY2018, and FY2019.\n2. Obtain the revenue for each of those years from the income statements.\n3. Calculate the capex as a percentage of revenue for each year by dividing the net property and equipment by the revenue and multiplying by 100.\n4. Find the average of the three percentages.\n\nSince the necessary data is not available in the provided document, I cannot complete the calculation.", "To calculate the FY2015 operating cash flow ratio for Adobe, we need to find the cash from operations and total current liabilities for the year 2015.\n\nFrom the cash flow statement provided, the cash flow from operations for FY2015 is given as $23,400 thousand.\n\nNext, let's find the total current liabilities for FY2015 from the Consolidated Balance Sheets.\n\nAs of December 31, 2015:\nCurrent liabilities: $3,971,000 thousand\n\nNow, we can calculate the operating cash flow ratio:\n\nOperating cash flow ratio = cash from operations / total current liabilities\nOperating cash flow ratio = $23,400,000 / $3,971,000\nOperating cash flow ratio \u2248 5.89\n\nSo, the FY2015 operating cash flow ratio for Adobe is approximately 5.89.", "The information provided does not include the operating income for FY2015 and FY2016, so I cannot directly calculate the year-over-year change in unadjusted operating income. However, I can provide a general guideline on how to calculate it using the income statement:\n\n1. Find the operating income for FY2015 and FY2016 from the income statement.\n2. Calculate the difference between the operating income of FY2016 and FY2015.\n3. Divide the difference by the operating income of FY2015.\n4. Multiply the result by 100 to get the percentage change.\n\nThe formula is:\n\n[(Operating Income FY2016 - Operating Income FY2015) / Operating Income FY2015] * 100\n\nSince the specific income figures are not available in the provided text, I cannot provide a numerical answer.", "To calculate the operating cash flow ratio for FY2017, we first need to find the cash from operations and total current liabilities from the provided information.\n\nCash from operations for FY2017 can be found in the cash flow statement, which is $474 million.\n\nTotal current liabilities for FY2017 can be found in the balance sheet, which is the sum of accounts payable, current portion of long-term debt, notes payable, and other current liabilities. However, the value of other current liabilities is missing. Therefore, I cannot provide the exact operating cash flow ratio.\n\nIf you provide the missing value for other current liabilities, I would be happy to calculate the operating cash flow ratio for you.", "Based on the information provided, it is not possible to directly answer if Adobe has an improving operating margin profile as of FY2022. The latest year mentioned in the text is 2018, and there is no information about the years following that.\n\nHowever, I can provide information on the operating margin trends up to 2018. Operating income margins increased 0.4 percentage points year-on-year for the full year 2018. Furthermore, operating income margins also increased by 1.0 percentage points in 2017 when compared to the same period in the previous year. In 2017, the improvement in operating income margins was partly due to the gain from the divestiture of Adobe's identity management business in May 2017.\n\nWhile I cannot comment on the specific situation in FY2022, I can mention that operating margin can be a useful metric for comparing a company's profitability from one period to another or against other companies. However, it is essential to consider that non-operating gains or losses, such as the divestiture of a business, can impact operating margins and may not represent the company's core operating performance. Additionally, changes in accounting rules, revenue recognition methods, or cost structures can also affect operating margins. Therefore, it is crucial to analyze operating margins in conjunction with other financial metrics and contextual information to assess a company's performance accurately.", "To calculate the inventory turnover ratio for FY2022, we first need to determine the cost of goods sold (COGS) for the year. Unfortunately, the provided document only contains the inventory balance information for the years 2022 and 2021, and it does not provide the COGS data. Therefore, it is not possible to directly calculate the inventory turnover ratio for FY2022 with the given information.\n\nHowever, I can explain the inventory turnover ratio and how it is calculated. The inventory turnover ratio is a financial metric that measures the number of times a company sells and replaces its stock of goods within a certain period, usually a year. It is calculated by dividing the cost of goods sold (COGS) by the average inventory for that period.\n\nCOGS = Beginning Inventory + Purchases - Ending Inventory\n\nFor the inventory turnover ratio calculation:\n\nInventory Turnover Ratio = COGS / Average Inventory\n\nA higher inventory turnover ratio indicates that a company is effectively managing its inventory and selling its products quickly. However, a very high ratio might also suggest that the company may not have enough inventory on hand to meet customer demand, leading to lost sales.\n\nBased on the information provided, it is not possible to determine if conventional inventory management is meaningful for AES Corporation in FY2022. To make such a conclusion, we would need additional context about the company's operations, industry practices, and strategic goals.", "The restructuring costs are directly outlined as restructuring and related expenses in The AES Corporation's income statements for FY2022. The amount is $12.0.", "To calculate the inventory turnover ratio for FY2022, we first need to determine the cost of goods sold (COGS) for the year. Unfortunately, the provided document only contains the inventory balance information for the years 2022 and 2021, and it does not provide the COGS data for FY2022.\n\nHowever, we can still provide some context regarding the inventory turnover ratio and its significance for AES Corporation. Inventory turnover ratio is a financial metric that measures the number of times a company sells and replaces its stock of goods within a certain period, typically a year. It is calculated by dividing the cost of goods sold (COGS) by the average inventory for the period.\n\nFor conventional inventory management, a higher inventory turnover ratio is generally considered favorable, as it indicates efficient inventory management and strong sales. However, for companies like AES Corporation, which is an energy company with significant investments in power generation assets, the conventional inventory management might not be meaningful.\n\nAES Corporation's inventory mainly consists of fuel and merchandise inventories. The fuel inventory is primarily used to generate power in their plants, and the merchandise inventory is for resale purposes. The company's primary business is generating and selling electricity, steam, and other energy-related products, rather than selling inventory as a retailer would. Therefore, the traditional inventory turnover ratio might not provide a meaningful insight into the company's operational efficiency or financial health.\n\nIn conclusion, without the COGS data, we cannot calculate the inventory turnover ratio for FY2022. However, considering AES Corporation's primary business, the conventional inventory management might not be a significant indicator of the company's performance.", "To calculate AES's FY2022 return on assets (ROA), we first need to determine the FY2022 net income and the average total assets between FY2021 and FY2022.\n\nFrom the information provided, we can find the following amounts:\n\nFY2022 net income: $ (546) million (from the Net income (loss) attributable to The AES Corporation common stockholders in the statement of income)\n\nTotal assets as of December 31, 2022: $242,456 million (from the statement of financial position)\n\nTotal assets as of December 31, 2021: $226,022 million (from the statement of financial position)\n\nTo calculate the average total assets, we can use the arithmetic mean:\n\nAverage total assets = (Total assets as of Dec 31, 2022 + Total assets as of Dec 31, 2021) / 2\n\nAverage total assets = ($242,456 million + $226,022 million) / 2\n\nAverage total assets = $468,478 million\n\nNow, we can calculate the ROA:\n\nROA = FY2022 net income / Average total assets\n\nROA = ($546 million) / $468,478 million\n\nROA \u2248 -0.001164\n\nRounded to two decimal places, AES's FY2022 ROA is approximately -0.12%.", "To calculate Amazon's FY2017 days payable outstanding (DPO), we first need to determine the average accounts payable for FY2016 and FY2017. However, the provided document does not contain the balance sheet for FY2016. Therefore, I cannot calculate the exact DPO for Amazon in FY2017.\n\nHowever, I can provide you with the formula and the necessary information to calculate the DPO if you have the required financial data:\n\n1. Find the average accounts payable for FY2016 and FY2017.\n2. Calculate the Cost of Goods Sold (COGS) for FY2017.\n3. Determine the change in inventory between FY2016 and FY2017.\n4. Plug the values into the formula:\n\nDPO = 365 * (average accounts payable) / (COGS + change in inventory)\n\nFor your reference, here are the relevant line items from the provided document:\n\n- COGS for FY2017: Cost of sales primarily consists of the purchase price of consumer products, inbound and outbound shipping costs, including costs related to sortation and delivery centers and where we are the transportation service provider, and digital media content costs. The total Cost of Sales for FY2017 is provided, but the exact value is not shown here.\n- Change in inventory between FY2016 and FY2017: This information is not provided in the document.\n\nIf you have the necessary financial data, you can use the given formula and the provided line items to calculate Amazon's FY2017 DPO.", "Based on the provided document, the revenue for Amazon in FY2016 was $11,692,713 and in FY2017 it was $13,400,514. To calculate the year-over-year change in revenue, we can use the following formula:\n\n[(Revenue in FY2017 - Revenue in FY2016) / Revenue in FY2016] \\* 100%\n\nPlugging in the values, we get:\n\n[(13,400,514 - 11,692,713) / 11,692,713] \\* 100% = 14.6%\n\nTherefore, the year-over-year change in revenue from FY2016 to FY2017 for Amazon was approximately 14.6%.", "To calculate the net income attributable to shareholders for Amazon in FY2019, we can use the information provided in the income statement. Here's how:\n\n1. Start with the net sales for FY2019: $170,773 million (from the Net sales section)\n2. Next, subtract the operating expenses for FY2019: $163,740 million (from the Operating expenses section)\n3. This gives us the operating income for FY2019: $7,033 million\n4. Then, subtract the cost of sales for FY2019: $149 million (from the Cost of sales section)\n5. This gives us the income before income taxes for FY2019: $6,884 million\n6. Next, subtract the income tax expense for FY2019: $1,150 million (from the Income tax expense section)\n7. This gives us the net income before extraordinary items for FY2019: $5,734 million\n8. Finally, subtract the cumulative effect of accounting changes for FY2019: $0 million (from the Other income (expense), net section)\n\nTherefore, Amazon's FY2019 net income attributable to shareholders is $5,734 million.", "Based on the information provided in the balance sheet, as a financial analyst, I can determine the net accounts receivable (AR) for Amcor at the end of the fiscal year 2020.\n\nThe relevant information is as follows:\n- Accounts receivable, net of allowance for doubtful accounts at the end of FY2020: $633 million\n\nTo calculate the year-end FY2020 net AR, we can use the given value directly:\n\nYear-end FY2020 net AR = $633 million\n\nThis means that Amcor's net accounts receivable at the end of the fiscal year 2020 was $633 million.", "I don't have access to real-time or historical data, so I can't provide information about a specific 8-K filing dated July 1, 2022. The document you provided is related to Amcor plc's 8-K filing from June 17, 2019. If you have a specific question about the contents of that document, I can try to help with that. For information on a specific 8-K filing, you would need to obtain a copy of that filing from the SEC's EDGAR database or another source.", "The provided documentation does not include information about AMCOR's quick ratio for FY2023 and FY2022. The quick ratio is a measure of a company's ability to meet its short-term financial obligations using only its most liquid assets (cash, marketable securities, and accounts receivable). It's a commonly used liquidity ratio in financial analysis.\n\nHowever, the document does provide some financial information, such as dividends per share, capital expenditures, and depreciation and amortization. But it does not offer enough data to calculate the quick ratio or any other liquidity ratios for the mentioned periods.\n\nTo answer the question about the quick ratio trend for AMCOR between FY2023 and FY2022, we would need the necessary data points, including the company's cash, marketable securities, accounts receivable, and current liabilities for both periods.", "Based on the provided documentation, the major acquisitions that Amcor has done in the relevant fiscal years are as follows:\n\n1. FY2023 (Twelve months ended June 30, 2023): The documentation does not provide specific information about any individual acquisitions made during this period. However, it does mention that the Company's acquisitions of businesses, equity method investments and nonmarketable securities totaled $73 million in 2023.\n\n2. FY2022: The documentation states that the Company's acquisitions of businesses, equity method investments and nonmarketable securities totaled $73 million in 2022. However, it does not provide further details about any specific acquisitions.\n\n3. FY2021: The documentation indicates that during 2021, Amcor's acquisitions of businesses, equity method investments and nonmarketable securities totaled approximately $4,766 million out of a range of $850 million to $950 million. This represents a significant acquisition activity during the fiscal year 2021. However, the documentation does not provide further details about any specific acquisitions.\n\nIn summary, while the documentation provides some information about the total value of acquisitions made by Amcor in the relevant fiscal years, it does not offer specific details about individual acquisitions.", "Based on the provided documentation, Amcor primarily operates in the packaging industry. They provide a range of flexible and rigid packaging, specialty cartons, closures, and services to various companies around the world.", "The information provided does not include the gross margin for Amcor in FY2023. However, it does mention that net sales have increased by 1% on a reported basis. Gross margin is calculated by subtracting the cost of goods sold from net sales and then dividing by net sales. Therefore, an increase in net sales could potentially lead to an improvement in gross margin if the cost of goods sold does not increase at the same rate. \n\nHowever, it is important to note that for a company like Amcor, which has significant corporate expenses (represented as item 2), gross margin may not be a useful metric on its own. This is because gross margin only takes into account the cost of goods sold and does not consider other operating expenses, such as corporate expenses. Therefore, it may be more useful to look at metrics that take into account both revenue and expenses, such as operating income margin or earnings per share, which are also mentioned in the provided information. \n\nIn conclusion, while gross margin could potentially be improving for Amcor in FY2023, it may not be a useful metric on its own due to the presence of significant corporate expenses. Other metrics that take into account both revenue and expenses may provide a more complete picture of the company's financial performance.", "Based on the information provided, Amcor's restructuring liability as of the second quarter of FY2023 close is related to a strategic reduction of the existing global workforce that was initiated by management during the first quarter of 2022. This plan is expected to impact approximately 7% of their employees and will result in approximately $100 million of restructuring charges, primarily related to employee severance and benefits costs. The majority of these charges are expected to be recognized in 2022, but some costs may still be incurred and recognized in FY2023. The purpose of this restructuring liability is to realign the company's workforce and reduce costs in order to improve overall business performance.\n\nIt is important to note that the restructuring accrual at December 31, 2022 is expected to cover substantially all of the restructuring liability, but the actual liability as of the second quarter of FY2023 close may vary due to changes in estimates, timing of recognition, or other factors. Additionally, the financial statement schedule II\u2014Valuation and Qualifying Accounts, which is filed as part of the annual report, may provide further details about the restructuring liability and related charges.", "The document does not provide the specific value for Amcor's Adjusted Non-GAAP EBITDA for FY 2023. It only mentions that the Adjusted EBITDAR is calculated by deducting interest, other non-operating income (expense), taxes, depreciation, and corporate expenses from net sales. The net sales for the Amcor Group increased by 1% on a reported basis for the twelve months ended June 30, 2023. However, this information needs to be used in conjunction with the detailed financial statements or tables to calculate or find the exact Adjusted Non-GAAP EBITDA value for FY 2023.", "The document does not provide specific information to directly answer your question. However, based on the available information, I can provide the following context:\n\n1. Net sales for the Amcor Group increased by 1% on a reported basis for the twelve months ended June 30, 2023, compared to the same period in the previous year.\n2. This 1% growth includes an unfavorable impact of approximately 3% related to movements in foreign exchange rates, an unfavorable impact of approximately 1% related to items affecting comparability, and price increases.\n3. For the June 2023 quarter, net sales were 6% lower than in the same quarter of the previous year on a reported basis, which includes an unfavorable impact of approximately 3% related to movements in foreign exchange rates and an unfavorable impact of approximately 1% related to items affecting comparability.\n\nGiven this information, to find the real change in sales for FY 2023 vs FY 2022, excluding the impact of FX movement, passthrough costs, and one-off items, you would need to:\n\n1. Start with the reported 1% growth for the twelve-month period ended June 30, 2023.\n2. Adjust for the unfavorable impact of approximately 3% related to movements in foreign exchange rates.\n3. Adjust for the unfavorable impact of approximately 1% related to items affecting comparability.\n4. However, the document does not provide information on how to adjust for passthrough costs. You might need additional data to account for this factor.\n\nPlease note that this calculation is an approximation based on available information, and you may need to consult additional resources or documentation to obtain a more accurate answer.", "To calculate the FY2015 depreciation and amortization (D&A) percentage margin for AMD, we can use the information provided in the Statement of Cash Flows. The D&A for FY2015 is given as 7,231 (in millions).\n\nFirst, we need to find the operating cash flow for FY2015. We can do this by locating the net earnings in the Income Statement and adding back the D&A and changes in working capital. However, we don't have the net earnings value in this provided data. Instead, let's calculate the operating cash flow using the given Cash Flow Statement data.\n\nOperating Cash Flow (OCF) = Cash Flows from Operating Activities\n= Net earnings + Depreciation and amortization +/- Movement in working capital + Other\n\nFor FY2015, we have:\n- Depreciation and amortization: 7,231\n- Movement in working capital: (154)\n- Other: 28\n\nHowever, we don't have the net earnings value to calculate the OCF directly. Since we are asked to calculate the D&A % margin, let's proceed by finding the revenue first.\n\nRevenue for FY2015: 3,993 (from the Income Statement data provided)\n\nNow, we can calculate the OCF as a percentage of revenue:\n\nOCF Margin = Operating Cash Flow / Revenue\n\nTo find the D&A % margin, we can use the following formula:\n\nD&A % Margin = D&A / Revenue\n\n= 7,231 / 3,993\n\u2248 1.81%\n\nSo, the FY2015 depreciation and amortization percentage margin for AMD is approximately 1.81%.", "To answer your question, I would need the quick ratio data for AMD for the fiscal year 2022. The quick ratio is a measure of a company's short-term liquidity and is calculated as the ratio of quick assets (current assets excluding inventory) to current liabilities. A quick ratio of 1 or more is generally considered healthy, as it indicates that a company has enough quick assets to cover its current liabilities.\n\nWithout this data, I cannot provide a direct answer to your question. However, I can say that the quick ratio is a relevant measure of liquidity for most companies, as it provides insight into a company's ability to meet its short-term obligations using only its most liquid assets.", "Based on the provided document, AMD sells various products and services as of FY22. However, the specific details of these products and services are not provided in the text you've given. Here's the relevant excerpt:\n\n\"In this section, we will describe the general financial condition and the results of operations of Advanced Micro Devices, Inc. and its wholly-owned subsidiaries (collectively, \u201cus,\u201d \u201cour\u201d or \u201cAMD\u201d), including a discussion of our results of operations for 2022 compared to 2021, an analysis of changes in our financial condition and a discussion of our off-balance sheet arrangements, among other things: our demand for AMD\u2019s products; the growth, change and competitive landscape of the markets in which AMD participates; future restructuring activities; the nature and extent of AMD\u2019s future payments to GLOBALFOUNDRIES Inc. (GF) and the materiality of these payments; the materiality of AMD\u2019s future purchases from GF; sales patterns of AMD\u2019s semi-custom System-on-Chip (SoC) products; AMD\u2019s expected completion of its restructuring and impairment plan; and our goodwill and intangible assets.\"\n\nTo answer your question fully, I would need to access information about AMD's products and services offered as of FY22 from a different source.", "Based on the provided documentation, there is no specific information about AMD's revenue change as of FY22. The table you've given contains financial data for different years, but it's for a bank and not AMD. I would recommend checking the financial reports or press releases from AMD to get the information you're looking for.", "The operating margin for AMD in FY22 decreased compared to FY21. This change was primarily driven by a decrease in gross margin, which was mainly due to amortization of intangible assets associated with the Xilinx acquisition.\n\nOperating margin is a useful metric for a company like AMD. It provides insight into how much profit the company makes from its core operations, excluding factors like taxes and interest. However, it's important to note that non-recurring items, such as acquisitions, can significantly impact this metric, as seen in AMD's case. Therefore, while it's useful, it should be considered in conjunction with other financial metrics to get a comprehensive understanding of the company's financial health.", "In FY22, the operating activities brought in the most cash flow for AMD with $21.1 billion, while investing activities lost the least cash flow with ($33.7) billion. Financing activities are not specified in the provided context for FY22.", "To answer your question, first, let's find the sales for each segment in FY21 and FY22, excluding the Embedded segment.\n\nFY21:\n- Data Center: Not given, let's denote it as X1\n- Client: Not given, let's denote it as Y1\n- Embedded: 289 (excluded from comparison)\n- All Other: 38 (not a reportable segment, but we'll include it for completeness)\n\nFY22:\n- Data Center: 1,094\n- Client: This segment is not mentioned in FY22, so we cannot include it in the comparison.\n- Embedded: 21,055\n- All Other: Not given, let's denote it as Z2\n\nNow, let's calculate the proportion of sales for each segment in FY21 and FY22, excluding Embedded:\n\nFY21 proportions:\n- Data Center: X1 / (X1 + Y1 + 38)\n- Client: Y1 / (X1 + Y1 + 38)\n- All Other: 38 / (X1 + Y1 + 38)\n\nFY22 proportions:\n- Data Center: 1,094 / (1,094 + Z2)\n\nSince the Client segment is not mentioned in FY22, we cannot compare the increase in proportional sales between FY21 and FY22 for this segment. However, we can compare the Data Center segment's proportional sales increase between FY21 and FY22.\n\nTo find the proportional increase, we would calculate the difference in proportions between FY22 and FY21. Unfortunately, without specific numbers for X1 and Y1, we cannot provide a numerical answer. But the method to find the answer is provided.", "Based on the provided document, AMD reported customer concentration for fiscal year 2020. However, there is no information provided about customer concentration for fiscal year 2022.", "Based on the provided document, the debt securities registered to trade on a national securities exchange under American Express' name as of 2022 are the Fixed Rate Senior Notes with a weighted-average coupon rate of 3.60% and a total amount of $10.2 billion.", "Based on the document provided, American Express primarily operates in the following geographies as of 2022:\n\n1. Europe\n2. Middle East & Africa\n3. Latin America\n4. North America\n5. Asia Pacific\n\nThese geographical areas are mentioned in the net operating revenues section for the year ended December 31, 2022.", "Based on the information provided, American Express (AMEX) did not have an improving operating margin profile in 2022 compared to 2021. Their operating margin was 14% in 2022, which is a decrease from the 17% operating margin they had in 2021.\n\nHowever, it's important to note that while operating margin can be a useful metric for comparing the profitability of companies within the same industry, it may not be directly comparable or useful for all companies. In this case, AMEX has mentioned that the determination of certain items, such as adjustments for transaction and credit losses, technology and development expenses, and restructuring and other charges, may not be comparable to similarly titled measures used by other companies. Therefore, while the operating margin percentage can provide some insight, it should be viewed in conjunction with other metrics and contextual information to fully understand the company's financial health and performance.", "Based on the information provided, the gross margin percentage for American Express was negatively impacted by three basis points due to increased rewards and two basis points due to a LIFO charge for higher merchandise costs in the year 2021. However, changes in foreign currencies relative to the U.S. dollar positively impacted gross margin by approximately $301 in 2021.\n\nAs for the FY2022, the specific details of the factors affecting gross margin have not been provided. However, it is mentioned that gross margin on a segment basis contracted primarily due to the effects of significant unfavorable standard foreign currency exchange rates.\n\nGross margin is a useful metric for a company like American Express as it provides insight into the company's profitability from its core operations, i.e., the revenue generated from its primary business activities minus the direct costs associated with generating that revenue. However, it is important to note that gross margin alone may not provide a complete picture of a company's financial health, and other factors such as operating expenses, interest expenses, and taxes should also be considered.", "The effective tax rate of American Express changed from 21.0% in FY2021 to 25.2% in FY2022.", "Based on the information provided, the largest liability in American Express's Balance Sheet in 2022 was $10.6 billion, which is recorded in accounts payable and other liabilities on the Consolidated balance sheets. This liability was predominantly driven by continued growth in rewards points earned on higher spend and promotional offers outpacing redemptions throughout 2023. However, please note that this information is only up to June 30, 2022, and the liability amounts for the full year 2022 may be different. For a complete and accurate understanding, it is recommended to refer to American Express's full and final financial statements for the year 2022.", "Yes, based on the information provided, American Express was able to retain card members during 2022. It was stated that Card Member retention remained high throughout 2022, demonstrating the impact of investments made in their premium value propositions.", "Based on the provided instruction, I would need to review the Statement of Cash Flows for American Water Works for the fiscal year 2020 to accurately answer your question. However, as there is no such document provided in the context, I cannot give you an exact figure.\n\nI recommend checking the official financial statements of American Water Works or contacting their investor relations department for the most accurate information.", "To calculate American Water Works's FY2021 unadjusted EBITDA (Earnings Before Interest, Taxes, Depreciation, and Amortization), we need to find the operating income from the income statement and add the depreciation and amortization from the cash flow statement.\n\n1. From the income statement, find the operating income. In this case, it is not explicitly provided, so we need to calculate it by subtracting operating expenses from operating revenues.\n\nOperating revenues (2021) = $3,930 million\nOperating expenses (2021) = Not explicitly provided, but we can derive it by subtracting depreciation and amortization from the \"Adjustments to reconcile net income to net cash provided by operating activities\" section.\n\nDepreciation and amortization (2021) = $407 million + $180.2 million = $587.2 million\n\nOperating expenses (2021) = Operating revenues (2021) - Depreciation and amortization (2021)\nOperating expenses (2021) = $3,930 million - $587.2 million = $3,342.8 million\n\nOperating income (2021) = Operating revenues (2021) - Operating expenses (2021)\nOperating income (2021) = $3,930 million - $3,342.8 million = $587.2 million\n\n2. Now, add depreciation and amortization to the operating income to get the unadjusted EBITDA.\n\nUnadjusted EBITDA (2021) = Operating income (2021) + Depreciation and amortization (2021)\nUnadjusted EBITDA (2021) = $587.2 million + $587.2 million = $1,174.4 million\n\nAmerican Water Works's FY2021 unadjusted EBITDA in USD millions is approximately $1,174.4 million.", "Based on the information provided, American Water Works had a working capital of -$1.2 billion in 2022. However, it's important to note that working capital is not defined under U.S. generally accepted accounting principles (GAAP) for this company, and may not be computed the same as similarly titled measures used by other companies. The company defines working capital as current assets minus current liabilities. \n\nWhile a negative working capital might initially seem concerning, it's essential to consider the context of American Water Works' business model. The company has a model that allows it to turn inventory quickly and have a cash-generating operating cycle, which might explain the negative working capital. \n\nIn conclusion, while American Water Works had negative working capital in 2022, it might not be a useful or relevant metric for this company due to its unique business model and the non-GAAP nature of the calculation.", "To calculate the 3-year average net profit margin for Best Buy, we first need to find the net earnings attributable to Best Buy Co., Inc. shareholders for each of the fiscal years 2015, 2016, and 2017. We then divide the net earnings by the revenue for each year and find the average.\n\nFY2015: Net earnings $1,233 million; Revenue $38,025 million\nFY2016: Net earnings $897 million (excluding restructuring charges of $13 million); Revenue $39,469 million\nFY2017: Net earnings $1,233 million; Revenue $42,153 million\n\nNet profit margin for FY2015 = $1,233 / $38,025 * 100% = 3.24%\nNet profit margin for FY2016 = $897 / $39,469 * 100% = 2.27%\nNet profit margin for FY2017 = $1,233 / $42,153 * 100% = 2.93%\n\nNow, we calculate the 3-year average net profit margin:\n\n($1,233 + $897 + $1,233) / ($38,025 + $39,469 + $42,153) * 100% = $3,363 / $119,647 * 100% = 2.81%\n\nSo, the 3-year average net profit margin for Best Buy (FY2015 - FY2017) is approximately 2.8%.", "The information provided does not include the year end FY2019 total amount of inventories for Best Buy. The inventories at May 31, 2018 and 2017 are given, as well as information about the inventory balances at December 31, 2020. However, there is no data about the inventory balances for the year 2019.", "Based on the information provided, Best Buy's gross margins do not appear to be historically consistent, as they have fluctuated by more than roughly 2% each year. In 2021, the gross margin percentage was negatively impacted by three basis points due to increased rewards and two basis points due to a LIFO charge for higher merchandise costs. However, changes in foreign currencies relative to the U.S. dollar positively impacted gross margin by approximately $301 in 2021.\n\nIn 2014, gross margin included a $58 million lower of cost or market inventory adjustment, which accounted for one gross margin percentage point, and a $27 million benefit from technology licensing revenue, which accounted for less than one gross margin percentage point. Furthermore, the operating loss for 2015 was $481, which is a significant amount and may also indicate that gross margins are not consistently high.\n\nTherefore, gross margins do not appear to be a relevant metric for Best Buy, as they fluctuate from year to year and can be significantly impacted by various factors such as inventory adjustments, technology licensing revenue, changes in foreign currencies, and rewards programs.", "Based on the provided document, Best Buy has not specified any major acquisitions for FY2023. However, for FY2022, they completed acquisitions for cash consideration of approximately $51 million, but there are no further details about these acquisitions. For FY2021, Best Buy completed acquisitions for cash consideration of approximately $127 million. However, the document does not provide specific information about these acquisitions. It is recommended to refer to the \"Acquisitions and Divestitures\" section of their financial statements for more detailed information.", "Based on the information provided, the FY2023 (year ended December 31, 2022) cash flow details are available. Here's the calculation of cash flow for each activity:\n\n1. Operating activities: $3,565 million\n2. Investing activities: $1,999 million\n3. Financing activities: $(3,264) million (this amount represents a cash outflow)\n\nTo find the activities that brought in the most or lost the least cash flow, we can compare the absolute values of the cash flows for each category.\n\n1. Operating activities have the highest absolute cash flow value at $3,565 million.\n2. Investing activities have the second-highest absolute cash flow value at $1,999 million.\n3. Financing activities have the lowest absolute cash flow value at $3,264 million (since it is a negative value, it indicates a cash outflow).\n\nTherefore, among operations, investing, and financing activities, operating activities brought in the most cash flow for Best Buy in FY2023 (year ended December 31, 2022).", "Based on the provided document, the information about FY 2024 is not available. Therefore, I cannot provide an answer to your question. The latest information provided in the document is up to Q4 of FY 2023 (which is the same as the full fiscal year 2023).", "Based on the information provided, the number of Best Buy stores at the end of fiscal year (FY) 2023 was 925, and there is no data available for the number of Best Buy stores in Q2 of FY2024. Therefore, it is not possible to determine if there was any change in the number of Best Buy stores between Q2 of FY2024 and FY2023.", "The document does not provide specific information about the performance of Best Buy product categories in the domestic market during Q2 of FY2024. The closest relevant information is the revenue by product category for the domestic market in 2021 and 2022, but there is no data for 2023 or Q2 of any year. Additionally, the document discusses the revenue mix summary and comparable sales summary for 2023, but it does not break down the performance by product category.", "To calculate Block's (formerly known as Square) FY2016 working capital ratio, we first need to identify the total current assets and total current liabilities from the balance sheet data provided.\n\nTotal current assets for FY2016 = 895.6\nTotal current liabilities for FY2016 = 3,247.7 (calculated as the sum of short-term debt, trade payables, accrued employee costs, accounts payable, current portion of long-term debt, and other current liabilities)\n\nNow, we can calculate the working capital ratio using the formula:\n\nWorking capital ratio = total current assets / total current liabilities\n\nWorking capital ratio = 895.6 / 3,247.7\n\nBlock's FY2016 working capital ratio is approximately 0.276 (rounded to two decimal places).", "To calculate the FY2019 - FY2020 total revenue growth rate, we need to use the total revenues net of interest expense provided in the statement of income.\n\nFY2019 total revenues net of interest expense = $36,087 million\nFY2020 total revenues net of interest expense = $52,862 million\n\nThe growth rate can be calculated as follows:\n\nGrowth rate = ((FY2020 revenues - FY2019 revenues) / FY2019 revenues) * 100%\n\nGrowth rate = (($52,862 - $36,087) / $36,087) * 100%\n\nGrowth rate \u2248 46.5%\n\nTherefore, the FY2019 - FY2020 total revenue growth rate for Block (formerly known as Square) is approximately 46.5%.", "Based on the information provided, Block (formerly known as Square) generated $78,084 million in cash flow from operating activities in FY2020.\n\nHere's the calculation:\n\nNet cash provided by/(used in) Operating activities for FY2020 = $78,084 million\n\nThe value is taken directly from the Net cash provided by/(used in) Operating activities section of the cash flow statement for FY2020.", "To calculate Boeing's net property, plant, and equipment (PP&E) at the end of FY2018, we need to use the information provided in the balance sheet excerpt for 2018 and 2017.\n\nFirst, let's find the gross PP&E by adding up the components:\n- Land: $1,872 million\n- Building and improvements: $3,785 million\n- Fixtures and equipment: $13,028 million\n- Leasehold improvements: $5,384 million\n- Software: $2,800 million\n\nThis gives us a total gross PP&E of $26,869 million.\n\nNext, we need to account for accumulated depreciation and amortization, which was subtracted from the gross PP&E to arrive at the net PP&E. According to the balance sheet, the accumulated depreciation and amortization for 2018 was $15,520 million.\n\nTherefore, Boeing's net property, plant, and equipment at the end of FY2018 was:\n\n$26,869 million (gross PP&E) - $15,520 million (accumulated depreciation and amortization) = $11,349 million.\n\nSo, Boeing's net property, plant, and equipment at the end of FY2018 was $11,349 million (in USD millions).", "To answer this question, we need to first calculate the total revenue for FY2022 and then determine if any product or service category represents more than 20% of that amount.\n\nThe total revenue for FY2022 is $93,496 million (calculated by adding the total revenues for each segment).\n\nThe revenue for the Commercial Airplanes segment, which includes sales of both products and services, is $90,229 million.\n\nTherefore, the Commercial Airplanes segment represents approximately 96.6% of Boeing's total revenue for FY2022. This is the only category that comes close to representing more than 20% of Boeing's revenue for FY2022. The other categories all represent less than 10% of the total revenue.\n\nSo, to answer the question, there are no product or service categories that represent more than 20% of Boeing's revenue for FY2022.", "Based on the provided document, there is no information about Boeing reporting any materially important ongoing legal battles from FY2022. The document includes the Consolidated Results of Operations for the quarter ended December 31, 2022, changes in Internal Control Over Financial Reporting, and other information, but it does not mention any legal battles. However, it does mention that Boeing continues to monitor developments and potential Boeing impacts, and take mitigating actions as appropriate, which could potentially include legal matters. For the most accurate and up-to-date information, it is recommended to check Boeing's official financial statements or contact them directly.", "Based on the information provided, Boeing's gross margin as a percentage of net revenue was 45% in 2022, which is a decrease from 48% in 2021. Therefore, Boeing does not have an improving gross margin profile as of FY2022.\n\nGross margin is a useful metric for a company like Boeing as it provides investors with useful information related to the profitability of the business prior to considering all of the operating costs incurred. Management uses this measure in making financial, operating, and planning decisions and in evaluating the Company\u2019s performance. However, it is important to consider other factors such as research and development costs, marketing, general and administrative expenses, amortization of acquisition-related intangibles, licensing gain, interest expense, other income, net, and income tax provision (benefit) to evaluate the overall financial health of the company.", "Based on the provided document, Boeing's primary customers as of FY2022 are not explicitly mentioned. However, it does mention that Boeing facilitates, arranges, structures, and provides selective financing solutions for their Boeing customers. The revenues are reported by customer, but the names of the customers are not provided in the text. Therefore, I cannot provide specific names of Boeing's primary customers in FY2022.", "Yes, Boeing's business is subject to cyclicality. The document mentions that the airline industry, in which Boeing operates, is historically cyclical and very competitive. Additionally, Boeing's results of operations are affected by a variety of factors, including global economic conditions, currency fluctuations, capital and exchange controls, and other unpredictable and volatile factors that impact certain business operations, demand for products and services, in-stock positions, costs of doing business, availability of labor, access to inventory, supply chain operations, key suppliers and subcontractors, and world trade policies.", "Based on the information provided, Boeing is expecting to gradually return to a production rate of 5 per month in 2023. This is an increase from the currently low production rates and represents a significant change from the abnormally low production rates that resulted in abnormal production costs in 2021.", "The provided information does not include the effective tax rate for The Boeing Company in FY2022 and FY2021. The effective tax rate can be calculated by dividing the income tax expense by the pre-tax income. However, the given text does not provide the income tax expense for these years. To accurately answer this question, the missing information is required.", "I'm sorry for any confusion, but the information provided does not include the financial data for Coca Cola. The data presented is for 3M only. Therefore, I cannot provide the ROA for Coca Cola based on the given information.", "To answer your question, I would need the income statement of Coca Cola for the fiscal year 2021. However, you haven't provided the income statement. \n\nHere's the general method to calculate the COGS % margin:\n\nCOGS % Margin = (COGS / Net Sales) * 100\n\nWhere:\n- COGS (Cost of Goods Sold) is the direct costs attributable to the production of the goods sold by a company.\n- Net Sales is the total sales revenue minus the total returns, allowances, and discounts.\n\nPlease provide the income statement so I can help you calculate the COGS % margin for Coca Cola's FY2021.", "To calculate the dividend payout ratio for FY2022, we need to divide the total dividends paid by the net income attributable to shareholders. However, the total dividends paid are not provided in the given statements. Therefore, I cannot calculate the exact dividend payout ratio.\n\nIf you can provide the total dividends paid for FY2022, I would be able to calculate the dividend payout ratio.\n\nAs a reminder, the dividend payout ratio is calculated by dividing the total dividends paid by the net income attributable to shareholders. The formula is:\n\nDividend Payout Ratio = Total Dividends Paid / Net Income Attributable to Shareholders\n\nIn this case, you would need to find the total dividends paid for FY2022 and use the net income attributable to shareholders of $9,571 million.", "To calculate the DPO for FY2020, we first need to determine the average accounts payable between FY2019 and FY2020. However, the information provided only includes the accounts payable balance at the end of each year, not the average balance.\n\nAdditionally, the calculation of DPO requires the Cost of Goods Sold (COGS) for FY2020, which is not provided in the information given.\n\nTherefore, I am unable to calculate the DPO for FY2020 based solely on the information provided.", "To calculate the 3-year average unadjusted operating income percentage margin for Corning, we first need to find the operating income for each of the years 2019, 2020, and 2021. However, the provided information does not include the operating income. It only includes net income and core net income. Therefore, I'm unable to provide the answer based on the given information.", "Based on the information provided, the effective tax rate of Corning in FY2021 was 21.0% and in FY2022 it is expected to be approximately 20.0%. Therefore, the effective tax rate of Corning has decreased by 1.0 percentage points between FY2021 and FY2022.", "Based on the information provided, the FY2022 data has not been given. However, I can help you calculate the working capital using the available data for 2021 and 2020. Working capital is calculated as the difference between current assets and current liabilities.\n\nFor 2021, Corning's current assets were $7.0 billion (total assets of $27.4 billion minus long-term assets of $20.4 billion). The current liabilities were $4.3 billion (total liabilities of $14.2 billion minus long-term liabilities of $9.9 billion). So, the working capital for 2021 would be:\n\nWorking capital (WC) = Current Assets - Current Liabilities\nWC = $7.0 billion - $4.3 billion\nWC = $2.7 billion\n\nFor 2020, Corning's current assets were $6.2 billion (total assets of $25.9 billion minus long-term assets of $19.7 billion). The current liabilities were $4.0 billion (total liabilities of $13.1 billion minus long-term liabilities of $9.1 billion). So, the working capital for 2020 would be:\n\nWorking capital (WC) = Current Assets - Current Liabilities\nWC = $6.2 billion - $4.0 billion\nWC = $2.2 billion\n\nBased on the available data, Corning had a positive working capital in both 2021 and 2020.\n\nHowever, working capital might not be a useful or relevant metric for Corning or any other company in certain situations. For instance, if a company has a significant amount of idle cash or cash equivalents, working capital might not accurately represent the company's operational efficiency or short-term financial health. Additionally, if a company has a business model that requires minimal current assets or has long-term supply contracts, working capital might not be a relevant metric. In these cases, it is essential to consider other financial metrics and ratios to evaluate the company's financial position and performance.", "Based on the information provided in the balance sheet, Costco had a total of $7,574 million in total assets at the end of FY2021.", "To calculate the FY2018 fixed asset turnover ratio for CVS Health, we first need to determine the FY2018 revenue and the average Property, Plant, and Equipment (PP&E) between FY2017 and FY2018.\n\nFrom the provided balance sheet data, we can see that the total assets for FY2017 and FY2018 are $95,131 million and $73,202 million, respectively. However, the balance sheet does not provide a breakdown between current and non-current assets, which would allow us to identify the PP&E amount.\n\nTherefore, I'm unable to calculate the fixed asset turnover ratio with the given information. To perform this calculation, we would need more detailed financial information, such as a breakdown of assets into current and non-current categories or a specific line item for PP&E.", "To answer your question, I would need to know the FY2022 data for CVS Health, particularly the data related to the company's investments in long-term assets such as property, plant, and equipment. Capital-intensive businesses typically have a high ratio of capital expenditures to operating expenses.\n\nHowever, I don't have any information provided before the question, so I cannot provide an accurate answer. I would recommend checking the financial statements or investor relations section of CVS Health's website for more information on their capital expenditures and operating expenses.", "Yes, CVS Health has reported ongoing legal battles from the mentioned years. In 2022, a class action under ERISA was filed against CVS Health and Aetna in the U.S. District Court for the District of Connecticut. The court issued a joint judgment against the three defendants in August 2022, ordering them to pay $651 million over 15 years and imposing certain injunctive relief. CVS Health is appealing this judgment and has not accrued a liability for this matter.\n\nIn 2021, there is no specific legal battle mentioned in the provided document. However, it does mention that appeals are pending for two cases (one of which is an ERISA case) that were stayed in 2020.\n\nIn 2020, two class actions under ERISA were filed against CVS Health and Aetna in the U.S. District Court for the District of Connecticut. The Company has moved to dismiss the amended complaints in these cases. Additionally, a trial in federal court in Ohio took place, and the court issued a judgment against the three defendants in August 2022, as previously mentioned.", "Yes, based on the information provided, CVS Health Corporation paid dividends to common shareholders in Q2 of FY2022. The quarterly cash dividend for 2022 was $0.55 per share, and CVS Health has consistently paid dividends every quarter since becoming a public company. Therefore, it can be inferred that dividends were paid in Q2 of FY2022. However, the exact date of payment is not specified in the text.", "Based on the provided document, Mary N. Dillon, the new CEO of Foot Locker, Inc. as of September 1, 2022, has previous CEO experience. However, it does not explicitly mention if her previous experience is in a company similar to Foot Locker. It is recommended to look into her past roles in other companies for a more accurate answer.", "Based on the information provided, there were no board member nominees who had substantially more votes against joining than the other nominees. Each of the ten nominees received a majority of the votes cast \"for\" their election, and none of them received a significant number of votes \"against\" their election. Therefore, all ten nominees were duly elected to the Board of Directors.", "To calculate the Cash Conversion Cycle (CCC) for General Mills for FY2019, we first need to calculate the Days Inventory Outstanding (DIO), Days Sales Outstanding (DSO), and Days Payable Outstanding (DPO).\n\nThe given information does not provide the FY2018 and FY2019 financial data separately, but it does provide the following information:\n\n* Inventories at June 30, 2020: Not used in the calculation as we need the average inventory between FY2018 and FY2019.\n* Inventories at balance sheet date (assumed to be FY2019): Not used in the calculation as we need the average inventory between FY2018 and FY2019.\n* COGS (Cost of Goods Sold) for FY2019: Not provided.\n* Change in inventory between FY2018 and FY2019: Not provided.\n* Accounts receivable at May 31, 2019 and 2018: Not used in the calculation as we need the average accounts receivable between FY2018 and FY2019.\n* Accounts payable at May 31, 2019 and 2018: Not used in the calculation as we need the average accounts payable between FY2018 and FY2019.\n* Revenue for FY2019: Not provided.\n\nDue to the lack of necessary data, it is not possible to calculate the CCC for General Mills for FY2019. To perform the calculation, we would need the COGS, inventory, and revenue data for both FY2018 and FY2019.", "The working capital ratio is calculated as total current assets divided by total current liabilities.\n\nTotal current assets for FY2020 is given as 895.6 and total current liabilities is given as 71.4.\n\nSo, the working capital ratio for General Mills in FY2020 is 895.6 / 71.4 = 12.55.\n\nRounded to two decimal places, the working capital ratio is 12.55.", "The FY2020 free cash flow (FCF) for General Mills can be calculated as follows:\n\nFCF = Cash from operations - Capex\nFCF = $3,9539 million - $776.2 million\n\nTherefore, the FY2020 free cash flow for General Mills is $3,177.7 million.", "To calculate the FY2022 retention ratio for General Mills, we first need to determine the total cash dividends paid and the net income attributable to shareholders for FY2022. However, the provided data only includes net earnings attributable to shareholders, not net income attributable to shareholders. \n\nAssuming that net earnings attributable to shareholders and net income attributable to shareholders are the same, we can proceed with the calculation. \n\nFrom the provided data, the net earnings attributable to General Mills (which we are assuming is the same as net income attributable to shareholders) for FY2022 is $2,181.2 million. However, the total cash dividends paid for FY2022 are not provided in the given data.\n\nTherefore, I am unable to compute the FY2022 retention ratio for General Mills without the total cash dividends paid for FY2022.", "Based on the information provided, it is not possible to definitively classify Johnson & Johnson (JnJ) as a high growth company for FY2022. The text mentions that the company returned approximately $1.2 billion to shareholders through cash dividends and share repurchases, and that they had strong annual cash flow and balance sheet. It also mentions that the company made investments in infrastructure, acquisitions, and organic growth, but it is not clear what the financial impact of these investments were.\n\nThe table shows that the company had a loan commitment of $15,794 million in the Office segment as of June 30, 2022. However, it is not clear how this figures compare to previous years or if it represents an increase or decrease in growth.\n\nIt would be beneficial to have a look at JnJ's financial statements for FY2022, including the income statement, balance sheet, and cash flow statement, to make a more informed assessment of the company's growth. Additionally, comparing these financials to previous years would also provide context on whether the company is experiencing high growth.\n\nIt is also worth noting that the text mentions that the company's ability to execute its current and long-term business, operational and capital expenditures strategies, as well as its ability to finance current operations, capital expenditures and growth initiatives, could be affected by various factors such as changes in interest rates, economic conditions, and the company's ability to access capital markets. These factors could also impact the company's growth.", "Based on the information provided, the gross margin as a percentage of net revenue for JnJ was 45% in 2022, compared to 48% in 2021. This decrease in gross margin percentage can be attributed to a few factors.\n\nFirstly, the document mentions that the core merchandise categories, predominantly non-foods, and the warehouse ancillary and other businesses, largely e-commerce, had a two basis point improvement in 2021. However, it does not mention any improvement in these areas for 2022.\n\nSecondly, there is no mention of any reserve on inventory recorded in 2022, which positively impacted the gross margin percentage in 2021.\n\nTherefore, it can be inferred that the decrease in gross margin percentage for JnJ in FY2022 could be due to a lack of improvement in the core merchandise categories and the absence of any positive impact from inventory reserves.\n\nHowever, it is important to note that gross margin may not always be a useful metric for a company like JnJ. Gross margin only takes into account the cost of goods sold and does not consider other expenses such as research and development, marketing, general and administrative expenses, and interest expense.\n\nFor a company like JnJ, which invests heavily in research and development and has significant marketing and administrative expenses, gross margin may not provide a complete picture of the company's profitability. Therefore, it is essential to consider other financial metrics, such as operating margin and net profit margin, to evaluate the company's financial performance fully.", "To calculate the inventory turnover ratio, we need the cost of goods sold (COGS) for the fiscal year 2022, which is not provided in the document. However, we can find the Revenue - Non-Regulated for FY2022, which is $1,093 million. Although it's not explicitly stated, it is reasonable to assume that a significant portion of revenue comes from selling inventory.\n\nAssuming that Revenue - Non-Regulated is primarily driven by inventory sales, we can calculate the inventory turnover ratio as follows:\n\nInventory Turnover Ratio = Revenue / Average Inventory\n\nWe need to find the average inventory for FY2022. Since the inventory balance is only provided for December 31, 2022, we cannot calculate the exact average inventory. However, we can estimate it by assuming that the inventory balance remains relatively constant throughout the year.\n\nEstimated Average Inventory = (Beginning Inventory + Ending Inventory) / 2\n\nBeginning Inventory (FY2022) is not provided, but we can estimate it by using the inventory balance of the previous year (December 31, 2021), which is $521 million.\n\nEstimated Average Inventory = ($521 million + $604 million) / 2 = $562.5 million\n\nNow, we can calculate the inventory turnover ratio:\n\nInventory Turnover Ratio = $1,093 million / $562.5 million \u2248 1.94\n\nThis estimated inventory turnover ratio suggests that JnJ sold its inventory roughly 1.94 times during the fiscal year 2022. However, keep in mind that this is an approximation, as we had to estimate the beginning inventory and assume that the conventional inventory management is meaningful for the company.\n\nIf the company's inventory management is not conventional, it might be challenging to calculate the inventory turnover ratio accurately. This could be the case if JnJ uses a significant portion of its inventory for purposes other than direct sales, such as research and development, or if the company has a complex supply chain with long lead times and significant work-in-progress inventory. In such cases, the inventory turnover ratio might not provide a meaningful measure of inventory management efficiency.", "Based on the information provided, the question seems to be referring to Johnson & Johnson (JnJ) in the context of fiscal year 2023 (FY2023). However, the document only provides information about JnJ's expectations for fiscal year 2024 (FY2024).\n\nTherefore, I cannot provide an answer to the question using the information provided. The document does not contain any data or statements about JnJ's expected growth in adjusted EPS for FY2023.", "Based on the information provided, JnJ's US sales in FY2022 were $28.0 billion, an increase of 8.6%. On the other hand, the company's international sales were $24.1 billion, an increase of 21.6%, which included 18.8% operational growth and a positive currency impact of 2.8%. Therefore, JnJ's international sales grew at a faster rate than its US sales in FY2022.", "Based on the information provided, there is no mention of any business segment of JnJ being treated as a discontinued operation from August 30, 2023, onward. The latest date mentioned in the text is the fourth quarter of 2021, where the financial results of the Meridian subsidiary are reflected as discontinued operations for all periods presented.", "The document does not provide the specific amount of the gain accruing to Johnson & Johnson (JnJ) as a result of the separation of its Consumer Health business segment as of August 30, 2023. The information available in the document is only up to December 31, 2021.", "The text provided does not contain information about the amount of cash proceeds that Johnson & Johnson (JnJ) realized from the separation of Kenvue as of August 30, 2023. The latest date mentioned in the text is the fourth quarter of 2020.", "To answer your question, we need to first calculate the net earnings as a percent of sales for both quarters.\n\nFor Q2 of FY2022, JPMorgan Chase reported net income of $8.6 billion and total net revenue of $31.6 billion. So, the net earnings as a percent of sales for Q2 of FY2022 is:\n\n($8.6 billion / $31.6 billion) * 100% = 27.17%\n\nFor Q2 of FY2023, JPMorgan Chase reported net income of $14.5 billion and total net revenue of $30.5 billion. So, the net earnings as a percent of sales for Q2 of FY2023 is:\n\n($14.5 billion / $30.5 billion) * 100% = 47.54%\n\nComparing the two percentages, we can see that JPMorgan Chase's net earnings as a percent of sales increased from 27.17% in Q2 of FY2022 to 47.54% in Q2 of FY2023. Therefore, the answer to your question is yes.", "Based on the information provided, the Consumer & Community Banking segment of JPMorgan Chase had the lowest net revenue in 2021 Q1. The net revenue for this segment was $12.6 billion, while the Corporate & Investment Bank segment had a net revenue of $12.8 billion, and the Commercial Banking segment had a net revenue of $3.1 billion. The other segments, namely, Corporate, Asset & Wealth Management, and Commercial Banking had higher net revenues than the Consumer & Community Banking segment in 2021 Q1.", "The provided documentation does not contain information about JPM's financial status as of 2021 Q1, nor does it provide data on the number of shareholders or the total number of shares. Therefore, it is not possible to accurately answer this question without additional information.", "Based on the information provided, I cannot confirm if JPM's (J.P. Morgan's) gross margins are historically consistent as the document only provides data for the year 2020 and part of 2021. However, it does mention that gross margin percentage was negatively impacted by three basis points due to increased rewards and two basis points due to a LIFO charge, but was positively impacted by approximately $301 due to changes in foreign currencies. \n\nAlso, it's mentioned that gross margin on a segment basis contracted by 530 basis points primarily due to unfavorable standard foreign currency exchange rates. This indicates that gross margins can fluctuate more than roughly 2% each year due to various factors such as changes in rewards, LIFO charges, and foreign currency exchange rates.\n\nGross margin is a relevant metric for a company like JPM as it provides insight into the company's efficiency in utilizing its resources to generate revenue. However, it is important to note that gross margin alone may not provide a complete picture of a company's financial health, and it should be considered in conjunction with other financial metrics.", "The provided document does not contain specific income data for each quarter of 2022. It only mentions that JPMorgan Chase's net income for the full year 2022 was $37.7 billion. Therefore, I cannot provide the information about which business segment had the highest net income in Q2 2022.", "Based on the provided document, the VaR (Value at Risk) for JPM (JPMorgan Chase & Co.) in the second fiscal quarter of 2023 is $85 million. In the same period of the prior year (second fiscal quarter of 2022), the VaR was $150 million. Therefore, the risk that JPM faced in the second fiscal quarter of 2023 decreased compared to the same period in the prior year.", "To calculate the inventory turnover ratio for FY2019, we first need to determine the cost of sales (COGS) for FY2019 and the average inventory for FY2018 and FY2019.\n\nFrom the information provided, we can extract the following data:\n\nCOGS for FY2019:\n- Cost of sales - products: $44,589 million\n- Cost of sales - services: $8,731 million\nTotal COGS for FY2019: $44,589M + $8,731M = $53,320 million\n\nAverage inventory for FY2018 and FY2019:\n- FY2018 ending inventory: $2,280 million\n- FY2019 beginning inventory: $1,404 million\nAverage inventory: ($2,280M + $1,404M) / 2 = $1,842 million\n\nNow, we can calculate the inventory turnover ratio for FY2019:\n\nInventory turnover ratio = (FY2019 COGS) / (average inventory between FY2018 and FY2019)\nInventory turnover ratio = $53,320M / $1,842M = 28.93\n\nSo, Kraft Heinz's FY2019 inventory turnover ratio is approximately 28.93.", "To calculate Lockheed Martin's asset turnover ratio for FY2020, we first need to determine the average total assets for FY2019 and FY2020. Based on the provided balance sheet excerpt, the total assets for FY2019 are $16,998 million and for FY2020 are $16,865 million.\n\nNext, we need to find the FY2020 revenue. However, the provided information does not include a Profit and Loss (P&L) statement with the revenue figure. Therefore, I'm unable to calculate the exact asset turnover ratio. If you could provide the FY2020 revenue, I would be happy to calculate the ratio for you.\n\nPlease note that the asset turnover ratio calculation should be as follows:\n\nFY2020 revenue / ((Total assets FY2019 + Total assets FY2020) / 2)\n\nOnce you provide the FY2020 revenue, I can calculate the asset turnover ratio for you.", "Based on the information provided in the balance sheet, Lockheed Martin's FY2021 net working capital can be calculated as total current assets less total current liabilities.\n\nCurrent assets for FY2021 were reported to be $14,688 million, and current liabilities for FY2021 were reported to be $9,523 million.\n\nUsing these figures, Lockheed Martin's FY2021 net working capital is calculated as follows:\n\nNet working capital = Current assets - Current liabilities\nNet working capital = $14,688 million - $9,523 million\nNet working capital = $5,165 million\n\nTherefore, Lockheed Martin's FY2021 net working capital was $5,165 million.", "I'm sorry for any confusion, but the information provided does not include Lockheed Martin's financial data. The information is about a different company, and it only includes data up to FY2020. Therefore, I'm unable to provide the Compound Annual Growth Rate (CAGR) for Lockheed Martin's total revenue from FY2020 to FY2022. To calculate the CAGR, we would need the total revenue for all three years.", "Based on the information provided, the balance sheet for MGM Resorts International and its subsidiaries only includes data up to December 31, 2022. There is no information about the financial position as of December 31, 2018, or any data for fiscal year 2018. Therefore, it is not possible to accurately answer your question without additional information.\n\nTo clarify, the exact text I used to make this determination is:\n\nMGM RESORTS INTERNATIONAL AND SUBSIDIARIES\nCONSOLIDATED BALANCE SHEETS\n(In thousands, except share data)\n(Unaudited)\nJune 30,\n2023 December 31,\n2022\n\nSince there is no 2018 balance sheet provided, I cannot find the year-end FY2018 amount of accounts payable for MGM Resorts.", "To calculate the capital expenditures (capex) as a percentage of revenue for the years 2018 to 2020, we first need to determine the capex for each year and the total revenue for the corresponding years.\n\nFrom the Statement of Cash Flows, we can find the capital expenditures for each year:\n- FY2018: $1,554,000 thousand\n- FY2019: $1,358,000 thousand\n- FY2020: $1,004,000 thousand\n\nNext, we'll get the total revenue for each year from the Income Statement:\n- FY2018: $11,763,096 thousand\n- FY2019: $12,899,672 thousand\n- FY2020: $5,162,082 thousand\n\nNow, we can calculate the capex as a percentage of revenue for each year:\n- FY2018: $1,554,000 / $11,763,096 = 0.132 (or 13.2%)\n- FY2019: $1,358,000 / $12,899,672 = 0.105 (or 10.5%)\n- FY2020: $1,004,000 / $5,162,082 = 0.194 (or 19.4%)\n\nFinally, we can calculate the 3-year average capex as a percentage of revenue:\n($1,554,000 + $1,358,000 + $1,004,000) / ($11,763,096 + $12,899,672 + $5,162,082) = 0.138 (or 13.8%)\n\nSo, the 3-year average capex as a percentage of revenue for MGM Resorts from FY2018 to FY2020 is approximately 13.8%.", "Based on the provided documentation, there is no information available about any dividends paid by MGM Resorts to common shareholders in FY2022. The document only provides information up to December 31, 2021. Therefore, I cannot provide an accurate answer to this question.", "Based on the information provided, the region with the highest EBITDAR contribution for MGM during FY2022 was the Las Vegas Strip Resorts, with an Adjusted Property EBITDAR of $825,267 thousand.", "The text provided does not include the necessary information to directly calculate the interest coverage ratio for FY2022 using the Adjusted EBIT from FY2022 and the annual interest expense. The provided document includes the interest coverage ratio for accounting dates from March 31, 2023, to December 31, 2024, and for accounting dates occurring on and after March 31, 2025. It also includes an amendment letter.\n\nHowever, it does provide the Adjusted EBITDAR for the year ended December 31, 2022 ($1,142,107). Assuming the interest expense for FY2022 is available from another source, you can calculate the interest coverage ratio by dividing the Adjusted EBIT or EBITDAR for FY2022 by the interest expense for the same period.\n\nInterest Coverage Ratio = Adjusted EBIT or EBITDAR / Interest Expense", "To answer your question, we need to first identify the topline revenue for each region during FY2022. However, the provided document only seems to contain the Adjusted Operating Margin and Total figures for each region and year, not the topline revenue. Therefore, I'm unable to provide an answer to your question based on the given document.", "Based on the information provided, the text does not contain specific data about short-term investments for MGM in H1 FY2023, including the types and amounts of debt that received investments. Therefore, it's not possible to accurately answer this question without additional context or information.", "The Cost of Sales (COGS) for Microsoft in FY2016 was $7 million. This information can be found on the Consolidated Statements of Operations under the line item \"Cost of sales\" in the year ended December 31, 2016 section. Please note that this is the value as stated in the document, and no adjustments have been made for millions to USD conversions as the document does not specify a different currency.", "Based on the information provided, there is no direct mention of Microsoft's total debt for the FY2023. However, it is stated that the total debt portfolio was approximately $133.0 billion at December 31, 2022. At December 31, 2020, the total debt was approximately $124.0 billion. Therefore, it can be inferred that the debt has increased between the FY2020 and the FY2022 period, but without the FY2023 data, it cannot be confirmed if there was an increase between FY2023 and FY2022.", "To calculate the FY2015 unadjusted EBITDA % margin for Netflix, we first need to compute the unadjusted EBITDA using the provided Statement of Income and Statement of Cash Flows.\n\nUnadjusted EBITDA is calculated as Operating Income plus Depreciation and Amortization (D&A) from the Statement of Income. However, the D&A provided in the Statement of Cash Flows is already given for FY2015 as $407,004. We need to find the corresponding D&A from the Statement of Income.\n\nUnfortunately, the Statement of Income does not provide the D&A for FY2015 directly. But we can calculate it by finding the difference between D&A in FY2016 and the increase in D&A from FY2014 to FY2015.\n\nD&A for FY2015 (from Statement of Income) = D&A for FY2016 - Increase in D&A from FY2014 to FY2015\n= $654,893 - ($654,893 - $407,004)\n= $407,004\n\nNow, we can calculate the unadjusted EBITDA:\n\nUnadjusted EBITDA = Operating Income (from Statement of Income) + D&A (from Statement of Cash Flows)\n= $723,427 + $407,004\n= $1,130,431\n\nFinally, we can calculate the FY2015 unadjusted EBITDA % margin:\n\nFY2015 unadjusted EBITDA % margin = (Unadjusted EBITDA / Total Revenue) * 100%\n= ($1,130,431 / $5,797,924) * 100%\n\u2248 19.5%\n\nSo, the FY2015 unadjusted EBITDA % margin for Netflix is approximately 19.5%.", "Based on the information provided, Netflix's year end FY2017 total current liabilities were $4.2 billion. This information is directly stated in the text as part of the Consolidated Balance Sheets as of December 31, 2017.", "To calculate the three-year average of the cost of goods sold (COGS) as a percentage of revenue from FY2016 to FY2018, we first need to find the COGS and revenue for each year and then calculate the percentage. Here's the information provided in the statement of income:\n\nFY2018:\nCOGS: $22,294 million\nRevenue: $36,398 million\n\nFY2017:\nCOGS: $20,134 million\nRevenue: $34,353 million\n\nFY2016:\nCOGS: $19,782 million\nRevenue: $32,376 million\n\nNow, let's calculate the percentage for each year:\n\nFY2018: 61.3% (approximately)\nFY2017: 58.6% (approximately)\nFY2016: 61.1% (approximately)\n\nFinally, let's calculate the three-year average:\n\nThree-year average: (61.3% + 58.6% + 61.1%) / 3 = 60.0% (approximately)\n\nSo, Nike's three-year average of COGS as a percentage of revenue from FY2016 to FY2018 is approximately 60.0%.", "The information provided does not include the balance sheet for Nike. However, I can provide information on how to find the total current assets on a balance sheet. Current assets are typically listed in the first section of the balance sheet and include items such as cash, accounts receivable, and inventory. To find the total current assets, you would add up all the individual amounts listed in this section. Unfortunately, without the balance sheet, I cannot provide the total current assets for Nike at the end of FY2019. I recommend checking the 2019 FORM 10-K document for the balance sheet information.", "To calculate the inventory turnover ratio for FY2021, we first need to determine the cost of goods sold (COGS) for FY2021 and the average inventory for FY2020 and FY2021.\n\nFrom the information provided, we can see that the Merchandise Inventories for FY2020 and FY2021 were $119 million and $125 million, respectively. However, this information does not provide the inventory levels for any specific dates within those fiscal years. Without the specific inventory data for the beginning and end of FY2021, we cannot calculate the average inventory for that period.\n\nTherefore, I'm unable to provide the FY2021 inventory turnover ratio based on the given information. To calculate the inventory turnover ratio, we need the average inventory for the fiscal year and the COGS for that year.", "I'm sorry, I don't have the specific data for Nike's cash flow for FY2023 as the provided document only goes up to FY2019. However, based on the information available, I can tell you that:\n\n1. Cash flows from operating activities were $5,058 million in FY2019, a decrease from $5,287 million in FY2018.\n2. Cash flows from investing activities were -$3,193 million in FY2019, an increase in cash outflow from -$1,476 million in FY2018. This increase was primarily due to higher purchases of property, plant, and equipment, and capitalized computer software.\n3. Cash flows from financing activities were $5,293 million in FY2019, an increase from $4,835 million in FY2018. This increase was primarily due to the repayment of notes payable during FY2019.\n\nPlease refer to Nike's official FY2023 financial statements or reports for the specific data you are looking for.", "Based on the information provided, PayPal's working capital decreased $1.2 billion from 2021 to 2022. Working capital is calculated as current assets minus current liabilities. While the specific current asset and current liability values for 2022 are not provided, we can see that current assets have decreased (e.g., cash, cash equivalents and short-term investments, trade accounts receivable, inventories, prepaid expenses and other current assets) and current liabilities have increased (e.g., accrued expenses) compared to 2021. Therefore, it is unlikely that PayPal has positive working capital based on FY2022 data.\n\nHowever, it is essential to note that working capital may not be a useful or relevant metric for PayPal, as it is not defined under U.S. generally accepted accounting principles and may not be computed the same as similarly titled measures used by other companies. The company itself states that working capital is meaningful to investors as a measure of operational efficiency and short-term financial health. In PayPal's case, their primary source of revenue comes from transaction fees, which may not be directly related to their working capital position.", "To answer your question, as an investment analyst, I would look for the \"Investing activities\" section of the statement of cash flows for the fiscal year 2021. Capital expenditures are typically reported under this section. However, the provided information does not include a complete statement of cash flows for any of the years, only snippets from different sections.\n\nTherefore, based on the available information, I cannot provide the exact capital expenditure amount for PepsiCo in fiscal year 2021 (in USD billions). To accurately answer this question, I would need access to the complete and accurate financial statements for PepsiCo. I encourage you to provide the complete statement of cash flows for further assistance.", "Based on the provided document, PepsiCo operates in the following geographies as of FY2022:\n\n1. Europe, Middle East & Africa\n2. Latin America\n3. North America\n4. Asia Pacific\n\nThese geographical areas are referred to as operating segments in the document. It's important to note that the information is provided up to the year ended December 31, 2021, and there is no specific information about FY2022. However, since no significant changes in operating segments are mentioned, it's assumed that the geographical segments remain the same for FY2022.", "Yes, according to the information provided in the document, PepsiCo has reported ongoing legal battles from FY2022 and FY2021. Specifically, it is mentioned that there are individual actions against Visa, Mastercard, the Firm, and other banks, which were filed by certain merchants and some of these actions are still pending. Additionally, there is a lawsuit related to AFFF (Aqueous Film-Forming Foam) and natural resource damages, which was removed to federal court and is still ongoing. However, the document does not provide specific information about the FY2021 legal battles.\n\nIt is important to note that the information provided in the document is accurate as of the date it was filed, which is March 19, 2022, and may have changed after that date. It is recommended to consult the latest financial reports or legal documents for the most up-to-date information.", "Based on the provided document, the restructuring costs for PepsiCo in FY2022 are outlined in Note 3 - Restructuring and Impairment Charges. The total restructuring and impairment charge for FY2022 was $37,006.", "To calculate the FY2022 unadjusted EBITDA less capex for PepsiCo, we first need to determine the unadjusted operating income and then add depreciation and amortization. Unadjusted operating income is the net income before taxes, interest, and other non-operating items.\n\nFrom the income statement provided, the FY2022 net income is $13,305 million. However, the income statement does not provide enough details to calculate unadjusted operating income directly. Therefore, we will use the Statement of Cash Flows to derive the necessary information.\n\nIn the Statement of Cash Flows, the Operating Activities section shows Net income and Depreciation and amortization. However, it does not provide the exact operating income. To estimate the operating income, we can use the following formula:\n\nOperating Income \u2248 Net income + Taxes Paid - Depreciation and amortization\n\nFrom the Statement of Cash Flows, we have:\n- Net income (2022): $13,305 million\n- Taxes Paid (2022): $2,141 million (calculated as Provision for Income Taxes)\n- Depreciation and amortization (2022): $4,247 million\n\nNow, we can calculate the unadjusted operating income:\n\nUnadjusted Operating Income \u2248 $13,305 million + $2,141 million - $4,247 million\nUnadjusted Operating Income \u2248 $11,209 million\n\nFinally, we can calculate the FY2022 unadjusted EBITDA less capex:\n\nUnadjusted EBITDA \u2248 Unadjusted Operating Income + Depreciation and amortization\nUnadjusted EBITDA \u2248 $11,209 million + $4,247 million\nUnadjusted EBITDA \u2248 $15,456 million\n\nCapital Expenditures (2022) can be found in the Investing Activities section of the Statement of Cash Flows: $3,544 million\n\nNow, we can calculate unadjusted EBITDA less capex:\n\nUnadjusted EBITDA less capex \u2248 Unadjusted EBITDA - Capital Expenditures\nUnadjusted EBITDA less capex \u2248 $15,456 million - $3,544 million\nUnadjusted EBITDA less capex \u2248 $11,912 million\n\nIn FY2022, the unadjusted EBITDA less capex for PepsiCo is approximately $11,912 million.", "The document provided does not contain information about Pepsico's core constant currency EPS growth guidance as of FY2023Q1.", "The information provided does not include the outcome of the shareholder vote on the shareholder proposal for a congruency report by PepsiCo on net-zero emissions policies. Therefore, I cannot provide an answer to this question.", "PepsiCo increased its unsecured five year revolving credit agreement by $400,000,000 on May 26, 2023. This is calculated by subtracting the previous credit agreement amount of $3,800,000,000 from the new 2023 Five Year Credit Agreement amount of $4,200,000,000.", "As of May 26, 2023, PepsiCo may borrow up to $8,400,000,000 in total under its unsecured revolving credit agreements. This amount is calculated as the sum of the two credit agreements:\n\n1. The 2023 364 Day Credit Agreement enables PepsiCo and its borrowing subsidiaries to borrow up to $4,200,000,000 in U.S. Dollars and/or Euros.\n2. The 2023 Five Year Credit Agreement enables PepsiCo and its borrowing subsidiaries to borrow up to $4,200,000,000.\n\nKeep in mind that this is the maximum amount they can borrow, and actual borrowings may be lower and will depend on various factors, including customary terms and conditions.", "The document does not provide specific information on why PepsiCo raised full year guidance for FY2023 in FY2023Q1. The closest relevant information is about updates to the presentation and method of calculation for certain metrics in the first quarter of fiscal year 2023, but it does not mention any changes in guidance.", "The document provided does not contain information about Pepsico's core constant currency EPS growth guidance as of FY2023Q1.", "The information provided does not directly give the Pfizer's PPNE (Pension Plan Net Assets Excess) for FY20 and FY21. However, it mentions that Pfizer's main U.S. qualified plan and many of their international plans were overfunded as of December 31, 2021. This suggests that the PPNE might have increased, but I cannot confirm this without the specific PPNE figures for those years.", "Based on the provided documentation, it mentions that the net income attributable to Pfizer Inc. common shareholders before the impact of purchase accounting for acquisitions, acquisition-related items, discontinued operations and certain significant items is a measure that provides investors with useful information to evaluate the normal recurring operational activities and understand management's assessment of performance. However, it does not provide a comparable view of the company's performance to peers and is not a substitute for its directly comparable GAAP measure of net income attributable to Pfizer.\n\nThere is no mention of any potential events that are not in Pfizer's standard business operations that substantially increased net income in 2019. Therefore, based on the information provided, I cannot confirm or deny if there were any such events. To get a complete and accurate answer, it would be best to consult Pfizer's financial statements or contact Pfizer directly.", "Based on the provided document, the three main companies acquired by Pfizer mentioned in this 10-K report are:\n\n1. Wyeth: Pfizer completed the acquisition of Wyeth in October 2009.\n2. Hospira: Pfizer acquired Hospira in September 2015.\n3. Medivation: Pfizer purchased Medivation in September 2016.\n\nPlease note that the acquisition of these companies is mentioned in the document, but specific details about the acquisitions are not provided in the text you've given.", "Based on the information provided, Pfizer has already paid $412 million to the Upjohn Business in connection with the spin-off. However, the text does not mention any further payments expected in the future. Therefore, I cannot provide an answer to this question without additional information.", "Based on the provided document, the revenues for Q2 2023 are not available for Pfizer. Therefore, it's not possible to answer this question without additional information. The document only provides the revenues for the full year 2022, 2021, and the quarterly revenues for 2021, but not for Q2 2023.", "Based on the provided document, which includes information up to the fourth quarter of 2020, there is no mention of Pfizer planning to spin off any large business segments as of the second quarter of 2023. However, please note that the document does not contain information more recent than the fourth quarter of 2020. For the most accurate and up-to-date information, it is recommended to check Pfizer's official announcements or their more recent financial reports.", "The document does not provide information about debt securities registered to trade on a national securities exchange under Ulta Beauty's name as of FY2023. The text only mentions that debt securities are classified as available-for-sale (AFS) or held-to-maturity (HTM) and carried at fair value, with predominantly all of these securities held by Treasury and CIO in connection with its asset-liability management activities. The text also mentions Note 2 discussing trading assets but does not provide specific details about FY2023.", "Based on the provided document, there is no information about any major acquisitions that Ulta Beauty has done in Fiscal Year 2023 (FY2023) and Fiscal Year 2022 (FY2022). The document mainly discusses the increase in assortment of Black-owned and Black-founded brands, and the audited consolidated balance sheets of Ulta Beauty, Inc. as of specific dates in FY2023 and FY2022. Therefore, I cannot provide an answer to your question without additional information.", "Based on the information provided, the reduction in SG&A (Selling, General, and Administrative) expenses as a percent of net sales in FY2023 (fiscal year 2023) was primarily due to leverage from higher sales. \n\nThe document states that as a percentage of net sales, SG&A expenses decreased 180 basis points to 23.9% in fiscal 2021 compared to 25.7% in fiscal 2020. This leverage was primarily due to:\n\n1. 180 basis points of leverage of corporate overhead due to higher sales.\n2. 90 basis points of leverage of store payroll and benefits due to higher sales.\n3. 50 basis points from other factors.\n\nHowever, the document does not provide information on the SG&A expenses or net sales for fiscal 2022 or fiscal 2023. Therefore, I cannot provide specific data for those years. The last available data is for fiscal 2021.", "The text provided does not directly answer the question as it does not provide information on what drove the increase in Ulta Beauty's merchandise inventories balance at the end of FY2023. The text does provide information about the increase in cash and cash equivalents and receivables, net, but not about merchandise inventories.", "The provided document does not contain information about Ulta Beauty's total spend on stock repurchases for FY 2023 or the amount spent in Q4 of FY2023. Therefore, I cannot provide an answer to this question.", "I don't have real-time access to the data, but based on the information provided, the document does not seem to include the specific compensation expense for FY2023. Therefore, I cannot definitively answer whether the wages expense as a percent of net sales increased or decreased in FY2023. I recommend checking the latest financial report of Ulta Beauty, Inc. for accurate and up-to-date information.", "Based on the information provided, the derivative instrument with the highest notional value in FY 2021 was cross currency swaps, with a notional value of $32,502 million.", "Based on the information provided, Verizon expects to pay $369 million for its retirees in 2024. This information can be found under the \"Retiree medical\" section of the table in the Verizon 2021 Annual Report on Form 10-K.", "The text provided does not include the quick ratio for Verizon in FY 2022. The quick ratio is a measure of a company's short-term liquidity and is calculated as the ratio of quick assets (current assets excluding inventory) to current liabilities.\n\nHowever, the text does mention that Verizon maintains a level of liquidity sufficient to meet its short-term cash needs. This suggests that Verizon's liquidity profile is likely to be healthy, but without the quick ratio, it is not possible to make a definitive statement.", "Based on the information provided, which includes data from the Verizon 2021 Annual Report on Form 10-K, Verizon is described as a capital intensive business. However, the specific FY 2022 data was not provided in the text. The text does mention that Verizon's business is capital intensive and that they continue to invest in wireless networks, high-speed fiber, and other advanced technologies. It also mentions that a majority of this capital is funded by cash flows from operations and that when necessary, the company obtains funds from external sources, primarily in the debt markets and through short-term commercial paper borrowings. Therefore, based on the available information, it can be inferred that Verizon was a capital intensive business in 2021 and it is likely that it remains capital intensive in 2022.", "Yes, based on the information provided in the Verizon 2021 Annual Report on Form 10-K, Verizon's total debt increased to $150.9 billion at December 31, 2021, compared to $129.1 billion at December 31, 2020. Therefore, Verizon did increase its debt on the balance sheet between the 2022 fiscal year (which had not yet occurred at the time of the report) and the 2021 fiscal period.", "To calculate the FY2018 DPO for Walmart, we first need to determine the average accounts payable for FY2017 and FY2018. However, the provided information does not include the accounts payable data for these years. Therefore, I cannot provide an accurate answer to your question.\n\nTo calculate DPO, we need the following data:\n1. Average accounts payable for the fiscal years in question.\n2. Cost of goods sold (COGS) for the latest fiscal year.\n3. Change in inventory between the two fiscal years.\n\nOnce we have this information, we can calculate DPO using the formula:\nDPO = 365 * (average accounts payable) / (COGS + change in inventory)\n\nI encourage you to provide the necessary data to perform the calculation, or consult the relevant financial statements to obtain the required information.", "The operating income as a percentage of net sales for FY2018 was 4.4% and for FY2019 it was 4.0%. To find the change in unadjusted operating income % margin between FY2018 and FY2019, we subtract the operating income % margin of FY2019 from that of FY2018.\n\n4.4% (FY2018) - 4.0% (FY2019) = 0.4%\n\nTherefore, the change in unadjusted operating income % margin for Walmart from FY2018 to FY2019 is 0.4%.", "To calculate the 3-year average unadjusted EBITDA margin for Walmart from FY2018 to FY2020, we first need to determine the unadjusted operating income and depreciation and amortization for each of the years. However, the provided document only shows the operating income and not the depreciation and amortization.\n\nTo proceed with the calculation, we will assume that the depreciation and amortization can be found in the cash flow statement. Unfortunately, the given document does not contain the cash flow statement.\n\nTherefore, I cannot provide the unadjusted EBITDA % margin for Walmart based on the information provided. If you can provide the depreciation and amortization figures for FY2018 to FY2020, I can calculate the unadjusted EBITDA % margin for you.", "Based on the provided documentation, the themes and age groups targeted by the LEGO sets featured in the Fall 2023 and Summer 2023 catalogs can be compared as follows:\n\nFall 2023 Catalog:\nThe themes of the LEGO sets featured in the Fall 2023 catalog are not explicitly mentioned in the provided catalog cover. However, it features the characters Izzie and Bunchu, which might suggest that there are sets related to them or their world. The age group for the Fall 2023 catalog is not specified either, but the LEGO Group typically targets a wide range of age groups, from young children to adults, with their sets.\n\nSummer 2023 Catalog:\nThe Summer 2023 catalog features various themes, such as City, Friends, Ninjago, Creator, Classic, and more. These themes cater to different interests and age groups, from preschoolers to adults. The age groups targeted by the Summer 2023 catalog are not explicitly mentioned, but the catalog features sets with different complexity levels, making them suitable for various age ranges.\n\nIn summary, the themes and age groups targeted by the LEGO sets featured in the Fall 2023 and Summer 2023 catalogs cannot be directly compared due to the lack of specific information in the provided catalog covers. However, both catalogs showcase a variety of themes and are likely to cater to a wide range of age groups.", "The unique features of the LEGO DREAMZzz sets in the Fall 2023 catalog, as compared to other themes, include the focus on a dream world where children can learn to use the power of imagination to save innocent dreamers from the tyrannical Nightmare King. The sets come with story-led instructions, allowing children to build fantastical creatures and vehicles they dream up, encouraging open-ended creative play. This is different from other themes which may have more fixed narratives or building instructions. The LEGO DREAMZzz theme specifically encourages children to use their imagination and creativity in a dream-like setting.", "Based on the provided catalog excerpts, I can make the following observations about the representation of LEGO Technic sets in the LEGO US Retail catalogs:\n\n1. LEGO Technic sets are present in both the Fall 2023 and January 2024 catalogs, but the specific sets and their placement within the catalogs might differ.\n\n2. The Fall 2023 catalog features Izzie and Bunchu, but there is no information about them in the given text for the January 2024 catalog.\n\n3. The January 2024 catalog has a section called \"NEWEST ARRIVALS,\" which might include new LEGO Technic sets. However, without the complete catalog, it is impossible to determine if the selection, placement, or presentation of LEGO Technic sets has changed between the two catalogs.\n\n4. Both catalogs provide 3 ways to shop: online at LEGO.com, in-store at The LEGO Store, and by phone. This consistency suggests that the shopping experience for LEGO Technic sets remains similar across the catalogs.\n\nIn summary, while the catalogs may have different LEGO Technic sets and present them differently, the provided information does not contain specific details about these differences.", "Based on the provided catalogs, one trend in LEGO themes that can be observed is the focus on new arrivals and sets. In the Summer 2023 and Fall 2023 catalogs, there is a section called \"Newest Arrivals\" and \"SETSNEW60\" respectively, which highlights new products available for purchase. Similarly, the January 2024 Retail catalog also features a \"NEWEST ARRIVALS\" section, indicating that LEGO continues to prioritize and promote new releases.\n\nAnother trend that can be observed is the inclusion of special promotions and deals. For instance, the Summer 2023 and Fall 2023 catalogs both offer free shipping on orders over $35, while the January 2024 Retail catalog features a \"SAVE UP TO 30%\" promotion on selected items.\n\nAs for specific themes, it appears that LEGO continues to expand its offerings in popular categories such as space, city, and superheroes. For example, the Summer 2023 catalog features a \"Space\" section, while the Fall 2023 catalog includes a \"City\" section and the January 2024 Retail catalog highlights \"Super Heroes\" as a key theme.\n\nOverall, the trend seems to be one of continuous expansion and renewal, with LEGO regularly releasing new products and promotions to keep customers engaged and interested in their offerings.", "Based on the provided catalogs, LEGO's marketing strategy in the Summer 2023 catalog focuses on promoting creativity and imagination through the introduction of the LEGO DREAMZzz playsets. The theme of the Summer 2023 catalog is a journey into a dream world where children can learn to use their imagination to save innocent dreamers. The playsets come with story-led instructions, encouraging children to create any fantastical creatures and vehicles they can dream up.\n\nIn contrast, the Fall 2023 and January 2024 catalogs do not have a specific theme that promotes creativity and imagination in the same way. Instead, they highlight various LEGO sets and themes, such as new arrivals and popular products. While these catalogs may still inspire creativity through building and play, they do not have the same focused approach as the Summer 2023 catalog.\n\nTherefore, LEGO's marketing strategy in the Summer 2023 catalog appears to place a stronger emphasis on promoting creativity and imagination compared to the Fall 2023 and January 2024 catalogs.", "Based on the provided document, licensed properties such as Harry Potter, Marvel, and others play a significant role in the LEGO catalogs. They are featured prominently across different seasons and age groups. \n\nFor instance, Harry Potter themed LEGO sets are intended for children aged 8 and above. Similarly, LEGO sets based on Disney properties are for ages 5 and up. There are also LEGO sets for older age groups, such as LEGO Ideas and LEGO Icons, which are for ages 18 and above. These sets may include licensed properties as well.\n\nHowever, the specific details about the distribution of these sets across different seasons are not provided in the document. Therefore, while licensed properties are a key part of the LEGO catalog, the exact role they play in terms of seasonal availability is not clear from the given information.", "Based on the information provided, I can see that the LEGO product offerings in the Summer 2023 and January 2024 catalogs have some differences in terms of complexity and target age group, which can be observed in the following ways:\n\n1. Newest Arrivals: The January 2024 catalog features new sets that are not available in the Summer 2023 catalog, which could indicate an evolution in the product offering. For example, the January 2024 catalog introduces set 952024, which may have different complexity levels and target age groups compared to the sets in the Summer 2023 catalog.\n\n2. Set Complexity: While the specific details of each set's complexity are not provided in the catalog summaries, it can be inferred that LEGO continues to offer a range of complexities in their sets. This is evident in both catalogs, as they cater to various age groups and building skills.\n\n3. Target Age Groups: Both catalogs target a wide range of age groups, from young children to adults. The Summer 2023 catalog features sets designed for ages 1.5+, 4+, 6+, 9+, and 16+, while the January 2024 catalog targets ages 4+, 6+, 9+, 10+, and 18+. This suggests that LEGO maintains a diverse age group focus but may have slightly adjusted the specific age ranges between the two catalogs.\n\nIn summary, while the specific details of each set's complexity and target age group are not fully provided in the catalog summaries, it can be observed that LEGO's product offering evolves from the Summer 2023 catalog to the January 2024 catalog by introducing new sets, maintaining a range of complexities, and catering to various age groups.", "Based on the provided catalog excerpts, there are a few differences in how LEGO presents new releases in the Summer 2023 catalog compared to the Fall 2023 and January 2024 catalogs:\n\n1. **Theme Emphasis**: The Summer 2023 catalog seems to emphasize toy trucks and outdoor activities in the LEGO City and LEGO Friends themes. The Fall 2023 catalog introduces the LEGO DREAMZzz\u2122 theme, and the January 2024 catalog features a mix of themes, including Super Heroes, real-life heroes, outer space, and flowers.\n\n2. **Visual Presentation**: The Summer 2023 catalog has a more scattered layout, with various offers and QR codes interspersed among the new sets. The Fall 2023 and January 2024 catalogs have a cleaner, more organized layout, focusing more on the new sets themselves.\n\n3. **Call to Action**: The Summer 2023 catalog encourages readers to scan a QR code to see what's new, while the Fall 2023 and January 2024 catalogs invite readers to visit LEGO.com to explore the new sets.\n\n4. **Catalog Title**: The Summer 2023 catalog is titled \"Summer 2023 Catalog,\" while the Fall 2023 and January 2024 catalogs include the year in the title (e.g., \"January 2024 Catalog\").\n\nPlease note that these observations are based on the provided excerpts and may not represent the full catalogs.", "Based on the provided documentation, the LEGO Friends theme has several sets suitable for kids aged 4 and above. Here are some examples:\n\n1. Dollhouse - This set includes various rooms and outdoor areas for kids to explore, as well as a cast of 10 pretend play characters.\n2. LEGO Friends Sets on Pages 6-9 - While the specific sets aren't listed, the documentation indicates that there are several LEGO Friends sets available for this age group.\n\nIt's important to note that the age recommendations for LEGO sets are guidelines and can vary based on a child's individual skill level and interests.", "Yes, based on the provided documentation, LEGO City sets are appropriate for kids aged 5 and above.", "The LEGO Marvel sets are appropriate for children aged 6 and above.", "The minimum age for building LEGO DC sets is 7+.", "Yes, there are LEGO Sonic sets suitable for young kids. The LEGO Sonic the Hedgehog series has sets with an age rating of 4+, making them a great option for younger children. These sets allow young builders to start their LEGO journey while enjoying the fun and exciting world of Sonic the Hedgehog.", "LEGO Minecraft is designed for ages 7 and above.", "Based on the provided documentation, the following LEGO sets are available for kids aged 6 and above:\n\n1. LEGO Dollhouse\n2. LEGO Harry Potter\u2122\n3. LEGO NINJAGO\u00ae\n4. LEGO City\n5. LEGO Minecraft\u00ae\n6. LEGO TECHNIC \u2122\n\nPlease note that this list is not exhaustive and there may be other LEGO sets available for this age group. For a complete and up-to-date list, please visit the LEGO website or contact the LEGO Store.", "Yes, 4-year-olds can build LEGO sets. The themes available for this age group include LEGO DUPLO, LEGO City, LEGO NINJAGO, and LEGO 10704 DUPLO Town Truck & Tracked Excavator. These sets are designed with larger pieces that are easier for younger children to handle. Always ensure that the specific age recommendation on the packaging is followed for a safe and enjoyable building experience.", "Based on the provided documentation, the following LEGO sets are recommended for kids aged 7 and above:\n\n1. LEGO Harry Potter\u2122 (AGES 8+)\n2. LEGO City (AGES 5+)\n3. LEGO Minecraft\u00ae (AGES 7+)\n4. LEGO Marvel (AGES 7+)\n5. LEGO DC (AGES 18+)\n6. LEGO Star Wars\u2122 (AGES 8+)\n7. LEGO Friends (AGES 4+)\n8. LEGO NINJAGO\u00ae (AGES 6+)\n9. LEGO Jurassic World (AGES 4+)\n10. LEGO | Disney (AGES 4+)\n\nFor more specific options, the \"LEGO City\" category has a set called \"Race Car and Car Carrier Truck\" (60406) with 328 pieces, recommended for kids aged 6 and above. Another option is the \"Elemental Dragon vs. The Empress Mech\" (71796) from the NINJAGO\u00ae series, which has 1,038 pieces and is recommended for kids aged 9 and above.", "Based on the provided document, LEGO DUPLO is a theme that is specifically designed for young children, including those who are 5 years old. LEGO DUPLO bricks are larger than standard LEGO bricks, making them easier for small hands to handle. The themes and sets under LEGO DUPLO are often simple, colorful, and open-ended, allowing for creativity and imagination. Some examples of LEGO DUPLO themes include:\n\n* LEGO DUPLO Town: This theme features familiar settings and characters that preschoolers can relate to, such as homes, parks, and vehicles.\n* LEGO DUPLO Construction: This theme allows children to build and create their own construction sites, cranes, and buildings.\n* LEGO DUPLO Animals: This theme features various animals that children can play with and learn about.\n* LEGO DUPLO My First: This theme is designed for even younger children, with large, brightly colored bricks and simple designs.\n\nThese are just a few examples of LEGO DUPLO themes that would be suitable for 5-year-old kids. It is recommended to choose sets that are appropriate for their age and skill level, and to always supervise young children during play.", "To use StrongSwan for IPSec encrypted communication between two hosts, fully accelerated by DOCA, follow these steps:\n\n1. Ensure that the DOCA IPsec Security Gateway is properly installed and configured on both hosts. This includes setting up the necessary hardware acceleration and creating the required DOCA objects and security associations (SAs).\n\n2. Install StrongSwan on both hosts. You can obtain the necessary packages and instructions from the StrongSwan documentation.\n\n3. Configure StrongSwan to use the DOCA plugin for IPsec offload. This can be done by adding the following lines to the StrongSwan configuration file (usually located at /etc/ipsec.conf):\n\n```\nload = yes\nplugin = doca\ndoca_socket_path = /tmp/rules_socket\n```\n\nThe `doca_socket_path` value should be set to the same value used when configuring the DOCA IPsec Security Gateway.\n\n4. Restart the StrongSwan server on both hosts to apply the changes:\n\n```\nsystemctl restart strongswan-starter.service\n```\n\n5. Configure the IPsec connection between the two hosts. This can be done by adding the following lines to the StrongSwan configuration file:\n\n```\nconn myconn\n left = %any\n leftid = @left\n leftcert = left.pem\n right = %any\n rightid = @right\n rightcert = right.pem\n auto = start\n ike = aes256gcm16-prfsha384-ecp521!\n esp = aes256gcm16-ecp521!\n```\n\nReplace `left` and `right` with the appropriate IP addresses or hostnames for the two hosts, and replace `left.pem` and `right.pem` with the paths to the corresponding certificate files.\n\n6. Start the IPsec connection:\n\n```\nipsec up myconn\n```\n\nAt this point, the two hosts should be able to communicate over an IPsec-encrypted connection, fully accelerated by DOCA.", "To achieve the best performance for a DOCA GPUNetIO packet processing application, consider the following hardware configuration in your system:\n\n1. NVIDIA ConnectX-6 Dx SmartNIC: This network adapter offers high-performance, low-latency networking with GPUDirect\u00ae support, which is essential for DOCA applications.\n\n2. NVIDIA A100 or A40 GPUs: These GPUs provide high computational power and large GPU memory, which is beneficial for handling packet processing tasks efficiently.\n\n3. High-speed PCIe Gen4 x16 or x8 slots: Ensure your system has the latest PCIe Gen4 slots to take full advantage of the high-bandwidth ConnectX-6 Dx SmartNIC and GPUs.\n\n4. Sufficient system memory: Allocate at least 128 GB or more of system memory (RAM) to ensure smooth data transfers and processing between the GPU, SmartNIC, and CPU.\n\n5. High-performance CPU: Although the GPU and SmartNIC will handle most of the processing, a high-performance CPU, such as an Intel Xeon Scalable processor or AMD EPYC, will help manage system tasks and improve overall performance.\n\n6. Fast and reliable storage: Use high-speed SSDs, preferably NVMe, for storing application data and libraries. This will help reduce storage-related bottlenecks and improve application performance.\n\n7. High-quality power supply: Invest in a high-quality power supply to ensure stable and consistent power delivery to all system components, especially the GPUs and SmartNIC.\n\n8. Proper cooling: Ensure your system has adequate cooling to maintain optimal temperatures for all components, especially the GPUs and SmartNIC, as heat can negatively impact performance.\n\n9. NVIDIA DOCA software: Install the latest NVIDIA DOCA software to take advantage of the advanced features and libraries for GPU-accelerated networking and security applications.\n\n10. Validated drivers and firmware: Always use the latest, validated drivers and firmware for your SmartNIC, GPUs, and other system components to ensure compatibility and stability.", "The choice between using OVS-DOCA (Open vSwitch Database-driven OpenFlow Configuration and Management) and OVS-DPDK (Open vSwitch Data Plane Development Kit) would depend on the specific use case and requirements.\n\nOVS-DOCA is a framework for managing and configuring Open vSwitch using a declarative configuration model, which is stored in a database. It provides a centralized and automated way to manage Open vSwitch configurations, making it well-suited for large-scale deployments where consistency and ease of management are important.\n\nOn the other hand, OVS-DPDK is a high-performance userspace implementation of the Open vSwitch data plane that bypasses the kernel to improve packet processing performance. It is designed for use cases that require high throughput and low latency, such as network functions virtualization (NFV) and software-defined networking (SDN).\n\nTherefore, if high performance and low latency are the primary requirements, then OVS-DPDK may be the better choice. However, if ease of management and consistency across a large number of Open vSwitch instances are more important, then OVS-DOCA may be the better choice. It's also possible to use both OVS-DOCA and OVS-DPDK together, depending on the specific use case.", "Based on the error message you provided, it seems like the issue is related to CMake and the DOCA dependency. Here are a few things you can check:\n\n1. **CMake installation**: The error message suggests that CMake was not found on your system. You need to install CMake before building your DOCA application. You can download it from the official website: .\n\n2. **DOCA dependency**: The error message also indicates that the DOCA dependency was not found. This could be because the pkgconfig tool could not locate it. Make sure that the DOCA development package is installed on your system and that the pkgconfig tool is aware of its location.\n\n3. **Meson build system**: The error message originates from the meson.build file. Meson is a build system that is used to build software projects. Make sure that the meson.build file is correctly configured and that it specifies the correct path to the DOCA dependency.\n\n4. **Environment variables**: Make sure that the necessary environment variables are set. For example, you may need to set the `PKG_CONFIG_PATH` variable to include the path to the DOCA pkgconfig file.\n\nIf you have already tried these steps and are still encountering the error, please provide more information about your system and the steps you have taken so far.", "Yes, there are examples provided in the DOCA documentation on how to manage a DOCA application running on a BF3 from an x86 host using gRPC.\n\nYou can refer to the \"DOCA gRPC Example\" section in the DOCA documentation, which provides a detailed walkthrough of setting up and running a gRPC client and server between a DOCA application running on a BF3 and an x86 host.\n\nThe example includes a simple gRPC server implemented in the DOCA application, which exposes a method for adding two integers. A corresponding gRPC client is then implemented on the x86 host, which calls this method to add two integers and prints the result.\n\nThe example also covers the necessary steps for configuring the DOCA application and the x86 host to communicate over gRPC, including setting up the necessary network interfaces and configuring the gRPC client and server.\n\nYou can access the DOCA documentation and the \"DOCA gRPC Example\" section at the following link:\n\n\n\nNote that the specific steps and commands in the example may vary depending on your specific setup and environment. Therefore, it is recommended to carefully read and follow the instructions in the documentation.", "To exchange information securely between the host and the DPU, you can use the DMA Copy sample application provided in the documentation. This application demonstrates how to transfer files between the DPU and the host using direct memory access (DMA) library, which leverages hardware acceleration for data copy. This ensures secure data transfer while also offloading the host CPU.\n\nBefore exchanging information, you can put the DPU in zero-trust mode, which adds an additional layer of security by preventing the host system administrator from accessing the DPU from the host. In this mode, the data center administrator should control the DPU entirely through the Arm cores and/or BMC connection instead of through the host. This can help ensure that any interaction with the SE from the host, such as signaling the SE for the DPU or waiting for a signal from the DPU, is properly managed and secured.\n\nFurthermore, you can restrict the host from performing certain operations that can compromise the DPU by individually changing the DPU host to zero-trust mode for port ownership and other restricted operations. This will help maintain the security and isolation of the DPU and the data it processes.", "The sample code for the DOCA applications can be found in the \"DOCA Samples\" section of the documentation. This section provides code snippets for achieving basic DOCA-based tasks and serves as an implementation example of a single feature of a given DOCA library.\n\nFor a more detailed reference of full DOCA-based programs that make use of multiple DOCA libraries, please refer to the \"DOCA Reference Applications\" section.\n\nApplications are a higher-level reference code than the samples and demonstrate how a full DOCA-based program can be built. They can be found in the \"DOCA Reference Applications\" section of the documentation.", "I'm sorry for the confusion, but the provided documentation does not contain information about the new features offered by DOCA 2.5. The newest version mentioned in the documentation is DOCA 2.6.0, which introduces the NVIDIA BlueField networking platform enhancement for high-performance and secure AI bare-metal cloud. If DOCA 2.5.0 is indeed the version you're interested in, I would recommend checking the official documentation or release notes for that specific version from the official NVIDIA DOCA documentation or support resources.", "Based on the provided documentation, the best generative AI session to attend would be \"Getting started: Generative AI at the Edge\" with the code SE62935. Here's why:\n\n- It is a special event focused solely on generative AI.\n- The session covers practical considerations for deploying generative AI, which can be very useful for getting started with the technology.\n- It is targeted at a technical audience with an intermediate level of knowledge, indicating that it will cover the topic in depth.\n- The session is already published, so it is confirmed to take place.\n\nHere's the relevant information from the documentation:\n\nCODE: SE62935\nTITLE: Getting started: Generative AI at the Edge \nSESSION STATUS: Accepted\nSESSION TYPE: Special Event\nAUDIENCE LEVEL: Technical \u2013 Intermediate\nLENGTH: 50\nPUBLISHED?: Yes\nABSTRACT: Learn practical considerations for deploying Generative AI. The conversation has evolved beyond data sources to representation, to where human-in-the-loop is most effective, and how \n\nPlease note that this recommendation is based on the information provided in the documentation, and there might be other sessions that could also be valuable depending on your specific interests and needs.", "Based on the provided documentation, there is no information indicating that anyone from Google is presenting in the described events. The company names mentioned are NVIDIA and Amini.", "Based on the provided document, I would suggest the session titled \"Navigating the Deep Learning Landscape: An MLOps Approach\". This session will help you understand the MLOps ecosystem, support the entire machine learning workflow, and enable you to tailor a solution for your team. It also covers practical concerns like integrating accelerated computing and cloud-native infrastructure.", "The session called \"Speech AI Demystified\" has a session code S61253 and a session create date of 2023-08-18 04:59 PM.", "The provided documentation does not include information on who is presenting session S62430. The only details given are the code, title, session status, session type, session catalog consolidated types, session create date, and industry segments.", "Based on the information provided, the session titled \"Insights from NVIDIA Research\" has no specific participant roles listed. Therefore, I cannot determine who the presenter(s) will be.", "Based on the provided documentation, I suggest the following session related to robotics:\n\nTitle: Simulating Custom Robots: A Hands-On Lab Using Isaac Sim and ROS2\nSESSION STATUS: Accepted\nSESSION TYPE: DLI Training Lab\nSESSION CATALOG CONSOLIDATED TYPES: DLI Training Lab, Inception Startup\nINDUSTRY SEGMENTS: Not specified\n\nAlternatively, consider the following session for a more interactive experience:\n\nTitle: *IMPORTANT: Connect with the Experts: Robotics, Simulation, and AI\nSESSION STATUS: Not specified\nSESSION TYPE: Not specified\nSESSION CATALOG CONSOLIDATED TYPES: Not specified\nINDUSTRY SEGMENTS: All Industries\nABSTRACT: This session is an interactive opportunity to meet with the minds behind NVIDIA's robotics, simulation, and AI technologies. Discuss technical challenges, opportunities, and potential commercialization in robotics development with the experts.\n\nBoth sessions should provide valuable insights into robotics development and related technologies.", "Sure, based on the provided documentation, I would suggest the session titled \"Speech AI Demystified\" with CODE: S61253. This session is about Speech AI, which is a topic related to deep learning. Additionally, the session type is a talk, and the audience level is technical-intermediate, which seems to match your interest in deep learning.", "Based on the information provided, I would recommend the \"Connect with the Experts\" sessions on ray tracing. These sessions provide an opportunity to meet with the minds behind NVIDIA's ray tracing products and research, and ask any questions you may have. This would be particularly beneficial for individuals looking to gain a deeper understanding of ray tracing, as the sessions are designed to cater to all skill levels. More information on these sessions can be found at the following URL: ", "Yes, there is a session titled \"*Fast-Track your XR UE Build using Cloud Streaming to Iterate Your Customer Projects without a PC*\" which covers the use of NVIDIA technology Clara Parabricks. The session details are as follows:\n\n- CODE: S62344\n- TITLE: Fast-Track your XR UE Build using Cloud Streaming to Iterate Your Customer Projects without a PC\n- SESSION STATUS: Accepted\n- SESSION TYPE: Talk\n- SESSION CATALOG CONSOLIDATED TYPES: Inception Startup, Talks & Panels\n- PRODUCTION TYPE: Live (Gated)\n- NVIDIA TECHNOLOGY: Clara Parabricks\n- SESSION DELIVERY: In-Person\n- DATE: 2024-03-21\n- TIME: 02:00 PM\n- PARTICIPANT ROLE: Instructor\n- AUDIENCE ROLE: Research: Academic\n\nYou can find more information about this session using the provided code (S62344) on the event website.", "Based on the provided documentation, I recommend the training lab with the code S63140 titled \"Reinforcement Learning Placeholder\". Although the title suggests it is a placeholder, the abstract indicates that it is a session about learning the benefits of using reinforcement learning to train robot behaviors. However, please note that the session status is currently \"In Review\" and it has not been specified whether it is published or not.", "Based on the provided documentation, there is no specific information about who the presenter is for any of the sessions. The name \"Katie Luo\" does not appear in the session details. Therefore, I'm unable to provide an answer to your query with the given information.", "Based on the provided documentation, it is not possible to attend both S62219 and S62779 because neither of these sessions exist in the provided records. However, you could attend S61440 and S62619, assuming they are scheduled at different times. Please check the schedule for accurate time slots.", "Based on the provided documentation, there are no sessions with codes S62832 or S61276 mentioned. Therefore, it's not possible to determine if attending these sessions is possible."]} diff --git a/services/evaluator/tests/datasets/rag-retriever/dataset_with_retrieved_context_and_generated_answer.jsonl b/services/evaluator/tests/datasets/rag-retriever/dataset_with_retrieved_context_and_generated_answer.jsonl deleted file mode 100644 index 14cbb63bc8..0000000000 --- a/services/evaluator/tests/datasets/rag-retriever/dataset_with_retrieved_context_and_generated_answer.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"question": ["When did the 2024 SF Taiwan Day take place?", "Where did the 2024 SF Taiwan Day take place?", "Who threw the first pitch during the 2024 SF Taiwan Day take place?"], "contexts": [["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch."], ["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch."], ["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch."]], "scores": [[0.6491671307624074], [0.6504167270397829], [0.7066548474535921]], "ground_truth": ["May 25th", "Oakland Coliseum", "NVIDIA founder and CEO Jensen Huang"], "answer": ["The 2024 SF Taiwan Day took place on May 25th.", "The 2024 SF Taiwan Day took place at the Oakland Coliseum on May 25th.", "The answer to the question is: Jensen Huang"]} \ No newline at end of file diff --git a/services/evaluator/tests/datasets/rag-retriever/rag-retriever-contexts.jsonl b/services/evaluator/tests/datasets/rag-retriever/rag-retriever-contexts.jsonl deleted file mode 100644 index 0455850b4d..0000000000 --- a/services/evaluator/tests/datasets/rag-retriever/rag-retriever-contexts.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"question": ["When did the 2024 SF Taiwan Day take place?", "Where did the 2024 SF Taiwan Day take place?", "Who threw the first pitch during the 2024 SF Taiwan Day take place?"], "contexts": [["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch.", "Taiwan, officially the Republic of China, is a country in East Asia. The main island of Taiwan, also known as Formosa, lies between the East and South China Seas in the northwestern Pacific Ocean, with the People's Republic of China to the northwest, Japan to the northeast, and the Philippines to the south."], ["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch.", "Taiwan, officially the Republic of China, is a country in East Asia. The main island of Taiwan, also known as Formosa, lies between the East and South China Seas in the northwestern Pacific Ocean, with the People's Republic of China to the northwest, Japan to the northeast, and the Philippines to the south."], ["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch.", "Taiwan, officially the Republic of China, is a country in East Asia. The main island of Taiwan, also known as Formosa, lies between the East and South China Seas in the northwestern Pacific Ocean, with the People's Republic of China to the northwest, Japan to the northeast, and the Philippines to the south."]], "ground_truth": ["May 25th", "Oakland Coliseum", "NVIDIA founder and CEO Jensen Huang"]} diff --git a/services/evaluator/tests/datasets/rag-retriever/rag_generated_answer.jsonl b/services/evaluator/tests/datasets/rag-retriever/rag_generated_answer.jsonl deleted file mode 100644 index d9341336f9..0000000000 --- a/services/evaluator/tests/datasets/rag-retriever/rag_generated_answer.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"question": ["Do Cholesterol Statin Drugs Cause Breast Cancer?", "Exploiting Autophagy to Live Longer", "How to Reduce Exposure to Alkylphenols Through Your Diet", "What\u2019s Driving America\u2019s Obesity Problem?", "Who Should be Careful About Curcumin?", "Foods for Glaucoma", "What is Actually in Chicken Nuggets?", "What Do Meat Purge and Cola Have in Common?", "Chronic Headaches and Pork Parasites", "Stopping Heart Disease in Childhood", "Food Dyes and ADHD", "How Citrus Might Help Keep Your Hands Warm", "Starving Tumors of Their Blood Supply", "Are Dental X-Rays Safe?", "How Should I Take Probiotics?", "Breast Cancer & Alcohol: How Much is Safe?", "Diet and Cellulite", "Best Treatment for Constipation", "Should We Avoid Titanium Dioxide?", "Avoiding Cooked Meat Carcinogens", "Plant-Based Diets for Psoriasis", "Increasing Muscle Strength with Fenugreek", "How Chemically Contaminated Are We?", "Treating an Enlarged Prostate With Diet", "Optimal Phytosterol Dose and Source", "Is Caffeinated Tea Really Dehydrating?", "Mercury Testing Recommended Before Pregnancy", "Stool Size and Breast Cancer Risk", "Vitamin D: Shedding some light on the new recommendations", "Breast Cancer and Diet", "Can antioxidant-rich spices counteract the effects of a high-fat meal?", "Dioxins Stored in Our Own Fat May Increase Diabetes Risk", "Didn't another study show carnitine was good for the heart?", "Any update on the scary in vitro avocado data?", "What do you think of Dr. Jenkins' take on paleolithic diets?", "What about pepper plus turmeric in V8 juice?", "Is annatto food coloring safe?", "Fresh fruit versus frozen--which is better?", "Are krill oil supplements better than fish oil capsules?", "Is apple cider vinegar good for you?", "How can you believe in any scientific study?", "Is vitamin D3 (cholecalciferol) preferable to D2 (ergocalciferol)?", "accidents", "adenovirus 36", "African-American", "airport scanners", "Alli", "alternative medicine", "American Dental Association", "amnesia", "aneurysm", "anisakis", "antinutrients", "apnea", "Arkansas", "ascorbic acid", "Atkins diet", "avocados", "bagels", "beans", "benzene", "betel nuts", "bioavailability", "black raspberries", "blood clots", "BMAA", "bone fractures", "BPH", "BRCA genes", "breast pain", "bronchiolitis obliterans", "Bush administration", "cadaverine", "caloric restriction", "canker sores", "carcinogens", "carrageenan", "cauliflower", "chanterelle mushrooms", "Chernobyl", "chickpeas", "chlorophyll", "cinnamon", "cocaine", "coffee", "coma", "cooking methods", "cortisol", "crib death", "cumin", "Czechoslovakia", "deafness", "DHA", "dietary scoring", "domoic acid", "Dr. Dean Ornish", "Dr. Walter Willett", "ECMO", "eggnog", "endocrine disruptors", "energy drinks", "ergothioneine", "Evidence-based medicine", "factory farming practices", "fava beans", "fenugreek", "Finland", "flax oil", "folic acid", "Fosamax", "fructose", "galactosemia", "genetic manipulation", "Global Burden of Disease Study", "goji berries", "grapes", "growth promoters", "halibut", "Harvard Physicians\u2019 Study II", "hearing", "heme iron", "hernia", "Hiroshima", "hormonal dysfunction", "hyperactivity", "IGF-1", "industrial toxins", "insects", "Iowa Women\u2019s Health Study", "Japan", "junk food", "kidney beans", "kohlrabi", "lard", "leeks", "leucine", "Lindane", "liver disease", "low-carb diets", "lyme disease", "magnesium", "maple syrup", "mastitis", "medical ethics", "memory", "mesquite", "Mevacor", "milk", "molasses", "mouth cancer", "muscle health", "myelopathy", "National Academy of Sciences", "Native Americans", "neurocysticercosis", "NIH-AARP study", "norovirus", "nuts", "okra", "oral intraepithelial neoplasia", "organotins", "oxen meat", "Panama", "Parkinson's disease", "peanut butter", "Peoria", "pesticides", "philippines", "phytic acid", "pineapples", "plant-based diet", "poisonous plants", "polypropylene plastic", "pork", "poultry workers", "prenatal vitamins", "prolactin", "prunes", "pumpkin", "quinine", "rapamycin", "red tea", "rhabdomyolysis", "rickets", "Rutin", "salmon", "saturated fat", "seafood", "serotonin", "shelf life", "sirtuins", "smoking", "soil health", "spearmint", "Splenda", "St. John's wort", "stevia", "subsidies", "sulfur", "suppositories", "sweeteners", "taro", "tempeh", "thiamine", "titanium dioxide", "tongue worm", "trans fats", "Tufts", "turnips", "ultra-processed foods", "uterine health", "veal", "veggie chicken", "viral infections", "vitamin K", "walnut oil", "weight gain", "whiting", "worms", "Yale", "Zoloft", "Preventing Brain Loss with B Vitamins?", "More Than an Apple a Day: Combating Common Diseases", "Are Organic Foods Safer?", "Diabetes as a Disease of Fat Toxicity", "Is Milk Good for Our Bones?", "Preventing Ulcerative Colitis with Diet", "The Actual Benefit of Diet vs. Drugs", "The Saturated Fat Studies: Buttering Up the Public", "Coffee and Artery Function", "Caloric Restriction vs. Plant-Based Diets", "Infectobesity: Adenovirus 36 and Childhood Obesity", "Does Cholesterol Size Matter?", "Barriers to Heart Disease Prevention", "Childhood Constipation and Cow\u2019s Milk", "Diabetics Should Take Their Pulses", "Academy of Nutrition and Dietetics Conflicts of Interest", "Do Vegetarians Get Enough Protein?", "Eggs and Arterial Function", "Treating Asthma With Plants vs. Supplements?", "Phytates for the Treatment of Cancer", "Alkylphenol Endocrine Disruptors and Allergies", "Chicken Salmonella Thanks to Meat Industry Lawsuit", "Turmeric Curcumin and Osteoarthritis", "How Long to Detox From Fish Before Pregnancy?", "Is Caramel Color Carcinogenic?", "Counteracting the Effects of Dioxins Through Diet", "Chronic Headaches and Pork Tapeworms", "Heart Disease Starts in Childhood", "Artificial Food Colors and ADHD", "Keeping Your Hands Warm With Citrus", "Anti-Angiogenesis: Cutting Off Tumor Supply Lines", "Cancer Risk From CT Scan Radiation", "Preventing the Common Cold with Probiotics?", "Eating Healthy on a Budget", "Flaxseeds & Breast Cancer Survival: Clinical Evidence", "Do Fruit & Nut Bars Cause Weight Gain?", "Titanium Dioxide & Inflammatory Bowel Disease", "Prolonged Liver Function Enhancement From Broccoli", "Apple Juice May Be Worse Than Sugar Water", "Preventing Strokes with Diet", "Neurobiology of Artificial Sweeteners", "Benefits of Fenugreek Seeds", "More Antibiotics In White Meat or Dark Meat?", "BPA Plastic and Male Sexual Dysfunction", "Filled Full of Lead", "The Answer to the Pritikin Puzzle", "To Snack or Not to Snack?", "Boosting Good Bacteria in the Colon Without Probiotics", "Optimal Phytosterol Dose", "Human Neurotransmitters in Plants", "Kiwifruit for Irritable Bowel Syndrome", "Dietary Treatment of Crohn's Disease", "Unsafe at Any Feed", "Pharmacists Versus Health Food Store Employees: Who Gives Better Advice?", "Preventing Cataracts with Diet", "Cheese Mites and Maggots", "Cholesterol and Lower Back Pain", "EPIC Findings on Lymphoma", "Sometimes the Enzyme Myth Is True", "Vitamin C-Enriched Bacon", "Out of the Lab Onto the Track", "Dragon's Blood", "Better Than Goji Berries", "How to Help Prevent Abdominal Aortic Aneurysms", "The Difficulty of Arriving at a Vitamin D Recommendation", "Amyloid and Apple Juice", "Dietary Guidelines: From Dairies to Berries", "Are Avocados Good for You?", "Relieving Yourself of Excess Estrogen", "Too Much Iodine Can Be as Bad as Too Little", "Is Milk and Mucus a Myth?", "Convergence of Evidence", "Is Dragon Fruit Good For You?", "Is Distilled Fish Oil Toxin-Free?", "Acne & Cancer Connection", "Overdosing on Greens", "Dietary Theory of Alzheimer's", "Meat & Multiple Myeloma", "Apthous Ulcer Mystery Solved", "EPIC Study", "Update on Herbalife\u00ae", "Saturated Fat & Cancer Progression", "Aluminum in Vaccines vs. Food", "Are Multivitamins Good For You?", "Fish Fog", "Sexually Transmitted Fish Toxin", "Veggies vs. Cancer", "Alcohol Risks vs. Benefits", "Is Coconut Milk Good For You?", "Boosting Heart Nerve Control", "Kuna Indian Secret", "The Healthiest Sweetener", "Are Artificial Colors Bad for You?", "Healthiest Airplane Beverage", "Antioxidant Content of 300 Foods", "Plant vs. Cow Calcium", "Vitamin Supplements Worth Taking", "Healthy Chocolate Milkshakes", "The Healthiest Vegetables", "Bowel Movement Frequency", "Olive Oil and Artery Function", "How Doctors Responded to Being Named a Leading Killer"], "contexts": [["Statin use and risk of breast cancer: a meta-analysis of observational studies. Emerging evidence suggests that statins' may decrease the risk of cancers. However, available evidence on breast cancer is conflicting. We, therefore, examined the association between statin use and risk of breast cancer by conducting a detailed meta-analysis of all observational studies published regarding this subject. PubMed database and bibliographies of retrieved articles were searched for epidemiological studies published up to January 2012, investigating the relationship between statin use and breast cancer. Before meta-analysis, the studies were evaluated for publication bias and heterogeneity. Combined relative risk (RR) and 95 % confidence interval (CI) were calculated using a random-effects model (DerSimonian and Laird method). Subgroup analyses, sensitivity analysis, and cumulative meta-analysis were also performed. A total of 24 (13 cohort and 11 case-control) studies involving more than 2.4 million participants, including 76,759 breast cancer cases contributed to this analysis. We found no evidence of publication bias and evidence of heterogeneity among the studies. Statin use and long-term statin use did not significantly affect breast cancer risk (RR = 0.99, 95 % CI = 0.94, 1.04 and RR = 1.03, 95 % CI = 0.96, 1.11, respectively). When the analysis was stratified into subgroups, there was no evidence that study design substantially influenced the effect estimate. Sensitivity analysis confirmed the stability of our results. Cumulative meta-analysis showed a change in trend of reporting risk of breast cancer from positive to negative in statin users between 1993 and 2011. Our meta-analysis findings do not support the hypothesis that statins' have a protective effect against breast cancer. More randomized clinical trials and observational studies are needed to confirm this association with underlying biological mechanisms in the future.", "Long-term statin use and risk of ductal and lobular breast cancer among women 55-74 years of age Background Mechanistic studies largely support the chemopreventive potential of statins. However, results of epidemiologic studies investigating statin use and breast cancer risk have been inconsistent and lacked the ability to evaluate long-term statin use. Materials and Methods We utilized data from a population-based case-control study of breast cancer conducted in the Seattle-Puget Sound region to investigate the relationship between long-term statin use and breast cancer risk. 916 invasive ductal carcinoma (IDC) and 1,068 invasive lobular carcinoma (ILC) cases 55-74 years of age diagnosed between 2000 and 2008 were compared to 902 control women. All participants were interviewed in-person and data on hypercholesterolemia and all episodes of lipid lowering medication use were collected through a structured questionnaire. We assessed the relationship between statin use and IDC and ILC risk using polytomous logistic regression. Results Current users of statins for 10 years or longer had a 1.83-fold increased risk of IDC [95% confidence interval (CI): 1.14-2.93] and a 1.97-fold increased risk of ILC (95% CI: 1.25-3.12) compared to never users of statins. Among women diagnosed with hypercholesterolemia, current users of statins for 10 years or longer had more than double the risk of both IDC [odds ratio (OR): 2.04, 95% CI: 1.17-3.57] and ILC (OR: 2.43, 95% CI: 1.40-4.21) compared to never users. Conclusion In this contemporary population-based case-control study long-term use of statins was associated with increased risks of both IDC and ILC. Impact Additional studies with similarly high frequencies of statin use for various durations are needed to confirm this novel finding.", "Statin Use and Breast Cancer Survival: A Nationwide Cohort Study from Finland Recent studies have suggested that statins, an established drug group in the prevention of cardiovascular mortality, could delay or prevent breast cancer recurrence but the effect on disease-specific mortality remains unclear. We evaluated risk of breast cancer death among statin users in a population-based cohort of breast cancer patients. The study cohort included all newly diagnosed breast cancer patients in Finland during 1995\u20132003 (31,236 cases), identified from the Finnish Cancer Registry. Information on statin use before and after the diagnosis was obtained from a national prescription database. We used the Cox proportional hazards regression method to estimate mortality among statin users with statin use as time-dependent variable. A total of 4,151 participants had used statins. During the median follow-up of 3.25 years after the diagnosis (range 0.08\u20139.0 years) 6,011 participants died, of which 3,619 (60.2%) was due to breast cancer. After adjustment for age, tumor characteristics, and treatment selection, both post-diagnostic and pre-diagnostic statin use were associated with lowered risk of breast cancer death (HR 0.46, 95% CI 0.38\u20130.55 and HR 0.54, 95% CI 0.44\u20130.67, respectively). The risk decrease by post-diagnostic statin use was likely affected by healthy adherer bias; that is, the greater likelihood of dying cancer patients to discontinue statin use as the association was not clearly dose-dependent and observed already at low-dose/short-term use. The dose- and time-dependence of the survival benefit among pre-diagnostic statin users suggests a possible causal effect that should be evaluated further in a clinical trial testing statins\u2019 effect on survival in breast cancer patients.", "Statin use after diagnosis of breast cancer and survival: a population-based cohort study. BACKGROUND: Preclinical studies have shown that statins, particularly simvastatin, can prevent growth in breast cancer cell lines and animal models. We investigated whether statins used after breast cancer diagnosis reduced the risk of breast cancer-specific, or all-cause, mortality in a large cohort of breast cancer patients. METHODS: A cohort of 17,880 breast cancer patients, newly diagnosed between 1998 and 2009, was identified from English cancer registries (from the National Cancer Data Repository). This cohort was linked to the UK Clinical Practice Research Datalink, providing prescription records, and to the Office of National Statistics mortality data (up to 2013), identifying 3694 deaths, including 1469 deaths attributable to breast cancer. Unadjusted and adjusted hazard ratios (HRs) for breast cancer-specific, and all-cause, mortality in statin users after breast cancer diagnosis were calculated using time-dependent Cox regression models. Sensitivity analyses were conducted using multiple imputation methods, propensity score methods and a case-control approach. RESULTS: There was some evidence that statin use after a diagnosis of breast cancer had reduced mortality due to breast cancer and all causes (fully adjusted HR = 0.84 [95% confidence interval = 0.68-1.04] and 0.84 [0.72-0.97], respectively). These associations were more marked for simvastatin 0.79 (0.63-1.00) and 0.81 (0.70-0.95), respectively. CONCLUSIONS: In this large population-based breast cancer cohort, there was some evidence of reduced mortality in statin users after breast cancer diagnosis. However, these associations were weak in magnitude and were attenuated in some sensitivity analyses.", "Plant Sterols as Anticancer Nutrients: Evidence for Their Role in Breast Cancer While many factors are involved in the etiology of cancer, it has been clearly established that diet significantly impacts one\u2019s risk for this disease. More recently, specific food components have been identified which are uniquely beneficial in mitigating the risk of specific cancer subtypes. Plant sterols are well known for their effects on blood cholesterol levels, however research into their potential role in mitigating cancer risk remains in its infancy. As outlined in this review, the cholesterol modulating actions of plant sterols may overlap with their anti-cancer actions. Breast cancer is the most common malignancy affecting women and there remains a need for effective adjuvant therapies for this disease, for which plant sterols may play a distinctive role."], ["Treating aging: progress toward dietary restriction mimetics During the last decade, biogerontologists have labored to understand the biological basis of the aging process by studying the genes and signaling pathways that regulate it. But the last year has seen a breakthrough in a different direction: toward treatments that might slow aging by mimicking the effects of dietary restriction.", "mTOR is a key modulator of ageing and age-related disease Many experts in the biology of ageing believe that pharmacological interventions to slow ageing are a matter of \u2018when\u2019 rather than \u2018if\u2019. A leading target for such interventions is the nutrient response pathway defined by the mechanistic target of rapamycin (mTOR). Inhibition of this pathway extends lifespan in model organisms and confers protection against a growing list of age-related pathologies. Characterized inhibitors of this pathway are already clinically approved, and others are under development. Although adverse side effects currently preclude use in otherwise healthy individuals, drugs that target the mTOR pathway could one day become widely used to slow ageing and reduce age-related pathologies in humans.", "Extending healthy ageing: nutrient sensitive pathway and centenarian population Ageing is a challenge for any living organism and human longevity is a complex phenotype. With increasing life expectancy, maintaining long-term health, functionality and well-being during ageing has become an essential goal. To increase our understanding of how ageing works, it may be advantageous to analyze the phenotype of centenarians, perhaps one of the best examples of successful ageing. Healthy ageing involves the interaction between genes, the environment, and lifestyle factors, particularly diet. Besides evaluating specific gene-environment interactions in relation to exceptional longevity, it is important to focus attention on modifiable lifestyle factors such as diet and nutrition to achieve extension of health span. Furthermore, a better understanding of human longevity may assist in the design of strategies to extend the duration of optimal human health. In this article we briefly discuss relevant topics on ageing and longevity with particular focus on dietary patterns of centenarians and nutrient-sensing pathways that have a pivotal role in the regulation of life span. Finally, we also discuss the potential role of Nrf2 system in the pro-ageing signaling emphasizing its phytohormetic activation.", "Macronutrient balance and lifespan Dietary restriction (DR) without malnutrition is widely regarded to be a universal mechanism for prolonging lifespan. It is generally believed that the benefits of DR arise from eating fewer calories (termed caloric restriction, CR). Here we argue that, rather than calories, the key determinant of the relationship between diet and longevity is the balance of protein to non-protein energy ingested. This ratio affects not only lifespan, but also total energy intake, metabolism, immunity and the likelihood of developing obesity and associated metabolic disorders. Among various possible mechanisms linking macronutrient balance to lifespan, the nexus between the TOR and AMPK signaling pathways is emerging as a central coordinator.", "Saturated fatty acid metabolism is key link between cell division, cancer, and senescence in cellular and whole organism aging Cellular senescence is an in vivo and in vitro phenomenon, accompanied by physiological changes including cessation of division and disturbances of organelle structure and function. Review of the literature was undertaken to determine whether there is evidence that whole organism aging and cell senescence share a common initiation pathway. In vivo aged cells of different lineages, including aged T lymphocytes, show high expression of the INK4A-p16 gene. In cell culture when telomeres are shortened past a key length or state, the Arf/Ink gene system (p16/p14 humans, p16/p19 mice) switches on and activates p53, which suppresses further cell division. The p53 gene is a key tumor suppressor and its deletion or mutation allows cancerous growth. The switching on of p53 also causes changes in fatty acid metabolism, especially down-regulation of both fatty acid synthase and stearoyl-CoA (delta-9) desaturase. The co-suppression of these genes together with enhanced uptake of extracellular fatty acids, leads to raised levels of cellular palmitate and induction of either apoptosis or senescence. In senescent cells, the fatty acid composition of the cellular membranes alters and leads to changes in both structure and function of organelles, especially mitochondria. Animal models of accelerated aging exhibit repression of stearoyl-CoA desaturase activity while anti-aging calorie restriction stimulates the same enzyme system. It is concluded that aging in cells and whole organisms share a common initiation pathway and that cellular senescence is protective against cancer. Healthy longevity is likely to be most enhanced by factors that actively suppress excessive cell division."], ["Alkylphenols in human milk and their relations to dietary habits in central Taiwan. The aims of this study were to determine the concentrations of 4-nonylphenol (NP) and 4-octylphenol (OP) in 59 human milk samples and to examine related factors including mothers' demographics and dietary habits. Women who consumed over the median amount of cooking oil had significantly higher OP concentrations (0.98 ng/g) than those who consumed less (0.39 ng/g) (P < 0.05). OP concentration was significantly associated with the consumption of cooking oil (beta = 0.62, P < 0.01) and fish oil capsules (beta = 0.39, P < 0.01) after adjustment for age and body mass index (BMI). NP concentration was also significantly associated with the consumption of fish oil capsules (beta = 0.38, P < 0.01) and processed fish products (beta = 0.59, P < 0.01). The food pattern of cooking oil and processed meat products from factor analysis was strongly associated with OP concentration in human milk (P < 0.05). These determinations should aid in suggesting foods for consumption by nursing mothers in order to protect their infants from NP/OP exposure. 2010 Elsevier Ltd. All rights reserved.", "Alkylphenols in human milk and their relations to dietary habits in central Taiwan. The aims of this study were to determine the concentrations of 4-nonylphenol (NP) and 4-octylphenol (OP) in 59 human milk samples and to examine related factors including mothers' demographics and dietary habits. Women who consumed over the median amount of cooking oil had significantly higher OP concentrations (0.98 ng/g) than those who consumed less (0.39 ng/g) (P < 0.05). OP concentration was significantly associated with the consumption of cooking oil (beta = 0.62, P < 0.01) and fish oil capsules (beta = 0.39, P < 0.01) after adjustment for age and body mass index (BMI). NP concentration was also significantly associated with the consumption of fish oil capsules (beta = 0.38, P < 0.01) and processed fish products (beta = 0.59, P < 0.01). The food pattern of cooking oil and processed meat products from factor analysis was strongly associated with OP concentration in human milk (P < 0.05). These determinations should aid in suggesting foods for consumption by nursing mothers in order to protect their infants from NP/OP exposure. 2010 Elsevier Ltd. All rights reserved.", "Alkylphenols and alkylphenol ethoxylates contamination of crustaceans and fishes from the Adriatic Sea (Italy). This paper presents the results of an investigation on the occurrence of alkylphenols (APs) and their ethoxylates (APEs) in 8 edible marine species from the Adriatic Sea and tries to estimate the corresponding intake for the Italian population. Two crustaceans, Nephrops norvegicus (Norway lobster) and Squilla mantis (spottail mantis shrimp), plus six fish species, Engraulis enchrascicolus (anchovy), Scomber scombrus (Atlantic mackerel), Merluccius merluccius (European hake), Mullus barbatus (red mullet), Solea vulgaris (common sole) and Lophius piscatorius (angler) were analyzed for their content of nonylphenol (NP), octylphenol (OP) and octylphenol polyethoxylates (OPEs). These compounds were found in all analysed samples. NP was detected at the highest concentrations: 118-399 and 9.5-1431 ng g(-1) fresh weight (fw) respectively in crustaceans and fish. OP was found at respective levels of 2.7-4.7 and 0.3-3.8 ng g(-1) fw in crustaceans and fish, whereas OPE was determined at respective concentrations of 1.2-16.8 and 0.2-21.1 ng g(-1) fw in the same species. These results, together with those from a previous study on 4 edible mollusc, allow to estimate respective daily intakes for NP, OP, and OPE of about 12, 0.1, and 0.1 microg day(-1) for an Italian adult living along the Adriatic Coast. In relation to NP and OP, these intakes are much lower than the doses associated with toxic effects in laboratory animals (9 mg kg(-1) bw for rats). Nevertheless, data of exposure from other sources to these chemicals and others with similar biological characteristics are needed.", "Alkylphenols--potential modulators of the allergic response. The prevalence of allergic diseases has increased in recent decades. Allergic diseases, particularly asthma, are complex diseases with strong gene-environment interactions. Epidemiological studies have identified a variety of risk factors for the development of allergic diseases. Among them, endocrine-disrupting chemicals (EDCs) play an important role in triggering or exacerbating these diseases. 4-Nonylphenol (NP) and 4-octylphenol (OP)--two major alkylphenols--have been recognized as common toxic and xenobiotic endocrine disrupters. Due to their low solubility, high hydrophobicity, and low estrogenic activity, they tend to accumulate in the human body and may be associated with the adverse effects of allergic diseases. Recently, new evidence has supported the importance of alkylphenols in the in vitro allergic response. This review focuses on the effects of alkylphenols on several key cell types in the context of allergic inflammation. Copyright \u00a9 2012. Published by Elsevier B.V.", "Reducing exposure to dioxins and related compounds through foods in the next generation. Dioxins and related compounds are undesirable and unintended contaminants in the food supply, and dietary intake is the major route of exposure. Reducing dietary exposure to dioxins among the most vulnerable segments of the population (i.e., pregnant women, infants, and young girls) is an effective strategy for reducing body burdens in future generations. Exposure to dioxins through foods can be minimized by selecting lower-fat versions of meats, poultry, and dairy products. Consuming all foods, including fatty fish, in recommended amounts is congruent with the goal of reducing dioxin intake exposure and maintaining good health."], ["Increased food energy supply is more than sufficient to explain the US epidemic of obesity. BACKGROUND: The major drivers of the obesity epidemic are much debated and have considerable policy importance for the population-wide prevention of obesity. OBJECTIVE: The objective was to determine the relative contributions of increased energy intake and reduced physical activity to the US obesity epidemic. DESIGN: We predicted the changes in weight from the changes in estimated energy intakes in US children and adults between the 1970s and 2000s. The increased US food energy supply (adjusted for wastage and assumed to be proportional to energy intake) was apportioned to children and adults and inserted into equations that relate energy intake to body weight derived from doubly labeled water studies. The weight increases predicted from the equations were compared with weight increases measured in representative US surveys over the same period. RESULTS: For children, the measured weight gain was 4.0 kg, and the predicted weight gain for the increased energy intake was identical at 4.0 kg. For adults, the measured weight gain was 8.6 kg, whereas the predicted weight gain was somewhat higher (10.8 kg). CONCLUSIONS: Increased energy intake appears to be more than sufficient to explain weight gain in the US population. A reversal of the increase in energy intake of approximately 2000 kJ/d (500 kcal/d) for adults and of 1500 kJ/d (350 kcal/d) for children would be needed for a reversal to the mean body weights of the 1970s. Alternatively, large compensatory increases in physical activity (eg, 110-150 min of walking/d), or a combination of both, would achieve the same outcome. Population approaches to reducing obesity should emphasize a reduction in the drivers of increased energy intake.", "Dietary sugar and body weight: have we reached a crisis in the epidemic of obesity and diabetes?: health be damned! Pour on the sugar. Sugar-sweetened drinks have been associated with several health problems. In the point narrative as presented below, we provide our opinion and review of the data to date that we need to reconsider consumption of dietary sugar based on the growing concern of obesity and type 2 diabetes. In the counterpoint narrative following our contribution, Drs. Kahn and Sievenpiper provide a defense and suggest that dietary sugar is not the culprit. Data from the National Health and Nutrition Examination Survey and U.S. Department of Agriculture dietary surveys along with commercial Homescan data on household purchases were used to understand changes in sugar and fructose consumption. Meta-analyses and randomized clinical trials were used to evaluate outcomes of beverage and fructose intake. About 75% of all foods and beverages contain added sugar in a large array of forms. Consumption of soft drinks has increased fivefold since 1950. Meta-analyses suggest that consumption of sugar-sweetened beverages (SSBs) is related to the risk of diabetes, the metabolic syndrome, and cardiovascular disease. Drinking two 16-ounce SSBs per day for 6 months induced features of the metabolic syndrome and fatty liver. Randomized controlled trials in children and adults lasting 6 months to 2 years have shown that lowering the intake of soft drinks reduced weight gain. Recent studies suggest a gene-SSB potential relationship. Consumption of calorie-sweetened beverages has continued to increase and plays a role in the epidemic of obesity, the metabolic syndrome, and fatty liver disease. Reducing intake of soft drinks is associated with less weight gain.", "Non-nutrient causes of low-grade, systemic inflammation: support for a 'canary in the mineshaft' view of obesity in chronic disease. A form of low-grade, systemic inflammation ('metaflammation') is linked to many types of chronic disease. Initially, this was thought to be causally related to weight gain and obesity and a possible explanation of the link between obesity and disease. However, several lifestyle-related inducers of such inflammation, some of which are associated with obesity, but some of which are not, have now been identified. The most common of these have been nutritive related, suggesting that there could still be a relationship, either directly or indirectly, with obesity. Here we provide evidence for non-nutritive inflammatory inducers, providing further support for an earlier suggestion that while obesity, beyond a point, may have a direct link with disease, this may be neither necessary nor sufficient to explain the current epidemic of chronic disease. A more ubiquitous cause encompassing all inflammatory inducers is the modern, post-industrial environment and lifestyles emanating from this. Obesity may thus be more of 'a canary in the mineshaft', warning of bigger global problems, than just a single pathway to modern environmentally driven disease. \u00a9 2010 The Authors. obesity reviews \u00a9 2010 International Association for the Study of Obesity.", "Will all Americans become overweight or obese? estimating the progression and cost of the US obesity epidemic. We projected future prevalence and BMI distribution based on national survey data (National Health and Nutrition Examination Study) collected between 1970s and 2004. Future obesity-related health-care costs for adults were estimated using projected prevalence, Census population projections, and published national estimates of per capita excess health-care costs of obesity/overweight. The objective was to illustrate potential burden of obesity prevalence and health-care costs of obesity and overweight in the United States that would occur if current trends continue. Overweight and obesity prevalence have increased steadily among all US population groups, but with notable differences between groups in annual increase rates. The increase (percentage points) in obesity and overweight in adults was faster than in children (0.77 vs. 0.46-0.49), and in women than in men (0.91 vs. 0.65). If these trends continue, by 2030, 86.3% adults will be overweight or obese; and 51.1%, obese. Black women (96.9%) and Mexican-American men (91.1%) would be the most affected. By 2048, all American adults would become overweight or obese, while black women will reach that state by 2034. In children, the prevalence of overweight (BMI >/= 95th percentile, 30%) will nearly double by 2030. Total health-care costs attributable to obesity/overweight would double every decade to 860.7-956.9 billion US dollars by 2030, accounting for 16-18% of total US health-care costs. We continue to move away from the Healthy People 2010 objectives. Timely, dramatic, and effective development and implementation of corrective programs/policies are needed to avoid the otherwise inevitable health and societal consequences implied by our projections .", "Health and economic burden of the projected obesity trends in the USA and the UK. Rising prevalence of obesity is a worldwide health concern because excess weight gain within populations forecasts an increased burden from several diseases, most notably cardiovascular diseases, diabetes, and cancers. In this report, we used a simulation model to project the probable health and economic consequences in the next two decades from a continued rise in obesity in two ageing populations--the USA and the UK. These trends project 65 million more obese adults in the USA and 11 million more obese adults in the UK by 2030, consequently accruing an additional 6-8\u00b75 million cases of diabetes, 5\u00b77-7\u00b73 million cases of heart disease and stroke, 492,000-669,000 additional cases of cancer, and 26-55 million quality-adjusted life years forgone for USA and UK combined. The combined medical costs associated with treatment of these preventable diseases are estimated to increase by $48-66 billion/year in the USA and by \u00a31\u00b79-2 billion/year in the UK by 2030. Hence, effective policies to promote healthier weight also have economic benefits. Copyright \u00a9 2011 Elsevier Ltd. All rights reserved."], ["Clinical utility of curcumin extract. Turmeric root has been used medicinally in China and India for thousands of years. The active components are thought to be the curcuminoids, primarily curcumin, which is commonly available worldwide as a standardized extract. This article reviews the pharmacology of curcuminoids, their use and efficacy, potential adverse effects, and dosage and standardization. Preclinical studies point to mechanisms of action that are predominantly anti-inflammatory and antineoplastic, while early human clinical trials suggest beneficial effects for dyspepsia, peptic ulcer, inflammatory bowel disease, rheumatoid arthritis, osteoarthritis, uveitis, orbital pseudotumor, and pancreatic cancer. Curcumin is well-tolerated; the most common side effects are nausea and diarrhea. Theoretical interactions exist due to purported effects on metabolic enzymes and transport proteins, but clinical reports do not support any meaningful interactions. Nonetheless, caution, especially with chemotherapy agents, is advised. Late-phase clinical trials are still needed to confirm most beneficial effects.", "Curcumin: an orally bioavailable blocker of TNF and other pro-inflammatory biomarkers TNFs are major mediators of inflammation and inflammation-related diseases, hence, the United States Food and Drug Administration (FDA) has approved the use of blockers of the cytokine, TNF-\u03b1, for the treatment of osteoarthritis, inflammatory bowel disease, psoriasis and ankylosis. These drugs include the chimeric TNF antibody (infliximab), humanized TNF-\u03b1 antibody (Humira) and soluble TNF receptor-II (Enbrel) and are associated with a total cumulative market value of more than $20 billion a year. As well as being expensive ($15 000\u201320 000 per person per year), these drugs have to be injected and have enough adverse effects to be given a black label warning by the FDA. In the current report, we describe an alternative, curcumin (diferuloylmethane), a component of turmeric (Curcuma longa) that is very inexpensive, orally bioavailable and highly safe in humans, yet can block TNF-\u03b1 action and production in in vitro models, in animal models and in humans. In addition, we provide evidence for curcumin's activities against all of the diseases for which TNF blockers are currently being used. Mechanisms by which curcumin inhibits the production and the cell signalling pathways activated by this cytokine are also discussed. With health-care costs and safety being major issues today, this golden spice may help provide the solution. Linked Articles This article is part of a themed section on Emerging Therapeutic Aspects in Oncology. To view the other articles in this section visit http://dx.doi.org/10.1111/bph.2013.169.issue-8", "Therapeutic Roles of Curcumin: Lessons Learned from Clinical Trials Extensive research over the past half century has shown that curcumin (diferuloylmethane), a component of the golden spice turmeric (Curcuma longa), can modulate multiple cell signaling pathways. Extensive clinical trials over the past quarter century have addressed the pharmacokinetics, safety, and efficacy of this nutraceutical against numerous diseases in humans. Some promising effects have been observed in patients with various pro-inflammatory diseases including cancer, cardiovascular disease, arthritis, uveitis, ulcerative proctitis, Crohn\u2019s disease, ulcerative colitis, irritable bowel disease, tropical pancreatitis, peptic ulcer, gastric ulcer, idiopathic orbital inflammatory pseudotumor, oral lichen planus, gastric inflammation, vitiligo, psoriasis, acute coronary syndrome, atherosclerosis, diabetes, diabetic nephropathy, diabetic microangiopathy, lupus nephritis, renal conditions, acquired immunodeficiency syndrome, \u03b2-thalassemia, biliary dyskinesia, Dejerine-Sottas disease, cholecystitis, and chronic bacterial prostatitis. Curcumin has also shown protection against hepatic conditions, chronic arsenic exposure, and alcohol intoxication. Dose-escalating studies have indicated the safety of curcumin at doses as high as 12\u00a0g/day over 3\u00a0months. Curcumin\u2019s pleiotropic activities emanate from its ability to modulate numerous signaling molecules such as pro-inflammatory cytokines, apoptotic proteins, NF\u2013\u03baB, cyclooxygenase-2, 5-LOX, STAT3, C-reactive protein, prostaglandin E2, prostate-specific antigen, adhesion molecules, phosphorylase kinase, transforming growth factor-\u03b2, triglyceride, ET-1, creatinine, HO-1, AST, and ALT in human participants. In clinical trials, curcumin has been used either alone or in combination with other agents. Various formulations of curcumin, including nanoparticles, liposomal encapsulation, emulsions, capsules, tablets, and powder, have been examined. In this review, we discuss in detail the various human diseases in which the effect of curcumin has been investigated.", "Bioavailability of curcumin: problems and promises. Curcumin, a polyphenolic compound derived from dietary spice turmeric, possesses diverse pharmacologic effects including anti-inflammatory, antioxidant, antiproliferative and antiangiogenic activities. Phase I clinical trials have shown that curcumin is safe even at high doses (12 g/day) in humans but exhibit poor bioavailability. Major reasons contributing to the low plasma and tissue levels of curcumin appear to be due to poor absorption, rapid metabolism, and rapid systemic elimination. To improve the bioavailability of curcumin, numerous approaches have been undertaken. These approaches involve, first, the use of adjuvant like piperine that interferes with glucuronidation; second, the use of liposomal curcumin; third, curcumin nanoparticles; fourth, the use of curcumin phospholipid complex; and fifth, the use of structural analogues of curcumin (e.g., EF-24). The latter has been reported to have a rapid absorption with a peak plasma half-life. Despite the lower bioavailability, therapeutic efficacy of curcumin against various human diseases, including cancer, cardiovascular diseases, diabetes, arthritis, neurological diseases and Crohn's disease, has been documented. Enhanced bioavailability of curcumin in the near future is likely to bring this promising natural product to the forefront of therapeutic agents for treatment of human disease.", "Curcumin, a component of turmeric: from farm to pharmacy. Curcumin, an active polyphenol of the golden spice turmeric, is a highly pleiotropic molecule with the potential to modulate the biological activity of a number of signaling molecules. Traditionally, this polyphenol has been used in Asian countries to treat such human ailments as acne, psoriasis, dermatitis, and rash. Recent studies have indicated that curcumin can target newly identified signaling pathways including those associated with microRNA, cancer stem cells, and autophagy. Extensive research from preclinical and clinical studies has delineated the molecular basis for the pharmaceutical uses of this polyphenol against cancer, pulmonary diseases, neurological diseases, liver diseases, metabolic diseases, autoimmune diseases, cardiovascular diseases, and numerous other chronic diseases. Multiple studies have indicated the safety and efficacy of curcumin in numerous animals including rodents, monkeys, horses, rabbits, and cats and have provided a solid basis for evaluating its safety and efficacy in humans. To date, more than 65 human clinical trials of curcumin, which included more than 1000 patients, have been completed, and as many as 35 clinical trials are underway. Curcumin is now used as a supplement in several countries including the United States, India, Japan, Korea, Thailand, China, Turkey, South Africa, Nepal, and Pakistan. In this review, we provide evidence for the pharmaceutical uses of curcumin for various diseases. Copyright \u00a9 2013 International Union of Biochemistry and Molecular Biology, Inc."], ["The Association of Consumption of Fruits/Vegetables with Decreased Risk of Glaucoma among Older African American Women in the Study of Osteoporotic Fractures Purpose To explore the association between consumption of fruits and vegetables and the presence of glaucoma in older African American women. Design Cross-sectional study. Methods Disc photographs and suprathreshold visual fields were obtained from the 662 African American participants in the Study of Osteoporotic Fractures. Masked, trained readers graded all discs, and two glaucoma specialists reviewed photos and visual fields. The Block Food Frequency Questionnaire assessed food consumption. Relationships between selected fruit/vegetable/nutrient consumption and glaucoma were evaluated using logistic regression models after adjusting for potential confounders. Results After excluding women missing Food Frequency Questionnaire and disc data, 584 African American women (88.2% of total African American cohort) were included. Glaucoma was diagnosed in at least one eye in 77 subjects (13%). Women who ate 3 or more servings/day of fruits/fruit juices were 79% (odds ratio [OR]=0.21; 95% confidence interval [CI]: 0.08\u20130.60) less likely to have glaucoma than women who ate less than one serving/day. Women who consumed more than 2 servings/week of fresh oranges (OR=0.18; 95%CI: 0.06\u20130.51) and peaches (OR=0.30; 95%CI: 0.13\u20130.67) had a decreased odds of glaucoma compared to those consuming less than one serving/week. For vegetables, >1 serving/week compared to \u22641 serving/month of collard-greens/kale decreased the odds of glaucoma by 57% (OR=0.43; 95%CI: 0.21\u20130.85). There was a protective trend against glaucoma in those consuming more fruit/fruit juices (p=0.023), fresh oranges (p=0.002), fresh peaches (p=0.002), and collard greens/kale (p=0.014). Higher consumption of carrots (p=0.061) and spinach (p=0.094) also showed some associations. Individual nutrient intake from food sources found protective trends with higher intakes of vitamin A (p=0.011), vitamin C (p=0.018), and \u03b1-carotene (p=0.021), and close to statistically significant trends with \u03b2-carotene (p=0.052), folate (p=0.056), and lutein/zeaxanthin (p=0.077). Conclusion Higher intake of certain fruits and vegetables high in Vitamins A and C and carotenoids may be associated with a decreased likelihood of glaucoma in older African American women. Randomized controlled trials are needed to determine whether the intake of specific nutrients changes the risk of glaucoma.", "Glaucoma risk and the consumption of fruits and vegetables among older women in the study of osteoporotic fractures. PURPOSE: To explore the association between the consumption of fruits and vegetables and the presence of glaucoma. DESIGN: Cross-sectional cohort study. METHODS: In a sample of 1,155 women located in multiple centers in the United States, glaucoma specialists diagnosed glaucoma in at least one eye by assessing optic nerve head photographs and 76-point suprathreshold screening visual fields. Consumption of fruits and vegetables was assessed using the Block Food Frequency Questionnaire. The relationship between selected fruit and vegetable consumption and glaucoma was investigated using adjusted logistic regression models. RESULTS: Among 1,155 women, 95 (8.2%) were diagnosed with glaucoma. In adjusted analysis, the odds of glaucoma risk were decreased by 69% (odds ratio [OR], 0.31; 95% confidence interval [CI], 0.11 to 0.91) in women who consumed at least one serving per month of green collards and kale compared with those who consumed fewer than one serving per month, by 64% (OR, 0.36; 95% CI, 0.17 to 0.77) in women who consumed more than two servings per week of carrots compared with those who consumed fewer than one serving per week, and by 47% (OR, 0.53; 95% CI, 0.29 to 0.97) in women who consumed at least one serving per week of canned or dried peaches compared with those who consumed fewer than one serving per month. CONCLUSIONS: A higher intake of certain fruits and vegetables may be associated with a decreased risk of glaucoma. More studies are needed to investigate this relationship.", "The Association between Glaucoma Prevalence and Supplementation with the Oxidants Calcium and Iron Purpose. To investigate the relationship between supplementary consumption of the oxidants calcium and iron and the prevalence of glaucoma. Methods. This cross-sectional study included 3833 participants in the National Health and Nutrition Examination Survey (NHANES) for 2007 and 2008, \u226540 years of age, who reported a presence or absence of glaucoma. Participants were interviewed regarding the use of dietary supplements and antacids during the preceding 30-day period. Data pertaining to the supplementary intake of calcium and iron was aggregated and divided into quintiles. Information regarding the presence or absence of glaucoma and demographics, comorbidities, and health-related behavior was obtained via interview. Results. Participants who consumed \u2265800 mg/d of supplementary calcium or \u226518 mg/d of supplementary iron had significantly higher odds of having been diagnosed with glaucoma than did those who had not consumed supplementary calcium or iron, after adjustment for potential confounders (odds ratio [OR] 2.44, 95% confidence interval [CI] 1.25\u20134.76 for calcium; OR 3.80, 95% CI 1.79\u20138.06 for iron). Concurrent consumption of both calcium and iron above these levels was associated with still greater odds of having been diagnosed with glaucoma (OR 7.24, 95% CI 2.42\u201321.62). A clear dose\u2013response relationship between quintiles of supplementary calcium or iron intake and glaucoma prevalence was not found. Conclusions. These results suggest that there may be a threshold intake of iron and calcium above which there is an increased risk of development of glaucoma. Prospective longitudinal studies are needed, to assess whether oxidant intake is a risk factor for development and progression of glaucoma.", "Two-year randomized, placebo-controlled study of black currant anthocyanins on visual field in glaucoma. AIM: To examine the influence of the black currant anthocyanins (BCACs) on the disease progression of open-angle glaucoma (OAG), a randomized, placebo-controlled, double-masked trial was made in 38 patients with OAG treated by antiglaucoma drops. METHODS: BCACs (50 mg/day, n = 19) or their placebos (n = 19) were orally administered once daily for a 24-month period. Systemic blood pressure, pulse rates, intraocular pressure (IOP), ocular blood circulation by laser-speckle flowgraphy, and Humphrey visual field mean deviation (MD) were measured during the 24-month period. RESULTS: As a main outcome measurement, we evaluated the difference between the groups in MD deterioration in the eye with a better MD from the trial's baseline through 24 months. A statistically significant difference was observed between the treatment groups in mean change from baseline in MD 24 months after therapy (p = 0.039, unpaired t test). Upon administration of BCACs, the ocular blood flows during the 24-month observational period increased in comparison with placebo-treated patients. However, no significant changes were observed in systemic and ocular conditions including IOP during the 24-month period. CONCLUSIONS: Our results suggest that oral administration of BCACs may be a safe and promising supplement for patients with OAG in addition to antiglaucoma medication. Copyright \u00a9 2012 S. Karger AG, Basel.", "Influence of diet on tear function. The effect of diet on tear function is illustrated clearly by malnutrition-induced xerophthalmia. Dietary habits in well nourished North American society have been implicated as a cause of some tear dysfunction. A review of the ocular literature suggests that sufficient dietary protein, vitamins A, B6 and C, potassium, and zinc may be necessary for normal tear function. Excesses of dietary fats, salt, cholesterol, alcohol, protein, and sucrose have been associated with or suggested as causes of tear dysfunction. No unequivocal link has been established between diet and remission of dry eye states in a well nourished population."], ["The autopsy of chicken nuggets reads \\\"chicken little\\\". PURPOSE: To determine the contents of chicken nuggets from 2 national food chains. BACKGROUND: Chicken nuggets have become a major component of the American diet. We sought to determine the current composition of this highly processed food. METHODS: Randomly selected nuggets from 2 different national fast food chains were fixed in formalin, sectioned and stained for microscopic analysis. RESULTS: Striated muscle (chicken meat) was not the predominate component in either nugget. Fat was present in equal or greater quantities along with epithelium, bone, nerve, and connective tissue. CONCLUSION: Chicken nuggets are mostly fat, and their name is a misnomer. Copyright \u00a9 2013 Elsevier Inc. All rights reserved.", "Fast food hamburgers: what are we really eating? Americans consume about 5 billion hamburgers a year. It is presumed that most hamburgers are composed primarily of meat. The purpose of this study is to assess the content of 8 fast food hamburger brands using histologic methods. Eight different brands of hamburgers were evaluated for water content by weight and microscopically for recognizable tissue types. Glial fibrillary acidic protein (GFAP) staining was used to evaluate for brain tissue. Water content by weight ranged from 37.7% to 62.4% (mean, 49%). Meat content in the hamburgers ranged from 2.1% to 14.8% (median, 12.1%). The cost per gram of hamburger ranged from $0.02 to $0.16 (median, $0.03) and did not correlate with meat content. Electron microscopy showed relatively preserved skeletal muscle. A variety of tissue types besides skeletal muscle were observed including connective tissue (n = 8), blood vessels (n = 8), peripheral nerve (n = 8), adipose tissue (n = 7), plant material (n = 4), cartilage (n = 3), and bone (n = 2). In 2 hamburgers, intracellular parasites (Sarcocystis) were identified. The GFAP immunostaining was not observed in any of the hamburgers. Lipid content on oil-red-O staining was graded as 1+ (moderate) in 6 burgers and 2+ (marked) in 2 burgers. Fast food hamburgers are comprised of little meat (median, 12.1%). Approximately half of their weight is made up of water. Unexpected tissue types found in some hamburgers included bone, cartilage, and plant material; no brain tissue was present. Sarcocystis parasites were discovered in 2 hamburgers.", "Applying morphologic techniques to evaluate hotdogs: what is in the hotdogs we eat? Americans consume billions of hotdogs per year resulting in more than a billion dollars in retail sales. Package labels typically list some type of meat as the primary ingredient. The purpose of this study is to assess the meat and water content of several hotdog brands to determine if the package labels are accurate. Eight brands of hotdogs were evaluated for water content by weight. A variety of routine techniques in surgical pathology including routine light microscopy with hematoxylin-eosin-stained sections, special staining, immunohistochemistry, and electron microscopy were used to assess for meat content and for other recognizable components. Package labels indicated that the top-listed ingredient in all 8 brands was meat; the second listed ingredient was water (n = 6) and another type of meat (n = 2). Water comprised 44% to 69% (median, 57%) of the total weight. Meat content determined by microscopic cross-section analysis ranged from 2.9% to 21.2% (median, 5.7%). The cost per hotdog ($0.12-$0.42) roughly correlated with meat content. A variety of tissues were observed besides skeletal muscle including bone (n = 8), collagen (n = 8), blood vessels (n = 8), plant material (n = 8), peripheral nerve (n = 7), adipose (n = 5), cartilage (n = 4), and skin (n = 1). Glial fibrillary acidic protein immunostaining was not observed in any of the hotdogs. Lipid content on oil red O staining was graded as moderate in 3 hotdogs and marked in 5 hotdogs. Electron microscopy showed recognizable skeletal muscle with evidence of degenerative changes. In conclusion, hotdog ingredient labels are misleading; most brands are more than 50% water by weight. The amount of meat (skeletal muscle) in most brands comprised less than 10% of the cross-sectional surface area. More expensive brands generally had more meat. All hotdogs contained other tissue types (bone and cartilage) not related to skeletal muscle; brain tissue was not present.", "Detection of PhIP in grilled chicken entr\u00e9es at popular chain restaurants throughout California. Heterocyclic amines (HCAs), compounds formed when meat is cooked at high temperatures particularly through pan frying, grilling, or barbequing, pose a potential carcinogenic risk to the public. It is unclear whether there is any level at which consumption of HCAs can be considered safe. Efforts to measure these compounds mainly include cooking studies under laboratory conditions and some measurement of home-cooked foods, but analysis of commercially cooked foods has been minimal. Attempts to estimate exposure of the public to these compounds must take into consideration dining outside the home, which could result in significant exposure for some individuals. We surveyed at least 9 locations each of 7 popular chain restaurants (McDonald's, Burger King, Chick-fil-A, Chili's, TGI Friday's, Outback Steakhouse, and Applebee's) in California, collecting one or two entrees from each location. Entrees were analyzed for 2-amino-1-methyl-6-phenylimidazo[4,5-b]pyridine (PhIP) using high-performance liquid chromatography tandem mass spectrometry. All 100 samples contained PhIP. Concentrations were variable within and between entrees and ranged from 0.08 to 43.2 ng/g. When factoring in the weight of the entrees, absolute levels of PhIP reached over 1,000 ng for some entrees. Potential strategies for reducing exposure include the avoidance of meats cooked using methods that are known to form PhIP.", "Dietary roles of non-starch polysaccharides in human nutrition: a review. Nonstarch polysaccharides (NSPs) occur naturally in many foods. The physiochemical and biological properties of these compounds correspond to dietary fiber. Nonstarch polysaccharides show various physiological effects in the small and large intestine and therefore have important health implications for humans. The remarkable properties of dietary NSPs are water dispersibility, viscosity effect, bulk, and fermentibility into short chain fatty acids (SCFAs). These features may lead to diminished risk of serious diet related diseases which are major problems in Western countries and are emerging in developing countries with greater affluence. These conditions include coronary heart disease, colo-rectal cancer, inflammatory bowel disease, breast cancer, tumor formation, mineral related abnormalities, and disordered laxation. Insoluble NSPs (cellulose and hemicellulose) are effective laxatives whereas soluble NSPs (especially mixed-link \u03b2-glucans) lower plasma cholesterol levels and help to normalize blood glucose and insulin levels, making these kinds of polysaccharides a part of dietary plans to treat cardiovascular diseases and Type 2 diabetes. Moreover, a major proportion of dietary NSPs escapes the small intestine nearly intact, and is fermented into SCFAs by commensal microflora present in the colon and cecum and promotes normal laxation. Short chain fatty acids have a number of health promoting effects and are particularly effective in promoting large bowel function. Certain NSPs through their fermented products may promote the growth of specific beneficial colonic bacteria which offer a prebiotic effect. Various modes of action of NSPs as therapeutic agent have been proposed in the present review. In addition, NSPs based films and coatings for packaging and wrapping are of commercial interest because they are compatible with several types of food products. However, much of the physiological and nutritional impact of NSPs and the mechanism involved is not fully understood and even the recommendation on the dose of different dietary NSPs intake among different age groups needs to be studied."], ["Fructose: It\u2019s \u201cAlcohol Without the Buzz\u201d What do the Atkins Diet and the traditional Japanese diet have in common? The Atkins Diet is low in carbohydrate and usually high in fat; the Japanese diet is high in carbohydrate and usually low in fat. Yet both work to promote weight loss. One commonality of both diets is that they both eliminate the monosaccharide fructose. Sucrose (table sugar) and its synthetic sister high fructose corn syrup consist of 2 molecules, glucose and fructose. Glucose is the molecule that when polymerized forms starch, which has a high glycemic index, generates an insulin response, and is not particularly sweet. Fructose is found in fruit, does not generate an insulin response, and is very sweet. Fructose consumption has increased worldwide, paralleling the obesity and chronic metabolic disease pandemic. Sugar (i.e., fructose-containing mixtures) has been vilified by nutritionists for ages as a source of \u201cempty calories,\u201d no different from any other empty calorie. However, fructose is unlike glucose. In the hypercaloric glycogen-replete state, intermediary metabolites from fructose metabolism overwhelm hepatic mitochondrial capacity, which promotes de novo lipogenesis and leads to hepatic insulin resistance, which drives chronic metabolic disease. Fructose also promotes reactive oxygen species formation, which leads to cellular dysfunction and aging, and promotes changes in the brain\u2019s reward system, which drives excessive consumption. Thus, fructose can exert detrimental health effects beyond its calories and in ways that mimic those of ethanol, its metabolic cousin. Indeed, the only distinction is that because fructose is not metabolized in the central nervous system, it does not exert the acute neuronal depression experienced by those imbibing ethanol. These metabolic and hedonic analogies argue that fructose should be thought of as \u201calcohol without the buzz.\u201d", "Tobacco and obesity epidemics: not so different after all? Short abstract Campaigns to promote healthy eating are undermined by the ubiquity of processed, energy dense foods. A global strategy is now needed to tackle the rising prevalence of obesity", "Dietary sugar and body weight: have we reached a crisis in the epidemic of obesity and diabetes?: health be damned! Pour on the sugar. Sugar-sweetened drinks have been associated with several health problems. In the point narrative as presented below, we provide our opinion and review of the data to date that we need to reconsider consumption of dietary sugar based on the growing concern of obesity and type 2 diabetes. In the counterpoint narrative following our contribution, Drs. Kahn and Sievenpiper provide a defense and suggest that dietary sugar is not the culprit. Data from the National Health and Nutrition Examination Survey and U.S. Department of Agriculture dietary surveys along with commercial Homescan data on household purchases were used to understand changes in sugar and fructose consumption. Meta-analyses and randomized clinical trials were used to evaluate outcomes of beverage and fructose intake. About 75% of all foods and beverages contain added sugar in a large array of forms. Consumption of soft drinks has increased fivefold since 1950. Meta-analyses suggest that consumption of sugar-sweetened beverages (SSBs) is related to the risk of diabetes, the metabolic syndrome, and cardiovascular disease. Drinking two 16-ounce SSBs per day for 6 months induced features of the metabolic syndrome and fatty liver. Randomized controlled trials in children and adults lasting 6 months to 2 years have shown that lowering the intake of soft drinks reduced weight gain. Recent studies suggest a gene-SSB potential relationship. Consumption of calorie-sweetened beverages has continued to increase and plays a role in the epidemic of obesity, the metabolic syndrome, and fatty liver disease. Reducing intake of soft drinks is associated with less weight gain.", "Food and drug reward: overlapping circuits in human obesity and addiction. Both drug addiction and obesity can be defined as disorders in which the saliency value of one type of reward (drugs and food, respectively) becomes abnormally enhanced relative to, and at the expense of others. This model is consistent with the fact that both drugs and food have powerful reinforcing effects-partly mediated by dopamine increases in the limbic system-that, under certain circumstances or in vulnerable individuals, could overwhelm the brain's homeostatic control mechanisms. Such parallels have generated significant interest in understanding the shared vulnerabilities and trajectories between addiction and obesity. Now, brain imaging discoveries have started to uncover common features between these two conditions and to delineate some of the overlapping brain circuits whose dysfunctions may explain stereotypic and related behavioral deficits in human subjects. These results suggest that both obese and drug-addicted individuals suffer from impairments in dopaminergic pathways that regulate neuronal systems associated not only with reward sensitivity and incentive motivation, but also with conditioning (memory/learning), impulse control (behavioural inhibition), stress reactivity, and interoceptive awareness. Here, we integrate findings predominantly derived from positron emission tomography that shed light on the role of dopamine in drug addiction and in obesity, and propose an updated working model to help identify treatment strategies that may benefit both of these conditions.", "Obesity and addiction: neurobiological overlaps. Drug addiction and obesity appear to share several properties. Both can be defined as disorders in which the saliency of a specific type of reward (food or drug) becomes exaggerated relative to, and at the expense of others rewards. Both drugs and food have powerful reinforcing effects, which are in part mediated by abrupt dopamine increases in the brain reward centres. The abrupt dopamine increases, in vulnerable individuals, can override the brain's homeostatic control mechanisms. These parallels have generated interest in understanding the shared vulnerabilities between addiction and obesity. Predictably, they also engendered a heated debate. Specifically, brain imaging studies are beginning to uncover common features between these two conditions and delineate some of the overlapping brain circuits whose dysfunctions may underlie the observed deficits. The combined results suggest that both obese and drug-addicted individuals suffer from impairments in dopaminergic pathways that regulate neuronal systems associated not only with reward sensitivity and incentive motivation, but also with conditioning, self-control, stress reactivity and interoceptive awareness. In parallel, studies are also delineating differences between them that centre on the key role that peripheral signals involved with homeostatic control exert on food intake. Here, we focus on the shared neurobiological substrates of obesity and addiction. \u00a9 2012 The Authors. obesity reviews \u00a9 2012 International Association for the Study of Obesity."], ["Neurocysticercosis in pregnancy: not just another headache. Infection with pork tapeworm, or Taenia solium, affects approximately 50 million people worldwide. The most important and potentially devastating form of the infestation, neurocysticercosis, occurs when the parasite invades the central nervous system. There has been a significant increase in the number of cases in the United States due to immigration from endemic areas. This case study of a pregnant woman in the 35th week of gestation exemplifies the serious consequences of this infection in pregnancy, and discusses an evidence-based approach to the diagnosis, treatment and eradication of this preventable disease. \u00a9 2012 AWHONN.", "Freezing of infested pork muscle kills cysticerci. A method for culturing cysticerci that allows successful evagination and growth of scolexes from metacestodes of Taenia solium was used to study the survival of cysticerci subjected to low temperatures. Refrigeration of pork muscle infested with cysticerci at temperatures above 0 degrees C did not affect the parasites' survival in culture. Conversely, freezing of meat prevented survival of cysts. A practical procedure to kill cysticerci is the storage of pork muscle for four days at -5 degrees C, three days at -15 degrees C, or one day at -24 degrees C. These simple measures would help prevent the most frequent parasitosis of man's central nervous system.", "Epidemiologic Investigation of Immune-Mediated Polyradiculoneuropathy among Abattoir Workers Exposed to Porcine Brain Background In October 2007, a cluster of patients experiencing a novel polyradiculoneuropathy was identified at a pork abattoir (Plant A). Patients worked in the primary carcass processing area (warm room); the majority processed severed heads (head-table). An investigation was initiated to determine risk factors for illness. Methods and Results Symptoms of the reported patients were unlike previously described occupational associated illnesses. A case-control study was conducted at Plant A. A case was defined as evidence of symptoms of peripheral neuropathy and compatible electrodiagnostic testing in a pork abattoir worker. Two control groups were used - randomly selected non-ill warm-room workers (n\u200a=\u200a49), and all non-ill head-table workers (n\u200a=\u200a56). Consenting cases and controls were interviewed and blood and throat swabs were collected. The 26 largest U.S. pork abattoirs were surveyed to identify additional cases. Fifteen cases were identified at Plant A; illness onsets occurred during May 2004\u2013November 2007. Median age was 32 years (range, 21\u201355 years). Cases were more likely than warm-room controls to have ever worked at the head-table (adjusted odds ratio [AOR], 6.6; 95% confidence interval [CI], 1.6\u201326.7), removed brains or removed muscle from the backs of heads (AOR, 10.3; 95% CI, 1.5\u201368.5), and worked within 0\u201310 feet of the brain removal operation (AOR, 9.9; 95% CI, 1.2\u201380.0). Associations remained when comparing head-table cases and head-table controls. Workers removed brains by using compressed air that liquefied brain and generated aerosolized droplets, exposing themselves and nearby workers. Eight additional cases were identified in the only two other abattoirs using this technique. The three abattoirs that used this technique have stopped brain removal, and no new cases have been reported after 24 months of follow up. Cases compared to controls had higher median interferon-gamma (IFN\u03b3) levels (21.7 pg/ml; vs 14.8 pg/ml, P<0.001). Discussion This novel polyradiculoneuropathy was associated with removing porcine brains with compressed air. An autoimmune mechanism is supported by higher levels of IFN\u03b3 in cases than in controls consistent with other immune mediated illnesses occurring in association with neural tissue exposure. Abattoirs should not use compressed air to remove brains and should avoid procedures that aerosolize CNS tissue. This outbreak highlights the potential for respiratory or mucosal exposure to cause an immune-mediated illness in an occupational setting.", "An outbreak of neurological autoimmunity with polyradiculoneuropathy in workers exposed to aerosolised porcine neural tissue: a descriptive study. BACKGROUND: Between November, 2006, and May, 2008, a subacute neurological syndrome affected workers from two swine abattoirs in Minnesota and Indiana who had occupational exposure to aerosolised porcine brain. We aimed to describe the pathogenic and immunological characteristics of this illness. METHODS: All patients from two abattoirs who presented or were referred to the Mayo Clinic (Rochester, MN, USA) with neurological symptoms were included. We recorded details of exposure to aerosolised brain tissue and did comprehensive neurological, laboratory, neuroimaging, electrophysiological, pathological, and autoimmune serological assessments. Healthy controls were recruited from the community and from workers at the plant in Minnesota. FINDINGS: 24 patients were identified (21 from Minnesota, three from Indiana). The shortest duration from first exposure to symptom onset was 4 weeks. No infectious agent that could trigger disease was identified. All patients developed polyradiculoneuropathy, which was usually sensory predominant and painful. Two patients had initial CNS manifestations: transverse myelitis and meningoencephalitis. Nerve conduction studies localised abnormalities to the most proximal and distal nerve segments. Quantitative sensory and autonomic testing revealed involvement of large and small sensory fibres and sweat fibres. MRI showed prominent abnormalities of roots and ganglia. Nerve biopsies identified mild demyelination, axonal degeneration, and perivascular inflammation. Protein concentrations were high in the CSF of 18 (86%) of 21 patients. Sera from all patients and 29 (34%) of 85 unaffected workplace controls (but none of 178 community controls) had a distinctive neural-reactive IgG; 75% of patients' sera contained an IgG specific to myelin basic protein. Seropositivity correlated directly with exposure risk in patients and controls. 17 patients required immunomodulatory therapies, six improved spontaneously, and one was lost to follow-up after exposure stopped. INTERPRETATION: The neurological disorder described is autoimmune in origin and is related to occupational exposure to multiple aerosolised porcine brain tissue antigens. The pattern of nerve involvement suggests vulnerability of nerve roots and terminals where the blood-nerve barrier is most permeable. FUNDING: Mayo Clinic Foundation; Minnesota Department of Health; Centers for Disease Control and Prevention. Copyright 2010 Elsevier Ltd. All rights reserved.", "Outbreak of progressive inflammatory neuropathy following exposure to aerosolized porcine neural tissue. In the fall of 2007, the Minnesota Department of Health was notified of 11 cases of an unexplained neurological illness, all linked to a pork processing plant, Quality Pork Processors, Inc., in Austin, MN. The cluster of workers had been experiencing similar symptoms, including fatigue, pain, numbness, and tingling in their extremities as well as weakness. The symptoms were described as more sensory than motor, and all patients had evidence of polyradiculoneuropathy with signs of nerve root irritation. An epidemiological investigation revealed that the only commonality between cases was their exposure to a pork brain extraction procedure involving compressed air. As relatives of the cases remained asymptomatic and all cultures for known pathogens were negative, the etiology of the syndrome seemed not to be infectious. Clinically, the syndrome was most akin to chronic inflammatory demyelinating polyneuropathy. Laboratory tests corroborated the clinical findings, revealing inflammation of peripheral nerves and nerve roots; however, these cases also had features clinically distinct from chronic inflammatory demyelinating polyneuropathy as well as laboratory testing revealing a novel immunoglobulin G immunostaining pattern. This suggested that the observed inflammation was the result of 1 or more unidentified antigens. This syndrome was ultimately dubbed progressive inflammatory neuropathy and was theorized to be an autoimmune reaction to aerosolized porcine neural tissue. Since the investigation's outset, 18 cases of progressive inflammatory neuropathy have been identified at the Minnesota pork processing plant, with 5 similar cases at an Indiana plant and 1 case at a Nebraskan plant. The plants in which cases have been identified have since stopped the use of compressed air in removing pork brains. All cases have stabilized or improved, with some requiring immunosuppressive and analgesic treatment. The study of progressive inflammatory neuropathy is ongoing, and the details of this investigation highlight the value of epidemiological principles in the identification and containment of outbreaks while researchers attempt to uncover the unique pathophysiology and potential etiology of the illness. Mt Sinai J Med 76:442-447, 2009. (c) 2009 Mount Sinai School of Medicine."], ["Preventing and arresting coronary atherosclerosis. The good news about coronary atherosclerosis is that it takes an awful lot of plaque before symptoms of myocardial ischemia occur. The bad news is that despite the need for large quantities of plaque for symptoms to occur, nevertheless nearly half of us in the United States eventually have the necessary quantity. Atherosclerosis is infrequently hereditary in origin. Most of us get atherosclerosis because we consume too much fat, cholesterol, and calories. The consequence is an elevated ( > 150 mg/dl) serum total cholesterol level, and the higher the number is above 150, the greater is the quantity of plaque deposited in our arteries. If the serum total cholesterol level can be prevented from rising to more than 150 mg/dl, plaques are not laid down; if elevated levels are lowered to 150 mg/dl, further plaque does not form, and parts of those present may vanish. A fruit-vegetarian-starch diet is necessary as a rule to achieve the 150 mg/dl level in most adults. Lipid-lowering drugs are required in the patients with familial hypercholesterolemia and in most patients with atherosclerotic events. The best news about atherosclerosis is that it can be prevented in those without the hereditary form, and it can be arrested by lowering elevated serum total (and LDL) cholesterol to the 150 mg/dl level.", "Resolving the Coronary Artery Disease Epidemic Through Plant-Based Nutrition. The world's advanced countries have easy access to plentiful high-fat food; ironically, it is this rich diet that produces atherosclerosis. In the world's poorer nations, many people subsist on a primarily plant-based diet, which is far healthier, especially in terms of heart disease. To treat coronary heart disease, a century of scientific investigation has produced a device-driven, risk factor-oriented strategy. Nevertheless, many patients treated with this approach experience progressive disability and death. This strategy is a rear-guard defensive one. In contrast, compelling data from nutritional studies, population surveys, and interventional studies support the effectiveness of a plant-based diet and aggressive lipid lowering to arrest, prevent, and selectively reverse heart disease. In essence, this is an offensive strategy. The single biggest step toward adopting this strategy would be to have United States dietary guidelines support a plant-based diet. An expert committee purged of industrial and political influence is required to assure that science is the basis for dietary recommendations. (c)2001 CHF, Inc.", "Resolving the Coronary Artery Disease Epidemic Through Plant-Based Nutrition. The world's advanced countries have easy access to plentiful high-fat food; ironically, it is this rich diet that produces atherosclerosis. In the world's poorer nations, many people subsist on a primarily plant-based diet, which is far healthier, especially in terms of heart disease. To treat coronary heart disease, a century of scientific investigation has produced a device-driven, risk factor-oriented strategy. Nevertheless, many patients treated with this approach experience progressive disability and death. This strategy is a rear-guard defensive one. In contrast, compelling data from nutritional studies, population surveys, and interventional studies support the effectiveness of a plant-based diet and aggressive lipid lowering to arrest, prevent, and selectively reverse heart disease. In essence, this is an offensive strategy. The single biggest step toward adopting this strategy would be to have United States dietary guidelines support a plant-based diet. An expert committee purged of industrial and political influence is required to assure that science is the basis for dietary recommendations. (c)2001 CHF, Inc.", "Updating a 12-year experience with arrest and reversal therapy for coronary heart disease (an overdue requiem for palliative cardiology). Coronary artery disease is essentially nonexistent in cultures whose nutrition assures cholesterol levels <150 mg/dl. Patients with advanced coronary artery disease may abolish disease progression through a plant-based diet and cholesterol-lowering medication to achieve and maintain a total cholesterol <150 mg/dl.", "Can noncommunicable diseases be prevented? Lessons from studies of populations and individuals. Noncommunicable diseases (NCDs)--mainly cancers, cardiovascular diseases, diabetes, and chronic respiratory diseases--are responsible for about two-thirds of deaths worldwide, mostly in low- and middle-income countries. There is an urgent need for policies and strategies that prevent NCDs by reducing their major risk factors. Effective approaches for large-scale NCD prevention include comprehensive tobacco and alcohol control through taxes and regulation of sales and advertising; reducing dietary salt, unhealthy fats, and sugars through regulation and well-designed public education; increasing the consumption of fresh fruits and vegetables, healthy fats, and whole grains by lowering prices and improving availability; and implementing a universal, effective, and equitable primary-care system that reduces NCD risk factors, including cardiometabolic risk factors and infections that are precursors to NCDs, through clinical interventions."], ["Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "Food additives and hyperactive behaviour in 3-year-old and 8/9-year-old children in the community: a randomised, double-blinded, placebo-controlled... BACKGROUND: We undertook a randomised, double-blinded, placebo-controlled, crossover trial to test whether intake of artificial food colour and additives (AFCA) affected childhood behaviour. METHODS: 153 3-year-old and 144 8/9-year-old children were included in the study. The challenge drink contained sodium benzoate and one of two AFCA mixes (A or B) or a placebo mix. The main outcome measure was a global hyperactivity aggregate (GHA), based on aggregated z-scores of observed behaviours and ratings by teachers and parents, plus, for 8/9-year-old children, a computerised test of attention. This clinical trial is registered with Current Controlled Trials (registration number ISRCTN74481308). Analysis was per protocol. FINDINGS: 16 3-year-old children and 14 8/9-year-old children did not complete the study, for reasons unrelated to childhood behaviour. Mix A had a significantly adverse effect compared with placebo in GHA for all 3-year-old children (effect size 0.20 [95% CI 0.01-0.39], p=0.044) but not mix B versus placebo. This result persisted when analysis was restricted to 3-year-old children who consumed more than 85% of juice and had no missing data (0.32 [0.05-0.60], p=0.02). 8/9-year-old children showed a significantly adverse effect when given mix A (0.12 [0.02-0.23], p=0.023) or mix B (0.17 [0.07-0.28], p=0.001) when analysis was restricted to those children consuming at least 85% of drinks with no missing data. INTERPRETATION: Artificial colours or a sodium benzoate preservative (or both) in the diet result in increased hyperactivity in 3-year-old and 8/9-year-old children in the general population.", "Synthetic Food Colors and Neurobehavioral Hazards: The View from Environmental Health Research Background: The proposition that synthetic food colors can induce adverse behavioral effects in children was first enunciated in 1975 by Feingold [Why Your Child Is Hyperactive. New York:Random House (1975)], who asserted that elevated sensitivity to food additives underlies the signs of hyperactivity observed in some children. Although the evidence suggested that some unknown proportion of children did respond to synthetic food colors, the U.S. Food and Drug Administration (FDA) interpreted the evidence as inconclusive. A study published in 2007 [McCann et al. Food additives and hyperactive behaviour in 3-year-old and 8/9-year-old children in the community: a randomised, double-blinded, placebo-controlled trial. Lancet 370:1560\u20131567 (2007)] drew renewed attention to the hypothesis because of the study\u2019s size and scope. It led the FDA to review the evidence, hold a public hearing, and seek the advice of its Food Advisory Committee. In preparation for the hearing, the FDA reviewed the available evidence and concluded that it did not warrant further agency action. Objectives: In this commentary I examine the basis of the FDA\u2019s position, the elements of the review that led to its decision and that of the Food Advisory Committee, and the reasons that this is an environmental health issue. Discussion: The FDA review confined itself, in essence, to the clinical diagnosis of hyperactivity, as did the charge to the committee, rather than asking the broader environmental question of behavioral effects in the general population; it failed to recognize the significance of vulnerable subpopulations; and it misinterpreted the meaning of effect size as a criterion of risk. The FDA\u2019s response would have benefited from adopting the viewpoints and perspectives common to environmental health research. At the same time, the food color debate offers a lesson to environmental health researchers; namely, too narrow a focus on a single outcome or criterion can be misleading.", "Toxicology of food dyes. BACKGROUND: Food dyes, synthesized originally from coal tar and now petroleum, have long been controversial because of safety concerns. Many dyes have been banned because of their adverse effects on laboratory animals or inadequate testing. CONCLUSIONS: This review finds that all of the nine currently US-approved dyes raise health concerns of varying degrees. Red 3 causes cancer in animals, and there is evidence that several other dyes also are carcinogenic. Three dyes (Red 40, Yellow 5, and Yellow 6) have been found to be contaminated with benzidine or other carcinogens. At least four dyes (Blue 1, Red 40, Yellow 5, and Yellow 6) cause hypersensitivity reactions. Numerous microbiological and rodent studies of Yellow 5 were positive for genotoxicity. Toxicity tests on two dyes (Citrus Red 2 and Orange B) also suggest safety concerns, but Citrus Red 2 is used at low levels and only on some Florida oranges and Orange B has not been used for several years. The inadequacy of much of the testing and the evidence for carcinogenicity, genotoxicity, and hypersensitivity, coupled with the fact that dyes do not improve the safety or nutritional quality of foods, indicates that all of the currently used dyes should be removed from the food supply and replaced, if at all, by safer colorings. It is recommended that regulatory authorities require better and independent toxicity testing, exercise greater caution regarding continued approval of these dyes, and in the future approve only well-tested, safe dyes.", "Anaphylaxis to annatto dye: a case report. Annatto dye is an orange-yellow food coloring extracted from the seeds of the tree Bixa orellana. It is commonly used in cheeses, snack foods, beverages, and cereals. Previously reported adverse reactions associated with annatto dye have included urticaria and angioedema. We present a patient who developed urticaria, angioedema, and severe hypotension within 20 minutes following ingestion of milk and Fiber One cereal, which contained annatto dye. Subsequent skin tests to milk, wheat, and corn were negative. The patient had a strong positive skin test to annatto dye, while controls had no response. The nondialyzable fraction of annatto dye on SDS-PAGE demonstrated two protein staining bands in the range of 50 kD. Immunoblotting demonstrated patient IgE-specific for one of these bands, while controls showed no binding. Annatto dye may contain contaminating or residual seed proteins to which our patient developed IgE hypersensitivity. Annatto dye is a potential rare cause of anaphylaxis."], ["TRP channel blamed for burning cold after a tropical fish meal EMBO J (2012) 31 19, 3795\u20133808 doi:10.1038/emboj.2012.207; published online July312012 Ciguatera is one of the most common forms of food poisoning, occurring after consumption of fish contaminated with ciguatoxins. New work by Vetter et al (2012) reveals the key molecular players that underlie the altered temperature sensation associated with ciguatera. In particular, they show that ciguatoxins act on sensory neurons that express TRPA1, an ion channel implicated in the detection of noxious cold.", "Hesperidin Displays Relevant Role in the Nutrigenomic Effect of Orange Juice on Blood Leukocytes in Human Volunteers: A Randomized Controlled Cross-Over Study Background We previously showed, in healthy, middle-aged, moderately overweight men, that orange juice decreases diastolic blood pressure and significantly improves postprandial microvascular endothelial reactivity and that hesperidin could be causally linked to the observed beneficial effect of orange juice. The objective was to determine the effect of chronic consumption of orange juice on the gene expression profile of leukocytes in healthy volunteers and to assess to what extent hesperidin is involved in the effect of orange juice. Methodology/Principal Findings Volunteers were included in a randomized, controlled, crossover study. Throughout three 4-week periods, volunteers consumed daily: 500 ml orange juice, 500 ml control drink plus hesperidin or 500 ml control drink and placebo. Blood samplings were performed on 10 overnight-fasted subjects after the 4-week treatment period. Global gene expression profiles were determined using human whole genome cDNA microarrays. Both orange juice and hesperidin consumption significantly affected leukocyte gene expression. Orange juice consumption induced changes in expression of, 3,422 genes, while hesperidin intake modulated the expression of 1,819 genes. Between the orange juice and hesperidin consumption groups, 1,582 regulated genes were in common. Many of these genes are implicated in chemotaxis, adhesion, infiltration and lipid transport, which is suggestive of lower recruitment and infiltration of circulating cells to vascular wall and lower lipid accumulation. Conclusions This study shows that regular consumption of orange juice for 4 weeks alters leukocyte gene expression to an anti-inflammatory and anti-atherogenic profile, and hesperidin displays a relevant role in the genomic effect of this beverage. Trial Registration ClinicalTrials.gov NCT 00983086", "Ambient odor of orange in a dental office reduces anxiety and improves mood in female patients. Essential oils have been used as remedies for a long time in different cultures across the world. However, scientific proof of such application is scarce. We included 72 patients between the ages of 22 and 57 while waiting for dental treatment in our study. The participants were assigned to either a control group (14 men, 23 women) or to an odor group (18 men and 17 women). Ambient odor of orange was diffused in the waiting room through an electrical dispenser in the odor group whereas in the control group no odor was in the air. We assessed by means of self-report demographic and cognitive variables, trait and state anxiety, and current pain, mood, alertness, and calmness. In this study, we report that exposure to ambient odor of orange has a relaxant effect. Specifically, compared to the controls, women who were exposed to orange odor had a lower level of state anxiety, a more positive mood, and a higher level of calmness. Our data support the previous notion of sedative properties of the natural essential oil of orange (Citrus sinensis).", "Controlling for sugar and ascorbic acid, a mixture of flavonoids matching navel oranges significantly increases human postprandial serum antioxidan... Fruit and vegetable consumption reduces the risk for cardiovascular disease development. The postprandial state is an important contributor to chronic disease development. Orange flavonoids may reduce postprandial oxidation. It was hypothesized that a mixture of orange flavonoids would reduce postprandial oxidation better than a single orange flavonoid or orange sugar and ascorbic acid, but not as well as orange juice, when consumed with a typical breakfast. A placebo-controlled crossover trial (16 male and female participants, 4 treatments, 4 visits) was carried out. Treatments were placebo (ascorbic acid and sugar equivalent to orange juice); placebo plus hesperidin; placebo plus hesperidin, luteolin, and naringenin (mixture; found to have synergistic antioxidant properties in vitro in previous work); and orange juice (positive control). Serum oxygen radical absorbance capacity (ORAC), total plasma phenolics (TP), and serum lipoprotein oxidation (LO) were measured after a 12-hour baseline fast and at 1, 2, and 3 hours after sample consumption. The placebo plus mixture and orange juice groups were significantly increased in ORAC and LO lag time. Data for TP were inconsistent with ORAC and LO. Contrary to previous studies attributing the protective postprandial effect to fructose and ascorbate in other fruit trials, orange phenolic compounds contribute directly to the postprandial oxidative protection of serum, despite an inconsistent change in serum TP. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Strawberry fields forever? On the basis of copious preclinical data supporting the preventive efficacy of small fruits such as berries and grapes, Chen and colleagues conducted a randomized (noncomparative) phase II trial evaluating two doses of strawberry powder (60 g/d or 30 g/d for six months) to prevent esophageal cancer in China (reported in this issue of the journal, beginning on page 41); 60 g/d reduced the histologic grade of dysplastic lesions and reduced localized biomarkers, whereas 30 g/d was not effective. Fundamental questions remain such as the best formulation of strawberry powder, the active components associated with powder, and the actual mechanism of action, and standardized preparations will be required to permit the widespread use of strawberry powder with a predicable outcome. Clearly, however, this work is a good example of proof-of-principle and highlights the important role of diet, nutrition, and natural products in cancer prevention. \u00a92012 AACR."], ["Targeting methionine auxotrophy in cancer: discovery & exploration. INTRODUCTION: Amino acid auxotrophy or the metabolic defect which renders cancer incapable of surviving under amino acid depleted conditions is being exploited and explored as a therapeutic against cancer. Early clinical data on asparagine- and arginine-depleting drugs have demonstrated low toxicity and efficacy in melanoma, hepatocellular carcinoma and acute lymphoblastic leukemia. Methionine auxotrophy is a novel niche currently under exploration for targeting certain cancers. AREAS COVERED: In this review we explore the discovery of methionine auxotrophy followed by in vitro, in vivo and patient data on targeting cancer with methionine depletion. We end with a small discussion on bioengineering, pegylation and red blood cell encapsulation as mechanisms for decreasing immunogenicity of methionine-depleting drugs. We hope to provide a platform for future pharmacology, toxicology and cytotoxicity studies with methionine depletion therapy and drugs. EXPERT OPINION: Although methionine auxotrophy seems as a viable target, extensive research addressing normal versus cancer cell toxicity needs to be conducted. Further research also needs to be conducted into the molecular mechanism associated with methionine depletion therapy. Finally, novel methods need to be developed to decrease the immunogenicity of methionine-depleting drugs, a current issue with protein therapeutics.", "Methionine dependency and cancer treatment. Conventional chemotherapies have showed their limits, notably for patients with advanced cancer. New therapeutic strategies must be identified, and the metabolic abnormalities of cancer cells offer such opportunities. Many human cancer cell lines and primary tumors have absolute requirements for methionine, an essential amino acid. In contrast, normal cells are relatively resistant to exogenous methionine restriction. The biochemical mechanism for methionine dependency has been studied extensively, but the fundamental mechanism remains unclear. A number of investigators have attempted to exploit the methionine dependence of tumors for therapeutic effects in vivo. To reduce in vivo methionine in plasma and tumours, dietary and pharmacological treatments have been used. Methionine-free diet or methionine-deprived total parenteral nutrition causes regression of a variety of animal tumours. Alternatively, methionine depletion was achieved by the use of methioninase. This enzyme specifically degrades methionine and inhibits tumour growth in preclinical models. Because of potential toxicity and quality of life problems, prolonged methionine restriction with diet or with methioninase is not suitable for clinical use. Methionine restriction may find greater application in association with various chemotherapeutic agents. Several preclinical studies have demonstrated synergy between methionine restriction and various cytotoxic chemotherapy drugs. The experimental results accumulated during the last three decades suggest that methionine restriction can become an additional cancer therapeutic strategy, notably in association with chemotherapy.", "Amino acid sensing mechanisms: an Achilles heel in cancer? The act of increasing mass, either in non-dividing cells or in dividing cells seeking to provide new material for daughter cells, depends upon the continued presence of extracellular nutrients in order to conserve mass. For amino acid nutrients, it appears that their insufficiency for new protein synthesis is actively monitored by both prokaryotic and eukaryotic cells, eliciting appropriate cellular responses that may depend not only on bulk nutrient supply, but also on the abundance of specific amino acids. \u00a9 2012 The Author Journal compilation \u00a9 2012 FEBS.", "Expression of the biochemical defect of methionine dependence in fresh patient tumors in primary histoculture. Methionine dependence is a metabolic defect that occurs in many human tumor cell lines but not normal in unestablished cell strains. Methionine-dependent tumor cell lines are unable to proliferate and arrest in the late S/G2 phase of the cell cycle when methionine is replaced by its immediate precursor homocysteine in the culture medium (MET-HCY+ medium). However, it is not known whether methionine dependence occurs in fresh patient tumors as it does in cell lines. In order to determine whether methionine dependence occurs in fresh patient tumors as well as whether methionine dependence occurs in fresh patient tumors as well as in cell lines we took advantage of the technique of sponge-gel-supported histoculture to grow tumors directly from surgery. We then measured nuclear DNA content by image analysis to determine the cell cycle position in MET-HCY+ compared to MET+HCY- medium in 21 human patient tumors. Human tumor cell lines found to be methionine dependent by cell count were used as positive controls and were found to have marked reduction of cells in G1 compared to total cells in the cell cycle in MET-HCY+ medium with respect to the G1: total cell ratio in MET+HCY- medium. Therefore late cell cycle arrest was used as a marker of methionine dependence for histocultured patient tumors. We found that 5 human tumors of 21, including tumors of the colon, breast, ovary, prostate, and a melanoma, were methionine dependent based on cell cycle analysis. These data on fresh human tumors indicate that methionine dependence may frequently occur in the cancer patient population. Implications for potential therapy based on methionine dependence are discussed.", "The flip side of immune surveillance: immune dependency. The growths of many and perhaps all tumors may be stimulated rather than inhibited by a quantitatively low level of immunity. The reason tumors have antigens may be that tumors do not develop in vivo in the absence of at least a minimal immune reaction; in this sense, cancer may be considered an autoimmune disease. This review, based largely on the work of our own laboratory, outlines the data showing that the titration of anti-tumor immunity exhibits the phenomenon of hormesis, i.e. the dose-response curve is non-linear such that low levels of immunity are generally stimulatory but larger quantities of the same immune reactants may inhibit tumor growth. Evidence is also reviewed that suggests that the immune response may vary qualitatively and quantitatively during progression, such that there seems to be, during oncogenesis, a very low level of immune reaction that aids initial tumor growth, followed by a larger reaction that may cause remission of early neoplasms, followed, if the neoplasm survives, by a relative immunologic tolerance to the tumor that may be dependent, at least in part, on suppressor cells. This knowledge may help to explain some clinical observations concerning the relationships among tumor types and the organ distribution of metastases."], ["Update on the biological effects of ionizing radiation, relative dose factors and radiation hygiene. Diagnostic imaging is an indispensable part of contemporary medical and dental practice. Over the last few decades there has been a dramatic increase in the use of ionizing radiation for diagnostic imaging. The carcinogenic effects of high-dose exposure are well known. Does diagnostic radiation rarely cause cancer? We don't know but we should act as if it does. Accordingly, dentists should select patients wisely - only make radiographs when there is patient-specific reason to believe there is a reasonable expectation the radiograph will offer unique information influencing diagnosis or treatment. Low-dose examinations should be made: intraoral imaging - use fast film or digital sensors, thyroid collars, rectangular collimation; panoramic and lateral cephalometric imaging - use digital systems or rare-earth film screen combinations; and cone beam computed tomography - use low-dose machines, restrict field size to region of interest, reduce mA and length of exposure arc as appropriate. \u00a9 2012 Australian Dental Association.", "The use of dental radiographs: update and recommendations. BACKGROUND AND OVERVIEW: The National Council on Radiation Protection & Measurements updated its recommendations on radiation protection in dentistry in 2003, the Centers for Disease Control and Prevention published its Guidelines for Infection Control in Dental Health-Care Settings in 2003, and the U.S. Food and Drug Administration updated its selection criteria for dental radiographs in 2004. This report summarizes the recommendations presented in these documents and addresses additional topics such as patient selection criteria, film selection for conventional radiographs, collimation, beam filtration, patient protective equipment, film holders, operator protection, film exposure and processing, infection control, quality assurance, image viewing, direct digital radiography and continuing education of dental health care workers who expose radiographs. CONCLUSIONS: This report discusses implementation of proper radiographic practices. In addition to these guidelines, dentists should be aware of, and comply with, applicable federal and state regulations. CLINICAL IMPLICATIONS: Dentists should weigh the benefits of dental radiographs against the consequences of increasing a patient's exposure to radiation and implement appropriate radiation control procedures.", "Do endodontic compounds induce genetic damage? A comprehensive review. Taking into consideration genetic damage plays an important role in carcinogenesis, the purpose of this paper is to provide an overview on the genotoxic potential of some endodontic compounds currently used in dentistry, such as formocresol, paramonochlorophenol, calcium hydroxide, resin-based sealers, phenolic compounds, chlorhexidine, mineral trioxide aggregate, and others. Some of these compounds appear capable of exerting noxious activity on the genetic material. The action mechanisms are discussed. Therefore, this is an area that warrants investigation since the estimation of risk of these substances with respect to genotoxicity will be added to those used for regulatory purposes in improving oral health and preventing oral carcinogenesis.", "Diet, nutrition and the prevention of dental diseases. Oral health is related to diet in many ways, for example, nutritional influences on craniofacial development, oral cancer and oral infectious diseases. Dental diseases impact considerably on self-esteem and quality of life and are expensive to treat. The objective of this paper is to review the evidence for an association between nutrition, diet and dental diseases and to present dietary recommendations for their prevention. Nutrition affects the teeth during development and malnutrition may exacerbate periodontal and oral infectious diseases. However, the most significant effect of nutrition on teeth is the local action of diet in the mouth on the development of dental caries and enamel erosion. Dental erosion is increasing and is associated with dietary acids, a major source of which is soft drinks. Despite improved trends in levels of dental caries in developed countries, dental caries remains prevalent and is increasing in some developing countries undergoing nutrition transition. There is convincing evidence, collectively from human intervention studies, epidemiological studies, animal studies and experimental studies, for an association between the amount and frequency of free sugars intake and dental caries. Although other fermentable carbohydrates may not be totally blameless, epidemiological studies show that consumption of starchy staple foods and fresh fruit are associated with low levels of dental caries. Fluoride reduces caries risk but has not eliminated dental caries and many countries do not have adequate exposure to fluoride. It is important that countries with a low intake of free sugars do not increase intake, as the available evidence shows that when free sugars consumption is <15-20 kg/yr ( approximately 6-10% energy intake), dental caries is low. For countries with high consumption levels it is recommended that national health authorities and decision-makers formulate country-specific and community-specific goals for reducing the amount of free sugars aiming towards the recommended maximum of no more than 10% of energy intake. In addition, the frequency of consumption of foods containing free sugars should be limited to a maximum of 4 times per day. It is the responsibility of national authorities to ensure implementation of feasible fluoride programmes for their country.", "Dietary advice in dental practice. This paper aims to provide dental health professionals with practical advice to pass on to patients about diet and dental health. Sugars are the most important dietary factor contributing to dental caries. Different foods carry different dental health risks; those containing non-milk, extrinsic sugars are potentially the most damaging. In the UK, sugared soft drinks and confectionery contribute approximately 50% to total intake of non-milk extrinsic sugars. Patients should be encouraged to reduce the frequency of intake of sugary foods. Intake of acidic foods and drinks contributes to dental erosion and consumption of such foods should also be limited. Dietary advice to dental patients should be positive and personalized if possible and can be in line with dietary recommendations for general health. These are to increase the consumption of starchy staple foods (eg bread, potatoes and unsweetened cereals), vegetables and fruit and to reduce the consumption of sugary and fatty foods."], ["The impact of meals on a probiotic during transit through a model of the human upper gastrointestinal tract. Commercial literature on various probiotic products suggests that they can be taken before meals, during meals or after meals or even without meals. This has led to serious confusion for the industry and the consumer. The objective of our study was to examine the impact of the time of administration with respect to mealtime and the impact of the buffering capacity of the food on the survival of probiotic microbes during gastrointestinal transit. We used an in vitro Digestive System (IViDiS) model of the upper gastrointestinal tract to examine the survival of a commercial multi-strain probiotic, ProtecFlor\u00ae. This product, in a capsule form, contains four different microbes: two lactobacilli (Lactobacillus helveticus R0052 and Lactobacillus rhamnosus R0011), Bifidobacterium longum R0175 and Saccharomyces cerevisiae boulardii. Enumeration during and after transit of the stomach and duodenal models showed that survival of all the bacteria in the product was best when given with a meal or 30 minutes before a meal (cooked oatmeal with milk). Probiotics given 30 minutes after the meal did not survive in high numbers. Survival in milk with 1% milk fat and oatmeal-milk gruel were significantly better than apple juice or spring water. S. boulardii was not affected by time of meal or the buffering capacity of the meal. The protein content of the meal was probably not as important for the survival of the bacteria as the fat content. We conclude that ideally, non-enteric coated bacterial probiotic products should be taken with or just prior to a meal containing some fats.", "Dose-response efficacy of a proprietary probiotic formula of Lactobacillus acidophilus CL1285 and Lactobacillus casei LBC80R for antibiotic-associa... OBJECTIVES: Standard therapies for antibiotic-associated diarrhea (AAD) and Clostridium difficile-associated diarrhea (CDAD) have limited efficacy. Probiotic prophylaxis is a promising alternative for reduction of AAD and CDAD incidence. METHODS: In this single-center, randomized, double-blind, placebo-controlled dose-ranging study, we randomized 255 adult inpatients to one of three groups: two probiotic capsules per day (Pro-2, n=86), one probiotic capsule and one placebo capsule per day (Pro-1, n=85), or two placebo capsules per day (n=84). Each probiotic capsule contained 50 billion c.f.u. of live organisms (Lactobacillus acidophilus CL1285 +Lactobacillus casei LBC80R Bio-K+ CL1285). Probiotic prophylaxis began within 36 h of initial antibiotic administration, continued for 5 days after the last antibiotic dose, and patients were followed for an additional 21 days. RESULTS: Pro-2 (15.5%) had a lower AAD incidence vs. Pro-1 (28.2%). Each probiotic group had a lower AAD incidence vs. placebo (44.1%). In patients who acquired AAD, Pro-2 (2.8 days) and Pro-1 (4.1 days) had shorter symptom duration vs. placebo (6.4 days). Similarly, Pro-2 (1.2%) had a lower CDAD incidence vs. Pro-1 (9.4%). Each treatment group had a lower CDAD incidence vs. placebo (23.8%). Gastrointestinal symptoms were less common in the treatment groups vs. placebo and in Pro-2 vs. Pro-1. CONCLUSIONS: The proprietary probiotic blend used in this study was well tolerated and effective for reducing risk of AAD and, in particular, CDAD in hospitalized patients on antibiotics. A dose-ranging effect was shown with 100 billion c.f.u., yielding superior outcomes and fewer gastrointestinal events compared to 50 billion c.f.u. (ClinicalTrials.gov number NCT00958308).", "Human gut microbiota and its relationship to health and disease. Probiotics are live microorganisms that confer a health benefit on the host when administered in appropriate amounts. Over 700 randomized, controlled, human studies have been conducted with probiotics thus far, with the results providing strong support for the use of probiotics in the clinical prevention or treatment of gastrointestinal tract disorders and metabolic syndrome. The present review is based on webinar presentations that were developed by the American Gastroenterological Association (AGA) in partnership with the International Scientific Association for Probiotics and Prebiotics (ISAPP) and the North American branch of the International Life Sciences Institute (ILSI North America). The presentations provided gastroenterologists and researchers with fundamental and current scientific information on the influence of gut microbiota on human health and disease, as well as clinical intervention strategies and practical guidelines for the use of probiotics and prebiotics. \u00a9 2011 International Life Sciences Institute.", "Probiotics as prevention and treatment for diarrhea. PURPOSE OF REVIEW: To critically appraise evidence on probiotic use for prevention and treatment of diarrhea in children and adults. RECENT FINDINGS: Several randomized controlled trials and meta-analyses suggested that probiotics are effective in primary and secondary prevention of gastroenteritis and its treatment. Selected Lactobacillus strains had a modest, although significant effect in primary prevention. Saccharomyces boulardii was effective in antibiotic-associated and in Clostridium difficile diarrhea. There is evidence that it might prevent diarrhea in day-care centers. Lactobacillus rhamnosus GG was associated with reduced diarrheal duration and severity, more evident in case of childhood Rotavirus diarrhea. Similar, although weaker, evidence was obtained with S. boulardii. Both strains are included in evidence-based recommendations for gastroenteritis management in children. Data on other Lactobacillus strains are preliminary. Probiotic efficacy was related to cause, early administration and bacterial load, and their mechanisms were associated with antiinfectious action in the intestine or, indirectly, to modulation of innate and adaptive immunity. SUMMARY: Probiotics have gained a role as adjunctive treatment of infantile gastroenteritis together with rehydration. Their efficacy is less convincing in adults, but promising in antibiotic-associated diarrhea. However, evidence of efficacy is limited to a few strains.", "Assessment of psychotropic-like properties of a probiotic formulation (Lactobacillus helveticus R0052 and Bifidobacterium longum R0175) in rats and... In a previous clinical study, a probiotic formulation (PF) consisting of Lactobacillus helveticus R0052 and Bifidobacterium longum R0175 (PF) decreased stress-induced gastrointestinal discomfort. Emerging evidence of a role for gut microbiota on central nervous system functions therefore suggests that oral intake of probiotics may have beneficial consequences on mood and psychological distress. The aim of the present study was to investigate the anxiolytic-like activity of PF in rats, and its possible effects on anxiety, depression, stress and coping strategies in healthy human volunteers. In the preclinical study, rats were daily administered PF for 2 weeks and subsequently tested in the conditioned defensive burying test, a screening model for anti-anxiety agents. In the clinical trial, volunteers participated in a double-blind, placebo-controlled, randomised parallel group study with PF administered for 30\u00a0d and assessed with the Hopkins Symptom Checklist (HSCL-90), the Hospital Anxiety and Depression Scale (HADS), the Perceived Stress Scale, the Coping Checklist (CCL) and 24\u00a0h urinary free cortisol (UFC). Daily subchronic administration of PF significantly reduced anxiety-like behaviour in rats (P\u00a0<\u00a00\u00b705) and alleviated psychological distress in volunteers, as measured particularly by the HSCL-90 scale (global severity index, P\u00a0<\u00a00\u00b705; somatisation, P\u00a0<\u00a00\u00b705; depression, P\u00a0<\u00a00\u00b705; and anger-hostility, P\u00a0<\u00a00\u00b705), the HADS (HADS global score, P\u00a0<\u00a00\u00b705; and HADS-anxiety, P\u00a0<\u00a00\u00b706), and by the CCL (problem solving, P\u00a0<\u00a00\u00b705) and the UFC level (P\u00a0<\u00a00\u00b705). L. helveticus R0052 and B. longum R0175 taken in combination display anxiolytic-like activity in rats and beneficial psychological effects in healthy human volunteers."], ["Epidemiology and pathophysiology of alcohol and breast cancer: Update 2012. AIMS: To update epidemiological data on alcohol and breast cancer, with special emphasis on light alcohol consumption, and to review mechanisms of alcohol mediated mammary carcinogenesis. METHODS: For epidemiological data, in November 2011 we performed a literature search in various bibliographic databases, and we conducted a meta-analysis of data on light alcohol drinking. Relevant mechanistic studies were also reviewed to November 2011. RESULTS: A significant increase of the order of 4% in the risk of breast cancer is already present at intakes of up to one alcoholic drink/day. Heavy alcohol consumption, defined as three or more drinks/day, is associated with an increased risk by 40-50%. This translates into up to 5% of breast cancers attributable to alcohol in northern Europe and North America for a total of approximately 50,000 alcohol-attributable cases of breast cancer worldwide. Up to 1-2% of breast cancers in Europe and North America are attributable to light drinking alone, given its larger prevalence in most female populations when compared with heavy drinking. Alcohol increases estrogen levels, and estrogens may exert its carcinogenic effect on breast tissue either via the ER or directly. Other mechanisms may include acetaldehyde, oxidative stress, epigenetic changes due to a disturbed methyl transfer and decreased retinoic acid concentrations associated with an altered cell cycle. CONCLUSIONS: Women should not exceed one drink/day, and women at elevated risk for breast cancer should avoid alcohol or consume alcohol occasionally only.", "Moderate alcohol consumption during adult life, drinking patterns, and breast cancer risk Context Multiple studies have linked alcohol consumption to breast cancer risk, but the risk of lower levels of consumption has not been well quantified. In addition, the role of drinking patterns (i.e. frequency of drinking and \u201cbinge\u201d drinking) and consumption at different times of adult life are not well understood. Objective To evaluate the association of breast cancer with alcohol consumption during adult life, including quantity, frequency, and age at consumption. Design, Setting, and Participants Prospective observational study of 105,986 women enrolled in the Nurses\u2019 Health Study followed from 1980 until 2008 with early adult and eight updated alcohol assessments during this time. Main Outcome Measures Relative risks of developing invasive breast cancer. Results 7690 cases developed during 2.4 million person-years of follow-up. Increasing alcohol consumption was associated with increased breast cancer risk that was statistically significant at levels as low as 5.0-9.9 gm/day, equivalent to 3-6 drinks/week (RR 1.15 (95% CI 1.06-1.24) 332 cases/100,000 person-years). After controlling for cumulative alcohol intake, binge drinking, but not frequency of drinking, was associated with breast cancer risk. Alcohol intake both earlier and later in adult life was independently associated with risk. Conclusion Low levels of alcohol consumption were associated with a small increase in breast cancer risk, with the most consistent measure being cumulative alcohol intake throughout adult life. Alcohol intake both earlier and later in adult life was independently associated with risk.", "Alcohol intake and mortality among women with invasive breast cancer Background: Alcohol intake has consistently been associated with increased breast cancer incidence in epidemiological studies. However, the relation between alcohol and survival after breast cancer diagnosis is less clear. Methods: We investigated whether alcohol intake was associated with survival among 3146 women diagnosed with invasive breast cancer in the Swedish Mammography Cohort. Alcohol consumption was estimated using a food frequency questionnaire. Cox proportional hazard models were used to calculate hazard ratios (HRs) and 95% confidence intervals (95% CIs). Results: From 1987 to 2008 there were 385 breast cancer-specific deaths and 860 total deaths. No significant association was observed between alcohol intake and breast cancer-specific survival. Women who consumed 10\u2009g per day (corresponding to approximately 0.75 to 1 drinks) or more of alcohol had an adjusted HR (95% CI) of breast cancer-specific death of 1.36 (0.82\u20132.26;ptrend=0.47) compared with non-drinkers. A significant inverse association was observed between alcohol and non-breast cancer deaths. Those who consumed 3.4\u20139.9\u2009g per day of alcohol had a 33% lower risk of death compared with non-drinkers (95% CI 0.50\u20130.90;ptrend=0.04). Conclusion: Our findings suggest that alcohol intake up to approximately one small drink per day does not negatively impact breast cancer-specific survival and a half drink per day is associated with a decreased risk of mortality from other causes.", "Alcohol consumption and breast cancer risk in the Women's Health Study. The authors assessed the association between moderate alcohol consumption and breast cancer risk in the Women's Health Study (United States, 1992-2004). During an average of 10 years of follow-up, 1,484 cases of total breast cancer (1,190 invasive and 294 in situ) were documented among 38,454 women who, at baseline, were free of cancer and cardiovascular disease and provided detailed dietary information, including alcohol consumption, for the preceding 12 months. Higher alcohol consumption was associated with a modest increase in breast cancer risk; the multivariable relative risks for > or =30 g/day of alcohol vs. none were 1.32 (95% confidence interval (CI): 0.96, 1.82) for total breast cancer and 1.43 (95% CI: 1.02, 2.02) for invasive breast cancer. An increased risk was limited to estrogen receptor (ER)- and progesterone receptor (PR)-positive tumors; the multivariable relative risks for an increment of 10 g/day of alcohol were 1.11 (95% CI: 1.03, 1.20) for ER+PR+ tumors (804 cases), 1.00 (95% CI: 0.81, 1.24) for ER+PR- tumors (125 cases), and 0.99 (95% CI: 0.82, 1.20) for ER-PR- tumors (167 cases). The association also seemed strongest among those taking postmenopausal hormones currently, but the test for interaction was not significant. The findings from this prospective study suggest that moderate alcohol consumption increases breast cancer risk.", "Light alcohol drinking and cancer: a meta-analysis. BACKGROUND: There is convincing evidence that alcohol consumption increases the risk of cancer of the colorectum, breast, larynx, liver, esophagus, oral cavity and pharynx. Most of the data derive from studies that focused on the effect of moderate/high alcohol intakes, while little is known about light alcohol drinking (up to 1 drink/day). PATIENTS AND METHODS: We evaluated the association between light drinking and cancer of the colorectum, breast, larynx, liver, esophagus, oral cavity and pharynx, through a meta-analytic approach. We searched epidemiological studies using PubMed, ISI Web of Science and EMBASE, published before December 2010. RESULTS: We included 222 articles comprising \u223c92 000 light drinkers and 60 000 non-drinkers with cancer. Light drinking was associated with the risk of oropharyngeal cancer [relative risk, RR = 1.17; 95% confidence interval (CI) 1.06-1.29], esophageal squamous cell carcinoma (SCC) (RR = 1.30; 95% CI 1.09-1.56) and female breast cancer (RR = 1.05; 95% CI 1.02-1.08). We estimated that \u223c5000 deaths from oropharyngeal cancer, 24 000 from esophageal SCC and 5000 from breast cancer were attributable to light drinking in 2004 worldwide. No association was found for colorectum, liver and larynx tumors. CONCLUSIONS: Light drinking increases the risk of cancer of oral cavity and pharynx, esophagus and female breast."], ["Cellulite: nature and aetiopathogenesis. Only a limited number of studies on cellulite have been published in the international literature and many of them reach somewhat antithetical conclusions. Consequently, it is not yet possible to reconcile the extreme differences of opinion which have lingered on for years concerning the nature of this disorder, as well as its origin and even the most basic aspects of its histopathological classification. It does not even have a recognized name: in fact, the term 'cellulitis' is used in scientific English to indicate a spreading gangrenous infection of the subcutaneous cellular tissue. The other terms used from time to time [panniculitis, lipodystrophy, edematofibrosclerotic panniculitis (EFP), liposclerosis, lipoedema, etc.] have quite different morphological and pathogenetic connotations in general. Over the last few decades, three major conflicting theories have emerged in relation to the ethiopathogenesis of cellulite. These indicate, respectively, the following causes: 1. Oedema caused by excessive hydrophilia of the intercellular matrix. 2. A homeostatic alteration on a regional microcirculatory level; this pathogenetic theory is summarized in a synthetic and self-explanatory denomination: EFP. 3. A peculiar anatomical conformation of the subcutaneous tissue of women, different from male morphology. These theories must all now be updated in the light of recent advances on the sophisticated and composite physiopathology of the adipose organ - which acts not only as a control device which regulates the systematic equilibrium of energy and modulates the food intake and the metabolism of other tissue substrate through a multiple glandular secretion of hormones and parahormones.", "In vitro and in vivo efficacy of sulfo-carrabiose, a sugar-based cosmetic ingredient with anti-cellulite properties. Most of adult women exhibit cellulite on the hips, buttock and thighs. Although extracellular matrix and lymphatic system disorders can increase its appearance, cellulite basically results from an excessive fat storage in the adipose tissue which exerts considerable pressure on the surrounding skin tissue and creates a dimpled irregular appearance. Caffeine, the most widely used anti-cellulite ingredient, favours fat break-down by inhibiting the phosphodiesterase enzyme and encouraging a high intracellular level of cAMP. A series of studies has shown that spermine and spermidine, two ubiquitous polyamines, encouraged fat storage and slowed fat break-down in the adipose tissue. Besides, it was shown that heparan sulfate glycosaminoglycans had a strong affinity for polyamines. To design a new cosmetic ingredient with anti-cellulite properties, we used molecular modelling to screen several ingredients with a structure similar to that of heparan sulfate glycosaminoglycans. This way, we identified sulfo-carrabiose as a potent molecule for trapping spermine and spermidine. These virtual results were first confirmed in tubo where sulfo-carrabiose was shown to dose-dependently inactivate spermine and spermidine. In vitro, adipocytes cultured with sulfo-carrabiose exhibited a significant reduction of lipogenesis and a significant increase of lipolysis. When sulfo-carrabiose was incorporated in a cosmetic formula, significant improvements were observed in thigh circumference, with better results than those obtained with caffeine after 28 days of use. Furthermore, a combination of caffeine and sulfo-carrabiose led to results significantly better than those obtained with caffeine alone. As measured by fringe projection, thigh volume was also significantly reduced after sulfo-carrabiose treatment. Finally, the appearance of cellulite assessed by clinical evaluation was also significantly reduced within 28 days. \u00a9 2010 BASF Beauty Care Solutions. ICS \u00a9 2010 Society of Cosmetic Scientists and the Soci\u00e9t\u00e9 Fran\u00e7aise de Cosm\u00e9tologie.", "Association of dietary fat, vegetables and antioxidant micronutrients with skin ageing in Japanese women. Daily diet may have implications for skin ageing. However, data on the relationship between diet and the parameters of skin conditions are scarce. The present study aimed to examine the associations of biophysical properties of the skin of women with intakes of fats and antioxidant micronutrients as well as food groups as sources of these nutrients. In a cross-sectional study, we measured the hydration, surface lipids and elasticity of the skin of 716 Japanese women using non-invasive techniques. The extent of facial wrinkles in the crow's-foot area was determined by observation using the Daniell scale. Each subject's usual diet was determined with the use of a validated FFQ. After controlling for covariates including age, smoking status, BMI and lifetime sun exposure, the results showed that higher intakes of total fat, saturated fat and monounsaturated fat were significantly associated with increased skin elasticity. A higher intake of green and yellow vegetables was significantly associated with a decreased Daniell wrinkling score. Intake of saturated fat was significantly inversely associated with the Daniell wrinkling score after additional adjustment for green and yellow vegetable intake. Further studies with more accurate measurement methods are needed to investigate the role of daily diet in skin ageing.", "Effect of a low-fat high-carbohydrate diet on symptoms of cyclical mastopathy. 21 patients with severe persistent cyclical mastopathy of at least 5 years' duration were randomised to a control group who received general dietary advice or to an intervention group who were taught how to reduce the fat content of their diet to 15% of calories while increasing complex carbohydrate consumption to maintain caloric intake. Both groups were followed for 6 months with food records and measurement of plasma hormone and lipid levels. Severity of symptoms was recorded with daily diaries and patients were assessed at the beginning and end of the study by a physician who was unaware of their dietary regimen. After 6 months there was a significant reduction in the intervention group in the severity of premenstrual breast tenderness and swelling. Physical examination showed reduced breast swelling, tenderness, and nodularity in 6 of 10 patients in the intervention group and 2 of 9 patients in the control group.", "Acne: risk indicator for increased body mass index and insulin resistance. Acne appears to represent a visible indicator disease of over-activated mTORC1 signalling, an unfavour-able metabolic deviation on the road to serious common Western diseases of civilisation associated with increased body mass index and insulin resistance. Exaggerated mTORC1 signalling by Western diet explains the association of acne with increased body mass index, insulin resistance, and early onset of menarche. Both, a high glycaemic load and increased consumption of milk and milk products, staples of Western diet, aggravate mammalian target of rapamycin complex 1 signalling. This review of the literature summarises present evidence for an association between acne, increased body mass index, insulin resistance and Western diet. By dietary intervention with a Palaeolithic-type diet, the dermatologist has the chance to attenuate patients' increased mTORC1 signalling by reducing glycaemic load and milk consumption, which may not only improve acne but may delay the march to more serious mTORC1-driven diseases of civilisation."], ["Randomised clinical trial: dried plums (prunes) vs. psyllium for constipation. BACKGROUND: Treatment of chronic constipation remains challenging with 50% of patients dissatisfied with current therapy. There is an unmet need for natural and safe alternatives. Dried plums (prunes) have been used traditionally for constipation but their efficacy is not known. Aim To assess and compare the effects of dried plums and psyllium in patients with chronic constipation. METHODS: Subjects were enrolled in an 8-week, single-blind, randomised cross-over study. Subjects received either dried plums (50 g b.d., fibre=6 gm/day) or psyllium (11 g b.d., fibre=6 gm/day) for 3 weeks each, in a crossover trial with a 1-week washout period. Subjects maintained a daily symptom and stool diary. Assessments included number of complete spontaneous bowel movements per week, global relief of constipation, stool consistency, straining, tolerability and taste. RESULTS: Forty constipated subjects (m/f=3/37, mean age=38 years) participated. The number of complete spontaneous bowel movements per week (primary outcome measure) and stool consistency scores improved significantly (P<0.05) with dried plums when compared to psyllium. Straining and global constipation symptoms did not differ significantly between treatments (P=N.S.). Dried plums and psyllium were rated as equally palatable and both were safe and well tolerated. CONCLUSION: Dried plums are safe, palatable and more effective than psyllium for the treatment of mild to moderate constipation, and should be considered as a first line therapy. \u00a9 2011 Blackwell Publishing Ltd.", "Prevalence, symptoms and outcome of constipation in infants and toddlers. OBJECTIVE: To determine the prevalence of constipation in children 10% titanium by weight. While some other cr\u00e8mes contained titanium, despite being colored white, most shampoos, deodorants, and shaving creams contained the lowest levels of titanium (<0.01 \u03bcg/mg). For several high-consumption pharmaceuticals, the titanium content ranged from below the instrument detection limit (0.0001 \u03bcg Ti/mg) to a high of 0.014 \u03bcg Ti/mg. Electron microscopy and stability testing of food-grade TiO2 (E171) suggests that approximately 36% of the particles are less than 100 nm in at least one dimension and that it readily disperses in water as fairly stable colloids. However, filtration of water solubilized consumer products and personal care products indicated that less than 5% of the titanium was able to pass through 0.45 or 0.7 \u03bcm pores. Two white paints contained 110 \u03bcg Ti/mg while three sealants (i.e., prime coat paint) contained less titanium (25 to 40 \u03bcg Ti/mg). This research showed that while many white-colored products contained titanium, it was not a prerequisite. Although several of these product classes contained low amounts of titanium, their widespread use and disposal down the drain and eventually to WWTPs deserves attention. A Monte Carlo human exposure analysis to TiO2 through foods identified children as having the highest exposures because TiO2 content of sweets is higher than other food products, and that a typical exposure for a US adult may be on the order of 1 mg Ti per kilogram body weight per day. Thus, because of the millions of tons of titanium based white pigment used annually, testing should focus on food-grade TiO2 (E171) rather than that adopted in many environmental health and safety tests (i.e., P25), which is used in much lower amounts in products less likely to enter the environment (e.g., catalyst supports, photocatalytic coatings).", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "Fish consumption, methylmercury and child neurodevelopment Purpose of review To summarize recent evidence regarding associations of early life exposure to mercury from maternal fish consumption during pregnancy, thimerosal in vaccines and dental amalgam with child neurodevelopment. Recent findings Recent publications have built upon previous evidence demonstrating mild detrimental neurocognitive effects from prenatal methylmercury exposure from maternal fish consumption during pregnancy. New studies examining the effects of prenatal fish consumption as well as methylmercury suggest there are benefits from prenatal fish consumption, but also that consumption of fish high in mercury should be avoided. Future studies incorporating information on both the methylmercury and the docosahexaenoic acid contained within fish will help to refine recommendations to optimize outcomes for mothers and children. Additional recent studies have supported the safety of vaccines containing thimerosal and of dental amalgam for repair of dental caries in children. Summary Exposure to mercury may harm child development. Interventions intended to reduce exposure to low levels of mercury in early life must, however, be carefully evaluated in consideration of the potential attendant harm from resultant behavior changes, such as reduced docosahexaenoic acid exposure from lower seafood intake, reduced uptake of childhood vaccinations and suboptimal dental care.", "Reducing the staggering costs of environmental disease in children, estimated at $76.6 billion in 2008. A 2002 analysis documented $54.9 billion in annual costs of environmentally mediated diseases in US children. However, few important changes in federal policy have been implemented to prevent exposures to toxic chemicals. We therefore updated and expanded the previous analysis and found that the costs of lead poisoning, prenatal methylmercury exposure, childhood cancer, asthma, intellectual disability, autism, and attention deficit hyperactivity disorder were $76.6 billion in 2008. To prevent further increases in these costs, efforts are needed to institute premarket testing of new chemicals; conduct toxicity testing on chemicals already in use; reduce lead-based paint hazards; and curb mercury emissions from coal-fired power plants.", "Update on the biological effects of ionizing radiation, relative dose factors and radiation hygiene. Diagnostic imaging is an indispensable part of contemporary medical and dental practice. Over the last few decades there has been a dramatic increase in the use of ionizing radiation for diagnostic imaging. The carcinogenic effects of high-dose exposure are well known. Does diagnostic radiation rarely cause cancer? We don't know but we should act as if it does. Accordingly, dentists should select patients wisely - only make radiographs when there is patient-specific reason to believe there is a reasonable expectation the radiograph will offer unique information influencing diagnosis or treatment. Low-dose examinations should be made: intraoral imaging - use fast film or digital sensors, thyroid collars, rectangular collimation; panoramic and lateral cephalometric imaging - use digital systems or rare-earth film screen combinations; and cone beam computed tomography - use low-dose machines, restrict field size to region of interest, reduce mA and length of exposure arc as appropriate. \u00a9 2012 Australian Dental Association."], ["Heterocyclic amines: Mutagens/carcinogens produced during cooking of meat and fish. Research leading to the discovery of a series of mutagenic and carcinogenic heterocyclic amines (HCAs) was inspired by the idea that smoke produced during cooking of food, especially meat or fish, might be carcinogenic. More than ten kinds of HCAs, actually produced by cooking or heating of meat or fish, have now been isolated and their structures determined, most being previously unregistered compounds. They are highly mutagenic towards Salmonella typhimurium in the presence of S9 mix and are also mutagenic in vitro and in vivo toward mammalian cells. HCAs have now been chemically synthesized in quantity and subjected to long-term animal testing. When HCAs were fed in the diet, rodents developed cancers in many organs, including the colon, breast and prostate, and one HCA produced hepatomas in monkeys. The lesions exhibited alteration in genes including Apc, beta-catenin and Ha-ras, and these changes provide clues to the induction mechanisms. The HCAs are oxidized to hydroxyamino derivatives by cytochrome P450s, and further converted to ester forms by acetyltransferase and sulfotransferase. Eventually, they produce DNA adducts through the formation of N-C bonds at guanine bases. There are HCA-sensitive and resistant strains of rodents and a search for the responsible genes is now under way. While the content of HCAs in dishes consumed in ordinary life is low and not sufficient in itself to explain human cancer, the coexistence of many other mutagens/carcinogens of either autobiotic or xenobiotic type and the possibility that HCAs induce genomic instability and heightened sensitivity to tumor promoters suggest that avoidance of exposure to HCAs or reduction of HCAs' biological effects as far as possible are to be highly recommended. Usage of microwave ovens for cooking and supplementation of the diet, for example with soy-isoflavones, which have been found to suppress the occurrence of HCA-induced breast cancers, should be encouraged. Advice to the general public about how to reduce the carcinogenic load imposed by HCAs would be an important contribution to cancer prevention.", "Formation and biochemistry of carcinogenic heterocyclic aromatic amines in cooked meats. Heteroyclic aromatic amines (HAAs) are a class of hazardous chemicals that are receiving heightened attention as a risk factor for human cancer. HAAs arise during the cooking of meats, fish, and poultry, and several HAAs also occur in tobacco smoke condensate and diesel exhaust. Many HAAs are carcinogenic and induce tumors at multiple sites in rodents. A number of epidemiologic studies have reported that frequent consumption of well-done cooked meats containing HAAs can result in elevated risks for colon, prostate, and mammary cancers. Moreover, DNA adducts of HAAs have been detected in human tissues, demonstrating that HAAs induce genetic damage even though the concentrations of these compounds in cooked meats are generally in the low parts-per-billion (ppb) range. With recent improvements in sensitivity of mass spectrometry instrumentation, HAAs, their metabolites, and DNA adducts can be detected at trace amounts in biological fluids and tissues of humans. The incorporation of HAA biomarkers in epidemologic studies will help to clarify the role of these dietary genotoxicants in the etiology of human cancer.", "Occurrence of heterocyclic amines in cooked meat products. Heterocyclic amines (HCAs), potent mutagens and a risk factor for human cancers, are produced in meats cooked at high temperature. The aim of this study was to determine the HCA content in cooked meat products (beef, chicken, pork, fish) prepared by various cooking methods (pan frying, oven broiling, and oven baking at 170 to 230\u00b0C) that are preferred by U.S. meat consumers. The primary HCAs in these samples were PhIP (2-amino-1-methyl-6-phenylimidazo [4,5-b]pyridine) (1.49-10.89ng/g), MeIQx (2-amino-3,8-dimethylimidazo [4,5-f]quinoxaline) (not detected-4.0ng/g), and DiMeIQx (2-amino-3,4,8-trimethyl-imidazo [4,5-f]quinoxaline) (not detected-3.57ng/g). Type and content of HCAs in cooked meat samples were highly dependent on cooking conditions. The total HCA content in well-done meat was 3.5 times higher than that of medium-rare meat. Fried pork (13.91ng/g) had higher levels of total HCAs than fried beef (8.92ng/g) and fried chicken (7.00ng/g). Among the samples, fried bacon contained the highest total HCA content (17.59ng/g). Copyright \u00a9 2011 Elsevier Ltd. All rights reserved.", "Red meat and colon cancer: should we become vegetarians, or can we make meat safer? The effect of meat consumption on cancer risk is a controversial issue. However, recent meta-analyses show that high consumers of cured meats and red meat are at increased risk of colorectal cancer. This increase is significant but modest (20-30%). Current WCRF-AICR recommendations are to eat no more than 500 g per week of red meat, and to avoid processed meat. Moreover, our studies show that beef meat and cured pork meat promote colon carcinogenesis in rats. The major promoter in meat is heme iron, via N-nitrosation or fat peroxidation. Dietary additives can suppress the toxic effects of heme iron. For instance, promotion of colon carcinogenesis in rats by cooked, nitrite-treated and oxidized high-heme cured meat was suppressed by dietary calcium and by \u03b1-tocopherol, and a study in volunteers supported these protective effects in humans. These additives, and others still under study, could provide an acceptable way to prevent colorectal cancer. Copyright \u00a9 2011 Elsevier B.V. All rights reserved.", "Processed meat and colorectal cancer: a review of epidemiologic and experimental evidence Processed meat intake may be involved in the etiology of colorectal cancer, a major cause of death in affluent countries. The epidemiologic studies published to date conclude that the excess risk in the highest category of processed meat-eaters is comprised between 20 and 50% compared with non-eaters. In addition, the excess risk per gram of intake is clearly higher than that of fresh red meat. Several hypotheses, which are mainly based on studies carried out on red meat, may explain why processed meat intake is linked to cancer risk. Those that have been tested experimentally are (i) that high-fat diets could promote carcinogenesis via insulin resistance or fecal bile acids; (ii) that cooking meat at a high temperature forms carcinogenic heterocyclic amines and polycyclic aromatic hydrocarbons; (iii) that carcinogenic N-nitroso compounds are formed in meat and endogenously; (iv) that heme iron in red meat can promote carcinogenesis because it increases cell proliferation in the mucosa, through lipoperoxidation and/or cytotoxicity of fecal water. Nitrosation might increase the toxicity of heme in cured products. Solving this puzzle is a challenge that would permit to reduce cancer load by changing the processes rather than by banning processed meat."], ["Vegetarian diet ameliorates symptoms of atopic dermatitis through reduction of the number of peripheral eosinophils and of PGE2 synthesis by monocy... Many patients with atopic dermatitis are dissatisfied with conventional treatments based on topical steroids and have experienced some traditional remedies and alternative therapies. However, most of such therapies have not been evaluated scientifically and clinically by specialists. This study was designed to assess whether a certain vegetarian diet might be effective for atopic dermatitis and if so, to identify the mechanisms of this remedy through analyses of immunological parameters. An open-trial study was carried out in twenty patients with atopic dermatitis. An improvement of dermatitis was evaluated by SCORAD index and serological and immunological parameters were monitored. After a two-month treatment, the severity of dermatitis was strikingly inhibited, as assessed by SCORAD index and serological parameters including LDH5 activity and a number of peripheral eosinophils. A sharp reduction in eosinophils and neutrophils was observed prior to improvement in the skin inflammation. In addition, PGE2 production by peripheral blood mononuclear cells was reduced by this treatment. In contrast, serum IgE levels did not change during the same period. Although this study is an open-trial one, it suggests that this treatment may be useful for the treatment of adult patients with severe atopic dermatitis.", "Antioxidants in vegan diet and rheumatic disorders. Plants are rich natural sources of antioxidants in addition to other nutrients. Interventions and cross sectional studies on subjects consuming uncooked vegan diet called living food (LF) have been carried out. We have clarified the efficacy of LF in rheumatoid diseases as an example of a health problem where inflammation is one of the main concerns. LF is an uncooked vegan diet and consists of berries, fruits, vegetables and roots, nuts, germinated seeds and sprouts, i.e. rich sources of carotenoids, vitamins C and E. The subjects eating LF showed highly increased levels of beta and alfa carotenes, lycopen and lutein in their sera. Also the increases of vitamin C and vitamin E (adjusted to cholesterol) were statistically significant. As the berry intake was 3-fold compared to controls the intake of polyphenolic compounds like quercetin, myricetin and kaempherol was much higher than in the omnivorous controls. The LF diet is rich in fibre, substrate of lignan production, and the urinary excretion of polyphenols like enterodiol and enterolactone as well as secoisolaricirecinol were much increased in subjects eating LF. The shift of fibromyalgic subjects to LF resulted in a decrease of their joint stiffness and pain as well as an improvement of their self-experienced health. The rheumatoid arthritis patients eating the LF diet also reported similar positive responses and the objective measures supported this finding. The improvement of rheumatoid arthritis was significantly correlated with the day-to-day fluctuation of subjective symptoms. In conclusion the rheumatoid patients subjectively benefited from the vegan diet rich in antioxidants, lactobacilli and fibre, and this was also seen in objective measures.", "Rheumatoid arthritis treated with vegetarian diets. The notion that dietary factors may influence rheumatoid arthritis (RA) has been a part of the folklore of the disease, but scientific support for this has been sparse. In a controlled, single-blind trial we tested the effect of fasting for 7-10 d, then consuming an individually adjusted, gluten-free, vegan diet for 3.5 mo, and then consuming an individually adjusted lactovegetarian diet for 9 mo on patients with RA. For all clinical variables and most laboratory variables measured, the 27 patients in the fasting and vegetarian diet groups improved significantly compared with the 26 patients in the control group who followed their usual omnivorous diet throughout the study period. One year after the patients completed the trial, they were reexamined. Compared with baseline, the improvements measured were significantly greater in the vegetarians who previously benefited from the diet (diet responders) than in diet nonresponders and omnivores. The beneficial effect could not be explained by patients' psychologic characteristics, antibody activity against food antigens, or changes in concentrations of prostaglandin and leukotriene precursors. However, the fecal flora differed significantly between samples collected at time points at which there was substantial clinical improvement and time points at which there were no or only minor improvements. In summary, the results show that some patients with RA can benefit from a fasting period followed by a vegetarian diet. Thus, dietary treatment may be a valuable adjunct to the ordinary therapeutic armamentarium for RA.", "Upregulation of lymphocyte apoptosis as a strategy for preventing and treating autoimmune disorders: a role for whole-food vegan diets, fish oil an... Induced apoptosis of autoreactive T-lymphocyte precursors in the thymus is crucial for the prevention of autoimmune disorders. IGF-I and prolactin, which are lymphocyte growth factors, may have the potential to suppress apoptosis in thymocytes and thus encourage autoimmunity; conversely, dietary fish oil rich in omega-3 fats appears to upregulate apoptosis in lymphocytes. Since whole-food vegan diets may downregulate systemic IGF-I activity, it is proposed that such a diet, in conjunction with fish oil supplementation and treatment with dopamine agonists capable of suppressing prolactin secretion, may have utility for treating and preventing autoimmune disorders. This prediction is consistent with the extreme rarity of autoimmune disorders among sub-Saharan black Africans as long as they followed their traditional quasi-vegan lifestyles, and with recent ecologic studies correlating risks for IDDM and for multiple sclerosis mortality with animal product and/or saturated fat consumption. Moreover, there is evidence that vegan or quasi-vegan diets are useful in the management of rheumatoid arthritis, multiple sclerosis, and possibly SLE. The dopamine agonist bromocryptine exerts anti-inflammatory effects in rodent models of autoimmunity, and there is preliminary evidence that this drug may be clinically useful in several human autoimmune diseases; better tolerated D2-specific agonists such as cabergoline may prove to be more practical for use in therapy. The moderate clinical utility of supplemental fish oil in rheumatoid arthritis and certain other autoimmune disorders is documented. It is not unlikely that extra-thymic anti-inflammatory effects contribute importantly to the clinical utility of vegan diets, bromocryptine, and fish oil in autoimmunity. The favorable impact of low latitude or high altitude on autoimmune risk may be mediated by superior vitamin D status, which is associated with decreased secretion of parathyroid hormone; there are theoretical grounds for suspecting that parathyroid hormone may inhibit apoptosis in thymocytes. Androgens appear to up-regulate thymocyte apoptosis, may be largely responsible for the relative protection from autoimmunity enjoyed by men, and merit further evaluation for the management of autoimmunity in women. It will probably prove more practical to prevent autoimmune disorders than to reverse them once established; a whole-food vegan diet, coupled with fish oil and vitamin D supplementation, may represent a practical strategy for achieving this prevention, while concurrently lowering risk for many other life-threatening 'Western' diseases. Copyright 2001 Harcourt Publishers Ltd.", "Changes in plasma phospholipid fatty acids and their relationship to disease activity in rheumatoid arthritis patients treated with a vegetarian diet. In a controlled clinical trial we have recently shown that patients with rheumatoid arthritis (RA) improved after fasting for 7-10 d and that the improvement could be sustained through 3.5 months with a vegan diet and 9 months with a lactovegetarian diet. Other studies have indicated that the inflammatory process in RA can be reduced through manipulation of dietary fatty acids. A switch to a vegetarian diet significantly alters the intake of fatty acids. Therefore, we have analysed the changes in fatty acid profiles of the plasma phospholipid fraction and related these changes to disease activity. The concentrations of the fatty acids 20:3n-6 and 20:4n-6 were significantly reduced after 3.5 months with a vegan diet (P < 0.0001 and P < 0.01 respectively), but the concentration increased to baseline values with a lactovegetarian diet. The concentration of 20:5n-3 was significantly reduced after the vegan diet (P < 0.0001) and the lactovegetarian diet periods (P < 0.01). There was no significant difference in fatty acid concentrations between diet responders and diet non-responders after the vegan or lactovegetarian diet periods. Our results indicate that the changes in the fatty acid profiles cannot explain the clinical improvement."], ["Whole-Body Vibration and the Prevention and Treatment of Delayed-Onset Muscle Soreness Context: Numerous recovery strategies have been used in an attempt to minimize the symptoms of delayed-onset muscle soreness (DOMS). Whole-body vibration (WBV) has been suggested as a viable warm-up for athletes. However, scientific evidence to support the protective effects of WBV training (WBVT) on muscle damage is lacking. Objective: To investigate the acute effect of WBVT applied before eccentric exercise in the prevention of DOMS. Design: Randomized controlled trial. Setting: University laboratory. Patients or Other Participants: A total of 32 healthy, untrained volunteers were randomly assigned to either the WBVT (n \u200a=\u200a 15) or control (n \u200a=\u200a 17) group. Intervention(s): Volunteers performed 6 sets of 10 maximal isokinetic (60\u00b0/s) eccentric contractions of the dominant-limb knee extensors on a dynamometer. In the WBVT group, the training was applied using a vibratory platform (35\u00a0Hz, 5\u00a0mm peak to peak) with 100\u00b0 of knee flexion for 60\u00a0seconds before eccentric exercise. No vibration was applied in the control group. Main Outcome Measure(s): Muscle soreness, thigh circumference, and pressure pain threshold were recorded at baseline and at 1, 2, 3, 4, 7, and 14\u00a0days postexercise. Maximal voluntary isometric and isokinetic knee extensor strength were assessed at baseline, immediately after exercise, and at 1, 2, 7, and 14\u00a0days postexercise. Serum creatine kinase was measured at baseline and at 1, 2, and 7\u00a0days postexercise. Results: The WBVT group showed a reduction in DOMS symptoms in the form of less maximal isometric and isokinetic voluntary strength loss, lower creatine kinase levels, and less pressure pain threshold and muscle soreness (P < .05) compared with the control group. However, no effect on thigh circumference was evident (P < .05). Conclusions: Administered before eccentric exercise, WBVT may reduce DOMS via muscle function improvement. Further investigation should be undertaken to ascertain the effectiveness of WBVT in attenuating DOMS in athletes.", "Watermelon juice: potential functional drink for sore muscle relief in athletes. l-Citrulline is an excellent candidate to reduce muscle soreness, and watermelon is a fruit rich in this amino acid. This study investigated the potential of watermelon juice as a functional drink for athletes. An in vitro study of intestinal absorption of l-citrulline in Caco-2 cells was performed using unpasteurized (NW), pasteurized (80 \u00b0C for 40 s) watermelon juice (PW) and, as control, a standard of l-citrulline. l-citrulline bioavailability was greater when it was contained in a matrix of watermelon and when no heat treatment was applied. In the in vivo experiment (maximum effort test in a cycloergometer), seven athletes were supplied with 500 mL of natural watermelon juice (1.17 g of l-citrulline), enriched watermelon juice (4.83 g of l-citrulline plus 1.17 g from watermelon), and placebo. Both watermelon juices helped to reduce the recovery heart rate and muscle soreness after 24 h.", "A program consisting of a phytonutrient-rich medical food and an elimination diet ameliorated fibromyalgia symptoms and promoted toxic-element deto... BACKGROUND: An effective treatment for fibromyalgia (FM) has yet to become available. OBJECTIVE: To assess the efficacy ofa lifestyle program consisting of a modified elimination diet and a supplemental medical food on clinical symptoms of FM assessed by the Fibromyalgia Impact Questionnaire (FIQ), FibroQuest Symptoms Survey (FibroQuest), Medical Symptoms Questionnaire (MSQ), metallothionein mRNA expression, and urinary toxic element excretion. METHODS: Eight women (aged 48-74 years) were enrolled in an 8-week pilot trial employing a sequential design. During the initial 4-week Program A (control), participants consumed a modified US Department of Agriculture food pyramid diet and a rice protein powder supplement that provided basic macronutrient support. During the second 4-week Program B (intervention), participants consumed a modified elimination diet and a phytonutrient-rich medical food. RESULTS: Compared to baseline, both programs showed trends toward lower mean FIQ total score, MSQ total score, and FibroQuest total score, FIQ stiffness score, and FibroQuest headaches score. Compared to Program A, Program B resulted in a significant decrease (P< .05) in the FIQpain score and stiffness score. Participants also had better pain tolerance at five tender points during Program B than during Program A. Higher metallothionein mRNA expression was observed during Program B. An increase in creatinine-adjusted mercury excretion and suggestive increase in creatinine-adjusted arsenic excretion were noted when Program B was compared to baseline. Urinary mercury/arsenic concentrations were inversely associated with FIQand FibroQuest scores. CONCLUSIONS: Program B was shown to be a safe and efficacious botanically derived medical food treatment program for the amelioration of FM symptoms.", "Massage therapy attenuates inflammatory signaling after exercise-induced muscle damage. Massage therapy is commonly used during physical rehabilitation of skeletal muscle to ameliorate pain and promote recovery from injury. Although there is evidence that massage may relieve pain in injured muscle, how massage affects cellular function remains unknown. To assess the effects of massage, we administered either massage therapy or no treatment to separate quadriceps of 11 young male participants after exercise-induced muscle damage. Muscle biopsies were acquired from the quadriceps (vastus lateralis) at baseline, immediately after 10 min of massage treatment, and after a 2.5-hour period of recovery. We found that massage activated the mechanotransduction signaling pathways focal adhesion kinase (FAK) and extracellular signal-regulated kinase 1/2 (ERK1/2), potentiated mitochondrial biogenesis signaling [nuclear peroxisome proliferator-activated receptor \u03b3 coactivator 1\u03b1 (PGC-1\u03b1)], and mitigated the rise in nuclear factor \u03baB (NF\u03baB) (p65) nuclear accumulation caused by exercise-induced muscle trauma. Moreover, despite having no effect on muscle metabolites (glycogen, lactate), massage attenuated the production of the inflammatory cytokines tumor necrosis factor-\u03b1 (TNF-\u03b1) and interleukin-6 (IL-6) and reduced heat shock protein 27 (HSP27) phosphorylation, thereby mitigating cellular stress resulting from myofiber injury. In summary, when administered to skeletal muscle that has been acutely damaged through exercise, massage therapy appears to be clinically beneficial by reducing inflammation and promoting mitochondrial biogenesis.", "Concentrations of antibiotic residues vary between different edible muscle tissues in poultry. Antibiotics are used by veterinarians and producers to treat disease and improve animal production. The federal government, to ensure the safety of the food supply, establishes antibiotic residue tolerances in edible animal tissues and determines the target tissues (e.g., muscle) for residue monitoring. However, when muscle is selected as the target tissue, the federal government does not specify which type of muscle tissue is used for monitoring (e.g., breast versus thigh). If specific muscle tissues incorporate residues at higher concentrations, these tissues should be selected for residue monitoring. To evaluate this possibility in poultry, chickens were divided into four groups and at 33 days of age were dosed with enrofloxacin (Baytril), as per label directions, at either 25 ppm for 3 days, 25 ppm for 7 days, 50 ppm for 3 days, or 50 ppm for 7 days. Breast and thigh muscle tissues were collected from each bird (n = 5 birds per day per group) during the dosing and withdrawal period, and fluoroquinolone concentrations were determined. The results indicate higher overall enrofloxacin concentrations in breast versus thigh muscle for each treatment group (P < 0.05). These data indicate, at least for enrofloxacin, that not all muscle tissues incorporate antibiotics at the same concentrations. These results may be helpful to regulatory agencies as they determine what tissues are to be monitored to ensure that the established residue safety tolerance levels are not exceeded."], ["Nowhere to hide: Chemical toxicants and the unborn child. Contemporary reproductive aged women and their offspring are facing an unprecedented onslaught of toxicant exposures from myriad sources in their day-to-day life. Public health recommendations regarding optimal diet and nutrition in pregnancy must incorporate several considerations including safety of available foodstuffs, cultural practices and lifestyle issues. Gestational consumption of contaminated seafood remains a potential source of toxicant exposure, including mercury, for the developing child. Health care professionals responsible for the care of women and their developing children need to become apprised of: a) risks associated with toxicant bioaccumulation in pregnancy; b) ongoing information emerging in the important field of reproductive toxicology; and c) strategies within the clinical setting to facilitate nutritional sufficiency and precautionary avoidance of adverse exposure among young women.", "Chemical exposure early in life and the neurodevelopment of children--an overview of current epidemiological evidence. A number of chemicals have been shown to demonstrate neurotoxic effects either in human or laboratory animal studies. This article aims at evaluating the impact of exposure to several chemicals including: organophosphate, organochlorine pesticides, polychlorinated biphenyls (PCBs), mercury and lead on the neurodevelopment of children by reviewing the most recent published literature, and answer the question whether any progress has been made in the epidemiology of the neurodevelopment of children induced by exposure to those chemicals. The result of the presented studies show that exposure to the above-mentioned chemicals may impair the neurodevelopment of children. Neonates exposed to organophosphate pesticides demonstrated a higher proportion of abnormal reflexes, and young children had more attention problems. Exposure to organochlorine pesticides in children was associated with alertness, quality of alert responsiveness, cost of attention and other potential attention associated measures. The majority of studies indicate the negative impact of lead exposure at the level <10 \u00b5g/dl or even <5 \u00b5g/dl on the neurodevelopment of children. The results of studies on exposure to PCBs, mercury, and their effect on neurodevelopment are inconsistent. Some suggest that prenatal exposure to PCBs and mercury is related to performance impairments, attention and concentration problems, while other do not present any statistically significant association. The studies were mostly well designed, using prospective cohorts with the exposure assessment based on the biomarker of exposure. Concerning the covariates and confounders affecting the endpoints in most of the presented studies, confounders were included in data analysis. In order to recognize the early cognitive, motor and language outcomes of chemical exposures, well standardized tools were used for evaluating the neurodevelopmental effects and offer an early and fairly comprehensive measure of child development. Because the neurotoxicants may cross the placenta and the fetal brain, exposure consideration regarding the reduction of exposure to those chemicals should be implemented.", "Evidence of effects of environmental chemicals on the endocrine system in children. Pollutant chemicals that are widespread in the environment can affect endocrine signaling, as evidenced in laboratory experiments and in wildlife with relatively high exposures. Although humans are commonly exposed to such pollutant chemicals, the exposures are generally low, and clear effects on endocrine function from such exposures have been difficult to demonstrate. Several instances in which there are data from humans on exposure to the chemical agent and the endocrine outcome are reviewed, including age at weaning, age at puberty, and sex ratio at birth, and the strength of the evidence is discussed. Although endocrine disruption in humans by pollutant chemicals remains largely undemonstrated, the underlying science is sound and the potential for such effects is real.", "Human exposure to endocrine disrupters: carcinogenic risk assessment. Human exposure to endocrine disrupters (EDs) is widespread and is considered to pose a growing threat to human health. Recent advances in molecular and genetic research and better understanding of mechanisms of blastic cell transformation have led to efforts to improve cancer risk assessment for populations exposed to this family of xenobiotics. In risk assessment, low dose extrapolation of cancer incidence data from both experimental animals and epidemiology studies has been largely based on models assuming linear correlation at low doses, despite existence of evidence showing otherwise. Another weakness of ED risk assessment is poor exposure data in ecological studies. Those are frequently rough estimates derived from contaminated items of local food basket surveys. Polyhalogenated hydrocarbons are treated as examples. There is growing sense of urgency to develop a biologically based dose response model of cancer risk, integrating emerging data from molecular biology and epidemiology to provide more realistic data for risk assessors, public, public health managers and environmental issues administrators.", "Mercury exposure and risks from dental amalgam in the US population, post-2000. Dental amalgam is 50% metallic mercury (Hg) by weight and Hg vapour continuously evolves from in-place dental amalgam, causing increased Hg content with increasing amalgam load in urine, faeces, exhaled breath, saliva, blood, and various organs and tissues including the kidney, pituitary gland, liver, and brain. The Hg content also increases with maternal amalgam load in amniotic fluid, placenta, cord blood, meconium, various foetal tissues including liver, kidney and brain, in colostrum and breast milk. Based on 2001 to 2004 population statistics, 181.1 million Americans carry a grand total of 1.46 billion restored teeth. Children as young as 26 months were recorded as having restored teeth. Past dental practice and recently available data indicate that the majority of these restorations are composed of dental amalgam. Employing recent US population-based statistics on body weight and the frequency of dentally restored tooth surfaces, and recent research on the incremental increase in urinary Hg concentration per amalgam-filled tooth surface, estimates of Hg exposure from amalgam fillings were determined for 5 age groups of the US population. Three specific exposure scenarios were considered, each scenario incrementally reducing the number of tooth surfaces assumed to be restored with amalgam. Based on the least conservative of the scenarios evaluated, it was estimated that some 67.2 million Americans would exceed the Hg dose associated with the reference exposure level (REL) of 0.3 \u03bcg/m(3) established by the US Environmental Protection Agency; and 122.3 million Americans would exceed the dose associated with the REL of 0.03 \u03bcg/m(3) established by the California Environmental Protection Agency. Exposure estimates are consistent with previous estimates presented by Health Canada in 1995, and amount to 0.2 to 0.4 \u03bcg/day per amalgam-filled tooth surface, or 0.5 to 1 \u03bcg/day/amalgam-filled tooth, depending on age and other factors. Copyright \u00a9 2011 Elsevier B.V. All rights reserved."], ["Dietary patterns, supplement use, and the risk of benign prostatic hyperplasia. It has long been appreciated that a healthy lifestyle plays a critical role in cardiovascular health. It is now apparent that the same is true in the development of benign prostatic hyperplasia (BPH). Prospective cohort data originating from recently published randomized trials on the medical treatment of BPH and prevention of prostate cancer have been invaluable. A growing body of evidence suggests that exercise and the intake of specific macronutrients and micronutrients through regular diet play a beneficial role. Most strikingly, the magnitude of these effects is similar to medical therapies using alpha-blockers and 5-alpha-reductase inhibitors. The use of supplements for prostate disease is a multibillion dollar business in the United States, and supplements are more commonly prescribed than medical therapy in many countries. In contrast to consumption of micronutrients through regular diet, supplemental intake of micronutrients and phytotherapies currently lack evidence to support their efficacy.", "Effect of diet and exercise intervention on the growth of prostate epithelial cells. Epidemiological studies suggest a positive association between nutrient intake, hyperinsulinemia and risk of Benign prostatic hyperplasis (BPH). This study tests the hypothesis that a low-fat, high-fiber diet and daily exercise would lower serum insulin and reduce the growth of serum-stimulated primary prostate epithelial cells in culture. Serum samples were obtained from eight overweight men before and after the Pritikin residential, 2-week diet and exercise intervention and from seven men who were long-term followers of the low-fat, high-fiber diet and regular exercise lifestyle. The serum was used to stimulate primary prostate epithelial cells in culture. Growth was measured after 48 and 96 h and apoptosis after 96 h. At 48 h there was no significant difference in growth within the Pre, 2-week or Long-Term groups. At 96 h growth was significantly reduced in the 2-week (13%) and in the Long-Term (14%) groups compared to the Pre data. At 96 h, apoptosis was not significantly different among the three groups. Fasting insulin was reduced by 30% in the 2-week group and by 52% in the Long-Term group compared to the Pre data. Testosterone was unchanged in the 2-week group. The results of this study indicate that a low-fat, high-fiber diet and daily exercise lowers insulin and reduces growth of prostate primary epithelial cells and suggests that lifestyle may be an important factor in the development or progression of BPH. Future prospective trials should address the effects of this lifestyle modification on BPH symptomatology and progression.", "Pilot study to explore effects of low-fat, flaxseed-supplemented diet on proliferation of benign prostatic epithelium and prostate-specific antigen. OBJECTIVES: Dietary factors may influence the prostate and have an impact on prostatic growth and disease. A small number of studies have suggested that flaxseed-supplemented, fat-restricted diets may thwart prostate cancer growth in both animals and humans. Unknown, however, is the potential effect of such a diet on benign prostatic epithelium. METHODS: We undertook a pilot study to explore whether a flaxseed-supplemented, fat-restricted diet affects the proliferation rates in benign epithelium. We also explored the effects on circulating levels of prostate-specific antigen (PSA), total testosterone, and cholesterol. Fifteen men who were scheduled to undergo repeat prostate biopsy were instructed to follow a low-fat (less than 20% kcal), flaxseed-supplemented (30 g/day) diet and were provided with a supply of flaxseed to last throughout the 6-month intervention period. The PSA, total testosterone, and cholesterol levels were determined at baseline and at 6 months of follow-up. Reports from the original and repeat biopsies were compared, and proliferation (MIB-1) rates were quantified in the benign prostatic epithelium. RESULTS: Statistically significant decreases in PSA (8.47 +/- 3.82 to 5.72 +/- 3.16 ng/mL; P = 0.0002) and cholesterol (241.1 +/- 30.8 to 213.3 +/- 51.2 mg/dL; P = 0.012) were observed. No statistically significant change was seen in total testosterone (434.5 +/- 143.6 to 428.3 +/- 92.5 ng/dL). Although 6-month repeat biopsies were not performed in 2 cases because of PSA normalization, of the 13 men who underwent repeat biopsy, the proliferation rates in the benign epithelium decreased significantly from 0.022 +/- 0.027 at baseline to 0.007 +/- 0.014 at 6 months of follow-up (P = 0.0168). CONCLUSIONS: These pilot data suggest that a flaxseed-supplemented, fat-restricted diet may affect the biology of the prostate and associated biomarkers. A randomized controlled trial is needed to determine whether flaxseed supplementation, a low-fat diet, or a combination of the two regimens may be of use in controlling overall prostatic growth.", "A dietary intervention for recurrent prostate cancer after definitive primary treatment: results of a randomized pilot trial. OBJECTIVES: Considerable evidence has shown that diet can affect both the incidence and the progression of prostate cancer. The objective of this study was to determine whether men in this situation could make a change to a diet emphasizing plant-based foods and fish and to examine the effect on quality of life (QOL) and prostate-specific antigen (PSA) velocity. METHODS: A total of 36 men and their partners were randomly assigned to attend a series of 11 dietary and cooking classes that also integrated mindfulness practice as a support in making the change or a wait-list control group. Assessments were made of dietary intake, QOL, and PSA at baseline, after intervention (11 weeks), and 3 months after intervention. RESULTS: The intervention group showed significant reductions in the consumption of saturated fat and increased consumption of vegetable proteins with accompanying reductions in animal proteins, including dairy products. They also showed increased QOL. Although no significant change was found in the rate of PSA increase between the two groups, the mean PSA doubling time for the intervention group was substantially longer at the 3-month follow-up visit than that of the controls. CONCLUSIONS: Men with a increasing PSA level after primary treatment were able to make a change to a prostate-healthy diet, accompanied by increases in QOL. No significant difference was found in the log PSA slope between the two groups; however, the PSA doubling time increased substantially in the intervention group compared with that in the controls. Future trials should examine the effect of the prostate-healthy diet with a larger sample of men for a longer period.", "Intensive lifestyle changes may affect the progression of prostate cancer. PURPOSE: Men with prostate cancer are often advised to make changes in diet and lifestyle, although the impact of these changes has not been well documented. Therefore, we evaluated the effects of comprehensive lifestyle changes on prostate specific antigen (PSA), treatment trends and serum stimulated LNCaP cell growth in men with early, biopsy proven prostate cancer after 1 year. MATERIALS AND METHODS: Patient recruitment was limited to men who had chosen not to undergo any conventional treatment, which provided an unusual opportunity to have a nonintervention randomized control group to avoid the confounding effects of interventions such as radiation, surgery or androgen deprivation therapy. A total of 93 volunteers with serum PSA 4 to 10 ng/ml and cancer Gleason scores less than 7 were randomly assigned to an experimental group that was asked to make comprehensive lifestyle changes or to a usual care control group. RESULTS: None of the experimental group patients but 6 control patients underwent conventional treatment due to an increase in PSA and/or progression of disease on magnetic resonance imaging. PSA decreased 4% in the experimental group but increased 6% in the control group (p = 0.016). The growth of LNCaP prostate cancer cells (American Type Culture Collection, Manassas, Virginia) was inhibited almost 8 times more by serum from the experimental than from the control group (70% vs 9%, p <0.001). Changes in serum PSA and also in LNCaP cell growth were significantly associated with the degree of change in diet and lifestyle. CONCLUSIONS: Intensive lifestyle changes may affect the progression of early, low grade prostate cancer in men. Further studies and longer term followup are warranted."], ["The Effects of Phytosterols Present in Natural Food Matrices on Cholesterol Metabolism and LDL-Cholesterol: A Controlled Feeding Trial Background/Objectives Extrinsic phytosterols supplemented to the diet reduce intestinal cholesterol absorption and plasma LDL-cholesterol. However, little is known about their effects on cholesterol metabolism when given in native, unpurified form and in amounts achievable in the diet. The objective of this investigation was to test the hypothesis that intrinsic phytosterols present in unmodified foods alter whole-body cholesterol metabolism. Subjects/Methods Twenty out of 24 subjects completed a randomized, crossover feeding trial where all meals were provided by a metabolic kitchen. Each subject consumed two diets for 4 weeks each. The diets differed in phytosterol content (phytosterol-poor diet, 126 mg phytosterols/2000 kcal; phytosterol-abundant diet, 449 mg/2000 kcal) but were otherwise matched for nutrient content. Cholesterol absorption and excretion were determined by gas chromatograph/mass spectrometry after oral administration of stable isotopic tracers. Results The phytosterol-abundant diet resulted in lower cholesterol absorption [54.2 \u00b1 2.2 % (95% confidence interval, 50.5%, 57.9%) vs. 73.2 \u00b1 1.3% (69.5%, 76.9%), P<0.0001] and 79% higher fecal cholesterol excretion [1322 \u00b1 112 (1083.2, 1483.3) vs. 739 \u00b1 97 mg/day (530.1, 930.2), P<0.0001] relative to the phytosterol-poor diet. Plasma lathosterol/cholesterol ratio rose 82% [from 0.71 \u00b1 0.11 (0.41, 0.96) to 1.29 \u00b1 0.14 \u03bcg/mg (0.98, 1.53), (P<0.0001)]. LDL-cholesterol was similar between diets. Conclusions Intrinsic phytosterols at levels present in a healthy diet are biologically active and have large effects on whole body cholesterol metabolism not reflected in circulating LDL. More work is needed to assess the effects of phytosterol-mediated fecal cholesterol excretion on coronary heart disease risk in humans.", "Phytosterol composition of nuts and seeds commonly consumed in the United States. Phytosterols were quantified in nuts and seeds commonly consumed in the United States. Total lipid extracts were subjected to acid hydrolysis and then alkaline saponfication, and free sterols were analyzed as trimethylsilyl derivatives by capillary GC-FID and GC-MS. Delta5-Avenasterol was quantified after alkaline saponification plus direct analysis of the glucoside. Sesame seed and wheat germ had the highest total phytosterol content (400-413 mg/100 g) and Brazil nuts the lowest (95 mg/100 g). Of the products typically consumed as snack foods, pistachio and sunflower kernel were richest in phytosterols (270-289 mg/100 g). beta-Sitosterol, Delta5-avenasterol, and campesterol were predominant. Campestanol ranged from 1.0 to 12.7 mg/100 g. Only 13 mg/100 g beta-sitosterol was found in pumpkin seed kernel, although total sterol content was high (265 mg/100 g). Phytosterol concentrations were greater than reported in existing food composition databases, probably due to the inclusion of steryl glycosides, which represent a significant portion of total sterols in nuts and seeds.", "Divergent changes in serum sterols during a strict uncooked vegan diet in patients with rheumatoid arthritis. The effects of a strict uncooked vegan diet on serum lipid and sterol concentrations were studied in patients with rheumatoid arthritis. The subjects were randomized into a vegan diet group (n 16), who consumed a vegan diet for 2-3 months, or into a control group (n 13), who continued their usual omnivorous diets. Serum total and LDL-cholesterol and -phospholipid concentrations were significantly decreased by the vegan diet. The levels of serum cholestanol and lathosterol also decreased, but serum cholestanol:total cholesterol and lathosterol:total cholesterol did not change. The effect of a vegan diet on serum plant sterols was divergent as the concentration of campesterol decreased while that of sitosterol increased. This effect resulted in a significantly greater sitosterol:campesterol value in the vegan diet group than in the control group (1.48 (SD 0.39) v. 0.72 (SD 0.14); P < 0.001). A higher concentration of campesterol compared with sitosterol is normal in omnivorous subjects and can be explained by lower absorption and esterification rates of sitosterol. Our results suggest that a strict uncooked vegan diet changes the relative absorption rates of these sterols and/or their biliary clearance.", "Effects of dietary coconut oil, butter and safflower oil on plasma lipids, lipoproteins and lathosterol levels. OBJECTIVE: The aim of this present study was to determine plasma levels of lathosterol, lipids, lipoproteins and apolipoproteins during diets rich in butter, coconut fat and safflower oil. DESIGN: The study consisted of sequential six week periods of diets rich in butter, coconut fat then safflower oil and measurements were made at baseline and at week 4 in each diet period. SUBJECTS: Forty-one healthy Pacific island polynesians living in New Zealand participated in the trial. INTERVENTIONS: Subjects were supplied with some foods rich in the test fats and were given detailed dietary advice which was reinforced regularly. RESULTS: Plasma lathosterol concentration (P < 0.001), the ratio plasma lathosterol/cholesterol (P=0.04), low density lipoprotein (LDL) cholesterol (P<0.001) and apoB (P<0.001) levels were significantly different among the diets and were significantly lower during coconut and safflower oil diets compared with butter diets. Plasma total cholesterol, HDL cholesterol and apoA-levels were also significantly (P< or =0.001) different among the diets and were not significantly different between buffer and coconut diets. CONCLUSIONS: These data suggest that cholesterol synthesis is lower during diets rich in coconut fat and safflower oil compared with diets rich in butter and might be associated with lower production rates of apoB-containing lipoproteins.", "Maintenance of the LDL cholesterol:HDL cholesterol ratio in an elderly population given a dietary cholesterol challenge. We previously evaluated the responses to dietary cholesterol in children and young adults. In this study, the effects of dietary cholesterol on plasma lipids and LDL atherogenicity were evaluated in 42 elderly subjects (29 postmenopausal women and 13 men > 60 y old). Our exclusion criteria were diabetes, heart disease, and the use of reductase inhibitors. The study followed a randomized crossover design in which subjects were assigned to consume the equivalent of 3 large eggs (EGG) daily or the same amount of a cholesterol-free, fat-free egg substitute (SUB) for a 1-mo period. After a 3-wk washout period, subjects were assigned to the alternate treatment. The concentration of plasma cholesterol after the EGG period varied among subjects. When all subjects were evaluated, there were significant increases in LDL cholesterol (LDL-C) (P < 0.05) and HDL-C (P < 0.001) for both men and women during the EGG period, resulting in no alterations in the LDL-C:HDL-C or the total cholesterol:HDL-C ratios. In addition, the LDL peak diameter was increased during the EGG period for all subjects. In contrast, the measured parameters of LDL oxidation, conjugated diene formation, and LDL lag time did not differ between the EGG and the SUB periods. We conclude from this study that dietary cholesterol provided by eggs does not increase the risk for heart disease in a healthy elderly population."], ["Black tea is not significantly different from water in the maintenance of normal hydration in human subjects: results from a randomised controlled ... There is a belief that caffeinated drinks, such as tea, may adversely affect hydration. This was investigated in a randomised controlled trial. Healthy resting males (n 21) were recruited from the general population. Following 24 h of abstention from caffeine, alcohol and vigorous physical activity, including a 10 h overnight fast, all men underwent four separate test days in a counter-balanced order with a 5 d washout in between. The test beverages, provided at regular intervals, were 4 \u00d7 240 ml black (i.e. regular) tea and 6 \u00d7 240 ml black tea, providing 168 or 252 mg of caffeine. The controls were identical amounts of boiled water. The tea was prepared in a standardised way from tea bags and included 20 ml of semi-skimmed milk. All food taken during the 12 h intervention period was controlled, and subjects remained at rest. No other beverages were offered. Blood was sampled at 0, 1, 2, 4, 8 and 12 h, and a 24 h urine sample was collected. Outcome variables were whole blood cell count, Na, K, bicarbonate, total protein, urea, creatinine and osmolality for blood; and total volume, colour, Na, K, creatinine and osmolality for urine. Although data for all twenty-one participants were included in the analysis (mean age 36 years and mean BMI 25\u00b78 kg/m(2)), nineteen men completed all conditions. Statistical analysis, using a factorial ANOVA approach within PROC MIXED, revealed no significant differences between tea and water for any of the mean blood or urine measurements. It was concluded that black tea, in the amounts studied, offered similar hydrating properties to water.", "Effect of decaffeination of coffee or tea on gastro-oesophageal reflux. BACKGROUND: Coffee and tea are believed to cause gastro-oesophageal reflux; however, the effects of these beverages and of their major component, caffeine, have not been quantified. The aim of this study was to evaluate gastro-oesophageal reflux induced by coffee and tea before and after a decaffeination process, and to compare it with water and water-containing caffeine. METHODS: Three-hour ambulatory pH-metry was performed on 16 healthy volunteers, who received 300 ml of (i) regular coffee, decaffeinated coffee or tap water (n = 16), (ii) normal tea, decaffeinated tea, tap water, or coffee adapted to normal tea in caffeine concentration (n = 6), and (iii) caffeine-free and caffeine-containing water (n = 8) together with a standardized breakfast. RESULTS: Regular coffee induced a significant (P < 0.05) gastro-oesophageal reflux compared with tap water and normal tea, which were not different from each other. Decaffeination of coffee significantly (P < 0.05) diminished gastro-oesophageal reflux, whereas decaffeination of tea or addition of caffeine to water had no effect. Coffee adapted to normal tea in caffeine concentration significantly (P < 0.05) increased gastro-oesophageal reflux. CONCLUSIONS: Coffee, in contrast to tea, increases gastro-oesophageal reflux, an effect that is less pronounced after decaffeination. Caffeine does not seem to be responsible for gastro-oesophageal reflux which must be attributed to other components of coffee.", "Tea or coffee? A case study on evidence for dietary advice. The present paper explores the level of evidence required to justify giving dietary advice to the public. There are important practical differences between the development of public health nutrition guidelines and guidelines for clinical practice. While the gold standard for evidence for clinical practice guidelines is a meta-analysis of a number of randomised controlled trials, this is often unrealistic and sometimes unethical for the evaluation of public health nutrition interventions. Hence, epidemiological studies make up the bulk of evidence for nutrition guidelines. Tea and coffee are an interesting case study in relation to this issue. They are two of the most commonly consumed beverages worldwide, yet there is little dietary advice on their use. The evidence for a relationship between coffee or tea consumption and several diseases is discussed. The available studies, predominantly epidemiological, together with animal and in vitro studies, indicate that coffee and tea are both safe beverages. However, tea is the healthier option because it has a possible role in the prevention of several cancers and CVD. While the evidence for such relationships is not strong, the public will continue to drink both tea and coffee, and will continue to ask nutritionists to make recommendations. It is therefore argued that advice should be given on the best available data, as waiting for complete data to become available could have severe consequences for public health.", "Common tea formulations modulate in vitro digestive recovery of green tea catechins. Epidemiological evidence suggests a role for tea catechins in reduction of chronic disease risk. However, stability of catechins under digestive conditions is poorly understood. The objective of this study was to characterize the effect of common food additives on digestive recovery of tea catechins. Green tea water extracts were formulated in beverages providing 4.5, 18, 23, and 3.5 mg per 100 mL epicatechin (EC), epigallocatechin (EGC), epigallocatechin-gallate (EGCG), and epicatechin-gallate (ECG), respectively. Common commercial beverage additives; citric acid (CA), BHT, EDTA, ascorbic acid (AA), milk (bovine, soy, and rice), and citrus juice (orange, grapefruit, lemon, and lime) were formulated into finished tea beverages at incremental dosages. Samples were then subjected to in vitro digestion simulating gastric and small intestinal conditions with pre- and post-digestion catechin profiles assessed by HPLC. Catechin stability in green tea was poor with <20% total catechins remaining post-digestion. EGC and EGCG were most sensitive with less, not double equals 10% recovery. Teas formulated with 50% bovine, soy, and rice milk increased total catechin recovery significantly to 52, 55, and 69% respectively. Including 30 mg AA in 250 mL of tea beverage significantly (p<0.05) increased catechin recovery of EGC, EGCG, EC, and ECG to 74, 54, 82, and 45% respectively. Juice preparation resulted in the highest recovery of any formulation for EGC (81-98%), EGCG (56-76%), EC (86-95%), and ECG (30-55%). These data provide evidence that tea consumption practices and formulation factors likely impact catechin digestive recovery and may result in diverse physiological profiles.", "Gastro-intestinal availability of aluminium from tea. The in vitro speciation of aluminium (Al) in black tea infusion (pH 4.8) was assessed using 3000, 10,000 and 30,000 Da cut-off ultrafilters, and the effect of adding human gastric juice (pH 2.3) and then raising the pH to 6.5 were also studied. 78% Al in the tea infusion passed through the 3000-Da ultrafilter; this percentage increased to more than 90% with the addition of gastric juice at pH 2.3, but then reduced to approximately 5% when the incubate was adjusted to pH 6.5. The breakdown of tea-derived polyphenols to low molecular weight phenols in vivo was measured using high-resolution 1H nuclear magnetic resonance spectroscopic analysis of ileostomy effluent, but there was no evidence of low molecular weight breakdown products from the polyphenols of ingested tea in this effluent. These results suggest that only a small proportion of Al in tea is potentially available for absorption throughout the small bowel. It may be misleading to estimate systemic Al absorption from tea drinking simply from total urinary aluminium excretion as has been done previously."], ["Hair mercury levels of women of reproductive age in Ontario, Canada: implications to fetal safety and fish consumption. OBJECTIVE: To study hair mercury concentrations among women of reproductive age in relation to fish intake in Ontario, Canada. STUDY DESIGN: Three groups were studied: 22 women who had called the Motherisk Program for information on the reproductive safety of consuming fish during pregnancy, a group of Japanese residing in Toronto (n=23) consuming much larger amounts of fish, and a group of Canadian women of reproductive age (n=20) not seeking advice, were studied. Mercury concentrations in hair samples were measured using inductively coupled plasma mass spectrometry. Seafood consumption habits were recorded for each participant. Based on the types of fish consumed and consumption frequencies, the estimated monthly intake of mercury was calculated. Hair mercury concentrations were correlated to both the number of monthly seafood servings and the estimated ingested mercury dose. RESULTS: There were significant correlations between fish servings and hair mercury (Spearman r=0.73, P<.0001) and between amounts of consumed mercury and hair mercury concentrations (Spearman r=0.81, P<.0001). Nearly two thirds of the Motherisk callers, all of the Japanese women, and 15% of the Canadian women of reproductive age had hair mercury above 0.3 microg/g, which was shown recently to be the lowest observable adverse effect level in a large systematic review of all perinatal studies. CONCLUSIONS: Because of very wide variability, general recommendations for a safe number of fish servings may not be sufficient to protect the fetus. Analysis of hair mercury may be warranted before pregnancy in selected groups of women consuming more than 12 ounces of fish per week, as dietary modification can decrease body burden and ensure fetal safety. Copyright (c) 2010. Published by Mosby, Inc.", "Nowhere to hide: Chemical toxicants and the unborn child. Contemporary reproductive aged women and their offspring are facing an unprecedented onslaught of toxicant exposures from myriad sources in their day-to-day life. Public health recommendations regarding optimal diet and nutrition in pregnancy must incorporate several considerations including safety of available foodstuffs, cultural practices and lifestyle issues. Gestational consumption of contaminated seafood remains a potential source of toxicant exposure, including mercury, for the developing child. Health care professionals responsible for the care of women and their developing children need to become apprised of: a) risks associated with toxicant bioaccumulation in pregnancy; b) ongoing information emerging in the important field of reproductive toxicology; and c) strategies within the clinical setting to facilitate nutritional sufficiency and precautionary avoidance of adverse exposure among young women.", "Mercury levels and fish consumption practices in women of child-bearing age in the Florida Panhandle. The southeastern United States, and in particular the coastal areas along the Gulf of Mexico (Gulf Coast) in Florida, experience some of the highest levels of mercury deposition in the country. Although the State of Florida's coastal border is among the longest in the United States, and the State has issued fish consumption advisories due to mercury on multiple fish species, few data have been systematically collected to assess mercury levels in the human population of the state or to assess the efficacy of the consumption advisories. Because of the generally high rate of seafood consumption among coastal populations, the human population in the Florida Panhandle, near Pensacola, FL is potentially exposed to elevated levels of mercury. In the present study, we analyzed hair mercury levels in women of child-bearing age (16-49 years) who had resided near Pensacola, FL for at least 1 year. We also surveyed the fish consumption practices of the cohort and evaluated awareness of the Florida Fish Consumption Advisory. Hair mercury levels were significantly higher in women who consumed fish within the 30 days prior to sampling (p<0.05) and in those women who were unaware of the consumption advisory (p<0.05). Only 31% of the women reported knowledge of the consumption advisory and pregnant women exhibited lower awareness of the advisory than non-pregnant women. The data suggest that public health interventions such as education and fish advisories have not reached the majority of women in the counties surrounding Pensacola who are most at risk from consumption of fish with high levels of mercury.", "Fish consumption, methylmercury and child neurodevelopment Purpose of review To summarize recent evidence regarding associations of early life exposure to mercury from maternal fish consumption during pregnancy, thimerosal in vaccines and dental amalgam with child neurodevelopment. Recent findings Recent publications have built upon previous evidence demonstrating mild detrimental neurocognitive effects from prenatal methylmercury exposure from maternal fish consumption during pregnancy. New studies examining the effects of prenatal fish consumption as well as methylmercury suggest there are benefits from prenatal fish consumption, but also that consumption of fish high in mercury should be avoided. Future studies incorporating information on both the methylmercury and the docosahexaenoic acid contained within fish will help to refine recommendations to optimize outcomes for mothers and children. Additional recent studies have supported the safety of vaccines containing thimerosal and of dental amalgam for repair of dental caries in children. Summary Exposure to mercury may harm child development. Interventions intended to reduce exposure to low levels of mercury in early life must, however, be carefully evaluated in consideration of the potential attendant harm from resultant behavior changes, such as reduced docosahexaenoic acid exposure from lower seafood intake, reduced uptake of childhood vaccinations and suboptimal dental care.", "Relationship between the prenatal exposure to low-level of mercury and the size of a newborn's cerebellum. Exposure to methylmercury at any stage of central nervous system development could induce alterations and result in severe congenital abnormalities. Total mercury level in maternal hair during pregnancy correlates well with blood levels of methylmercury and with total mercury levels in fetal brain. A prospective study has been conducted and a total of 137 childbearing women living at the coastal region with term, normal pregnancies were included and their newborns evaluated by ultrasonography. Mothers and their newborns are divided in two groups according to their hair mercury levels; examined group with high body levels of mercury (\u2265 1 \u03bcg/g) and control group with low body levels of mercury (<1 \u03bcg/g). Neurosonographic examination was conducted to all newborns. Two dimensions of cerebellum in the sagital-medial plane have been measured: maximum height and width starting from the roof of the fourth chamber. Majority of mothers had hair mercury levels lower than 1 \u03bcg/g (N = 107). Mean value was 0.88 \u03bcg/g (SD 1.24), ranging from 0.02 to 8.71 \u03bcg/g. There was no significant difference between the two groups when it comes to the width of cerebellum (Mann-Whitney test: Z = 1471; p = 0.141). However, comparison related to the length of cerebellum shows statistically significant smaller cerebellum in newborns whose mother had hair mercury levels higher than 1 \u03bcg/g (Mann-Whitney test: Z = 2329; p = 0.019). Our results lead to a conclusion that prenatal exposure to, what we consider to be, low-levels of methylmercury does influence fetal brain development detected as decreased size of newborn's cerebellum. From a clinical point of view, a question related to the influence of prenatal low-level methylmercury exposure on fetal neurodevelopment remains open. Our further objectives are to direct the research towards performing detailed neuropshychological tests on children at the age of 18 months. Such tests could indicate the presence of subtle neurological or neuropsychological deficits. Copyright \u00a9 2010 Elsevier Ltd. All rights reserved."], ["Dietary fiber and breast cancer risk: a systematic review and meta-analysis of prospective studies. BACKGROUND: Evidence from case-control studies suggest that dietary fiber may be inversely related to breast cancer risk, but it is unclear if this is supported by prospective data. We conducted a systematic review and meta-analysis of the evidence from prospective studies. METHODS: PubMed was searched for prospective studies of fiber intake and breast cancer risk until 31st August 2011. Random effects models were used to estimate summary relative risks (RRs). RESULTS: Sixteen prospective studies were included. The summary RR for the highest versus the lowest intake was 0.93 [95% confidence interval (CI) 0.89-0.98, I(2) = 0%] for dietary fiber, 0.95 (95% CI 0.86-1.06, I(2) = 4%) for fruit fiber, 0.99 (95% CI 0.92-1.07, I(2) = 1%) for vegetable fiber, 0.96 (95% CI 0.90-1.02, I(2) = 5%) for cereal fiber, 0.91 (95% CI 0.84-0.99, I(2) = 7%) for soluble fiber and 0.95 (95% CI 0.89-1.02, I(2) = 0%) for insoluble fiber. The summary RR per 10 g/day of dietary fiber was 0.95 (95% CI 0.91-0.98, I(2) = 0%, P(heterogeneity) = 0.82). In stratified analyses, the inverse association was only observed among studies with a large range (\u226513 g/day) or high level of intake (\u226525 g/day). CONCLUSION: In this meta-analysis of prospective studies, there was an inverse association between dietary fiber intake and breast cancer risk.", "Dietary fibre and risk of breast cancer in the UK Women's Cohort Study. BACKGROUND: Reports of relationships between dietary fibre intake and breast cancer have been inconsistent. Previous cohort studies have been limited by a narrow range of intakes. METHODS: Women who developed invasive breast cancer, 350 post-menopausally and 257 pre-menopausally, during 240,959 person-years of follow-up in the UK Women's Cohort Study (UKWCS) were studied. This cohort has 35,792 subjects with a wide range of exposure to dietary fibre with intakes of total fibre in the lowest quintile of <20 g/day up to >30 g/day in the top quintile. Fibre and breast cancer relationships were explored using Cox regression modelling adjusted for measurement error. Effects of fibre, adjusting for confounders were examined for pre- and post-menopausal women separately. RESULTS: In pre-menopausal, but not post-menopausal women a statistically significant inverse relationship was found between total fibre intake and risk of breast cancer (P for trend = 0.01). The top quintile of fibre intake was associated with a hazard ratio of 0.48 [95% confidence interval (CI) 0.24-0.96] compared with the lowest quintile. Pre-menopausally, fibre from cereals was inversely associated with risk of breast cancer (P for trend = 0.05) and fibre from fruit had a borderline inverse relationship (P for trend = 0.09). A further model including dietary folate strengthened the significance of the inverse relationship between total fibre and pre-menopausal breast cancer. CONCLUSIONS: These findings suggest that in pre-menopausal women, total fibre is protective against breast cancer; in particular, fibre from cereals and possibly fruit.", "Cytological abnormalities in nipple aspirates of breast fluid from women with severe constipation. The relation between epithelial dysplasia in nipple aspirates of breast fluid and frequency of bowel movements was studied in 1481 white women. There was a significant positive association with dysplasia (risk ratio 4.5; 95% confidence interval 1.9-11.9) in women reporting severe constipation, i.e., two or fewer bowel movements weekly, which was not seen in women reporting more than one bowel movement daily. Women who had one bowel movement daily or one every other day had increased risk ratios. Cytological abnormalities in breast epithelium associated with severe constipation may be relevant to studies of diet and breast disease since the intestinal flora has been reported to metabolism bile salts and oestrogens secreted by the liver into the gastrointestinal tract-a process which may be enhanced by severe constipation.", "Cytological abnormalities in nipple aspirates of breast fluid from women with severe constipation. The relation between epithelial dysplasia in nipple aspirates of breast fluid and frequency of bowel movements was studied in 1481 white women. There was a significant positive association with dysplasia (risk ratio 4.5; 95% confidence interval 1.9-11.9) in women reporting severe constipation, i.e., two or fewer bowel movements weekly, which was not seen in women reporting more than one bowel movement daily. Women who had one bowel movement daily or one every other day had increased risk ratios. Cytological abnormalities in breast epithelium associated with severe constipation may be relevant to studies of diet and breast disease since the intestinal flora has been reported to metabolism bile salts and oestrogens secreted by the liver into the gastrointestinal tract-a process which may be enhanced by severe constipation.", "The metabolic consequences of slow colonic transit. Intestinal transit has a substantial influence on the enterohepatic circulation of bile acids and steroid hormones, on colonic pH, and on short chain fatty acid concentrations in the distal colon. Slow transit is likely to favor disease processes that are related to over-efficient enterohepatic recirculation and to lack of short chain fatty acid in the distal colon. These include gallstones, large bowel cancer, and possibly breast cancer. The best-documented influence of slow colonic transit is on bile acid metabolism. Slowing colonic transit increases deoxycholate and raises cholesterol saturation of bile, making gallstone formation more likely. In this review, we also examine the evidence that slow colonic transit may be important in the etiology of large bowel and breast cancer. There is a lack of data pertaining to the relationship between colonic transit and diseases such as colon and breast cancer. Should slow colonic transit prove to be a significant factor in the etiology of such diseases, then the health of the population might benefit from dietary and lifestyle changes that speed up intestinal transit."], ["Evaluation, treatment, and prevention of vitamin D deficiency: an Endocrine Society clinical practice guideline. OBJECTIVE: The objective was to provide guidelines to clinicians for the evaluation, treatment, and prevention of vitamin D deficiency with an emphasis on the care of patients who are at risk for deficiency. PARTICIPANTS: The Task Force was composed of a Chair, six additional experts, and a methodologist. The Task Force received no corporate funding or remuneration. CONSENSUS PROCESS: Consensus was guided by systematic reviews of evidence and discussions during several conference calls and e-mail communications. The draft prepared by the Task Force was reviewed successively by The Endocrine Society's Clinical Guidelines Subcommittee, Clinical Affairs Core Committee, and cosponsoring associations, and it was posted on The Endocrine Society web site for member review. At each stage of review, the Task Force received written comments and incorporated needed changes. CONCLUSIONS: Considering that vitamin D deficiency is very common in all age groups and that few foods contain vitamin D, the Task Force recommended supplementation at suggested daily intake and tolerable upper limit levels, depending on age and clinical circumstances. The Task Force also suggested the measurement of serum 25-hydroxyvitamin D level by a reliable assay as the initial diagnostic test in patients at risk for deficiency. Treatment with either vitamin D(2) or vitamin D(3) was recommended for deficient patients. At the present time, there is not sufficient evidence to recommend screening individuals who are not at risk for deficiency or to prescribe vitamin D to attain the noncalcemic benefit for cardiovascular protection.", "Towards prevention of vitamin D deficiency and beyond: knowledge gaps and research needs in vitamin D nutrition and public health. The North American Institute of Medicine (IOM) recently published their report on dietary reference intakes (DRI) for Ca and vitamin D. The DRI committee's deliberations underpinning this most comprehensive report on vitamin D nutrition to date benefited hugely from a much expanded knowledge base in vitamin D over the last decade or more. However, since their release, the vitamin D DRI have been the subject of intense controversy, which is largely due to the persistence of fundamental knowledge gaps in vitamin D. These can be identified at the levels of exposure, metabolism, storage, status, dose-response, function and beneficial or adverse health effects, as well as safe and effective application of intake recommendations at the population level through sustainable food-based approaches. The present review provides a brief overview of the approach used by the IOM committee to revise the DRI for vitamin D and to collate from a number of authoritative sources key knowledge gaps in vitamin D nutrition from the public health perspective. A number of research topics are outlined and data requirements within these are identified and mapped to the risk assessment framework used by the DRI committee. While not intended as an exhaustive list, it provides a basis for organising and prioritising research efforts in the area of vitamin D, which may offer a perspective on the major areas in need of attention. It is intended to be of use to researchers, national policy makers, the public health community, industry groups and other relevant stakeholders including funding institutions.", "Traditionally living populations in East Africa have a mean serum 25-hydroxyvitamin D concentration of 115\u00a0nmol/l. Cutaneous synthesis of vitamin D by exposure to UVB is the principal source of vitamin D in the human body. Our current clothing habits and reduced time spent outdoors put us at risk of many insufficiency-related diseases that are associated with calcaemic and non-calcaemic functions of vitamin D. Populations with traditional lifestyles having lifelong, year-round exposure to tropical sunlight might provide us with information on optimal vitamin D status from an evolutionary perspective. We measured the sum of serum 25-hydroxyvitamin D\u2082 and D\u2083 (25(OH)D) concentrations of thirty-five pastoral Maasai (34 (SD 10) years, 43 % male) and twenty-five Hadzabe hunter-gatherers (35 (SD 12) years, 84 % male) living in Tanzania. They have skin type VI, have a moderate degree of clothing, spend the major part of the day outdoors, but avoid direct exposure to sunlight when possible. Their 25(OH)D concentrations were measured by liquid chromatography-MS/MS. The mean serum 25(OH)D concentrations of Maasai and Hadzabe were 119 (range 58-167) and 109 (range 71-171) nmol/l, respectively. These concentrations were not related to age, sex or BMI. People with traditional lifestyles, living in the cradle of mankind, have a mean circulating 25(OH)D concentration of 115 nmol/l. Whether this concentration is optimal under the conditions of the current Western lifestyle is uncertain, and should as a possible target be investigated with concomitant appreciation of other important factors in Ca homeostasis that we have changed since the agricultural revolution.", "Vitamin D supplement doses and serum 25-hydroxyvitamin D in the range associated with cancer prevention. BACKGROUND: Studies indicate that intake of vitamin D in the range from 1,100 to 4,000 IU/d and a serum 25-hydroxyvitamin D concentration [25(OH)D] from 60-80 ng/ml may be needed to reduce cancer risk. Few community-based studies allow estimation of the dose-response relationship between oral intake of vitamin D and corresponding serum 25(OH)D in the range above 1,000 IU/d. MATERIALS AND METHODS: A descriptive study of serum 25(OH)D concentration and self-reported vitamin D intake in a community-based cohort (n = 3,667, mean age 51.3 \u00b1 13.4 y). RESULTS: Serum 25(OH)D rose as a function of self-reported vitamin D supplement ingestion in a curvilinear fashion, with no intakes of 10,000 IU/d or lower producing 25(OH)D values above the lower-bound of the zone of potential toxicity (200 ng/ml). Unsupplemented all-source input was estimated at 3,300 IU/d. The supplemental dose ensuring that 97.5% of this population achieved a serum 25(OH)D of at least 40 ng/ml was 9,600 IU/d. CONCLUSION: Universal intake of up to 40,000 IU vitamin D per day is unlikely to result in vitamin D toxicity.", "Low Vitamin D Status: Definition, Prevalence, Consequences and Correction Vitamin D is obtained from cutaneous production when 7-dehydrocholesterol is converted to vitamin D3 (cholecalciferol) by ultraviolet B radiation or by oral intake of vitamin D2 (ergocalciferol) and D3. An individual's vitamin D status is best evaluated by measuring the circulating 25-hydroxyvitamin D [25(OH)D] concentration. Though controversy surrounds the definition of low vitamin D status, there is increasing agreement that the optimal circulating 25(OH)D level should be ~30-32 ng/ml or above. Using this definition, it has been is estimated that approximately three quarters of all adults in the United States are low. Classically, low vitamin D status has skeletal consequences such as osteomalacia/rickets. More recently, associations between low vitamin D status and increased risk for various non-skeletal morbidities have been recognized; whether all of these associations are causally related to low vitamin D status remains to be determined. To achieve optimal vitamin D status, daily intakes of at least 1000 IU or more of vitamin D are required. The risk of toxicity with \u201chigh\u201d amounts of vitamin D intake is low. Substantial between-individual variability exists in response to the same administered vitamin D dose. When to monitor 25(OH)D levels has received little attention. Supplementation with vitamin D3 may be preferable to vitamin D2."], ["Diet and breast cancer: understanding risks and benefits. BACKGROUND: Breast cancer is the most commonly diagnosed cancer among women in the United States. Extensive research has been completed to evaluate the relationship between dietary factors and breast cancer risk and survival after breast cancer; however, a summary report with clinical inference is needed. Materials and METHODS: This review summarizes the current epidemiological and clinical trial evidence relating diet to breast cancer incidence, recurrence, survival, and mortality. The review includes emerging epidemiological studies that assess risk within breast cancer subtypes as well as a summary of previous and ongoing dietary intervention trials designed to modify breast cancer risk. RESULTS: The available literature suggests that both low-fat and high-fiber diets may be weakly protective against breast cancer, whereas total energy intake and alcohol appear to be positively associated. Fiber may be weakly protective possibly through modulation of estrogen, whereas fruit and vegetable intake is not clearly associated with risk. Obesity is a risk factor for postmenopausal disease, and adult weight gain should be avoided to reduce risk. In survivors, diet has the greatest potential influence on overall mortality rather than breast cancer-specific events. CONCLUSION: Diet is modestly associated with breast cancer risk; associations appear more pronounced for postmenopausal disease, and healthy choices after diagnosis and treatment likely support longevity more so than reduced risk for recurrent disease.", "Dietary factors and risk of breast cancer: combined analysis of 12 case-control studies. We conducted a combined analysis of the original data to evaluate the consistency of 12 case-control studies of diet and breast cancer. Our analysis shows a consistent, statistically significant, positive association between breast cancer risk and saturated fat intake in postmenopausal women (relative risk for highest vs. lowest quintile, 1.46; P less than .0001). A consistent protective effect for a number of markers of fruit and vegetable intake was demonstrated; vitamin C intake had the most consistent and statistically significant inverse association with breast cancer risk (relative risk for highest vs. lowest quintile, 0.69; P less than .0001). If these dietary associations represent causality, the attributable risk (i.e., the percentage of breast cancers that might be prevented by dietary modification) in the North American population is estimated to be 24% for postmenopausal women and 16% for premenopausal women.", "Dietary factors and breast cancer risk: a case control study among a population in Southern France. This case-control study examined different food groups in relation to breast cancer. Between 2002 and 2004, 437 cases and 922 controls matched according to age and area of residence were interviewed. Diet was measured by a validated food frequency questionnaire. Adjusted odds ratios (Ors) were computed across levels of various dietary intakes identified by two methods: the \\\"classical\\\" and the \\\"spline\\\" methods. Neither of the 2 methods found an association between total fruit and vegetable consumption and breast cancer. Results of the 2 methods showed a nonsignificant decreased association with cooked vegetables intake as well as legumes and fish consumption. Whereas the spline method showed no association, the classical method showed significant associations related to the lowest consumption of raw vegetables or dairy products and breast cancer risk: Adjusted OR for raw vegetable consumption between (67.4 and 101.3 g/day) vs. (< 67.4 g/day) was 0.63 [95% confidence interval (CI) = 0.43-0.93]. Adjusted OR for dairy consumption between (134.3 and 271.2 g/day) vs. (< 134.3 g/day) was 1.57 (95% CI = 1.06-2.32). However, the overall results were not consistent. Compared to the classical method, the use of the spline method showed a significant association for cereal, meat, and olive oil. Cereal and olive oil were inversely associated with breast cancer risk. Breast cancer risk increased by 56% for each additional 100 g/day of meat consumption. Studies using novel methodological techniques are needed to confirm the dietary threshold responsible for changes in breast cancer risk. New approaches that consist in analyzing dietary patterns rather than dietary food are necessary.", "Post-diagnosis dietary factors and survival after invasive breast cancer Little is known about the effects of diet after breast cancer diagnosis on survival. We prospectively examined the relation between post-diagnosis dietary factors and breast cancer and all-cause survival in women with a history of invasive breast cancer diagnosed between 1987 and 1999 (at ages 20\u201379 years). Diet after breast cancer diagnosis was measured using a 126-item food frequency questionnaire. Among 4,441 women without a history of breast cancer recurrence prior to completing the questionnaire, 137 subsequently died from breast cancer within 7 years of enrollment. Hazard ratios (HR) and 95% confidence intervals (CI) were estimated for intake of macronutrients as well as selected micronutrients and food groups from Cox proportional hazards regression models. After adjustment for factors at diagnosis (age, state of residence, menopausal status, smoking, breast cancer stage, alcohol, history of hormone replacement therapy), interval between diagnosis and diet assessment, and at follow-up (energy intake, breast cancer treatment, body mass index, and physical activity), women in the highest compared to lowest quintile of intake of saturated fat and trans fat had a significantly higher risk of dying from any cause (HR = 1.41, 95% CI = 1.06 to 1.87, P-trend = 0.03) for saturated fat; (HR = 1.78, 95% CI = 1.35 to 2.32, P-trend = 0.01) for trans fat intake. Associations were similar, though did not achieve statistical significance, for breast cancer survival. This study suggests that lower intake of saturated and trans fat in the post-diagnosis diet is associated with improved survival after breast cancer diagnosis.", "Dietary habits and breast cancer incidence among Seventh-day Adventists. Breast cancer incidence was monitored in a cohort of 20,341 California Seventh-day Adventist women who completed a detailed lifestyle questionnaire in 1976, and who were followed for 6 years. There were 215 histologically confirmed primary breast cancer detected among some 115,000 person-years of follow-up. Mean age at diagnosis was 66 years, indicating a primarily postmenopausal case series. Established risk factors for breast cancer showed strong relationships to risk in these data. Age at first live birth, maternal history of breast cancer, age at menopause, educational attainment, and obesity were all significantly related to risk. However, increasing consumption of high fat animal products was not associated with increased risk of breast cancer in a consistent fashion. Nor were childhood and early teenage dietary habits (vegetarian versus nonvegetarian) related to subsequent, adult risk of developing breast cancer. Also, a derived index of percent of calories from animal fat in the adult years was not significantly related to risk. These results persisted after simultaneously controlling for other, potentially confounding variables, utilizing Cox proportional hazard regression models."], ["A High Antioxidant Spice Blend Attenuates Postprandial Insulin and Triglyceride Responses and Increases Some Plasma Measures of Antioxidant Activity in Healthy, Overweight Men There is much interest in the potential of dietary antioxidants to attenuate in vivo oxidative stress, but little characterization of the time course of plasma effects exists. Culinary spices have demonstrated potent in vitro antioxidant properties. The objective of this study was to examine whether adding 14 g of a high antioxidant spice blend to a 5060-kJ (1200 kcal) meal exerted significant postprandial effects on markers of plasma antioxidant status and metabolism. Healthy overweight men (n = 6) consumed a control and spiced meal in a randomized crossover design with 1 wk between testing sessions. Blood was sampled prior to the meal and at 30-min intervals for 3.5 h (total of 8 samples). Mixed linear models demonstrated a treatment \u00d7 time interaction (P < 0.05) for insulin and TG, corresponding with 21 and 31% reductions in postprandial levels with the spiced meal, respectively. Adding spices to the meal significantly increased the ferric reducing antioxidant power, such that postprandial increases following the spiced meal were 2-fold greater than after the control meal (P = 0.009). The hydrophilic oxygen radical absorbance capacity (ORAC) of plasma also was increased by spices (P = 0.02). There were no treatment differences in glucose, total thiols, lipophilic ORAC, or total ORAC. The incorporation of spices into the diet may help normalize postprandial insulin and TG and enhance antioxidant defenses.", "Bioavailability of herbs and spices in humans as determined by ex vivo inflammatory suppression and DNA strand breaks. OBJECTIVE: The aim of this work was to determine the bioavailability of herbs and spices after human consumption by measuring the ability to protect lymphocytes from an oxidative injury and by examining the impact on inflammatory biomarkers in activated THP-1 cells. METHODS: Ten to 12 subjects in each of 13 groups consumed a defined amount of herb or spice for 7 days. Blood was drawn from subjects before consumption and 1 hour after taking the final herb or spice capsules. Subject serum and various extractions of the herbs and spices were analyzed for antioxidant capacity by oxygen radical absorbance capacity (ORAC) analysis or by 1,1-diphenyl-2-picrylhydrzyl (DPPH). Subject peripheral blood mononuclear cells (PBMCs) in medium with10% autologous serum were incubated with hydrogen peroxide to induce DNA strand breaks. Subject serum was also used to treat activated THP-1 cells to determine relative quantities of 3 inflammatory cytokine (tumor necrosis factor-\u03b1 [TNF-\u03b1], interleukin-1\u03b1 [IL-1\u03b1], and IL-6) mRNAs. RESULTS: Herbs and spices that protected PBMCs against DNA strand breaks were paprika, rosemary, ginger, heat-treated turmeric, sage, and cumin. Paprika also appeared to protect cells from normal apoptotic processes. Of the 3 cytokine mRNAs studied (TNF-\u03b1, IL-1\u03b1, and IL-6), TNF-\u03b1 was the most sensitive responder to oxidized LDL-treated macrophages. Clove, ginger, rosemary, and turmeric were able to significantly reduce oxidized LDL-induced expression of TNF-\u03b1. Serum from those consuming ginger reduced all three inflammatory biomarkers. Ginger, rosemary, and turmeric showed protective capacity by both oxidative protection and inflammation measures. CONCLUSIONS: DNA strand breaks and inflammatory biomarkers are a good functional measure of a food's bioavailability.", "Acute effects of high-fat meals enriched with walnuts or olive oil on postprandial endothelial function. OBJECTIVES: We sought to investigate whether the addition of walnuts or olive oil to a fatty meal have differential effects on postprandial vasoactivity, lipoproteins, markers of oxidation and endothelial activation, and plasma asymmetric dimethylarginine (ADMA). BACKGROUND: Compared with a Mediterranean diet, a walnut diet has been shown to improve endothelial function in hypercholesterolemic patients. We hypothesized that walnuts would reverse postprandial endothelial dysfunction associated with consumption of a fatty meal. METHODS: We randomized in a crossover design 12 healthy subjects and 12 patients with hypercholesterolemia to 2 high-fat meal sequences to which 25 g olive oil or 40 g walnuts had been added. Both test meals contained 80 g fat and 35% saturated fatty acids, and consumption of each meal was separated by 1 week. Venipunctures and ultrasound measurements of brachial artery endothelial function were performed after fasting and 4 h after test meals. RESULTS: In both study groups, flow-mediated dilation (FMD) was worse after the olive oil meal than after the walnut meal (p = 0.006, time-period interaction). Fasting, but not postprandial, triglyceride concentrations correlated inversely with FMD (r = -0.324; p = 0.024). Flow-independent dilation and plasma ADMA concentrations were unchanged, and the concentration of oxidized low-density lipoproteins decreased (p = 0.051) after either meal. The plasma concentrations of soluble inflammatory cytokines and adhesion molecules decreased (p < 0.01) independently of meal type, except for E-selectin, which decreased more (p = 0.033) after the walnut meal. CONCLUSIONS: Adding walnuts to a high-fat meal acutely improves FMD independently of changes in oxidation, inflammation, or ADMA. Both walnuts and olive oil preserve the protective phenotype of endothelial cells.", "Plasma antioxidant capacity changes following a meal as a measure of the ability of a food to alter in vivo antioxidant status. OBJECTIVE: Determine 1) if consumption of a meal of different fruits or berries increases plasma hydrophilic (H-) or lipophilic (L-) antioxidant capacity (AOC) measured as Oxygen Radical Absorbance Capacity (ORAC(FL)); 2) if including macronutrients in the meal alters postprandial changes in AOC; and 3) if preliminary recommendations can be developed for antioxidant intake. METHODS: Changes in plasma AOC following consumption of a single meal of berries/fruits (blueberry, dried plum, dried plum juice, grape, cherry, kiwifruit and strawberry) were studied in 5 clinical trials with 6-10 subjects per experiment. In two studies with blueberry or grape, additional macronutrients (carbohydrate, fat, protein) were included in the control and treatment meals. Blood samples collected before and after the meal were analyzed for AOC. RESULTS: Consumption of dried plums or dried plum juice did not alter either the H- or L-AOC area under the curve (AUC). Consumption of blueberry in 2 studies and of mixed grape powder [12.5 (Study #1), 39.9 (Study #4) and 8.6 (Study #5) mmole Trolox Equivalents (TE) AOC, respectively] increased hydrophilic AOC AUC. L-AOC increased following a meal of blueberry containing 12.5 mmole TE AOC (Study #1). Consumption of 280 g of cherries (4.5 mmol TE AOC) increased plasma L-AOC but not H-AOC. The AOC in the control groups in which additional macronutrients (Studies #4 and #5) were added decreased from the postprandial baseline AOC measurement. CONCLUSION: We have demonstrated that consumption of certain berries and fruits such as blueberries, mixed grape and kiwifruit, was associated with increased plasma AOC in the postprandial state and consumption of an energy source of macronutrients containing no antioxidants was associated with a decline in plasma AOC. However, without further long term clinical studies, one cannot necessarily translate increased plasma AOC into a potential decreased risk of chronic degenerative disease. Preliminary estimates of antioxidant needs based upon energy intake were developed. Consumption of high antioxidant foods with each meal is recommended in order to prevent periods of postprandial oxidative stress.", "Consumption of blueberries with a high-carbohydrate, low-fat breakfast decreases postprandial serum markers of oxidation. We sought to determine whether consumption of blueberries could reduce postprandial oxidation when consumed with a typical high-carbohydrate, low-fat breakfast. Participants (n 14) received each of the three treatments over 3 weeks in a cross-over design. Treatments consisted of a high blueberry dose (75 g), a low blueberry dose (35 g) and a control (ascorbic acid and sugar content matching that of the high blueberry dose). Serum oxygen radical absorbance capacity (ORAC), serum lipoprotein oxidation (LO) and serum ascorbate, urate and glucose were measured at fasting, and at 1, 2 and 3 h after sample consumption. The mean serum ORAC was significantly higher in the 75 g group than in the control group during the first 2 h postprandially, while serum LO lag time showed a significant trend over the 3 h for both blueberry doses. Changes in serum ascorbate, urate and glucose were not significantly different among the groups. To our knowledge, this is the first report that has demonstrated that increased serum antioxidant capacity is not attributable to the fructose or ascorbate content of blueberries. In summary, a practically consumable quantity of blueberries (75 g) can provide statistically significant oxidative protection in vivo after a high-carbohydrate, low-fat breakfast. Though not tested directly, it is likely that the effects are due to phenolic compounds, either directly or indirectly, as they are a major family of compounds in blueberries with potential bioactive activity."], ["Molecular Epidemiologic Evidence for Diabetogenic Effects of Dioxin Exposure in U.S. Air Force Veterans of the Vietnam War Background One of the outcomes positively associated with dioxin exposure in humans is type 2 diabetes. Objectives This study was conducted in order to find the molecular biological evidence for the diabetogenic action of dioxin in adipose samples from Vietnam veterans. Methods We obtained 313 adipose tissue samples both from Vietnam veterans who were exposed to dioxin (Operation Ranch Hand) and from comparison veterans who served in Southeast Asia with no record of dioxin exposure. We conducted quantitative reverse-transcribed polymerase chain reaction studies on selected marker mRNAs from these samples. Results We found the most sensitive and reliable molecular indicator of dioxin-induced diabetes to be the ratio of mRNA of glucose transporter 4 (GLUT4) and nuclear transcription factor kappa B (NF\u03baB), a marker of inflammation. This ratio showed significant correlations to serum dioxin residues and to fasting glucose among those in the Ranch Hand group and, surprisingly, even in the comparison group, who have low levels of dioxin comparable to the general public. Such a correlation in the comparison group was particularly significant among those with known risk factors such as obesity and family history of diabetes. Conclusions These results show that the GLUT4:NF\u03baB ratio is a reliable marker for the diabetogenic action of dioxin, particularly at very low exposure levels that are not much higher than those found in the general public, implying a need to address current exposure levels.", "Environmental contaminants as risk factors for developing diabetes. The contribution of exposure to persistent organic pollutants (POPs) to the incidence of diabetes has received little attention until recently. A number of reports have emerged, however, concerning elevated diabetes in persons occupationally exposed to dioxin. United States (US) Air Force personnel in Vietnam who sprayed Agent Orange containing dioxin as a contaminant had elevated rates of diabetes, leading to US government compensation for diabetes in these veterans. Recent studies in populations exposed to polychlorinated biphenyls (PCBs) and chlorinated pesticides found a dose-dependent elevated risk of diabetes. An elevation in risk of diabetes in relation to levels of several POPs has been demonstrated by two different groups using the National Health and Nutrition Examination Survey (NHANES), a random sampling of US citizens. The strong associations seen in quite different studies suggest the possibility that exposure to POPs could cause diabetes. One striking observation is that obese persons that do not have elevated POPs are not at elevated risk of diabetes, suggesting that the POPs rather than the obesity per se is responsible for the association. Although a specific mechanism is not known, most POPs induce a great number and variety of genes, including several that alter insulin action. Because diabetes is a dangerous disease that is increasing in frequency throughout the world, further study of the possibility that exposure to POPs contributes to the etiology of diabetes is critical.", "A strong dose-response relation between serum concentrations of persistent organic pollutants and diabetes: results from the National Health and Ex... OBJECTIVE: Low-level exposure to some persistent organic pollutants (POPs) has recently become a focus because of their possible link with the risk of diabetes. RESEARCH DESIGN AND METHODS: Cross-sectional associations of the serum concentrations of POPs with diabetes prevalence were investigated in 2,016 adult participants in the National Health and Nutrition Examination Survey 1999-2002. Six POPs (2,2',4,4',5,5'-hexachlorobiphenyl, 1,2,3,4,6,7,8-heptachlorodibenzo-p-dioxin, 1,2,3,4,6,7,8,9-octachlorodibenzo-p-dioxin, oxychlordane, p,p'-dichlorodiphenyltrichloroethane, and trans-nonachlor) were selected, because they were detectable in >or=80% of participants. RESULTS: Compared with subjects with serum concentrations below the limit of detection, after adjustment for age, sex, race and ethnicity, poverty income ratio, BMI, and waist circumference, diabetes prevalence was strongly positively associated with lipid-adjusted serum concentrations of all six POPs. When the participants were classified according to the sum of category numbers of the six POPs, adjusted odds ratios were 1.0, 14.0, 14.7, 38.3, and 37.7 (P for trend < 0.001). The association was consistent in stratified analyses and stronger in younger participants, Mexican Americans, and obese individuals. CONCLUSIONS: There were striking dose-response relations between serum concentrations of six selected POPs and the prevalence of diabetes. The strong graded association could offer a compelling challenge to future epidemiologic and toxicological research.", "Marine Food Pollutants as a Risk Factor for Hypoinsulinemia and Type 2 Diabetes Background Some persistent environmental chemicals are suspected of causing an increased risk of type 2 diabetes mellitus, a disease particularly common after age 70. This concern was examined in a cross-sectional study of elderly subjects in a population with elevated contaminant exposures from seafood species high in the food chain. Methods Clinical examinations of 713 Faroese residents aged 70-74 years (64% of eligible population) included fasting plasma concentrations of glucose and insulin, and glycosylated hemoglobin. Lifetime exposure to persistent environmental chemicals from pilot whale and other traditional food was estimated from a dietary questionnaire and by analysis of blood samples for polychlorinated biphenyls (PCBs) and related food contaminants. Results Septuagenarians with type 2 diabetes or impaired fasting glycemia tended to have higher PCB concentrations and higher past intake of traditional foods, especially during childhood and adolescence. In non-diabetic subjects, the fasting insulin concentration decreased by 7% (95% CI= \u221212% to \u22122%) for each doubling of the PCB concentration after adjustment for sex and body mass index at age 20. Conversely, the fasting glucose concentration increased by 6% (\u22121% to 13%) for each doubling in PCB. Similar associations were seen in subjects without impaired fasting glycemia, while further adjustment for current body mass index and lipid metabolism parameters attenuated some of the associations. Conclusions Impaired insulin secretion appears to constitute an important part of the type 2 diabetes pathogenesis associated with exposure to persistent lipophilic food contaminants.", "The role of persistent organic pollutants in the worldwide epidemic of type 2 diabetes mellitus and the possible connection to Farmed Atlantic Salm... Rates of type 2 diabetes mellitus (T2DM), both in the United States and worldwide, have been rising at an alarming rate over the last two decades. Because this disease is viewed as primarily being attributable to unhealthy lifestyle habits, a great deal of emphasis has been placed on encouraging increased exercise, better dietary habits, and weight loss. Recent studies reveal that the presence of several persistent organic pollutants (POPs) can confer greater risk for developing the disease than some of the established lifestyle risk factors. In fact, evidence suggests the hypothesis that obesity might only be a significant risk factor when adipose tissue contains high amounts of POPs. Chlorinated pesticides and polychlorinated biphenyls, in particular, have been strongly linked to the development of metabolic syndrome, insulin resistance, and T2DM. In addition to reviewing the evidence associating POPs to these conditions, this article explores the possible contribution of farmed Atlantic salmon - a significant and common dietary source of POPs - with blood sugar dysregulation conditions."], ["Intestinal microbiota metabolism of L-carnitine, a nutrient in red meat, promotes atherosclerosis Intestinal microbiota metabolism of choline/phosphatidylcholine produces trimethylamine (TMA), which is further metabolized to a proatherogenic species, trimethylamine-N-oxide (TMAO). Herein we demonstrate that intestinal microbiota metabolism of dietary L-carnitine, a trimethylamine abundant in red meat, also produces TMAO and accelerates atherosclerosis. Omnivorous subjects are shown to produce significantly more TMAO than vegans/vegetarians following ingestion of L-carnitine through a microbiota-dependent mechanism. Specific bacterial taxa in human feces are shown to associate with both plasma TMAO and dietary status. Plasma L-carnitine levels in subjects undergoing cardiac evaluation (n = 2,595) predict increased risks for both prevalent cardiovascular disease (CVD) and incident major adverse cardiac events (MI, stroke or death), but only among subjects with concurrently high TMAO levels. Chronic dietary L-carnitine supplementation in mice significantly altered cecal microbial composition, markedly enhanced synthesis of TMA/TMAO, and increased atherosclerosis, but not following suppression of intestinal microbiota. Dietary supplementation of TMAO, or either carnitine or choline in mice with intact intestinal microbiota, significantly reduced reverse cholesterol transport in vivo. Intestinal microbiota may thus participate in the well-established link between increased red meat consumption and CVD risk.", "Secondary prevention of CHD in UK men: the Diet and Reinfarction Trial and its sequel. The Diet and Reinfarction Trial (DART) involved 2033 men (mean age 56.5 years) recovering from myocardial infarction. They were randomly allocated to receive advice or to receive no advice on each of three dietary factors: an increase in fatty fish intake; a reduction in fat intake with an increase in polyunsaturated fat:saturated fat; an increased intake of cereal fibre. Compliance was satisfactory with the fish and fibre advice, but less so with the fat advice. The men given fish advice had 29% lower 2-year all-cause mortality; the other forms of advice did not have any significant effects. The Diet and Angina Randomized Trial (DART-2) involved 3114 men (mean age 61.1 years) with stable angina, who were followed up for 3-9 years. Advice to eat oily fish or take fish oil did not affect all-cause mortality, but it was associated with a significant increase in sudden cardiac death (P=0.018), and this effect was largely confined to the subgroup given fish oil capsules. Advice to eat more fruit and vegetables had no effect, probably because of poor compliance. The outcome of DART-2 appears to conflict with that of DART and some other studies; various possible explanations are considered. Nutritional interventions are not equally acceptable and should be tailored to the individuals for whom they are intended. Various distinct groups have a raised risk of CHD, and it cannot be assumed that the same nutritional interventions are appropriate to them all. Nutritional supplements do not necessarily have the same effects as the foods from which they are derived.", "The effect of high-protein diets on coronary blood flow. Recent research has demonstrated that successful simultaneous treatment of multiple risk factors including cholesterol, triglycerides, homocysteine, lipoprotein (a) [Lp(a)], fibrinogen, antioxidants, endothelial dysfunction, inflammation, infection, and dietary factors can lead to the regression of coronary artery disease and the recovery of viable myocardium. However, preliminary work revealed that a number of individuals enrolled in the original study went on popular high-protein diets in an effort to lose weight. Despite increasing numbers of individuals following high-protein diets, little or no information is currently available regarding the effect of these diets on coronary artery disease and coronary blood flow. Twenty-six people were studied for 1 year by using myocardial perfusion imaging (MPI), echocardiography (ECHO), and serial blood work to evaluate the extent of changes in regional coronary blood flow, regional wall motion abnormalities, and several independent variables known to be important in the development and progression of coronary artery disease. Treatment was based on homocysteine, Lp (a), C-reactive protein (C-RP), triglycerides, total cholesterol, high-density lipoprotein cholesterol, low-density lipoprotein cholesterol, very low-density lipoprotein cholesterol, and fibrinogen levels. Each variable was independently treated as previously reported. MPI and ECHO were performed at the beginning and end of the study for each individual. The 16 people (treatment group/TG) studied modified their dietary intake as instructed. Ten additional individuals elected a different dietary regimen consisting of a \\\"high-protein\\\" (high protein group/HPG) diet, which they believed would \\\"improve\\\" their overall health. Patients in the TG demonstrated a reduction in each of the independent variables studied with regression in both the extent and severity of coronary artery disease (CAD) as quantitatively measured by MPI. Recovery of viable myocardium was seen in 43.75% of myocardial segments in these patients, documented with both MPI and ECHO evaluations. Individuals in the HPG showed worsening of their independent variables. Most notably, fibrinogen, Lp (a), and C-RP increased by an average of 14%, 106%, and 61% respectively. Progression of the extent and severity of CAD was documented in each of the vascular territories with an overall cumulative progression of 39.7%. The differences between progression and extension of disease in the HPG and the regression of disease in the TG were statistically (p<0.001) significant. Patients following recommended treatment for each of the independent variables were able to regress both the extent and severity of their coronary artery disease (CAD), as well as improve their myocardial wall motion (function) while following the prescribed medical and dietary guidelines. However, individuals receiving the same medical treatment but following a high-protein diet showed a worsening of independent risk factors, in addition to progression of CAD. These results would suggest that high-protein diets may precipitate progression of CAI) through increases in lipid deposition and inflammatory and coagulation pathways.", "Vitamins E and C in the Prevention of Cardiovascular Disease in Men: The Physicians\u2019 Health Study II Randomized Trial Context Basic and observational studies suggest vitamins E or C may reduce risk of cardiovascular disease (CVD). However, few long-term trials have evaluated men at initially low risk of CVD, and no previous trial in men has examined vitamin C alone in the prevention of CVD. Objective To test whether long-term vitamin E or C supplementation decreases risk of major cardiovascular events among men. Design, Setting, and Participants The Physicians\u2019 Health Study II (PHS II) is a randomized, double-blind, placebo-controlled factorial trial of vitamins E and C that began in 1997 and continued until its scheduled completion on August 31, 2007. We enrolled 14,641 U.S. male physicians initially aged \u226550 years, including 754 (5.1%) men with prevalent CVD at randomization. Intervention Individual supplements of 400 IU vitamin E every other day and 500 mg vitamin C daily. Main Outcome Measures A composite endpoint of major cardiovascular events (nonfatal myocardial infarction (MI), nonfatal stroke, and CVD death). Results During a mean follow-up of 8.0 years, there were 1,245 confirmed major cardiovascular events. Compared with placebo, vitamin E had no effect on the incidence of major cardiovascular events (both active and placebo vitamin E groups, 10.9 events per 1,000 person-years; hazard ratio [HR], 1.01; 95% confidence interval [CI], 0.90\u20131.13; P=0.86), as well as total MI (HR, 0.90; 95% CI, 0.75\u20131.07; P=0.22), total stroke (HR, 1.07; 95% CI, 0.89\u20131.29; P=0.45), and cardiovascular mortality (HR, 1.07; 95% CI, 0.90\u20131.29; P=0.43). There was also no significant effect of vitamin C on major cardiovascular events (active and placebo vitamin E groups, 10.8 and 10.9 events per 1,000 person-years, respectively; HR, 0.99; 95% CI, 0.89\u20131.11; P=0.91), as well as total MI (HR, 1.04; 95% CI, 0.87\u20131.24; P=0.65), total stroke (HR, 0.89; 95% CI, 0.74\u20131.07; P=0.21), and cardiovascular mortality (HR, 1.02; 95% CI, 0.85\u20131.21; P=0.86). Neither vitamin E (HR, 1.07; 95% CI, 0.97\u20131.18; P=0.15) nor vitamin C (HR, 1.07; 95% CI, 0.97\u20131.18; P=0.16) had a significant effect on total mortality, but vitamin E was associated with an increased risk of hemorrhagic stroke (HR, 1.74; 95% CI, 1.04\u20132.91; P=0.036). Conclusions In this large, long-term trial of male physicians, neither vitamin E nor C supplementation reduced the risk of major cardiovascular events. These data provide no support for the use of these supplements for the prevention of CVD in middle-aged and older men.", "An archaeologic dig: a rice-fruit diet reverses ECG changes in hypertension. In 1940, a young German refugee physician scientist at Duke University in Durham, North Carolina began to treat patients with accelerated or \\\"malignant\\\" hypertension with a radical diet consisting of only white rice and fruit, with strikingly favorable results. He reported rapid reduction in blood pressure, rapid improvement in renal failure, papilledema, congestive heart failure and other manifestations of this previously fatal illness. This treatment was based on his theory that the kidney had both an excretory and a metabolic function, and that removing most of the sodium and protein burden from this organ enabled it to regain its normal ability to perform its more important metabolic functions. It was also effective in \\\"ordinary\\\" hypertension, in the absence of the dramatic vasculopathy of the accelerated form. The results were so dramatic that many experienced physicians suspected him of falsifying data. Among these results was the normalization of the ECG changes seen with hypertension. This paper reviews his published experience with this radical therapy, its controversial rise to fame, and its decline in popularity with the advent of effective antihypertensive drugs. It features the ECG changes seen in this then fatal disease, and the reversal of these changes by the rice diet. This treatment, though very difficult for the patient, produced effects which make it equal or superior to current multi-drug treatment of hypertension. A poorly known but important observation was that patients who were able to follow the regime, and who were slowly guided through a gradual modification of the diet over many months, were able to transition into a very tolerable low fat, largely vegetarian diet, while leading a normal, active life, without medications, indicating that the disease state had been permanently modified. Copyright \u00a9 2014 Elsevier Inc. All rights reserved."], ["In vitro evaluation of genotoxicity of avocado (Persea americana) fruit and leaf extracts in human peripheral lymphocytes. Persea americana is much sought after both for the nutritional value of its fruit and the medicinal values of its various plant parts. A chromosomal aberration assay was undertaken to evaluate the potential genotoxicity of crude extracts from avocado fruits and leaves. Chromosomal aberrations were observed in cultured human peripheral lymphocytes exposed to separately increasing concentrations of 50% methanolic extracts of Persea americana fruit and leaves. The groups exposed to leaf and fruit extracts, respectively, showed a concentration-dependent increase in chromosomal aberrations as compared to that in a control group. The mean percentage total aberrant metaphases at 100 mg/kg, 200 mg/kg, and 300 mg/kg concentrations of leaf extract were found respectively to be 58 \u00b1 7.05, 72 \u00b1 6.41, and 78 \u00b1 5.98, which were significantly higher (p < 0.0001 each) than that in the control group (6 \u00b1 3.39). The mean percentage total aberrant metaphases at 100 mg/kg, 200 mg/kg, and 300 mg/kg concentrations of fruit extract were found to be 18 \u00b1 5.49, 40 \u00b1 10.00, and 52 \u00b1 10.20, respectively, which were significantly higher (p = 0.033, p < 0.0001, and p < 0.0001, respectively) than that for control (6 \u00b1 3.39). Acrocentric associations and premature centromeric separation were the two most common abnormalities observed in both the exposed groups. The group exposed to leaf extracts also showed a significant number of a variety of other structural aberrations, including breaks, fragments, dicentrics, terminal deletion, minutes, and Robertsonian translocations. The group exposed to leaf extract showed higher frequency of all types of aberrations at equal concentrations as compared to the group exposed to fruit extract.", "Oxidative stability and shelf-life evaluation of selected culinary oils. Four out of eight 'healthier' oils-namely, almond oil, avocado oil, hazelnut oil and macadamia nut oil-studied were rich sources of monounsaturated fatty acids like olive oil. Grape seed oil, rice barn oil (marketed recently), toasted sesame oil and walnut oil contained high levels of essential fatty acids. The order of oxidative stability determined by Rancimat measuring of the induction period at four temperatures (90 degrees C, 100 degrees C, 110 degrees C, and 120 degrees C) was found to be macadamia oil > rice bran oil approximately toasted sesame oil > avocado oil > almond oil > hazelnut oil > grape seed oil > walnut oil. High-level monounsaturated fatty acid oils gave a linear relationship between 100 times the reciprocal of the induction period against the total unsaturated fatty acid content obtained as %C18:2 + 0.08 x C18:1 + 2.08 x %C18:3, while the polyunsaturated fatty acid oils gave an exponential relationship. In the case of rice bran and hazelnut oils, shelf-life prediction from the extrapolation of the Arrhenius plots and the Q(10) factors was compared well with that of storage time given by the oil producers. In the cases of the other oils (with an exception of macadamia nut oil), the predicted shelf-lives were significantly lower than that of the storage times; especially, walnut oil (very prone to oxidation) gave 15-20 times lower shelf-life than the best-before storage life.", "Genistein genotoxicity: critical considerations of in vitro exposure dose. The potential health benefits of soy-derived phytoestrogens include their reported utility as anticarcinogens, cardioprotectants and as hormone replacement alternatives in menopause. Although there is increasing popularity of dietary phytoestrogen supplementation and of vegetarian and vegan diets among adolescents and adults, concerns about potential detrimental or other genotoxic effects persist. While a variety of genotoxic effects of phytoestrogens have been reported in vitro, the concentrations at which such effects occurred were often much higher than the physiologically relevant doses achievable by dietary or pharmacologic intake of soy foods or supplements. This review focuses on in vitro studies of the most abundant soy phytoestrogen, genistein, critically examining dose as a crucial determinant of cellular effects. In consideration of levels of dietary genistein uptake and bioavailability we have defined in vitro concentrations of genistein >5 microM as non-physiological, and thus \\\"high\\\" doses, in contrast to much of the previous literature. In doing so, many of the often-cited genotoxic effects of genistein, including apoptosis, cell growth inhibition, topoisomerase inhibition and others become less obvious. Recent cellular, epigenetic and microarray studies are beginning to decipher genistein effects that occur at dietarily relevant low concentrations. In toxicology, the well accepted principle of \\\"the dose defines the poison\\\" applies to many toxicants and can be invoked, as herein, to distinguish genotoxic versus potentially beneficial in vitro effects of natural dietary products such as genistein.", "Time- and dose-dependent effects of roundup on human embryonic and placental cells. Roundup is the major herbicide used worldwide, in particular on genetically modified plants that have been designed to tolerate it. We have tested the toxicity and endocrine disruption potential of Roundup (Bioforce on human embryonic 293 and placental-derived JEG3 cells, but also on normal human placenta and equine testis. The cell lines have proven to be suitable to estimate hormonal activity and toxicity of pollutants. The median lethal dose (LD(50)) of Roundup with embryonic cells is 0.3% within 1 h in serum-free medium, and it decreases to reach 0.06% (containing among other compounds 1.27 mM glyphosate) after 72 h in the presence of serum. In these conditions, the embryonic cells appear to be 2-4 times more sensitive than the placental ones. In all instances, Roundup (generally used in agriculture at 1-2%, i.e., with 21-42 mM glyphosate) is more efficient than its active ingredient, glyphosate, suggesting a synergistic effect provoked by the adjuvants present in Roundup. We demonstrated that serum-free cultures, even on a short-term basis (1 h), reveal the xenobiotic impacts that are visible 1-2 days later in serum. We also document at lower non-overtly toxic doses, from 0.01% (with 210 microM glyphosate) in 24 h, that Roundup is an aromatase disruptor. The direct inhibition is temperature-dependent and is confirmed in different tissues and species (cell lines from placenta or embryonic kidney, equine testicular, or human fresh placental extracts). Furthermore, glyphosate acts directly as a partial inactivator on microsomal aromatase, independently of its acidity, and in a dose-dependent manner. The cytotoxic, and potentially endocrine-disrupting effects of Roundup are thus amplified with time. Taken together, these data suggest that Roundup exposure may affect human reproduction and fetal development in case of contamination. Chemical mixtures in formulations appear to be underestimated regarding their toxic or hormonal impact.", "Assessment of vitamin and carotenoid concentrations of emerging food products: edible microgreens. Microgreens (seedlings of edible vegetables and herbs) have gained popularity as a new culinary trend over the past few years. Although small in size, microgreens can provide surprisingly intense flavors, vivid colors, and crisp textures and can be served as an edible garnish or a new salad ingredient. However, no scientific data are currently available on the nutritional content of microgreens. The present study was conducted to determine the concentrations of ascorbic acid, carotenoids, phylloquinone, and tocopherols in 25 commercially available microgreens. Results showed that different microgreens provided extremely varying amounts of vitamins and carotenoids. Total ascorbic acid contents ranged from 20.4 to 147.0 mg per 100 g fresh weight (FW), while \u03b2-carotene, lutein/zeaxanthin, and violaxanthin concentrations ranged from 0.6 to 12.1, 1.3 to 10.1, and 0.9 to 7.7 mg/100 g FW, respectively. Phylloquinone level varied from 0.6 to 4.1 \u03bcg/g FW; meanwhile, \u03b1-tocopherol and \u03b3-tocopherol ranged from 4.9 to 87.4 and 3.0 to 39.4 mg/100 g FW, respectively. Among the 25 microgreens assayed, red cabbage, cilantro, garnet amaranth, and green daikon radish had the highest concentrations of ascorbic acids, carotenoids, phylloquinone, and tocopherols, respectively. In comparison with nutritional concentrations in mature leaves (USDA National Nutrient Database), the microgreen cotyledon leaves possessed higher nutritional densities. The phytonutrient data may provide a scientific basis for evaluating nutritional values of microgreens and contribute to food composition database. These data also may be used as a reference for health agencies' recommendations and consumers' choices of fresh vegetables."], ["Paleolithic nutrition: twenty-five years later. A quarter century has passed since the first publication of the evolutionary discordance hypothesis, according to which departures from the nutrition and activity patterns of our hunter-gatherer ancestors have contributed greatly and in specifically definable ways to the endemic chronic diseases of modern civilization. Refinements of the model have changed it in some respects, but anthropological evidence continues to indicate that ancestral human diets prevalent during our evolution were characterized by much lower levels of refined carbohydrates and sodium, much higher levels of fiber and protein, and comparable levels of fat (primarily unsaturated fat) and cholesterol. Physical activity levels were also much higher than current levels, resulting in higher energy throughput. We said at the outset that such evidence could only suggest testable hypotheses and that recommendations must ultimately rest on more conventional epidemiological, clinical, and laboratory studies. Such studies have multiplied and have supported many aspects of our model, to the extent that in some respects, official recommendations today have targets closer to those prevalent among hunter-gatherers than did comparable recommendations 25 years ago. Furthermore, doubts have been raised about the necessity for very low levels of protein, fat, and cholesterol intake common in official recommendations. Most impressively, randomized controlled trials have begun to confirm the value of hunter-gatherer diets in some high-risk groups, even as compared with routinely recommended diets. Much more research needs to be done, but the past quarter century has proven the interest and heuristic value, if not yet the ultimate validity, of the model.", "BEYOND THE PALEOLITHIC PRESCRIPTION: INCORPORATING DIVERSITY AND FLEXIBILITY IN THE STUDY OF HUMAN DIET EVOLUTION Evolutionary paradigms of human health and nutrition center on the evolutionary discordance or \u201cmismatch\u201d model whereby human bodies, reflecting adaptations established in the Paleolithic era, are ill-suited to modern industrialized diets resulting in rapidly increasing rates of chronic metabolic disease. Whereas this model remains useful, we argue that its utility in explaining the evolution of human dietary tendencies is limited. The assumption that human diets are mismatched to our evolved biology implies that they are instinctual or genetically determined and rooted in the Paleolithic. We review current research indicating that human eating habits are primarily learned through behavioral, social and physiological mechanisms starting in utero and extending throughout the life course. Those adaptations that appear to be strongly genetic likely reflect Neolithic, rather than Paleolithic, adaptations and are significantly influenced by human niche-constructing behavior. Incorporating a broader understanding of the evolved mechanisms by which humans learn and imprint eating habits and the reciprocal effects of those habits on physiology would provide useful tools for structuring more lasting nutrition interventions.", "Paleolithic vs. modern diets--selected pathophysiological implications. The nutritional patterns of Paleolithic humans influenced genetic evolution during the time segment within which defining characteristics of contemporary humans were selected. Our genome can have changed little since the beginnings of agriculture, so, genetically, humans remain Stone Agers--adapted for a Paleolithic dietary regimen. Such diets were based chiefly on wild game, fish and uncultivated plant foods. They provided abundant protein; a fat profile much different from that of affluent Western nations; high fibre; carbohydrate from fruits and vegetables (and some honey) but not from cereals, refined sugars and dairy products; high levels of micronutrients and probably of phytochemicals as well. Differences between contemporary and ancestral diets have many pathophysiological implications. This review addresses phytochemicals and cancer; calcium, physical exertion, bone mineral density and bone structural geometry; dietary protein, potassium, renal acid secretion and urinary calcium loss; and finally sarcopenia, adiposity, insulin receptors and insulin resistance. While not, yet, a basis for formal recommendations, awareness of Paleolithic nutritional patterns should generate novel, testable hypotheses grounded in evolutionary theory and it should dispel complacency regarding currently accepted nutritional tenets.", "Evolution of the human diet: linking our ancestral diet to modern functional foods as a means of chronic disease prevention. The evolution of the human diet over the past 10,000 years from a Paleolithic diet to our current modern pattern of intake has resulted in profound changes in feeding behavior. Shifts have occurred from diets high in fruits, vegetables, lean meats, and seafood to processed foods high in sodium and hydrogenated fats and low in fiber. These dietary changes have adversely affected dietary parameters known to be related to health, resulting in an increase in obesity and chronic disease, including cardiovascular disease (CVD), diabetes, and cancer. Some intervention trials using Paleolithic dietary patterns have shown promising results with favorable changes in CVD and diabetes risk factors. However, such benefits may be offset by disadvantages of the Paleolithic diet, which is low in vitamin D and calcium and high in fish potentially containing environmental toxins. More advantageous would be promotion of foods and food ingredients from our ancestral era that have been shown to possess health benefits in the form of functional foods. Many studies have investigated the health benefits of various functional food ingredients, including omega-3 fatty acids, polyphenols, fiber, and plant sterols. These bioactive compounds may help to prevent and reduce incidence of chronic diseases, which in turn could lead to health cost savings ranging from $2 to $3 billion per year as estimated by case studies using omega-3 and plant sterols as examples. Thus, public health benefits should result from promotion of the positive components of Paleolithic diets as functional foods.", "An archaeologic dig: a rice-fruit diet reverses ECG changes in hypertension. In 1940, a young German refugee physician scientist at Duke University in Durham, North Carolina began to treat patients with accelerated or \\\"malignant\\\" hypertension with a radical diet consisting of only white rice and fruit, with strikingly favorable results. He reported rapid reduction in blood pressure, rapid improvement in renal failure, papilledema, congestive heart failure and other manifestations of this previously fatal illness. This treatment was based on his theory that the kidney had both an excretory and a metabolic function, and that removing most of the sodium and protein burden from this organ enabled it to regain its normal ability to perform its more important metabolic functions. It was also effective in \\\"ordinary\\\" hypertension, in the absence of the dramatic vasculopathy of the accelerated form. The results were so dramatic that many experienced physicians suspected him of falsifying data. Among these results was the normalization of the ECG changes seen with hypertension. This paper reviews his published experience with this radical therapy, its controversial rise to fame, and its decline in popularity with the advent of effective antihypertensive drugs. It features the ECG changes seen in this then fatal disease, and the reversal of these changes by the rice diet. This treatment, though very difficult for the patient, produced effects which make it equal or superior to current multi-drug treatment of hypertension. A poorly known but important observation was that patients who were able to follow the regime, and who were slowly guided through a gradual modification of the diet over many months, were able to transition into a very tolerable low fat, largely vegetarian diet, while leading a normal, active life, without medications, indicating that the disease state had been permanently modified. Copyright \u00a9 2014 Elsevier Inc. All rights reserved."], ["Plant-derived health: the effects of turmeric and curcuminoids. Plants contain numerous polyphenols, which have been shown to reduce inflammation and hereby to increase resistance to disease. Examples of such polyphenols are isothiocyanates in cabbage and broccoli, epigallocatechin in green tee, capsaicin in chili peppers, chalones, rutin and naringenin in apples, resveratrol in red wine and fresh peanuts and curcumin/curcuminoids in turmeric. Most diseases are maintained by a sustained discreet but obvious increased systemic inflammation. Many studies suggest that the effect of treatment can be improved by a combination of restriction in intake of proinflammatory molecules such as advanced glycation end products (AGE), advanced lipoperoxidation end products (ALE), and rich supply of antiinflammatory molecules such as plant polyphenols. To the polyphenols with a bulk of experimental documentation belong the curcuminoid family and especially its main ingredient, curcumin. This review summarizes the present knowledge about these turmericderived ingredients, which have proven to be strong antioxidants and inhibitors of cyclooxigenase-2 (COX-2), lipoxygenase (LOX) and nuclear factor kappa B (NF-kappaB) but also AGE. A plethora of clinical effects are reported in various experimental diseases, but clinical studies in humans are few. It is suggested that supply of polyphenols and particularly curcuminoids might be value as complement to pharmaceutical treatment, but also prebiotic treatment, in conditions proven to be rather therapy-resistant such as Crohn's, long-stayed patients in intensive care units, but also in conditions such as cancer, liver cirrhosis, chronic renal disease, chronic obstructive lung disease, diabetes and Alzheimer's disease.", "Multitargeting by turmeric, the golden spice: From kitchen to clinic. Although much has been published about curcumin, which is obtained from turmeric, comparatively little is known about turmeric itself. Turmeric, a golden spice obtained from the rhizome of the plant Curcuma longa, has been used to give color and taste to food preparations since ancient times. Traditionally, this spice has been used in Ayurveda and folk medicine for the treatment of such ailments as gynecological problems, gastric problems, hepatic disorders, infectious diseases, and blood disorders. Modern science has provided the scientific basis for the use of turmeric against such disorders. Various chemical constituents have been isolated from this spice, including polyphenols, sesquiterpenes, diterpenes, triterpenoids, sterols, and alkaloids. Curcumin, which constitutes 2-5% of turmeric, is perhaps the most-studied component. Although some of the activities of turmeric can be mimicked by curcumin, other activities are curcumin-independent. Cell-based studies have demonstrated the potential of turmeric as an antimicrobial, insecticidal, larvicidal, antimutagenic, radioprotector, and anticancer agent. Numerous animal studies have shown the potential of this spice against proinflammatory diseases, cancer, neurodegenerative diseases, depression, diabetes, obesity, and atherosclerosis. At the molecular level, this spice has been shown to modulate numerous cell-signaling pathways. In clinical trials, turmeric has shown efficacy against numerous human ailments including lupus nephritis, cancer, diabetes, irritable bowel syndrome, acne, and fibrosis. Thus, a spice originally common in the kitchen is now exhibiting activities in the clinic. In this review, we discuss the chemical constituents of turmeric, its biological activities, its molecular targets, and its potential in the clinic. \u00a9 2012 WILEY-VCH Verlag GmbH & Co. KGaA, Weinheim.", "Curcumin as \\\"Curecumin\\\": from kitchen to clinic. Although turmeric (Curcuma longa; an Indian spice) has been described in Ayurveda, as a treatment for inflammatory diseases and is referred by different names in different cultures, the active principle called curcumin or diferuloylmethane, a yellow pigment present in turmeric (curry powder) has been shown to exhibit numerous activities. Extensive research over the last half century has revealed several important functions of curcumin. It binds to a variety of proteins and inhibits the activity of various kinases. By modulating the activation of various transcription factors, curcumin regulates the expression of inflammatory enzymes, cytokines, adhesion molecules, and cell survival proteins. Curcumin also downregulates cyclin D1, cyclin E and MDM2; and upregulates p21, p27, and p53. Various preclinical cell culture and animal studies suggest that curcumin has potential as an antiproliferative, anti-invasive, and antiangiogenic agent; as a mediator of chemoresistance and radioresistance; as a chemopreventive agent; and as a therapeutic agent in wound healing, diabetes, Alzheimer disease, Parkinson disease, cardiovascular disease, pulmonary disease, and arthritis. Pilot phase I clinical trials have shown curcumin to be safe even when consumed at a daily dose of 12g for 3 months. Other clinical trials suggest a potential therapeutic role for curcumin in diseases such as familial adenomatous polyposis, inflammatory bowel disease, ulcerative colitis, colon cancer, pancreatic cancer, hypercholesteremia, atherosclerosis, pancreatitis, psoriasis, chronic anterior uveitis and arthritis. Thus, curcumin, a spice once relegated to the kitchen shelf, has moved into the clinic and may prove to be \\\"Curecumin\\\".", "Dietary turmeric potentially reduces the risk of cancer. Turmeric, a plant rhizome that is often dried, ground and used as a cooking spice, has also been used medicinally for several thousand years. Curcumin, the phytochemical that gives turmeric its golden color, is responsible for most of the therapeutic effects of turmeric. In recent years curcumin has been studied for its effects on chronic diseases such as diabetes, Alzheimer's, and cancer. Though many researchers are investigating turmeric/curcumin in cancer therapy, there is little epidemiologic information on the effects of turmeric consumption. With limited availability of pharmacologic interventions in many areas of the world, use of turmeric in the diet may help to alleviate some of the disease burden through prevention. Here we provide a brief overview of turmeric consumption in different parts of the world, cancer rates in those regions, possible biochemical mechanisms by which turmeric acts and practical recommendations based on the information available.", "Curcumin in inflammatory diseases. Curcumin (diferuloylmethane), a yellow coloring agent extracted from turmeric is also used as a remedy for the treatment and prevention of inflammatory diseases. Acute and chronic inflammation is a major factor in the progression of obesity, type II diabetes, arthritis, pancreatitis, cardiovascular, neurodegenerative and metabolic diseases, as well as certain types of cancer. Turmeric has a long history of use in Ayurvedic medicine for the treatment of inflammatory disorders. Recent studies on the efficacy and therapeutic applicability of turmeric have suggested that the active ingredient of tumeric is curcumin. Further, compelling evidence has shown that curcumin has the ability to inhibit inflammatory cell proliferation, invasion, and angiogenesis through multiple molecular targets and mechanisms of action. Curcumin is safe, non-toxic, and mediates its anti-inflammatory effects through the down-regulation of inflammatory transcription factors, cytokines, redox status, protein kinases, and enzymes that all promote inflammation. In addition, curcumin induces apoptosis through mitochondrial and receptor-mediated pathways, as well as activation of caspase cascades. In the current study, the anti-inflammatory effects of curcumin were evaluated relative to various chronic inflammatory diseases. Based on the available pharmacological data obtained from in vitro and in vivo research, as well as clinical trials, an opportunity exists to translate curcumin into clinics for the prevention of inflammatory diseases in the near future. Copyright \u00a9 2012 International Union of Biochemistry and Molecular Biology, Inc."], ["Anaphylaxis to annatto dye: a case report. Annatto dye is an orange-yellow food coloring extracted from the seeds of the tree Bixa orellana. It is commonly used in cheeses, snack foods, beverages, and cereals. Previously reported adverse reactions associated with annatto dye have included urticaria and angioedema. We present a patient who developed urticaria, angioedema, and severe hypotension within 20 minutes following ingestion of milk and Fiber One cereal, which contained annatto dye. Subsequent skin tests to milk, wheat, and corn were negative. The patient had a strong positive skin test to annatto dye, while controls had no response. The nondialyzable fraction of annatto dye on SDS-PAGE demonstrated two protein staining bands in the range of 50 kD. Immunoblotting demonstrated patient IgE-specific for one of these bands, while controls showed no binding. Annatto dye may contain contaminating or residual seed proteins to which our patient developed IgE hypersensitivity. Annatto dye is a potential rare cause of anaphylaxis.", "Toxicology of food dyes. BACKGROUND: Food dyes, synthesized originally from coal tar and now petroleum, have long been controversial because of safety concerns. Many dyes have been banned because of their adverse effects on laboratory animals or inadequate testing. CONCLUSIONS: This review finds that all of the nine currently US-approved dyes raise health concerns of varying degrees. Red 3 causes cancer in animals, and there is evidence that several other dyes also are carcinogenic. Three dyes (Red 40, Yellow 5, and Yellow 6) have been found to be contaminated with benzidine or other carcinogens. At least four dyes (Blue 1, Red 40, Yellow 5, and Yellow 6) cause hypersensitivity reactions. Numerous microbiological and rodent studies of Yellow 5 were positive for genotoxicity. Toxicity tests on two dyes (Citrus Red 2 and Orange B) also suggest safety concerns, but Citrus Red 2 is used at low levels and only on some Florida oranges and Orange B has not been used for several years. The inadequacy of much of the testing and the evidence for carcinogenicity, genotoxicity, and hypersensitivity, coupled with the fact that dyes do not improve the safety or nutritional quality of foods, indicates that all of the currently used dyes should be removed from the food supply and replaced, if at all, by safer colorings. It is recommended that regulatory authorities require better and independent toxicity testing, exercise greater caution regarding continued approval of these dyes, and in the future approve only well-tested, safe dyes.", "Final report on the safety assessment of capsicum annuum extract, capsicum annuum fruit extract, capsicum annuum resin, capsicum annuum fruit powde... Capsicum-derived ingredients function as skin-conditioning agents--miscellaneous, external analgesics, flavoring agents, or fragrance components in cosmetics. These ingredients are used in 19 cosmetic products at concentrations as high as 5%. Cosmetic-grade material may be extracted using hexane, ethanol, or vegetable oil and contain the full range of phytocompounds that are found in the Capsicum annuum or Capsicum frutescens plant (aka red chiles), including Capsaicin. Aflatoxin and N-nitroso compounds (N-nitrosodimethylamine and N-nitrosopyrrolidine) have been detected as contaminants. The ultraviolet (UV) absorption spectrum for Capsicum Annuum Fruit Extract indicates a small peak at approximately 275 nm, and a gradual increase in absorbance, beginning at approximately 400 nm. Capsicum and paprika are generally recognized as safe by the U.S. Food and Drug Administration for use in food. Hexane, chloroform, and ethyl acetate extracts of Capsicum Frutescens Fruit at 200 mg/kg resulted in death of all mice. In a short-term inhalation toxicity study using rats, no difference was found between vehicle control and a 7% Capsicum Oleoresin solution. In a 4-week feeding study, red chilli (Capsicum annuum) in the diet at concentrations up to 10% was relatively nontoxic in groups of male mice. In an 8-week feeding study using rats, intestinal exfoliation, cytoplasmic fatty vacuolation and centrilobular necrosis of hepatocytes, and aggregation of lymphocytes in the portal areas were seen at 10% Capsicum Frutescens Fruit, but not 2%. Rats fed 0.5 g/kg day-1 crude Capsicum Fruit Extract for 60 days exhibited no significant gross pathology at necropsy, but slight hyperemia of the liver and reddening of the gastric mucosa were observed. Weanling rats fed basal diets supplemented with whole red pepper at concentrations up to 5.0% for up to 8 weeks had no pathology of the large intestines, livers, and kidneys, but destruction of the taste buds and keratinization and erosion of the gastrointestinal (GI) tract were noted in groups fed 0.5% to 5.0% red pepper. The results of 9-and 12-month extension of this study showed normal large intestines and kidneys. In rabbits fed Capsicum Annuum Powder at 5 mg/kg day-1 in the diet daily for 12 months damage to the liver and spleen was noted. A rabbit skin irritation test of Capsicum Annuum Fruit Extract at concentrations ranging from 0.1% to 1.0% produced no irritation, but Capsicum Frutescens Fruit Extract induced concentration-dependent (at 25 to 500 microg/ml) cytotoxicity in a human buccal mucosa fibroblast cell line. An ethanol extract of red chili was mutagenic in Salmonella typhimurium TA98, but not in TA100, or in Escherichia coli. Other genotoxicity assays gave a similar pattern of mixed results. Adenocarcinoma of the abdomen was observed in 7/20 mice fed 100 mg red chilies per day for 12 months; no tumors were seen in control animals. Neoplastic changes in the liver and intestinal tumors were observed in rats fed red chili powder at 80 mg/kg day-1 for 30 days, intestinal and colon tumors were seen in rats fed red chili powder and 1,2-dimethyl hydrazine, but no tumors were observed in controls. In another study in rats, however, red chile pepper in the diet at the same dose decreased the number of tumors seen with 1,2-dimethylhydrazine. Other feeding studies evaluated the effect of red chili peppers on the incidence of stomach tumors produced by N-methyl-N'-nitro-N-nitrosoguanidine, finding that red pepper had a promoting effect. Capsicum Frutescens Fruit Extract promoted the carcinogenic effect of methyl(acetoxymethyl)nitrosamine (carcinogen) or benzene hexachloride (hepatocarcinogen) in inbred male and female Balb/c mice dosed orally (tongue application). Clinical findings include symptoms of cough, sneezing, and runny nose in chili factory workers. Human respiratory responses to Capsicum Oleoresin spray include burning of the throat, wheezing, dry cough, shortness of breath, gagging, gasping, inability to breathe or speak, and, rarely, cyanosis, apnea, and respiratory arrest. A trade name mixture containing 1% to 5% Capsicum Frutescens Fruit Extract induced very slight erythema in 1 of 10 volunteers patch tested for 48 h. Capsicum Frutescens Fruit Extract at 0.025% in a repeated-insult patch test using 103 subjects resulted in no clinically meaningful irritation or allergic contact dermatitis. One epidemiological study indicated that chili pepper consumption may be a strong risk factor for gastric cancer in populations with high intakes of chili pepper; however, other studies did not find this association. Capsaicin functions as an external analgesic, a fragrance ingredient, and as a skin-conditioning agent--miscellaneous in cosmetic products, but is not in current use. Capsaicin is not generally recognized as safe and effective by the U.S. Food and Drug Administration for fever blister and cold sore treatment, but is considered to be safe and effective as an external analgesic counterirritant. Ingested Capsaicin is rapidly absorbed from the stomach and small intestine in animal studies. Subcutaneous injection of Capsaicin in rats resulted in a rise in the blood concentration, reaching a maximum at 5 h; the highest tissue concentrations were in the kidney and lowest in the liver. In vitro percutaneous absorption of Capsaicin has been demonstrated in human, rat, mouse, rabbit, and pig skin. Enhancement of the skin permeation of naproxen (nonsteroidal anti-inflammatory agent) in the presence of Capsaicin has also been demonstrated. Pharmacological and physiological studies demonstrated that Capsaicin, which contains a vanillyl moiety, produces its sensory effects by activating a Ca2 +-permeable ion channel on sensory neurons. Capsaicin is a known activator of vanilloid receptor 1. Capsaicin-induced stimulation of prostaglandin biosynthesis has been shown using bull seminal vesicles and rheumatoid arthritis synoviocytes. Capsaicin inhibits protein synthesis in Vero kidney cells and human neuroblastoma SHSY-5Y cells in vitro, and inhibits growth of E. coli, Pseudomonas solanacearum, and Bacillus subtilis bacterial cultures, but not Saccharomyces cerevisiae. Oral LD50 values as low as 161.2 mg/kg (rats) and 118.8 mg/kg (mice) have been reported for Capsaicin in acute oral toxicity studies, with hemorrhage of the gastric fundus observed in some of the animals that died. Intravenous, intraperitoneal, and subcutaneous LD50 values were lower. In subchronic oral toxicity studies using mice, Capsaicin produced statistically significant differences in the growth rate and liver/body weight increases. Capsaicin is an ocular irritant in mice, rats, and rabbits. Dose-related edema was observed in animals receiving Capsaicin injections into the hindpaw (rats) or application to the ear (mice). In guinea pigs, dinitrochlorobenzene contact dermatitis was enhanced in the presence of Capsaicin, injected subcutaneously, whereas dermal application inhibited sensitization in mice. Immune system effects have been observed in neonatal rats injected subcutaneously with Capsaicin. Capsaicin produced mixed results in S. typhimurium micronucleus and sister-chromatid exchange genotoxicity assays. Positive results for Capsaicin were reported in DNA damage assays. Carcinogenic, cocarcinogenic, anticarcinogenic, antitumorigenic, tumor promotion, and anti-tumor promotion effects of Capsaicin have been reported in animal studies. Except for a significant reduction in crown-rump length in day 18 rats injected subcutaneously with Capsaicin (50 mg/kg) on gestation days 14, 16, 18, or 20, no reproductive or developmental toxicity was noted. In pregnant mice dosed subcutaneously with Capsaicin, depletion of substance P in the spinal cord and peripheral nerves of pregnant females and fetuses was noted. In clinical tests, nerve degeneration of intracutaneous nerve fibers and a decrease in pain sensation induced by heat and mechanical stimuli were evident in subjects injected intradermally with Capsaicin. An increase in mean inspiratory flow was reported for eight normal subjects who inhaled nebulized 10(-7) M Capsaicin. The results of provocative and predictive tests involving human subjects indicated that Capsaicin is a skin irritant. Overall, studies suggested that these ingredients can be irritating at low concentrations. Although the genotoxicity, carcinogenicity, and tumor promotion potential of Capsaicin have been demonstrated, so have opposite effects. Skin irritation and other tumor-promoting effects of Capsaicin appear to be mediated through interaction with the same vanilloid receptor. Given this mechanism of action and the observation that many tumor promoters are irritating to the skin, the Panel considered it likely that a potent tumor promoter may also be a moderate to severe skin irritant. Thus, a limitation on Capsaicin content that would significantly reduce its skin irritation potential is expected to, in effect, lessen any concerns relating to tumor promotion potential. Because Capsaicin enhanced the penetration of an anti-inflammatory agent through human skin, the Panel recommends that care should be exercised in using ingredients that contain Capsaicin in cosmetic products. The Panel advised industry that the total polychlorinated biphenyl (PCB)/pesticide contamination should be limited to not more than 40 ppm, with not more than 10 ppm for any specific residue, and agreed on the following limitations for other impurities: arsenic (3 mg/kg max), heavy metals (0.002% max), and lead (5 mg/kg max). Industry was also advised that aflatoxin should not be present in these ingredients (the Panel adopted < or =15 ppb as corresponding to \\\"negative\\\" aflatoxin content), and that ingredients derived from Capsicum annuum and Capsicum Frutescens Plant species should not be used in products where N-nitroso compounds may be formed. (ABSTRACT TRUNCATED)", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "Carcinogenicity and regulation of caramel colorings. 2- and 4-methylimidazoles are present as contaminants in caramel colorings manufactured with ammonia catalysts. Both contaminants have been shown to induce cancer in animals and may be present in caramel colorings in amounts that exceed federal guidelines. California requires warning notices on products that could lead to consumption of more than 30 micrograms per day. The US Food and Drug Administration should bar the use of excessively contaminated caramel coloring in food."], ["Effect of freezing and storage on the phenolics, ellagitannins, flavonoids, and antioxidant capacity of red raspberries. Scottish-grown red raspberries are a rich source of vitamin C and phenolics, most notably, the anthocyanins cyanidin-3-sophoroside, cyanidin-3-(2(G)-glucosylrutinoside), and cyanidin-3-glucoside, and two ellagitannins, sanguiin H-6 and lambertianin C, which are present together with trace levels of flavonols, ellagic acid, and hydroxycinnamates. The antioxidant capacity of the fresh fruit and the levels of vitamin C and phenolics were not affected by freezing. When fruit were stored at 4 degrees C for 3 days and then at 18 degrees C for 24 h, mimicking the route fresh fruit takes after harvest to the supermarket and onto the consumer's table, anthocyanin levels were unaffected while vitamin C levels declined and those of elligitannins increased, and overall, there was no effect on the antioxidant capacity of the fruit. It is concluded, therefore, that freshly picked, fresh commercial, and frozen raspberries all contain similar levels of phytochemicals and antioxidants per serving.", "Differences in antioxidant levels of fresh, frozen and freeze-dried strawberries and strawberry jam. The present study was conducted to determine differences in antioxidant levels of fresh, frozen, and freeze-dried strawberries, and strawberry jam. Hydrophilic antioxidant activity (HAA) and lipophilic antioxidant activity (LAA) were measured using the ABTS/H\u2082O\u2082/HRP decoloration method. HAA and LAA were then summed to calculate the total antioxidant activity (TAA). Mean differences in HAA and LAA were analyzed using one-way analysis of variance and Dunnett's T3 pairwise comparisons. The mean TAA for freeze-dried strawberries based on an 'as consumed' weight (95% confidence interval [CI]: 29.58, 30.58) was significantly higher than for fresh (95% CI: 3.18, 3.66), frozen (95% CI: 2.58, 2.79), and jam (95% CI: 1.10, 1.22). The mean TAA based on dry weight for fresh strawberries (95% CI: 40.48, 46.67) was significantly higher than for freeze-dried (95% CI: 29.58, 30.58), frozen (95% CI: 24.62, 26.59), and jam (95% CI: 1.48, 1.64). Results agree with previous studies reporting that strawberries are a valuable source of antioxidants for consumers.", "Processed tart cherry products--comparative phytochemical content, in vitro antioxidant capacity and in vitro anti-inflammatory activity. Processing of fruits and vegetables affects their phytochemical and nutrient content. Tart cherries are commercially promoted to possess antioxidant and anti-inflammatory activity. However, processing affects their phytochemical content and may affect their related health benefits. The current study compares the in vitro antioxidant capacity and anti-inflammatory cyclooxygenase activity of processed tart cherry (Prunus cerasus) products-cherry juice concentrate, individually quick-frozen cherries, canned cherries, and dried cherries. Cherry products were analyzed for total anthocyanin and proanthocyanidin content and profile. On a per serving basis, total anthocyanins were highest in frozen cherries and total proanthocyanidins were highest in juice concentrate. Total phenolics were highest in juice concentrate. Juice concentrate had the highest oxygen radical absorbance capacity (ORAC) and peroxynitrite radical averting capacity (NORAC). Dried cherries had the highest hydroxyl radical averting capacity (HORAC) and superoxide radical averting capacity (SORAC). Processed tart cherry products compared very favorably to the U.S. Dept. of Agriculture-reported ORAC of other fresh and processed fruits. Inhibition of in vitro inflammatory COX-1 activity was greatest in juice concentrate. In summary, all processed tart cherry products possessed antioxidant and anti-inflammatory activity, but processing differentially affected phytochemical content and in vitro bioactivity. On a per serving basis, juice concentrate was superior to other tart cherry products. \u00a9 2012 Institute of Food Technologists\u00ae", "Effect of fresh fruit consumption on lung function and wheeze in children BACKGROUND: Fresh fruit consumption and vitamin C intake have been associated with improved lung function in adults. Whether this is due to enhancement of lung growth, to a reduction in lung function decline, or to protection against bronchospasm is unclear. METHODS: In a cross- sectional school based survey of 2650 children aged 8-11 from 10 towns in England and Wales the main outcome measure was forced expiratory volume in one second (FEV1) standardised for body size and sex. Exposure was assessed by a food frequency questionnaire to parents and by measurement of plasma levels of vitamin C in a subsample of 278 children. RESULTS: FEV1 was positively associated with frequency of fresh fruit consumption. After adjustment for possible confounding variables including social class and passive smoking, those who never ate any fresh fruit had an estimated FEV1 some 79 ml (4.3%) lower than those who ate these items more than once a day (95% CI 22 to 136 ml). The association between FEV1 and fruit consumption was stronger in subjects with wheeze than in non-wheezers (p = 0.020 for difference in trend), though wheeze itself was not related to fresh fruit consumption. Frequency of consumption of salads and of green vegetables were both associated with FEV1 but the relationships were weaker than for fresh fruit. Plasma vitamin C levels were unrelated to FEV1 (r = - 0.01, p = 0.92) or to wheeze and were only weakly related to fresh fruit consumption (r = 0.13, p = 0.055). CONCLUSIONS: Fresh fruit consumption appears to have a beneficial effect on lung function in children. Further work is needed to confirm whether the effect is restricted to subjects who wheeze and to identify the specific nutrient involved.", "Comparison of health-relevant flavonoids in commonly consumed cranberry products. The human health benefits from consumption of cranberry products have been associated with the fruits' unique flavonoid composition, including a complex profile of anthocyanins and proanthocyanidins. However, when processed by techniques such as pressing, canning, concentrating, or drying, a number of these natural components may be compromised or inactivated due to physical separation, thermal degradation, or oxidation. Fresh cranberries were compared to freeze-dried berries and individual fruit tissues (skin and peeled fruit). Products examined included cranberry juices (commercial and prepared from concentrate), cranberry sauces (commercial and homemade), and sweetened-dried cranberries (commercial). Freeze-drying resulted in no detectable losses of anthocyanins or proanthocyanidins from cranberry fruits. Anthocyanins were localized in the skin. Proanthocyanins were higher in the skin than in the flesh, with the exception of procyanidin A-2 dimer which was concentrated in the flesh. Anthocyanins were significantly higher in not-from-concentrate juice than in reconstituted juice from concentrate (8.3 mg and 4.2 mg/100 mL, respectively). Similarly, proanthocyanidins were markedly higher in not-from-concentrate juice compared to juice from concentrate (23.0 mg and 8.9 mg/100 mL, respectively). Homemade sauce contained far higher anthocyanins and proanthocyanidins (15.9 and 87.9 mg/100 g, respectively) than canned sauces processed with whole berries (9.6 and 54.4 mg/100 g, respectively) or jelled-type (1.1 and 16 mg/100 g, respectively). Sweetened-dried cranberries were quite low in anthocyanins (7.9 mg/100 g), but they still retained considerable proanthocyanidins (64.2 mg/100 g). Commercially processed products contained significantly lower levels of polyphenols as compared to fresh and home-processed preparations. Anthocyanins were more sensitive to degradation than proanthocyanidins. PRACTICAL APPLICATION: As cranberry juices and other products are increasingly consumed for their recognized health benefits (including prophylaxis against urinary tract infection), it is relevant to consider how various degrees of commercial and home processing can alter innate levels of the biologically active flavonoids (especially anthocyanins and proanthocyanidins) characteristic to the intact fruits. \u00a9 2012 Institute of Food Technologists\u00ae"], ["Incorporation of EPA and DHA into plasma phospholipids in response to different omega-3 fatty acid formulations - a comparative bioavailability study of fish oil vs. krill oil Background Bioavailability of omega-3 fatty acids (FA) depends on their chemical form. Superior bioavailability has been suggested for phospholipid (PL) bound omega-3 FA in krill oil, but identical doses of different chemical forms have not been compared. Methods In a double-blinded crossover trial, we compared the uptake of three EPA+DHA formulations derived from fish oil (re-esterified triacylglycerides [rTAG], ethyl-esters [EE]) and krill oil (mainly PL). Changes of the FA compositions in plasma PL were used as a proxy for bioavailability. Twelve healthy young men (mean age 31 y) were randomized to 1680 mg EPA+DHA given either as rTAG, EE or krill oil. FA levels in plasma PL were analyzed pre-dose and 2, 4, 6, 8, 24, 48, and 72 h after capsule ingestion. Additionally, the proportion of free EPA and DHA in the applied supplements was analyzed. Results The highest incorporation of EPA+DHA into plasma PL was provoked by krill oil (mean AUC0-72 h: 80.03 \u00b1 34.71%*h), followed by fish oil rTAG (mean AUC0-72 h: 59.78 \u00b1 36.75%*h) and EE (mean AUC0-72 h: 47.53 \u00b1 38.42%*h). Due to high standard deviation values, there were no significant differences for DHA and the sum of EPA+DHA levels between the three treatments. However, a trend (p = 0.057) was observed for the differences in EPA bioavailability. Statistical pair-wise group comparison's revealed a trend (p = 0.086) between rTAG and krill oil. FA analysis of the supplements showed that the krill oil sample contained 22% of the total EPA amount as free EPA and 21% of the total DHA amount as free DHA, while the two fish oil samples did not contain any free FA. Conclusion Further studies with a larger sample size carried out over a longer period are needed to substantiate our findings and to determine differences in EPA+DHA bioavailability between three common chemical forms of LC n-3 FA (rTAG, EE and krill oil). The unexpected high content of free EPA and DHA in krill oil, which might have a significant influence on the availability of EPA+DHA from krill oil, should be investigated in more depth and taken into consideration in future trials.", "Omega-3 fatty acids for nutrition and medicine: considering microalgae oil as a vegetarian source of EPA and DHA. Long-chain EPA/DHA omega-3 fatty acid supplementation can be co-preventative and co-therapeutic. Current research suggests increasing accumulated long chain omega-3s for health benefits and as natural medicine in several major diseases. But many believe plant omega-3 sources are nutritionally and therapeutically equivalent to the EPA/DHA omega-3 in fish oil. Although healthy, precursor ALA bio-conversion to EPA is inefficient and production of DHA is nearly absent, limiting the protective value of ALA supplementation from flax-oil, for example. Along with pollutants certain fish acquire high levels of EPA/DHA as predatory species. However, the origin of EPA/DHA in aquatic ecosystems is algae. Certain microalgae produce high levels of EPA or DHA. Now, organically produced DHA-rich microalgae oil is available. Clinical trials with DHA-rich oil indicate comparable efficacies to fish oil for protection from cardiovascular risk factors by lowering plasma triglycerides and oxidative stress. This review discusses 1) omega-3 fatty acids in nutrition and medicine; 2) omega-3s in physiology and gene regulation; 3) possible protective mechanisms of EPA/DHA in major diseases such as coronary heart disease, atherosclerosis, cancer and type 2 diabetes; 4) EPA and DHA requirements considering fish oil safety; and 5) microalgae EPA and DHA-rich oils and recent clinical results.", "Algal-oil capsules and cooked salmon: nutritionally equivalent sources of docosahexaenoic acid. Food and nutrition professionals question whether supplement-sourced nutrients appear to be equivalent to those derived from natural food sources. We compared the nutritional availability of docosahexaenoic acid (DHA) from algal-oil capsules to that from assayed cooked salmon in 32 healthy men and women, ages 20 to 65 years, in a randomized, open-label, parallel-group study. In this 2-week study comparing 600 mg DHA/day from algal-oil capsules to that from assayed portions of cooked salmon, mean change from baseline in plasma phospholipids and erythrocyte DHA levels was analyzed and DHA levels were compared by Student's t tests. In post-hoc analyses to determine bioequivalence, least-squares mean ratios of percent change from baseline in plasma phospholipid and erythrocyte DHA levels were compared. DHA levels increased by approximately 80% in plasma phospholipids and by approximately 25% in erythrocytes in both groups. Changes in DHA levels in plasma phospholipids and erythrocytes were similar between groups. As measured by delivery of DHA to both plasma and erythrocytes, fish and algal-oil capsules were equivalent. Both regimens were generally well-tolerated. These results indicate that algal-oil DHA capsules and cooked salmon appear to be bioequivalent in providing DHA to plasma and red blood cells and, accordingly, that algal-oil DHA capsules represent a safe and convenient source of non-fish-derived DHA.", "Bioequivalence of Docosahexaenoic acid from different algal oils in capsules and in a DHA-fortified food. Docosahexaenoic acid (DHA), a long-chain omega-3 fatty acid, is important for eye and brain development and ongoing visual, cognitive, and cardiovascular health. Unlike fish-sourced oils, the bioavailability of DHA from vegetarian-sourced (algal) oils has not been formally assessed. We assessed bioequivalence of DHA oils in capsules from two different algal strains versus bioavailability from an algal-DHA-fortified food. Our 28-day randomized, placebo-controlled, parallel group study compared bioavailability of (a) two different algal DHA oils in capsules (\\\"DHASCO-T\\\" and \\\"DHASCO-S\\\") at doses of 200, 600, and 1,000 mg DHA per day (n = 12 per group) and of (b) an algal-DHA-fortified food (n = 12). Bioequivalence was based on changes in plasma phospholipid and erythrocyte DHA levels. Effects on arachidonic acid (ARA), docosapentaenoic acid-n-6 (DPAn-6), and eicosapentaenoic acid (EPA) were also determined. Both DHASCO-T and DHASCO-S capsules produced equivalent DHA levels in plasma phospholipids and erythrocytes. DHA response was dose-dependent and linear over the dose range, plasma phospholipid DHA increased by 1.17, 2.28 and 3.03 g per 100 g fatty acid at 200, 600, and 1,000 mg dose, respectively. Snack bars fortified with DHASCO-S oil also delivered equivalent amounts of DHA on a DHA dose basis. Adverse event monitoring revealed an excellent safety and tolerability profile. Two different algal oil capsule supplements and an algal oil-fortified food represent bioequivalent and safe sources of DHA.", "No effect of fish oil supplementation on serum inflammatory markers and their interrelationships: a randomized controlled trial in healthy, middle-... BACKGROUND: A high intake of n-3 polyunsaturated fatty acids (PUFAs), mainly present in fish, may be associated with decreased inflammation. Previous intervention studies on fish PUFA and inflammatory markers in healthy individuals did not analyze a broad spectrum of inflammatory cytokines, chemokines and cell adhesion molecules, or their interrelationships. Therefore, we determined the effects of fish oil supplementation on 19 serum inflammatory markers and their interrelationships in healthy, middle-aged individuals. METHODS: Individuals (n=77) aged 50-70 years completed a randomized, double-blind placebo-controlled intervention study. Participants received 3.5 g/day fish oil (1.5 g/day total n-3 PUFA) (n=39) or placebo (high oleic sunflower oil) (n=38) for 12 weeks. Serum concentrations of 19 inflammatory markers were determined using a multiplex immunoassay before and after intervention. Changes in concentrations were analyzed using analysis of covariance and differences in patterns in inflammatory markers between the fish oil and placebo group were analyzed by principal component analysis. RESULTS: Fish oil supplementation did not significantly affect serum concentrations of cytokines, chemokines or cell adhesion molecules as compared with placebo. However, there was a trend for all inflammatory markers to increase after fish oil supplementation. PCA did not result in markedly distinctive patterns of inflammatory markers for the fish oil and placebo group. CONCLUSION: In conclusion, this 12-week randomized, double-blind placebo-controlled intervention trial did not show that 1.5 g/day n-3 PUFA significantly affected the serum inflammatory response in healthy individuals, nor did patterns of inflammatory markers. Thus, a healthy middle-aged population may not benefit from fish oil as an anti-inflammatory agent."], ["Cancer chemopreventive potential of apples, apple juice, and apple components. Apples ( MALUS sp., Rosaceae) are a rich source of nutrient as well as non-nutrient components and contain high levels of polyphenols and other phytochemicals. Main structural classes of apple constituents include hydroxycinnamic acids, dihydrochalcones, flavonols (quercetin glycosides), catechins and oligomeric procyanidins, as well as triterpenoids in apple peel and anthocyanins in red apples. Several lines of evidence suggest that apples and apple products possess a wide range of biological activities which may contribute to health beneficial effects against cardiovascular disease, asthma and pulmonary dysfunction, diabetes, obesity, and cancer (reviewed by Boyer and Liu, Nutr J 2004). The present review will summarize the current knowledge on potential cancer preventive effects of apples, apple juice and apple extracts (jointly designated as apple products). In brief, apple extracts and components, especially oligomeric procyanidins, have been shown to influence multiple mechanisms relevant for cancer prevention in IN VITRO studies. These include antimutagenic activity, modulation of carcinogen metabolism, antioxidant activity, anti-inflammatory mechanisms, modulation of signal transduction pathways, antiproliferative and apoptosis-inducing activity, as well as novel mechanisms on epigenetic events and innate immunity. Apple products have been shown to prevent skin, mammary and colon carcinogenesis in animal models. Epidemiological observations indicate that regular consumption of one or more apples a day may reduce the risk for lung and colon cancer.", "Anti-cancer properties of phenolics from apple waste on colon carcinogenesis in vitro. Colorectal cancer is one of the most common cancers in Western countries. The World Health Organisation identifies diet as a critical risk factor in the development and progression of this disease and the protective role of high levels of fruit and vegetable consumption. Several studies have shown that apples contain several phenolic compounds that are potent anti-oxidants in humans. However, little is known about other beneficial properties of apple phenolics in cancer. We have used the HT29, HT115 and CaCo-2 cell lines as in vitro models to examine the effect of apple phenolics (0.01-0.1% apple extract) on key stages of colorectal carcinogenesis, namely; DNA damage (Comet assay), colonic barrier function (TER assay), cell cycle progression (DNA content assay) and invasion (Matrigel assay). Our results indicate that a crude extract of apple phenolics can protect against DNA damage, improve barrier function and inhibit invasion (p<0.05). The anti-invasive effects of the extract were enhanced with twenty-four hour pretreatment of cells (p<0.05). We have shown that a crude apple extract from waste, rich in phenolic compounds, beneficially influences key stages of carcinogenesis in colon cells in vitro.", "Intake of whole apples or clear apple juice has contrasting effects on plasma lipids in healthy volunteers. PURPOSE: Fruit consumption is associated with a decreased risk of CVD in cohort studies and is therefore endorsed by health authorities as part of the '5 or more a day' campaigns. A glass of fruit juice is generally counted as one serving. Fruit may cause protection by affecting common risk factors of CVD. METHODS: Apples are among the most commonly consumed fruits and were chosen for a comprehensive 5 \u00d7 4 weeks dietary crossover study to assess the effects of whole apples (550 g/day), apple pomace (22 g/day), clear and cloudy apple juices (500 ml/day), or no supplement on lipoproteins and blood pressure in a group of 23 healthy volunteers. RESULTS: The intervention significantly affected serum total and LDL-cholesterol. Trends towards a lower serum LDL-concentration were observed after whole apple (6.7%), pomace (7.9%) and cloudy juice (2.2%) intake. On the other hand, LDL-cholesterol concentrations increased by 6.9% with clear juice compared to whole apples and pomace. There was no effect on HDL-cholesterol, TAG, weight, waist-to-hip ratio, blood pressure, inflammation (hs-CRP), composition of the gut microbiota or markers of glucose metabolism (insulin, IGF1 and IGFBP3). CONCLUSIONS: Apples are rich in polyphenols and pectin, two potentially bioactive constituents; however, these constituents segregate differently during processing into juice products and clear juice is free of pectin and other cell wall components. We conclude that the fibre component is necessary for the cholesterol-lowering effect of apples in healthy humans and that clear apple juice may not be a suitable surrogate for the whole fruit in nutritional recommendations.", "Fostering antioxidant defences: up-regulation of antioxidant genes or antioxidant supplementation? Vitamins have traditionally been considered as food components that are required in the normal diet to prevent deficiencies. However, a newer concept of the function of vitamins in nutrition has taken them beyond simply prevention of deficiency symptoms. This concept considers that many vitamins, when taken in relatively large doses, have important functions beyond preventing deficiencies. Linus Pauling was instrumental in putting forward this concept, particularly for vitamin C. Thus, relatively high intakes of vitamins, and in particular vitamins C and E which are antioxidants, are considered to be healthy for the human population. This may be true in some special situations such as, for instance, the prevention of Alzheimer's disease progression. However, recent epidemiological evidence has not supported the claim that antioxidant vitamins increase well-being and prolong life span. In fact, vitamin supplementation may be even detrimental and reduce life span. A new concept that we would like to put forward is that nutrients up-regulate the endogenous antioxidant defences. This is particularly true in the case of phytoestrogens for example, which bind to oestrogen receptors and eventually up-regulate the expression of antioxidant genes. In this review we discuss the pros and cons of antioxidant vitamin supplementation and also the possibility that the ingestion of some nutrients may be very effective in increasing antioxidant defences by up-regulating the activity of antioxidant enzymes which are normally present in the cell.", "Effect of vitamin C supplements on physical performance. Vitamin C is an essential component of the diet and may reduce the adverse effects of exercise-induced reactive oxygen species, including muscle damage, immune dysfunction, and fatigue. However, reactive oxygen species may mediate beneficial training adaptations that vitamin C attenuates; indeed, from a total of 12 studies, vitamin C in doses >1 g\u00b7d(-1) impaired sport performance substantially in four of four studies, possibly by reducing mitochondrial biogenesis, while a further four studies demonstrated impairments that were not statistically significant. Doses of \u223c0.2 g\u00b7d(-1) of vitamin C consumed through five or more servings of fruit and vegetables may be sufficient to reduce oxidative stress and provide other health benefits without impairing training adaptations."], ["Manufactured uncertainty: protecting public health in the age of contested science and product defense. The strategy of \\\"manufacturing uncertainty\\\" has been used with great success by polluters and manufacturers of dangerous products to oppose public health and environmental regulation. This strategy entails questioning the validity of scientific evidence on which the regulation is based. While this approach is most identified with the tobacco industry, it has been used by producers of asbestos, benzene, beryllium, chromium, diesel exhaust, lead, plastics, and other hazardous products to avoid environmental and occupational health regulation. It is also central to the debate on global warming. The approach is now so common that it is unusual for the science not to be challenged by an industry facing regulation. Manufacturing uncertainty has become a business in itself; numerous technical consulting firms provide a service often called \\\"product defense\\\" or \\\"litigation support.\\\" As these names imply, the usual objective of these activities is not to generate knowledge to protect public health but to protect a corporation whose products are alleged to have toxic properties. Evidence in the scientific literature of the funding effect--the close correlation between the results of a study desired by a study's funder and the reported results of that study--suggests that the financial interest of a study's sponsors should be taken into account when considering the study's findings. Similarly, the interpretation of data by scientists with financial conflicts should be seen in this light. Manufacturing uncertainty is antithetical to the public health principle that decisions be made using the best evidence currently available.", "Science in Liquid Dietary Supplement Promotion: The Misleading Case of Mangosteen Juice Liquid dietary supplements represent a fast growing market segment, including botanically-based beverages containing mangosteen, acai, and noni. These products often resemble fruit juice in packaging and appearance, but may contain pharmacologically active ingredients. While little is known about the human health effects or safety of consuming such products, manufacturers make extensive use of low-quality published research to promote their products. This report analyzes the science-based marketing claims of two of the most widely consumed mangosteen liquid dietary supplements, and compares them to the findings of the research being cited. The reviewer found that analyzed marketing claims overstate the significance of findings, and fail to disclose severe methodological weaknesses of the research they cite. If this trend extends to other related products that are similarly widely consumed, it may pose a public health threat by misleading consumers into assuming that product safety and effectiveness are backed by rigorous scientific data.", "A systematic review of systematic reviews of homeopathy Homeopathy remains one of the most controversial subjects in therapeutics. This article is an attempt to clarify its effectiveness based on recent systematic reviews. Electronic databases were searched for systematic reviews/meta-analysis on the subject. Seventeen articles fulfilled the inclusion/exclusion criteria. Six of them related to re-analyses of one landmark meta-analysis. Collectively they implied that the overall positive result of this meta-analysis is not supported by a critical analysis of the data. Eleven independent systematic reviews were located. Collectively they failed to provide strong evidence in favour of homeopathy. In particular, there was no condition which responds convincingly better to homeopathic treatment than to placebo or other control interventions. Similarly, there was no homeopathic remedy that was demonstrated to yield clinical effects that are convincingly different from placebo. It is concluded that the best clinical evidence for homeopathy available to date does not warrant positive recommendations for its use in clinical practice.", "Aromatherapy facts and fictions: a scientific analysis of olfactory effects on mood, physiology and behavior. A systematic review of scientific experimentation addressing olfactory effects on mood, physiology and behavior was undertaken. From this review, 18 studies meeting stringent empirical criteria were then analyzed in detail and it was found that credible evidence that odors can affect mood, physiology and behavior exists. To explain these effects, pharmacological and psychological mechanisms were explored and a psychological interpretation of the data was found to be more comprehensive. Methodological problems regarding dependent measures and stimuli, which led to inconsistencies in the data were discussed, as were the mediating variables of culture, experience, sex differences, and personality.", "Bach flower remedies: a systematic review of randomised clinical trials. Bach flower remedies continue to be popular and its proponents make a range of medicinal claims for them. The aim of this systematic review was to critically evaluate the evidence for these claims. Five electronic databases were searched without restrictions on time or language. All randomised clinical trials of flower remedies were included. Seven such studies were located. All but one were placebo-controlled. All placebo-controlled trials failed to demonstrate efficacy. It is concluded that the most reliable clinical trials do not show any differences between flower remedies and placebos."], ["Comparison of vitamin D2 and vitamin D3 supplementation in raising serum 25-hydroxyvitamin D status: a systematic review and meta-analysis Background: Currently, there is a lack of clarity in the literature as to whether there is a definitive difference between the effects of vitamins D2 and D3 in the raising of serum 25-hydroxyvitamin D [25(OH)D]. Objective: The objective of this article was to report a systematic review and meta-analysis of randomized controlled trials (RCTs) that have directly compared the effects of vitamin D2 and vitamin D3 on serum 25(OH)D concentrations in humans. Design: The ISI Web of Knowledge (January 1966 to July 2011) database was searched electronically for all relevant studies in adults that directly compared vitamin D3 with vitamin D2. The Cochrane Clinical Trials Registry, International Standard Randomized Controlled Trials Number register, and clinicaltrials.gov were also searched for any unpublished trials. Results: A meta-analysis of RCTs indicated that supplementation with vitamin D3 had a significant and positive effect in the raising of serum 25(OH)D concentrations compared with the effect of vitamin D2 (P = 0.001). When the frequency of dosage administration was compared, there was a significant response for vitamin D3 when given as a bolus dose (P = 0.0002) compared with administration of vitamin D2, but the effect was lost with daily supplementation. Conclusions: This meta-analysis indicates that vitamin D3 is more efficacious at raising serum 25(OH)D concentrations than is vitamin D2, and thus vitamin D3 could potentially become the preferred choice for supplementation. However, additional research is required to examine the metabolic pathways involved in oral and intramuscular administration of vitamin D and the effects across age, sex, and ethnicity, which this review was unable to verify.", "Vitamin D(3) is more potent than vitamin D(2) in humans. BACKGROUND: Current unitage for the calciferols suggests that equimolar quantities of vitamins D(2) (D2) and D(3) (D3) are biologically equivalent. Published studies yield mixed results. OBJECTIVE: The aim of the study was to compare the potencies of D2 and D3. DESIGN: The trial used a single-blind, randomized design in 33 healthy adults. Calciferols were dosed at 50,000 IU/wk for 12 wk. Principal outcome variables were area under the curve for incremental total 25-hydroxyvitamin D [25(OH)D] and change in calciferol content of sc fat. RESULTS: Incremental mean (sd) 25(OH)D area under the curve at 12 wk was 1366 ng \u00b7 d/ml (516) for the D2-treated group and 2136 (606) for the D3 (P < 0.001). Mean (sd) steady-state 25(OH)D increments showed similar differences: 24 ng/ml for D2 (10.3) and 45 ng/ml (16.2) for D3 (P <0.001). Subcutaneous fat content of D2 rose by 50 \u03bcg/kg in the D2-treated group, and D3 content rose by 104 \u03bcg/kg in the D3-treated group. Total calciferol in fat rose by only 33 ng/kg in the D2-treated, whereas it rose by 104 \u03bcg/kg in the D3-treated group. Extrapolating to total body fat D3, storage amounted to just 17% of the administered dose. CONCLUSION: D3 is approximately 87% more potent in raising and maintaining serum 25(OH)D concentrations and produces 2- to 3-fold greater storage of vitamin D than does equimolar D2. For neither was there evidence of sequestration in fat, as had been postulated for doses in this range. Given its greater potency and lower cost, D3 should be the preferred treatment option when correcting vitamin D deficiency.", "Low Vitamin D Status: Definition, Prevalence, Consequences and Correction Vitamin D is obtained from cutaneous production when 7-dehydrocholesterol is converted to vitamin D3 (cholecalciferol) by ultraviolet B radiation or by oral intake of vitamin D2 (ergocalciferol) and D3. An individual's vitamin D status is best evaluated by measuring the circulating 25-hydroxyvitamin D [25(OH)D] concentration. Though controversy surrounds the definition of low vitamin D status, there is increasing agreement that the optimal circulating 25(OH)D level should be ~30-32 ng/ml or above. Using this definition, it has been is estimated that approximately three quarters of all adults in the United States are low. Classically, low vitamin D status has skeletal consequences such as osteomalacia/rickets. More recently, associations between low vitamin D status and increased risk for various non-skeletal morbidities have been recognized; whether all of these associations are causally related to low vitamin D status remains to be determined. To achieve optimal vitamin D status, daily intakes of at least 1000 IU or more of vitamin D are required. The risk of toxicity with \u201chigh\u201d amounts of vitamin D intake is low. Substantial between-individual variability exists in response to the same administered vitamin D dose. When to monitor 25(OH)D levels has received little attention. Supplementation with vitamin D3 may be preferable to vitamin D2.", "Vitamin D2 Is as Effective as Vitamin D3 in Maintaining Circulating Concentrations of 25-Hydroxyvitamin D Context: Two reports suggested that vitamin D2 is less effective than vitamin D3 in maintaining vitamin D status. Objective: Our objective was to determine whether vitamin D2 was less effective than vitamin D3 in maintaining serum 25-hydroxyvitamin D levels or increased the catabolism of 25-hydroxyvitamin D3. Subjects and Design: This was a randomized, placebo-controlled, double-blinded study of healthy adults ages 18\u201384 yr who received placebo, 1000 IU vitamin D3, 1000 IU vitamin D2, or 500 IU vitamin D2 plus 500 IU vitamin D3 daily for 11 wk at the end of the winter. Results: Sixty percent of the healthy adults were vitamin D deficient at the start of the study. The circulating levels of 25-hydroxyvitamin D (mean \u00b1 sd) increased to the same extent in the groups that received 1000 IU daily as vitamin D2 (baseline 16.9 \u00b1 10.5 ng/ml; 11 wk 26.8 \u00b1 9.6 ng/ml), vitamin D3 (baseline 19.6 \u00b1 11.1 ng/ml; 11 wk 28.9 \u00b1 11.0 ng/ml), or a combination of 500 IU vitamin D2 and 500 IU vitamin D3 (baseline 20.2 \u00b1 10.4 ng/ml; 11 wk 28.4 \u00b1 7.7 ng/ml). The 25-hydroxyvitamin D3 levels did not change in the group that received 1000 IU vitamin D2 daily. The 1000 IU dose of vitamin D2 or vitamin D3 did not raise 25-hydroxyvitamin D levels in vitamin D-deficient subjects above 30 ng/ml. Conclusion: A 1000 IU dose of vitamin D2 daily was as effective as 1000 IU vitamin D3 in maintaining serum 25-hydroxyvitamin D levels and did not negatively influence serum 25-hydroxyvitamin D3 levels. Therefore, vitamin D2 is equally as effective as vitamin D3 in maintaining 25-hydroxyvitamin D status.", "Treatment of Hypovitaminosis D in Infants and Toddlers Context: Hypovitaminosis D appears to be on the rise in young children, with implications for skeletal and overall health. Objective: The objective of the study was to compare the safety and efficacy of vitamin D2 daily, vitamin D2 weekly, and vitamin D3 daily, combined with supplemental calcium, in raising serum 25-hydroxyvitamin D [25(OH)D] and lowering PTH concentrations. Design: This was a 6-wk randomized controlled trial. Setting: The study was conducted at an urban pediatric clinic in Boston. Subjects: Forty otherwise healthy infants and toddlers with hypovitaminosis D [25(OH)D < 20 ng/ml] participated in the study. Interventions: Participants were assigned to one of three regimens: 2,000 IU oral vitamin D2 daily, 50,000 IU vitamin D2 weekly, or 2,000 IU vitamin D3 daily. Each was also prescribed elemental calcium (50 mg/kg\u00b7d). Infants received treatment for 6 wk. Main Outcome Measures: Before and after treatment, serum measurements of 25(OH)D, PTH, calcium, and alkaline phosphatase were taken. Results: All treatments approximately tripled the 25(OH)D concentration. Preplanned comparisons were nonsignificant: daily vitamin D2 vs. weekly vitamin D2 (12% difference in effect, P = 0.66) and daily D2 vs. daily D3 (7%, P = 0.82). The mean serum calcium change was small and similar in the three groups. There was no significant difference in PTH suppression. Conclusions: Short-term vitamin D2 2,000 IU daily, vitamin D2 50,000 IU weekly, or vitamin D3 2,000 IU daily yield equivalent outcomes in the treatment of hypovitaminosis D among young children. Therefore, pediatric providers can individualize the treatment regimen for a given patient to ensure compliance, given that no difference in efficacy or safety was noted among these three common treatment regimens."], ["Nonfatal bathroom injuries among persons aged \u226515 years--United States, 2008. In 2008, approximately 21.8 million persons aged \u226515 years sustained nonfatal, unintentional injuries, resulting in approximately $67.3 billion in lifetime medical costs. Information about where injuries occur is limited, but bathrooms commonly are believed to be a particularly hazardous location. To investigate this assumption, CDC analyzed data from a nationally representative sample of emergency departments (EDs) to describe the incidence and circumstances of nonfatal injuries in bathrooms (in any setting) among persons aged \u226515 years in the United States. This report describes the results of that investigation, which found that, based on 3,339 cases documented in the 2008 National Electronic Surveillance System All Injury Program (NEISS-AIP) database, an estimated 234,094 nonfatal bathroom injuries were treated in U.S. EDs. Injury rates increased with age, and most injuries (81.1%) were caused by falls. All persons, but especially older adults, should be aware of bathroom activities that are associated with a high risk for injury and of environmental modifications that might reduce that risk.", "Short- and long-term morbidity and mortality in the population exposed to dioxin after the \\\"Seveso accident\\\". The early effects of 2,3,7,8-tetrachlorodibenzo-para-dioxin (TCDD) exposure in the population involved in the Seveso, Italy, incident in 1976, have been examined in numerous studies. Chloracne was the only effect linked with sufficient certainty to dioxin exposure. The possible long-term consequences were investigated with mortality and cancer incidence studies. Mortality and morbidity findings during the 20-year period following the accident showed increased risk from lymphoemopoietic neoplasm, digestive system cancer (rectum in males, and biliary tract among females, in particular) and respiratory system cancer (lung, among males). In the incidence analyses, also thyroid gland and pleura cancer appeared suggestively increased. Soft tissue sarcomas showed an increase in the largest, yet least exposed, exposure sub-cohort. Several hypotheses associating non-cancer effects with dioxin exposure were corroborated by findings in the Seveso population: this was the case with cardiovascular effects (possibly linked to both chemical exposure and stressful disaster experience), endocrine effects (diabetes among females) and reproductive effects: exposure of men to TCDD was linked to a lowered male/female sex ratio in their offspring. The results of many Seveso studies point to possible gender effects, in accordance with animal models. Notwithstanding the acknowledged study limitations (lack of individual exposure markers, short latency, and small population size for certain cancer types), results of previous experimental and epidemiological studies, along with mechanistic knowledge on dioxin toxicity, support the hypotheses that the observed excesses might be associated with dioxin exposure. The mortality and cancer incidence follow-up of the Seveso cohort are continuing.", "Industrial hygiene assessment of reticuloendotheliosis viruses exposure in the poultry industry. OBJECTIVES: Reticuloendotheliosis viruses (REV) are a group of retroviruses like avian leukosis/sarcoma viruses (ALSV) that naturally infect and cause cancers in chickens. We recently found that ALSV antibody levels were associated with job tasks in the poultry industry. The objectives of this study are to examine whether a similar association can be found with REV antibody levels and to examine the correlation between REV and ALSV antibody levels. METHODS: Relative risk was estimated comparing REV antibody levels of 45 poultry workers with those of 44 controls. The expected mean antibody level was predicted for the association with employment by a generalized linear model. Correlation coefficient was measured between ALSV and REV antibody levels. RESULTS: REV antibody levels were significantly higher in poultry workers than in control subjects and were associated with gender and employment conditions, especially employment duration. The relative risk was significantly higher for some job categories. A significant correlation was observed between REV and ALSV antibody levels, which was strong among poultry workers, but weak among the control subjects. CONCLUSION: Antibody levels can be validly used to identify certain job tasks associated with high risk of exposure to REV in the workplace, and the practical implication is recommendations for protection at these job tasks. Importantly, in situations where there is exposure to multiple pathogens in the workplace, the analysis of antibody levels of one pathogen may sufficiently represent exposure to the other correlated pathogens. This suggested exposure assessment may hold true for pathogens with a similar route of transmission.", "Occupational exposure assessment using antibody levels: exposure to avian leukosis/sarcoma viruses in the poultry industry. Avian leukosis/sarcoma viruses (ALSV) infect and cause cancers in chickens. Poultry workers are exposed to ALSV and other infectious agents in the workplace. This study examines if industrial hygiene assessment of antibody levels in poultry workers can identify risky job tasks at the higher exposure risk to an infectious agent, i.e., ALSV. We compared ALSV antibody levels in poultry workers and control subjects. Occupational and demographical factors were examined for an association with the exposure risk in poultry workers. We found that the antibody levels were significantly higher in poultry workers than in control subjects. Job category and age together were significantly associated with the antibody levels in workers. Certain job tasks were identified with significantly higher antibody levels as compared to others, implying that recommendations should be made to protect workers at these jobs. The findings of this study indicate that the measurement of antibody levels in workers can be useful for industrial hygiene assessment of exposure to infectious agents.", "Managing adverse effects and complications in completing treatment for hepatitis C virus infection. The addition of direct-acting antivirals (DAAs) to hepatitis C virus (HCV) treatment regimens has made treatment more effective and patient management more complex. Shepherding patients through a full course of HCV therapy requires motivation and involvement on the part of the patient and the physician. Indeed, physician inexperience and lack of confidence in guiding patients through the challenges of treatment appears to be a primary reason for early discontinuation of therapy. Among the many complications of HCV treatment that must be managed efficiently and effectively are depression and other psychiatric disorders; hematologic abnormalities including DAA- and ribavirin-associated anemia and peginterferon alfa-associated neutropenia and thrombocytopenia; rash and drug eruptions, including telaprevir-associated rash; and weight loss. Practical considerations in management of these common complications are offered. This article summarizes a presentation by Kenneth E. Sherman, MD, PhD, at the IAS-USA live continuing medical education course held in New York in June 2012."], ["Adenovirus-36 Is Associated with Obesity in Children and Adults in Sweden as Determined by Rapid ELISA Background Experimental and natural human adenovirus-36 (Adv36) infection of multiple animal species results in obesity through increasing adipogenesis and lipid accumulation in adipocytes. Presence of Adv36 antibodies detected by serum neutralization assay has previously been associated with obesity in children and adults living in the USA, South Korea and Italy, whereas no association with adult obesity was detected in Belgium/the Netherlands nor among USA military personnel. Adv36 infection has also been shown to reduce blood lipid levels, increase glucose uptake by adipose tissue and skeletal muscle biopsies, and to associate with improved glycemic control in non-diabetic individuals. Principal Findings Using a novel ELISA, 1946 clinically well-characterized individuals including 424 children and 1522 non-diabetic adults, and 89 anonymous blood donors, residing in central Sweden representing the population in Stockholm area, were studied for the presence of antibodies against Adv36 in serum. The prevalence of Adv36 positivity in lean individuals increased from \u223c7% in 1992\u20131998 to 15\u201320% in 2002\u20132009, which paralleled the increase in obesity prevalence. We found that Adv36-positive serology was associated with pediatric obesity and with severe obesity in females compared to lean and overweight/mildly obese individuals, with a 1.5 to 2-fold Adv36 positivity increase in cases. Moreover, Adv36 positivity was less common among females and males on antilipid pharmacological treatment or with high blood triglyceride level. Insulin sensitivity, measured as lower HOMA-IR, showed a higher point estimate in Adv36-positive obese females and males, although it was not statistically significant (p\u200a=\u200a0.08). Conclusion Using a novel ELISA we show that Adv36 infection is associated with pediatric obesity, severe obesity in adult females and lower risk of high blood lipid levels in non-diabetic Swedish individuals.", "Adenovirus 36 infection and obesity. The most important factors leading to fat accumulation in children are genetic inheritance, endocrine alterations, and behavioural/environmental causes. In addition, experimental animal studies have shown that infections due to various pathogens can lead to overweight and obesity conditions, and studies of humans have found that the incidence of seroconversion against some of these may be significantly more frequent in obese adults and children than in normal subjects. However, the results of these studies are not conclusive and, in some cases, have raised more questions than answers. We reviewed the literature concerning the role of adenovirus 36 (AD-36), the most widely studied infectious agent in animals and humans, because of its potential association with childhood obesity. The available evidence suggests that more studies are needed to evaluate whether or not the association between the presence of AD-36 antibodies and obesity is simply unrelated, and to verify whether there are subjects that have greater tendency to become obese because more easily susceptible to AD-36 infection or with a predisposition to suffer from persistent viral infection more easily leading to the development of obesity. If it is demonstrated that AD-36 does play a role in obesity, it will be important to investigate possible vaccines against the infection itself or antiviral drugs capable of inhibiting disease progression. Copyright \u00a9 2012 Elsevier B.V. All rights reserved.", "Human adenovirus-36 and childhood obesity. There is increasing evidence that obesity in humans is associated with infection with human adenovirus-36 (Adv36). Infection of experimental animals with Adv36 demonstrates that this virus causes obesity. Human studies have shown a prevalence of Adv36 infection of 30% or greater in obese adult humans, but a correlation with obesity has not always been demonstrated. In contrast, three published studies and one presented study with a total of 559 children all show that there is an increase in prevalence of Adv36 infection in obese children (28%) compared to non-obese children (10%). The explanation for the apparently more robust correlation of Adv36 infection with obesity in children vs. adults is not clear. The data in animals and people suggests that Adv36 has contributed to the worldwide increase in childhood obesity. More research is needed to identify prevalences and consequences of Adv36 infection in people of all age groups and geographic locations.", "Association of Adenovirus 36 Infection with Obesity and Metabolic Markers in Humans: A Meta-Analysis of Observational Studies Background Several studies have shown that Adenovirus 36 (Ad36) influences the risk of obesity in humans. Clarifying the relationship between Ad36 infection and obesity could lead to more effective approaches for the management of obesity. The objective of this study was to conduct a meta-analysis to confirm the influence of Ad36 infection on obesity and metabolic markers. Methodology/Principal Findings We searched MEDLINE and the Cochrane Library for pertinent articles (including their references) published between 1951 and April 22, 2012. Only English language reports of original observational studies were included in this meta-analysis. Data extraction was performed independently by two reviewers. Weighted mean differences (WMDs) and pooled odds ratios (ORs) with 95% confidence intervals (95% CIs) were calculated using the random effects model. Of 237 potentially relevant studies, 10 cross-sectional studies (n\u200a=\u200a2,870) conformed to the selection criteria. Pooled analysis showed that the WMD for BMI of Ad36 infection compared with non-infection was 3.19 (95% CI 1.44\u20134.93; P<0.001). Sensitivity analysis restricted to studies of adults yielded a similar result of 3.18 (95% CI 0.78\u20135.57; P\u200a=\u200a0.009). The increased risk of obesity associated with Ad36 infection was also significant (OR: 1.9; 95% CI: 1.01\u20133.56; P\u200a=\u200a0.047). No significant differences were found in relation to total cholesterol (P\u200a=\u200a0.83), triglycerides (P\u200a=\u200a0.64), HDL (P\u200a=\u200a0.69), blood glucose (P\u200a=\u200a0.08), waist circumstance (P\u200a=\u200a0.09), and systolic blood pressure (P\u200a=\u200a0.25). Conclusion/Significance Ad36 infection was associated with the risk of obesity and weight gain, but was not associated with abnormal metabolic markers including waist circumstance. It suggests that Ad36 infection is more associated with accumulation of subcutaneous fat than that of visceral fat. The relationship between Ad36 and obesity should be assessed by further studies, including well-designed prospective studies, to gain a better understanding of whether Ad36 plays a role in the etiology of human obesity.", "Human adenovirus-36 antibody status is associated with obesity in children. BACKGROUND: Human adenovirus-36 (Ad-36) is thought to induce obesity by a direct effect of the viral E4orf1 gene on lipogenic enzymes in host adipocytes. Ad-36 prevalence is 30% in obese adults, but prevalence has not been reported in childhood obesity. OBJECTIVES: To determine the prevalence of Ad-36 infection in obese Korean children (age 14.8 +/- 1.9; range 8.3-6.3 years); correlation of infection with BMI z-score and other obesity measures. METHODS: Blood was drawn at the annual school physical exam or clinic visit; Ad-36 status was determined by serum neutralization assay; and routine serum chemistry values. RESULTS: A total of 30% of subjects were positive (N = 25) for Ad-36; 70% were negative (N = 59). Significantly higher BMI z-scores (1.92 vs. 1.65, p < 0.01) and waist circumferences (96.3 vs. 90.7 cm, p = 0.05) were found in infected versus uninfected children. Cardiovascular risk factors were not significantly different. CONCLUSIONS: Ad-36 infection is common in obese Korean children and correlates highly with obesity. Ad-36 may have played a role in the obesity and Type 2 diabetes epidemic in children."], ["Low Prevalence of \u201cIdeal Cardiovascular Health\u201d in a Community-Based Population: The Heart Strategies Concentrating on Risk Evaluation (Heart SCORE) Study Background \u201cCardiovascular health\u201d is a new construct defined by the American Heart Association (AHA) as part of its 2020 Impact Goals definition. The applicability of this construct to community-based populations and the distributions of its components by race and sex have not been reported. Methods and Results The AHA construct of \u201ccardiovascular health\u201d and the AHA \u201cideal health behaviors index\u201d and \u201cideal health factors index\u201d were evaluated among 1933 participants (mean age 59 years; 44% blacks; 66% female) in the community-based Heart Strategies Concentrating on Risk Evaluation study. One of 1933 participants (0.1%) met all 7 components of the AHA's definition of ideal cardiovascular health. Less than 10% of participants met \u22655 components of ideal cardiovascular health in all subgroups (by race, sex, age and income level). Thirty-nine subjects (2.0%) had all four components of the ideal health behaviors index and 27 (1.4%) had all three components of the ideal health factors index. Blacks had significantly fewer ideal cardiovascular health components than whites (2.0\u00b11.2 vs. 2.6\u00b11.4, p<0.001). After adjustment by sex, age and income level, blacks had 82% lower odds of having \u22655 components of ideal cardiovascular health (Odds Ratio 0.18, 95% Confidence Interval (CI)=0.10-0.34, p<0.001). No interaction was found between race and sex. Conclusion The prevalence of ideal cardiovascular health is extremely low in a middle-age community-based study population. Comprehensive individual and population-based interventions must be developed to support the attainment of the AHA's 2020 Impact Goals for cardiovascular health.", "Analysis of risk factors for abdominal aortic aneurysm in a cohort of more than 3 million individuals. BACKGROUND: Abdominal aortic aneurysm (AAA) disease is an insidious condition with an 85% chance of death after rupture. Ultrasound screening can reduce mortality, but its use is advocated only for a limited subset of the population at risk. METHODS: We used data from a retrospective cohort of 3.1 million patients who completed a medical and lifestyle questionnaire and were evaluated by ultrasound imaging for the presence of AAA by Life Line Screening in 2003 to 2008. Risk factors associated with AAA were identified using multivariable logistic regression analysis. RESULTS: We observed a positive association with increasing years of smoking and cigarettes smoked and a negative association with smoking cessation. Excess weight was associated with increased risk, whereas exercise and consumption of nuts, vegetables, and fruits were associated with reduced risk. Blacks, Hispanics, and Asians had lower risk of AAA than whites and Native Americans. Well-known risk factors were reaffirmed, including male gender, age, family history, and cardiovascular disease. A predictive scoring system was created that identifies aneurysms more efficiently than current criteria and includes women, nonsmokers, and individuals aged <65 years. Using this model on national statistics of risk factors prevalence, we estimated 1.1 million AAAs in the United States, of which 569,000 are among women, nonsmokers, and individuals aged <65 years. CONCLUSIONS: Smoking cessation and a healthy lifestyle are associated with lower risk of AAA. We estimated that about half of the patients with AAA disease are not eligible for screening under current guidelines. We have created a high-yield screening algorithm that expands the target population for screening by including at-risk individuals not identified with existing screening criteria.", "Epidemiology of OA Osteoarthritis (OA) is the most common form of arthritis in the US, and a leading cause of disability. It is typically defined in epidemiologic studies on the basis of radiographic findings and consideration of symptoms. Its incidence and prevalence are rising, likely related to the aging of the population and increasing obesity. Risk factors for OA include a number of person-level factors, such as age, sex, obesity, and genetics, as well as joint-specific factors that are likely reflective of abnormal loading of the joints. A number of methodologic challenges exist in studying OA that can hamper our ability to identify pertinent relationships.", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "European bans on surfactant trigger transatlantic debate. U.S. and European regulators and researchers disagree over risks of a common class of surfactants."], ["Update on the biological effects of ionizing radiation, relative dose factors and radiation hygiene. Diagnostic imaging is an indispensable part of contemporary medical and dental practice. Over the last few decades there has been a dramatic increase in the use of ionizing radiation for diagnostic imaging. The carcinogenic effects of high-dose exposure are well known. Does diagnostic radiation rarely cause cancer? We don't know but we should act as if it does. Accordingly, dentists should select patients wisely - only make radiographs when there is patient-specific reason to believe there is a reasonable expectation the radiograph will offer unique information influencing diagnosis or treatment. Low-dose examinations should be made: intraoral imaging - use fast film or digital sensors, thyroid collars, rectangular collimation; panoramic and lateral cephalometric imaging - use digital systems or rare-earth film screen combinations; and cone beam computed tomography - use low-dose machines, restrict field size to region of interest, reduce mA and length of exposure arc as appropriate. \u00a9 2012 Australian Dental Association.", "Radiation and chest CT scan examinations: what do we know? In the past 3 decades, the total number of CT scans performed has grown exponentially. In 2007, > 70 million CT scans were performed in the United States. CT scan studies of the chest comprise a large portion of the CT scans performed today because the technology has transformed the management of common chest diseases, including pulmonary embolism and coronary artery disease. As the number of studies performed yearly increases, a growing fraction of the population is exposed to low-dose ionizing radiation from CT scan. Data extrapolated from atomic bomb survivors and other populations exposed to low-dose ionizing radiation suggest that CT scan-associated radiation may increase an individual's lifetime risk of developing cancer. This finding, however, is not incontrovertible. Because this topic has recently attracted the attention of both the scientific community and the general public, it has become increasingly important for physicians to understand the cancer risk associated with CT scan and be capable of engaging in productive dialogue with patients. This article reviews the current literature on the public health debate surrounding CT scan and cancer risk, quantifies radiation doses associated with specific studies, and describes efforts to reduce population-wide CT scan-associated radiation exposure. CT scan examinations of the chest, including CT scan pulmonary and coronary angiography, high-resolution CT scan, low-dose lung cancer screening, and triple rule-out CT scan, are specifically considered.", "Justification of diagnostic medical exposures: some practical issues. Report of an International Atomic Energy Agency Consultation Objectives The Radiation Protection of Patients Unit of the International Atomic Energy Agency (IAEA) is concerned about the effectiveness of justification of diagnostic medical exposures. Recent published work and the report of an initial IAEA consultation in the area gave grounds for such concerns. There is a significant level of inappropriate usage, and, in some cases, a poor level of awareness of dose and risk among some key groups involved. This article aims to address this. Methods The IAEA convened a second group of experts in November 2008 to review practical and achievable actions that might lead to more effective justification. Results This report summarises the matters that this group considered and the outcome of their deliberations. There is a need for improved communication, both within professions and between professionals on one hand, and between professionals and the patients/public on the other. Coupled with this, the issue of consent to imaging procedures was revisited. The need for good evidence-based referral guidelines or criteria of acceptability was emphasised, as was the need for their global adaptation and dissemination. Conclusion Clinical audit was regarded as a key tool in ensuring that justification becomes an effective, transparent and accountable part of normal radiological practice. In summary, justification would be facilitated by the \u201c3 As\u201d: awareness, appropriateness and audit.", "Genotoxicity of two mouthwash products in the Drosophila Wing-Spot Test. In this study, genotoxicity of two mouthwash products (chlorexidin, benzidamine-HCl) were investigated in the Drosophila Wing-Spot Test which makes use of the wing cell markers multiple wing hairs (mwh) and flare (flr) and detects both mitotic recombination and various types of mutational events. Induced mutations are detected as single mosaic spots on the wing blade of surviving adults that show either the multiple wing hairs or flare phenotype. Induced recombination leads to mwh and flr twin spots and also, to some extent, to mwh single spots. Recording of the frequency and the size of different spots is allowed for a quantitative determination of the mutagenic and recombinogenic effects. Trans-heterozygous third-instar larvae were treated at different concentrations of the mouthwash products. Chlorexidin exposure concentrations were 0.5, 1 and 2mg/ml. Benzidamine-HCl exposure concentrations were 0.38, 0.75 and 1.5mg/ml. In addition, the observed mutations were classified according to size and type of mutation per wing. Both chlorexidin and benzidamine-HCl were genotoxic in terms of total mutations per wing at the highest doses. Survival rates of flies used in the experiments were significantly lower than those of the control group, with both mouthwash products showing toxic effects on Drosophila melanogaster larvae. Copyright (c) 2010 Elsevier Ltd. All rights reserved.", "Hand washing frequencies and procedures used in retail food services. Transmission of viruses, bacteria, and parasites to food by way of improperly washed hands is a major contributing factor in the spread of foodborne illnesses. Field observers have assessed compliance with hand washing regulations, yet few studies have included consideration of frequency and methods used by sectors of the food service industry or have included benchmarks for hand washing. Five 3-h observation periods of employee (n = 80) hand washing behaviors during menu production, service, and cleaning were conducted in 16 food service operations for a total of 240 h of direct observation. Four operations from each of four sectors of the retail food service industry participated in the study: assisted living for the elderly, childcare, restaurants, and schools. A validated observation form, based on 2005 Food Code guidelines, was used by two trained researchers. Researchers noted when hands should have been washed, when hands were washed, and how hands were washed. Overall compliance with Food Code recommendations for frequency during production, service, and cleaning phases ranged from 5% in restaurants to 33% in assisted living facilities. Procedural compliance rates also were low. Proposed benchmarks for the number of times hand washing should occur by each employee for each sector of food service during each phase of operation are seven times per hour for assisted living, nine times per hour for childcare, 29 times per hour for restaurants, and 11 times per hour for schools. These benchmarks are high, especially for restaurant employees. Implementation would mean lost productivity and potential for dermatitis; thus, active managerial control over work assignments is needed. These benchmarks can be used for training and to guide employee hand washing behaviors."], ["Antimicrobial properties of Allium sativum (garlic). Although garlic has been used for its medicinal properties for thousands of years, investigations into its mode of action are relatively recent. Garlic has a wide spectrum of actions; not only is it antibacterial, antiviral, antifungal and antiprotozoal, but it also has beneficial effects on the cardiovascular and immune systems. Resurgence in the use of natural herbal alternatives has brought the use of medicinal plants to the forefront of pharmacological investigations, and many new drugs are being discovered. This review aims to address the historical use of garlic and its sulfur chemistry, and to provide a basis for further research into its antimicrobial properties.", "Anisakiasis, an underestimated infection: effect on intestinal permeability of Anisakis simplex-sensitized patients. Anisakis simplex is a parasite that, if present in uncooked and contaminated saltwater fish, can invade the human gut. Two different clinical situations are recognized: the first, known as a gastrointestinal disease, varying from an asymptomatic episode to vomiting and diarrhea, and the second, classified as an adverse reaction to food, characterized by a wide spectrum of allergic reactions like rhinitis, conjunctivitis, or even anaphylaxis causing hypotension and/or shock. The intestinal epithelium, the major defense system against external molecules, represents an open gate for toxins and allergens if its protective function is compromised. Previous data have demonstrated a strict relationship between an altered intestinal permeability (I.P.) and worsening of the clinical manifestations in patients with adverse reactions to the food. In this article we evaluated the sensitization to A. simplex among patients who referred clinical symptoms of allergy. All subjects underwent commonly used alimentary skin prick test for food allergens, to which Ani s1, an A. simplex allergen, was added. In addition, in A. simplex-sensitized subjects, I.P. was determined upon their enrolment to the study (time 0) and after 6 months of consuming a raw fish-free diet (time 6). Five hundred and forty subjects were screened, and 170 had a positive skin prick test, 87 (51.2%) of whom were positive to Ani s1. Increased I.P. was evidenced in A. simplex-sensitized subjects with worse clinical symptoms, which receded after 6 months' elimination of raw seafood. With our data we demonstrated that the alimentary habit to eat raw fish represents a high risk for the integrity of the intestinal mucosa, and we suggest that this pathological situation may constitute an ideal, under-estimated, open gate for molecules that predispose to other, more important pathologies.", "Hepatitis induced by Noni juice from Morinda citrifolia: a rare cause of hepatotoxicity or the tip of the iceberg? A 24-year-old female patient presented to her community hospital with mild elevations of serum transaminase and bilirubin levels. Because of multiple sclerosis, she was treated with interferon beta-1a for 6 weeks. After exclusion of viral hepatitis due to hepatitis A-E, interferon beta-1a was withdrawn under the suspicion of drug-induced hepatitis. One week later, she was admitted again to her community hospital with severe icterus. The transaminase and bilirubin levels were highly elevated, and a beginning impairment of the liver synthesis was expressed by a reduced prothrombin time. The confinement to our department occurred with a fulminant hepatitis and the suspicion of beginning acute liver failure. There was no evidence for hepatitis due to potentially hepatotoxic viruses, alcoholic hepatitis, Budd-Chiari syndrome, hemochromatosis, and Wilson's disease. In her serum there were high titers of liver-kidney microsomal type 1 autoantibody; the serum gamma globulin levels were in the normal range. Fine-needle aspiration biopsy of the liver ruled out an autoimmune hepatitis but showed signs of drug-induced toxicity. During the interview, she admitted that for 'general immune system stimulation' she had been drinking Noni juice, a Polynesian herbal remedy made from a tropical fruit (Morinda citrifolia), during the past 4 weeks. After cessation of the Noni juice ingestion, her transaminase levels normalized quickly and were in the normal range within 1 month. Copyright 2006 S. Karger AG, Basel.", "Acute hepatotoxicity after ingestion of Morinda citrifolia (Noni Berry) juice in a 14-year-old boy. We present a case of a 14-year-old previously healthy boy with acute hepatotoxicity after noni berry juice consumption. As the popularity of noni berry consumption continues to increase, heightened awareness of the relation between noni berry consumption and acute hepatotoxicity is important.", "Creation of a databank for content of antioxidants in food products by an amperometric method. Oxidative stress, i.e. excessive content of reactionary, oxygen, and nitrogen compounds (ROAC), including free radicals, is one of the causes of various dangerous diseases as well as premature aging. The adverse effect of free radicals can be neutralized by antioxidants. In order to carry out antioxidant therapy, one needs to know the contents of antioxidants in food products. We have created the databank for the contents of antioxidants in 1,140 food products, beverages, etc. Apart from water-soluble antioxidants, fat-soluble antioxidants in dairy and fish products, cacao, chocolate, nuts etc. were determined for the first time using an amperometric method."], ["Complementary and alternative medicines in irritable bowel syndrome: An integrative view Irritable bowel syndrome (IBS) is a common gastrointestinal disorder with a high incidence in the general population. The diagnosis of IBS is mainly based on exclusion of other intestinal conditions through the absence of inflammatory markers and specific antigens. The current pharmacological treatment approaches available focus on reducing symptom severity while often limiting quality of life because of significant side effects. This has led to an effectiveness gap for IBS patients that seek further relief to increase their quality of life. Complementary and alternative medicines (CAM) have been associated with a higher degree of symptom management and quality of life in IBS patients. Over the past decade, a number of important clinical trials have shown that specific herbal therapies (peppermint oil and Iberogast\u00ae), hypnotherapy, cognitive behavior therapy, acupuncture, and yoga present with improved treatment outcomes in IBS patients. We propose an integrative approach to treating the diverse symptoms of IBS by combining the benefits of and need for pharmacotherapy with known CAM therapies to provide IBS patients with the best treatment outcome achievable. Initial steps in this direction are already being considered with an increasing number of practitioners recommending CAM therapies to their patients if pharmacotherapy alone does not alleviate symptoms sufficiently.", "From exotic spice to modern drug? The global demand for more affordable therapeutics and concerns about side effects of commonly used drugs are refocusing interest on Eastern traditional medicines, particularly those of India and China.", "Emerging issues associated with HIV patients seeking advice from health food stores. OBJECTIVES: To ascertain the recommendations, training and education of health food store employees and determine how they communicate the costs, benefits and risks associated with natural health products for the HIV/AIDS community. METHODS: Four male research assistants, posing as asymptomatic HIV-positive individuals, inquired of employees of all retail health food stores in a major Canadian city as to what is recommended for their condition. The research assistants asked about product costs, side effects, potential drug interactions and efficacy. They also inquired as to employee education related to Complementary and Alternative Medicine (CAM) and noted whether employees asked about which conventional medications they were taking and whether they recommended that the subjects seek physician or CAM provider advice. RESULTS: A total of 32 stores were included. Eight store employees (25%) offered no advice; eight (25%) inquired whether the subjects were currently taking medications; six (19%) suggested visiting a physician; and eight (25%) suggested visiting a CAM provider. A total of 36 different products (mean 2.3 per employee) were recommended with considerable variability in product evidence and cost. The education of the employees varied from postgraduate education (n=3), to undergraduate degree (n=3), college level (n=5) in CAM, or no formal education in CAM (n=21). CONCLUSION: There was considerable heterogeneity in advice on natural food products provided by employees of natural food stores and, in general, these individuals had limited formal training in CAM. The products they recommended had limited evidence supporting their efficacy and in some instances were potentially harmful and had considerable costs. The findings of this study support the need to further examine how best to regulate this growing component of the health care system.", "Health food stores' recommendations for nausea and migraines during pregnancy. BACKGROUND: Many pregnant women use dietary supplements during pregnancy; however, relatively scant information is available on the safety of these products. Consumers of dietary supplements often rely on employees of health food stores to provide recommendations. OBJECTIVE: To evaluate recommendations made by health food store employees in the Phoenix metropolitan area regarding treatment of nausea/vomiting and migraines during pregnancy. METHODS: Phone calls were made by a disguised shopper to 155 health food stores in the greater Phoenix area. The caller posed as a woman 8 weeks' pregnant asking for recommendations for treatment of nausea/vomiting and migraines. Responses and recommendations were recorded and then compared with current scientific evidence obtained during a search of the literature using MEDLINE (1966-September 2004) as to whether or not the supplements and the methods of their use during pregnancy were contraindicated. RESULTS: Eighty-nine percent of stores offered recommendations for nausea/vomiting, and 82% provided recommendations for migraines. The use of ginger was the most recommended therapy for nausea/vomiting. Only 3.6% of respondents recommended correct usage, but failed to supply the correct dosage and duration. A total of 15 of 278 (5%) recommendations, for both nausea/vomiting and migraines, were for products contraindicated in pregnancy. CONCLUSIONS: In light of the increased use of dietary supplements by women during pregnancy, the willingness of personnel in health food stores to make any recommendations should foster concerns by patients and healthcare providers alike. Use of dietary supplements contraindicated in pregnancy could cause significant harm to the mother and/or fetus. Studies are needed to address the need for more stringent guidelines regarding health food stores and their recommendations.", "Traditional non-Western diets. In traditional cultures, balancing health with a balanced lifestyle was a core belief. The diseases of modern civilization were rare. Indigenous people have patterns of illness very different from Western civilization; yet, they rapidly develop diseases once exposed to Western foods and lifestyles. Food and medicine were interwoven. All cultures used special or functional foods to prevent disease. Food could be used at different times either as food or medicine. Foods, cultivation, and cooking methods maximized community health and well-being. With methods passed down through generations, cooking processes were utilized that enhanced mineral and nutrient bioavailability. This article focuses on what researchers observed about the food traditions of indigenous people, their disease patterns, the use of specific foods, and the environmental factors that affect people who still eat traditional foods."], ["The use of dental radiographs: update and recommendations. BACKGROUND AND OVERVIEW: The National Council on Radiation Protection & Measurements updated its recommendations on radiation protection in dentistry in 2003, the Centers for Disease Control and Prevention published its Guidelines for Infection Control in Dental Health-Care Settings in 2003, and the U.S. Food and Drug Administration updated its selection criteria for dental radiographs in 2004. This report summarizes the recommendations presented in these documents and addresses additional topics such as patient selection criteria, film selection for conventional radiographs, collimation, beam filtration, patient protective equipment, film holders, operator protection, film exposure and processing, infection control, quality assurance, image viewing, direct digital radiography and continuing education of dental health care workers who expose radiographs. CONCLUSIONS: This report discusses implementation of proper radiographic practices. In addition to these guidelines, dentists should be aware of, and comply with, applicable federal and state regulations. CLINICAL IMPLICATIONS: Dentists should weigh the benefits of dental radiographs against the consequences of increasing a patient's exposure to radiation and implement appropriate radiation control procedures.", "Update on the biological effects of ionizing radiation, relative dose factors and radiation hygiene. Diagnostic imaging is an indispensable part of contemporary medical and dental practice. Over the last few decades there has been a dramatic increase in the use of ionizing radiation for diagnostic imaging. The carcinogenic effects of high-dose exposure are well known. Does diagnostic radiation rarely cause cancer? We don't know but we should act as if it does. Accordingly, dentists should select patients wisely - only make radiographs when there is patient-specific reason to believe there is a reasonable expectation the radiograph will offer unique information influencing diagnosis or treatment. Low-dose examinations should be made: intraoral imaging - use fast film or digital sensors, thyroid collars, rectangular collimation; panoramic and lateral cephalometric imaging - use digital systems or rare-earth film screen combinations; and cone beam computed tomography - use low-dose machines, restrict field size to region of interest, reduce mA and length of exposure arc as appropriate. \u00a9 2012 Australian Dental Association.", "Diet, nutrition and the prevention of dental diseases. Oral health is related to diet in many ways, for example, nutritional influences on craniofacial development, oral cancer and oral infectious diseases. Dental diseases impact considerably on self-esteem and quality of life and are expensive to treat. The objective of this paper is to review the evidence for an association between nutrition, diet and dental diseases and to present dietary recommendations for their prevention. Nutrition affects the teeth during development and malnutrition may exacerbate periodontal and oral infectious diseases. However, the most significant effect of nutrition on teeth is the local action of diet in the mouth on the development of dental caries and enamel erosion. Dental erosion is increasing and is associated with dietary acids, a major source of which is soft drinks. Despite improved trends in levels of dental caries in developed countries, dental caries remains prevalent and is increasing in some developing countries undergoing nutrition transition. There is convincing evidence, collectively from human intervention studies, epidemiological studies, animal studies and experimental studies, for an association between the amount and frequency of free sugars intake and dental caries. Although other fermentable carbohydrates may not be totally blameless, epidemiological studies show that consumption of starchy staple foods and fresh fruit are associated with low levels of dental caries. Fluoride reduces caries risk but has not eliminated dental caries and many countries do not have adequate exposure to fluoride. It is important that countries with a low intake of free sugars do not increase intake, as the available evidence shows that when free sugars consumption is <15-20 kg/yr ( approximately 6-10% energy intake), dental caries is low. For countries with high consumption levels it is recommended that national health authorities and decision-makers formulate country-specific and community-specific goals for reducing the amount of free sugars aiming towards the recommended maximum of no more than 10% of energy intake. In addition, the frequency of consumption of foods containing free sugars should be limited to a maximum of 4 times per day. It is the responsibility of national authorities to ensure implementation of feasible fluoride programmes for their country.", "Emerging science in the dietary control and prevention of dental caries. The key environmental factor involved in caries incidence is fermentable carbohydrates. Because of the high costs of caries treatment, researchers continue to explore dietary control as a promising preventive method. While dietary change has been demonstrated to reduce Streptococcus mutans, a preventive role is expected for \\\"functional foods\\\" and dietary habit alterations. The authors consider how recent advances in the understanding of caries pathology can reveal dietary control as a valuable method in promoting a healthy dentition.", "Political context of the World Health Organization: sugar industry threatens to scupper the WHO. The Sugar Association, representing the U.S. sugar industry, is highly critical of a WHO report on guidelines for healthy eating, which suggests that sugar should account for no more than 10 percent of a healthy diet. The association has demanded that Congress end its funding of the World Health Organization unless the WHO withdraws the guidelines, and the association and six other big food industry groups have also asked the U.S. Secretary of Health and Human Services to use his influence to get the WHO report withdrawn. The WHO strongly rejects the sugar lobby's criticisms."], ["Amnesic shellfish poison. Amnesic shellfish poisoning (ASP) is caused by consumption of shellfish that have accumulated domoic acid, a neurotoxin produced by some strains of phytoplankton. The neurotoxic properties of domoic acid result in neuronal degeneration and necrosis in specific regions of the hippocampus. A serious outbreak of ASP occurred in Canada in 1987 and involved 150 reported cases, 19 hospitalisations and 4 deaths after consumption of contaminated mussels. Symptoms ranged from gastrointestinal disturbances, to neurotoxic effects such as hallucinations, memory loss and coma. Monitoring programmes are in place in numerous countries worldwide and closures of shellfish harvesting areas occur when domoic acid concentrations exceed regulatory limits. This paper reviews the chemistry, sources, metabolism and toxicology of domoic acid as well as human case reports of ASP and discusses a possible mechanism of toxicity.", "Short or Long Sleep Duration Is Associated with Memory Impairment in Older Chinese: the Guangzhou Biobank Cohort Study Study Objectives: To examine the association between sleep-related factors and memory impairment. Design: Cross-sectional study Setting: Community-based study in Guangzhou, China. Participants: 28,670 older Chinese (20,776 women and 7,894 men) aged 50 to 85 years. Measurements and Results: Demographic and socioeconomic data, sleep-related factors, and cognitive function were collected by face-to-face interview. Potential confounders, such as employment and occupational status, smoking, alcohol and tea use, physical activity, self-rated health, anthropometry, blood pressure, and fasting plasma glucose and lipids were measured. After adjusting for multiple potential confounders, an inverted U-shaped association between sleep duration and delayed word recall test (DWRT) score, a validated measure of memory impairment, was found, with 7 to 8 h of habitual sleep duration showing the highest score (P-values for trend from 3 to 7 h and from 7 to \u2265 10 h were all \u2264 0.001). Compared to sleep duration of 7 h, the adjusted odds ratio for memory impairment from the sleep duration of 3 to 4 or \u2265 10 h was 1.29 (95% confidence interval 1.07-1.56) and 1.52 (1.25-1.86), respectively. Subjects with daily napping, morning tiredness, or insomnia had significantly lower DWRT scores than those without (P ranged from < 0.001 to 0.01). Conclusions: Short or long sleep duration was an important sleep-related factor independently associated with memory impairment and may be a useful marker for increased risk of cognitive impairment in older people. Citation: Xu L; Jiang CQ; Lam TH; Liu B; Jin YL; Zhu T; Zhang WS; Cheng KK; Thomas GN. Short or long sleep duration is associated with memory impairment in older Chinese: the Guangzhou Biobank Cohort Study. SLEEP 2011;34(5):575-580.", "High tofu intake is associated with worse memory in elderly Indonesian men and women. BACKGROUND/AIMS: Cell culture studies suggest that phytoestrogens, abundant in soy products such as tempe and tofu, could protect against cognitive decline. Paradoxically, the Honolulu Asia Aging Study reported an increased risk for cognitive impairment and other dementia markers with high tofu (soybean curd) intake. METHODS: A cross-sectional study was carried out in 2 rural sites (Borobudur and Sumedang) and 1 urban site (Jakarta) among mainly Javanese and Sundanese elderly (n = 719, 52-98 years of age). Memory was measured using a word learning test sensitive to dementia and soy consumption was assessed using Food Frequency Questionnaire items. RESULTS: High tofu consumption was associated with worse memory (beta = -0.18, p < 0.01, 95% CI = -0.34 to -0.06), while high tempe consumption (a fermented whole soybean product) was independently related to better memory (beta = 0.12, p < 0.05, 95% CI = 0.00-0.28), particularly in participants over 68 years of age. Fruit consumption also had an independent positive association. The analyses were controlled for age, sex, education, site and intake of other foods. CONCLUSION: The results for tofu consumption as a risk factor for low memory function may tie in with the Honolulu Asia Aging Study data. It is unclear whether these negative associations could be attributed to potential toxins or to its phytoestrogen levels. Estrogen (through which receptors phytoestrogens can exert effects) was found to increase dementia risk in women over 65 years of age. Tempe contains high levels of phytoestrogens, but (due to fermentation) also exhibits high folate levels which may exert protective effects. Future studies should validate these findings and investigate potential mechanisms. Copyright 2008 S. Karger AG, Basel.", "Hydration and cognitive performance. A clinical link exists between severe dehydration and cognitive performance. Using rapid and severe water loss induced either by intense exercise and/or heat stress, initial studies suggested there were alterations in short-term memory and cognitive function related to vision, but more recent studies have not all confirmed these data. Some studies argue that water loss is not responsible for the observations made, and studies compensating water losses have failed to prevent the symptoms. Studies in children have suggested that drinking extra water helps cognitive performance, but these data rely on a small number of children. In older adults (mean age around 60) the data are not strong enough to support a relationship between mild dehydration and cognitive function. Data on frail elderly and demented people are lacking. Methodological heterogeneity in these studies are such that the relationship between mild dehydration and cognitive performance cannot be supported.", "A berry thought-provoking idea: the potential role of plant polyphenols in the treatment of age-related cognitive disorders. Today, tens of millions of elderly individuals worldwide suffer from dementia. While the pathogenesis of dementia is complex and incompletely understood, it may be, at least to a certain extent, the consequence of systemic vascular pathology. The metabolic syndrome and its individual components induce a proinflammatory state that damages blood vessels. This condition of chronic inflammation may damage the vasculature of the brain or be directly neurotoxic. Associations have been established between the metabolic syndrome, its constituents and dementia. A relationship has also been observed between certain dietary factors, such as constituents of the 'Mediterranean diet', and the metabolic syndrome; similar associations have been noted between these dietary factors and dementia. Fruit juices and extracts are under investigation as treatments for cognitive impairment. Blueberry, strawberry, blackberry, grape and plum juices or extracts have been successfully tested in cognitively impaired rodents. Published trials of the benefits of grape and blueberry juice in the treatment of small numbers of cognitively impaired persons have recently appeared. The benefits of fruit products are thought to be a result of its polyphenol content. A grape polyphenol found in grapes, resveratrol, now being studied in humans, and one in grapes and blueberries, pterostilbene, have been found to improve cognition in rodents. In the design of future human trials, one ought to consider the poor bioavailability of these products, the possible need to initiate the experimental therapy long before the onset of symptoms, and currently limited knowledge about the appropriate form (e.g. juice, powder or individual polyphenol) of treatment."], ["Aneurysm and Neurocysticercosis: Casual or Causal Relationship? Case Report and Review of the Literature Four cases of suggestive inflammatory aneurysms in patients with neurocysticercosis have been described. We report a case of a 49-year-old woman who presented with subarachnoid haemorrhage from a right middle cerebral artery bifurcation aneurysm and had a casual relationship with neurocysticercosis. At surgery, a viable cysticercus without signs of inflammation or thickened leptomeninges was found in the distal position of the aneurysm. Postoperatively, the patient received albendazole and dextrochlorpheniramine. In the subsequent three years, the patient was asymptomatic and took drugs to prevent convulsion and arterial hypertension. The relationship between NCC and the presence of cerebral aneurysm is discussed.", "The Collateral Network Concept: A Reassessment of the Anatomy of Spinal Cord Perfusion OBJECTIVE Prevention of paraplegia following repair of thoracoabdominal aortic aneurysms (TAAA) requires understanding the anatomy and physiology of the blood supply to the spinal cord. Recent laboratory studies and clinical observations suggest that a robust collateral network must exist to explain preservation of spinal cord perfusion when segmental vessels are interrupted. An anatomical study was undertaken. METHODS Twelve juvenile Yorkshire pigs underwent aortic cannulation and infusion of a low-viscosity acrylic resin at physiological pressures. After curing of the resin and digestion of all organic tissue, the anatomy of the blood supply to the spinal cord was studied grossly and using light and electron microscopy. RESULTS All vascular structures \u2265 8\u03bcm in diameter were preserved. Thoracic and lumbar segmental arteries (SAs) give rise not only to the anterior spinal artery (ASA), but to an extensive paraspinous network feeding the erector spinae, iliopsoas, and associated muscles. The ASA, mean diameter 134\u00b120 \u03bcm, is connected at multiple points to repetitive circular epidural arteries with mean diameters of 150\u00b126 \u03bcm. The capacity of the paraspinous muscular network is 25-fold the capacity of the circular epidural arterial network and ASA combined. Extensive arterial collateralization is apparent between the intraspinal and paraspinous networks, and within each network. Only 75% of all SAs provide direct ASA-supplying branches. CONCLUSIONS The ASA is only one component of an extensive paraspinous and intraspinal collateral vascular network. This network provides an anatomic explanation of the physiological resiliency of spinal cord perfusion when SAs are sacrificed during TAAA repair.", "Diverticular disease: Epidemiology and management Diverticular disease of the colon is among the most prevalent conditions in western society and is among the leading reasons for outpatient visits and causes of hospitalization. While previously considered to be a disease primarily affecting the elderly, there is increasing incidence among individuals younger than 40 years of age. Diverticular disease most frequently presents as uncomplicated diverticulitis, and the cornerstone of management is antibiotic therapy and bowel rest. Segmental colitis associated with diverticula shares common histopathological features with inflammatory bowel disease and may benefit from treatment with 5-aminosalicylates. Surgical management may be required for patients with recurrent diverticulitis or one of its complications including peridiverticular abscess, perforation, fistulizing disease, and strictures and/or obstruction. R\u00e9sum\u00e9 La maladie diverticulaire du c\u00f4lon est l\u2019une des pathologies les plus pr\u00e9valentes de la soci\u00e9t\u00e9 occidentale et des principales causes de consultations ambulatoires et d\u2019hospitalisations. On croyait qu\u2019elle touchait surtout les personnes \u00e2g\u00e9es, mais son incidence est en croissance aupr\u00e8s des personnes de moins de 40 ans. La maladie diverticulaire se manifeste surtout sous forme de diverticulite sans complication, et la pierre angulaire du traitement est l\u2019antibioth\u00e9rapie et le repos intestinal. La colite segmentaire associ\u00e9e aux diverticules partage des caract\u00e9ristiques histopathologiques avec les maladies inflammatoires de l\u2019intestin et peut profiter d\u2019un traitement aux 5-aminosalicylates. Une prise en charge chirurgicale peut s\u2019imposer en pr\u00e9sence de diverticulite r\u00e9currente ou de l\u2019une de ses complications, y compris un abc\u00e8s p\u00e9ridiverticulaire, une perforation, une fistulisation et des st\u00e9noses ou des obstructions.", "Effect of cholesterol crystals on plaques and intima in arteries of patients with acute coronary and cerebrovascular syndromes. Plaque disruption (PD) causes most acute cardiovascular events. Although cholesterol crystals (CCs) have been observed in plaques, their role in PD was unknown. However, cholesterol expands with crystallization tearing and perforating fibrous tissues. This study tested the hypothesis that CCs can damage plaques and intima, triggering PD, as observed in tissues prepared without ethanol solvents that dissolve CCs. Coronary arteries of patients who died of acute coronary syndrome (n = 19) and non-acute coronary syndrome causes (n = 12) and carotid plaques from patients with (n = 51) and without (n = 19) neurologic symptoms were studied. Samples were examined for CCs perforating the intima using light and scanning electron microscopy (SEM) with ethanol or vacuum dehydration. In addition, fresh unfixed carotid plaques were examined at 37 degrees C using confocal microscopy. Crystal content using SEM was scored from 0 to +3. SEM using vacuum dehydration had significantly higher crystal content compared with SEM using ethanol dehydration (+2.5 +/- 0.53 vs +0.25 +/- 0.46; p <0.0003), with enhanced detection of CC perforations. The presence of CCs using SEM and confocal microscopy was similar, suggesting that CC perforation can occur in vivo at 37 degrees C. All patients with acute coronary syndrome had perforating CCs, but none was present in patients without acute coronary syndrome (p = 0.0001). For all plaques, there were strong associations of CCs with PD, thrombus, symptoms (p <0.0001), and plaque size (p <0.02). Crystal content was an independent predictor of thrombus and symptoms. In conclusion, by avoiding ethanol in tissue preparation, CCs perforating the intima were shown to be associated with PD. Crystal content was significantly associated with clinical events, suggesting that cholesterol crystallization may have a role in PD.", "The artery size hypothesis: a macrovascular link between erectile dysfunction and coronary artery disease. Erectile dysfunction (ED) is defined as the inability to achieve or maintain an erection satisfactory for sexual performance. Evidence is accumulating to consider ED as a vascular disorder. Common risk factors for atherosclerosis are frequently found in association with ED, and ED is frequently reported in vascular syndromes, such as coronary artery disease (CAD), hypertension, cerebrovascular disease, peripheral arterial disease, and diabetes mellitus. Finally, similar early impairment of endothelium-dependent vasodilatation and late obstructive vascular changes has been reported in both ED and other vascular syndromes. Recently, we proposed a pathophysiologic mechanism to explain the link between ED and CAD called the artery size hypothesis. Given the systemic nature of atherosclerosis, all major vascular beds should be affected to the same extent. However, symptoms rarely become evident at the same time. This difference in rate of occurrence of different symptoms is proposed to be caused by the different size of the arteries supplying different vascular beds that allow a larger vessel to better tolerate the same amount of plaque compared with a smaller one. According to this hypothesis, because penile arteries are smaller in diameter than coronary arteries, patients with ED will seldom have concomitant symptoms of CAD, whereas patients with CAD will frequently complain of ED. Available clinical evidence appears to support this hypothesis."], ["Anisakis simplex: from Obscure Infectious Worm to Inducer of Immune Hypersensitivity Summary: Infection of humans with the nematode worm parasite Anisakis simplex was first described in the 1960s in association with the consumption of raw or undercooked fish. During the 1990s it was realized that even the ingestion of dead worms in food fish can cause severe hypersensitivity reactions, that these may be more prevalent than infection itself, and that this outcome could be associated with food preparations previously considered safe. Not only may allergic symptoms arise from infection by the parasites (\u201cgastroallergic anisakiasis\u201d), but true anaphylactic reactions can also occur following exposure to allergens from dead worms by food-borne, airborne, or skin contact routes. This review discusses A. simplex pathogenesis in humans, covering immune hypersensitivity reactions both in the context of a living infection and in terms of exposure to its allergens by other routes. Over the last 20 years, several studies have concentrated on A. simplex antigen characterization and innate as well as adaptive immune response to this parasite. Molecular characterization of Anisakis allergens and isolation of their encoding cDNAs is now an active field of research that should provide improved diagnostic tools in addition to tools with which to enhance our understanding of pathogenesis and controversial aspects of A. simplex allergy. We also discuss the potential relevance of parasite products such as allergens, proteinases, and proteinase inhibitors and the activation of basophils, eosinophils, and mast cells in the induction of A. simplex-related immune hypersensitivity states induced by exposure to the parasite, dead or alive.", "Anisakiasis, an underestimated infection: effect on intestinal permeability of Anisakis simplex-sensitized patients. Anisakis simplex is a parasite that, if present in uncooked and contaminated saltwater fish, can invade the human gut. Two different clinical situations are recognized: the first, known as a gastrointestinal disease, varying from an asymptomatic episode to vomiting and diarrhea, and the second, classified as an adverse reaction to food, characterized by a wide spectrum of allergic reactions like rhinitis, conjunctivitis, or even anaphylaxis causing hypotension and/or shock. The intestinal epithelium, the major defense system against external molecules, represents an open gate for toxins and allergens if its protective function is compromised. Previous data have demonstrated a strict relationship between an altered intestinal permeability (I.P.) and worsening of the clinical manifestations in patients with adverse reactions to the food. In this article we evaluated the sensitization to A. simplex among patients who referred clinical symptoms of allergy. All subjects underwent commonly used alimentary skin prick test for food allergens, to which Ani s1, an A. simplex allergen, was added. In addition, in A. simplex-sensitized subjects, I.P. was determined upon their enrolment to the study (time 0) and after 6 months of consuming a raw fish-free diet (time 6). Five hundred and forty subjects were screened, and 170 had a positive skin prick test, 87 (51.2%) of whom were positive to Ani s1. Increased I.P. was evidenced in A. simplex-sensitized subjects with worse clinical symptoms, which receded after 6 months' elimination of raw seafood. With our data we demonstrated that the alimentary habit to eat raw fish represents a high risk for the integrity of the intestinal mucosa, and we suggest that this pathological situation may constitute an ideal, under-estimated, open gate for molecules that predispose to other, more important pathologies.", "Anisakis simplex allergy after eating chicken meat. BACKGROUND: Allergic reactions to food can be produced by contaminants that induce sensitization. Among these, Anisakis simplex can cause seafood infestation, and allergic symptoms (urticaria-angioedema, anaphylaxis, and asthma) can follow the eating or handling of affected fish. Although seafood is the principal source of human infections by this parasite, we have found allergic symptoms in 8 patients previously diagnosed as having A simplex sensitization after they ate chicken meat. Chicken feed usually has a high proportion of fishmeal, which might possibly be contaminated by this nematode. OBJECTIVE: The aim of our study was to determine whether parasite proteins present in chicken meat could be responsible for the symptoms reported by these subjects. METHODS: We carried out in vivo tests (prick, bronchial challenge, and double-blind placebo-controlled challenge with meat chicken) in these 8 patients. We performed immunoblotting using the sera from the 8 patients and controls in order to detect A simplex sensitization. We also investigated the presence of A simplex proteins in sera from chickens fed with fishmeal and in other sera from chickens fed only with cereals. We excluded sensitization to other chicken nematodes by serologic methods. RESULTS: All 8 patients presented positive prick and challenges to A simplex. When we used serum from chickens fed with fishmeal as the antigen in blotting, patients 3, 4, 5, 6, 7, and 8 recognized a band of 16 kd, also obtained when using pools of fish-shellfish and A simplex larva. No detection was observed with sera from chickens fed with only cereals. CONCLUSION: We provide evidence, based on in vivo and in vitro tests, that subjects highly sensitized to A simplex can detect the presence of Anisakis species allergens in chicken meat.", "Anisakis simplex hypersensitivity is associated with chronic urticaria in endemic areas. BACKGROUND: Chronic urticaria (CU) may affect up to 1% of the general population. Anisakis simplex hypersensitivity is frequent in areas where raw fish is consumed and A. simplex allergy represents a relevant cause of acute urticaria. We assessed the possible association between CU and A. simplex sensitization in an area where marinated fish is very frequently eaten. METHODS: A thorough history of CU was sought in 919 adults seen at the Allergy Center, Bari. CU patients and 187 controls underwent skin-prick testing with a commercial extract of A. simplex, and reactors were recommended a 6-month raw-fish-free diet regimen. Responders were followed after a further 3 months. RESULTS: Of 919 subjects, 213 (23%) met the criteria for CU and 106/213 (49.7%) were sensitized to A. simplex with a significant difference between patients aged >65 or <65 years (56 vs. 41%, respectively; p < 0.05). All patients hypersensitive to A. simplex were regular consumers of marinated fish. In a control population without CU, the prevalence of A. simplex sensitization was 16% (p < 0.001). The 6-month diet regimen led to the disappearance of urticaria in 82/106 cases (77%) versus 1/42 (2%) subjects who did not change their dietary habits (p < 0.001). All nonresponders were sensitized to house-dust mites. Of 75 responders who were followed-up after 3 months, CU relapsed in 88% of those who had reintroduced raw fish versus 14% of those who were still on the diet (p < 0.001). CONCLUSION: In areas where raw or marinated fish is frequently eaten, A. simplex hypersensitivity is a frequent cause of CU. Copyright \u00a9 2012 S. Karger AG, Basel.", "Evaluation of a real-time polymerase chain reaction (PCR) assay for detection of anisakis simplex parasite as a food-borne allergen source in seafo... Anisakis simplex has been recognized as an important cause of disease in humans and as a food-borne allergen source. Actually, this food-borne parasite was recently identified as an emerging food safety risk. An A. simplex -specific primer-probe system based on a real-time polymerase chain reaction (PCR) detection assay has been successfully optimized and validated with seafood samples. In addition, a DNA extraction procedure has been optimized to detect the presence of the nematode in food samples. The assay is a very reliable, specific, and sensitive methodology to detect the presence of traces of this parasite in seafood products, including highly processed samples. As a result, 13 sequences of cytochrome c oxidase II gene were obtained and scrutinized to calculate intra- and interspecific variabilities of 0 and 35-67%, respectively. Finally, an efficiency of 2.07 +/- 0.14 of the assay was calculated, and a limit of detection of 40 ppm parasite in 25 g of sample was also optimized. Actually, the presence of this parasite in several seafood products has been demonstrated, enforcing the necessity of a design for a good manufacturing practice protocol for the processing industry to minimize the presence of this parasite as a food-borne allergen source in seafood products."], ["The role of phytic acid in legumes: antinutrient or beneficial function? This review describes the present state of knowledge about phytic acid (phytate), which is often present in legume seeds. The antinutritional effects of phytic acid primarily relate to the strong chelating associated with its six reactive phosphate groups. Its ability to complex with proteins and particularly with minerals has been a subject of investigation from chemical and nutritional viewpoints. The hydrolysis of phytate into inositol and phosphates or phosphoric acid occurs as a result of phytase or nonenzymatic cleavage. Enzymes capable of hydrolysing phytates are widely distributed in micro-organisms, plants and animals. Phytases act in a stepwise manner to catalyse the hydrolysis of phytic acid. To reduce or eliminate the chelating ability of phytate, dephosphorylation of hexa- and penta-phosphate forms is essential since a high degree of phosphorylation is necessary to bind minerals. There are several methods of decreasing the inhibitory effect of phytic acid on mineral absorption (cooking, germination, fermentation, soaking, autolysis). Nevertheless, inositol hexaphosphate is receiving increased attention owing to its role in cancer prevention and/or therapy and its hypocholesterolaemic effect.", "A systematic screening of total antioxidants in dietary plants. A predominantly plant-based diet reduces the risk for development of several chronic diseases. It is often assumed that antioxidants contribute to this protection, but results from intervention trials with single antioxidants administered as supplements quite consistently do not support any benefit. Because dietary plants contain several hundred different antioxidants, it would be useful to know the total concentration of electron-donating antioxidants (i.e., reductants) in individual items. Such data might be useful in the identification of the most beneficial dietary plants. We have assessed systematically total antioxidants in a variety of dietary plants used worldwide, including various fruits, berries, vegetables, cereals, nuts and pulses. When possible, we analyzed three or more samples of dietary plants from three different geographic regions in the world. Total antioxidants was assessed by the reduction of Fe(3+) to Fe(2+) (i.e., the FRAP assay), which occurred rapidly with all reductants with half-reaction reduction potentials above that of Fe(3+)/Fe(2+). The values, therefore, expressed the corresponding concentration of electron-donating antioxidants. Our results demonstrated that there is more than a 1000-fold difference among total antioxidants in various dietary plants. Plants that contain most antioxidants included members of several families, such as Rosaceae (dog rose, sour cherry, blackberry, strawberry, raspberry), Empetraceae (crowberry), Ericaceae (blueberry), Grossulariaceae (black currant), Juglandaceae (walnut), Asteraceae (sunflower seed), Punicaceae (pomegranate) and Zingiberaceae (ginger). In a Norwegian diet, fruits, berries and cereals contributed 43.6%, 27.1% and 11.7%, respectively, of the total intake of plant antioxidants. Vegetables contributed only 8.9%. The systematic analysis presented here will facilitate research into the nutritional role of the combined effect of antioxidants in dietary plants.", "Creation of a databank for content of antioxidants in food products by an amperometric method. Oxidative stress, i.e. excessive content of reactionary, oxygen, and nitrogen compounds (ROAC), including free radicals, is one of the causes of various dangerous diseases as well as premature aging. The adverse effect of free radicals can be neutralized by antioxidants. In order to carry out antioxidant therapy, one needs to know the contents of antioxidants in food products. We have created the databank for the contents of antioxidants in 1,140 food products, beverages, etc. Apart from water-soluble antioxidants, fat-soluble antioxidants in dairy and fish products, cacao, chocolate, nuts etc. were determined for the first time using an amperometric method.", "Fostering antioxidant defences: up-regulation of antioxidant genes or antioxidant supplementation? Vitamins have traditionally been considered as food components that are required in the normal diet to prevent deficiencies. However, a newer concept of the function of vitamins in nutrition has taken them beyond simply prevention of deficiency symptoms. This concept considers that many vitamins, when taken in relatively large doses, have important functions beyond preventing deficiencies. Linus Pauling was instrumental in putting forward this concept, particularly for vitamin C. Thus, relatively high intakes of vitamins, and in particular vitamins C and E which are antioxidants, are considered to be healthy for the human population. This may be true in some special situations such as, for instance, the prevention of Alzheimer's disease progression. However, recent epidemiological evidence has not supported the claim that antioxidant vitamins increase well-being and prolong life span. In fact, vitamin supplementation may be even detrimental and reduce life span. A new concept that we would like to put forward is that nutrients up-regulate the endogenous antioxidant defences. This is particularly true in the case of phytoestrogens for example, which bind to oestrogen receptors and eventually up-regulate the expression of antioxidant genes. In this review we discuss the pros and cons of antioxidant vitamin supplementation and also the possibility that the ingestion of some nutrients may be very effective in increasing antioxidant defences by up-regulating the activity of antioxidant enzymes which are normally present in the cell.", "Fibromyalgia and nutrition, what do we know? Many people suffer from fibromyalgia (FM) without an effective treatment. They do not have a good quality of life and cannot maintain normal daily activity. Among the different hypotheses for its ethiopathophysiology, oxidative stress is one of the possibilities. Non-scientific information addressed to patients regarding the benefits of nutrition is widely available, and they are used to trying non-evidenced strategies. The aim of this paper is to find out what we know right now from scientific studies regarding fibromyalgia disease and nutritional status, diets and food supplements. A systematic search has been performed on Medline with a wide range of terms about these nutritional issues. The search has been made during 2009, for articles published between 1998 and 2008. TARGET POPULATION: people suffering from FM. Vegetarian diets could have some beneficial effects probably due to the increase in antioxidant intake. There is a high prevalence of obesity and overweight in patients, and weight control seems to be an effective tool to improve the symptoms. Some nutritional deficiencies have been described, it is not clear whether they are directly related to this disease or not. About the usefulness of some food supplements we found very little data, and it seems that more studies are needed to prove which ones could be of help. Dietary advice is necessary to these patients to improve their diets and maintain normal weight. It would be interesting to investigate more in the field of nutrition and FM to reveal any possible relationships."], ["Do all sedentary activities lead to weight gain: sleep does not. PURPOSE OF REVIEW: To discuss the benefits of having a good night's sleep for body weight stability. RECENT FINDINGS: Experimental studies have shown that short-term partial sleep restriction decreases glucose tolerance, increases sympathetic tone, elevates cortisol concentrations, decreases the satiety hormone leptin, increases the appetite-stimulating hormone ghrelin, and increases hunger and appetite. Short sleep duration might increase the risk of becoming obese, because it does not allow the recovery of a hormonal profile facilitating appetite control. Lack of sleep could also lead to weight gain and obesity by increasing the time available for eating and by making the maintenance of a healthy lifestyle more difficult. Furthermore, the increased fatigue and tiredness associated with sleeping too little could lessen one's resolve to follow exercise regimens. SUMMARY: Short sleep duration appears to be a novel and independent risk factor for obesity. With the growing prevalence of chronic sleep restriction, any causal association between reduced sleep and obesity would have substantial importance from a public health standpoint. Future research is needed to determine whether sleep extension in sleep-deprived obese individuals will influence appetite control and/or reduce the amount of body fat.", "The effect of inhaling peppermint odor and ethanol in women athletes. The purpose of this study was to determine whether inhaling peppermint odor has effects on time of running, maximum heart rate (MHR), maximum oxygen consumption (VO2max), oxygen consumption (VO2), minute ventilation (VE) and respiratory exchange ratio (RER) during acute intensive exercise or not. 36 women soccer player were chosen for participating in this research. They were randomly divided in 3 groups (control, inhaling peppermint, inhaling mixture of peppermint and ethanol). In order to be aware of similarity of groups, the subjects' BMI was determined and ANOVA did not show any significant differences (p < 0.05). The subjects of three groups ran on treadmill according to Bruce test. Heart rate, time of running, VO2max, VO2, VE and RER were measured by Gas Analyzer. After collecting the data, ANOVA was done (p < 0.05) and the results showed that in this study the inhaling of fragrant odors did not have any significant effect on the time of running, MHR, VO2max, VO2, VE and RER, which we think is due to the intensity and duration of training. Referring to our results of the present study; we suggest that inhaling peppermint odor during acute intensive exercise has no significant effect on pulmonary indexes and physical performance (Tab. 4, Fig. 1, Ref. 21).", "Could increased time spent in a thermal comfort zone contribute to population increases in obesity? Domestic winter indoor temperatures in the USA, UK and other developed countries appear to be following an upwards trend. This review examines evidence of a causal link between thermal exposures and increases in obesity prevalence, focusing on acute and longer-term biological effects of time spent in thermal comfort compared with mild cold. Reduced exposure to seasonal cold may have a dual effect on energy expenditure, both minimizing the need for physiological thermogenesis and reducing thermogenic capacity. Experimental studies show a graded association between acute mild cold and human energy expenditure over the range of temperatures relevant to indoor heating trends. Meanwhile, recent studies of the role of brown adipose tissue (BAT) in human thermogenesis suggest that increased time spent in conditions of thermal comfort can lead to a loss of BAT and reduced thermogenic capacity. Pathways linking cold exposure and adiposity have not been directly tested in humans. Research in naturalistic and experimental settings is needed to establish effects of changes in thermal exposures on weight, which may raise possibilities for novel public health strategies to address obesity. \u00a9 2011 The Authors. obesity reviews \u00a9 2011 International Association for the Study of Obesity.", "Dietary inorganic nitrate improves mitochondrial efficiency in humans. Nitrate, an inorganic anion abundant in vegetables, is converted in vivo to bioactive nitrogen oxides including NO. We recently demonstrated that dietary nitrate reduces oxygen cost during physical exercise, but the mechanism remains unknown. In a double-blind crossover trial we studied the effects of a dietary intervention with inorganic nitrate on basal mitochondrial function and whole-body oxygen consumption in healthy volunteers. Skeletal muscle mitochondria harvested after nitrate supplementation displayed an improvement in oxidative phosphorylation efficiency (P/O ratio) and a decrease in state 4 respiration with and without atractyloside and respiration without adenylates. The improved mitochondrial P/O ratio correlated to the reduction in oxygen cost during exercise. Mechanistically, nitrate reduced the expression of ATP/ADP translocase, a protein involved in proton conductance. We conclude that dietary nitrate has profound effects on basal mitochondrial function. These findings may have implications for exercise physiology- and lifestyle-related disorders that involve dysfunctional mitochondria. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Amino acid sensing in dietary-restriction-mediated longevity: roles of signal-transducing kinases GCN2 and TOR DR (dietary restriction), or reduced food intake without malnutrition, is associated with extended longevity, improved metabolic fitness and increased stress resistance in a wide range of organisms. DR is often referred to as calorie restriction, implying that reduced energy intake is responsible for its widespread and evolutionarily conserved benefits. However, recent data indicate dietary amino acid restriction as a key mediator of DR benefits. In fruitflies, an imbalance in essential amino acid intake is thought to underlie longevity benefits of DR. In mammals, reduced dietary protein or essential amino acid intake can extend longevity, improve metabolic fitness and increase stress resistance. In the present paper we review two evolutionarily conserved signal transduction pathways responsible for sensing amino acid levels. The eIF2\u03b1 (eukaryotic initiation factor 2\u03b1) kinase GCN2 (general amino acid control non-derepressible 2) senses the absence of one or more amino acids by virtue of direct binding to uncharged cognate tRNAs. The presence of certain amino acids, such as leucine, permits activation of the master growth regulating kinase TOR (target of rapamycin). These two signal transduction pathways react to amino acid deprivation by inhibiting general protein translation while at the same time increasing translation of specific mRNAs involved in restoring homoeostasis. Together, these pathways may contribute to the regulation of longevity, metabolic fitness and stress resistance."], ["The environmental and public health risks associated with arsenical use in animal feeds. Arsenic exposures contribute significantly to the burden of preventable disease worldwide, specifically related to increased risks of cancer, diabetes, and cardiovascular disease. Most exposures are associated with natural contamination of groundwater, which is difficult to mitigate when these sources are used for drinking water. An anthropogenic source of arsenic exposure stems from the widespread use of arsenical drugs in food-animal production in the United States and China, among many countries. This use results in residual contamination of food products from animals raised with the drugs, as well as environmental contamination associated with disposal of wastes from these animals. Land disposal of these wastes can contaminate surface and ground water, and the conversion of animal wastes into fertilizer pellets for home use as well as the introduction of animal waste incinerators may increase opportunities for exposure. As an intentional additive to animal feed, use of arsenical drugs is a preventable source of human exposure. The domestic practice of using these drugs in poultry production has been the subject of media attention and limited research, though the use of these drugs in domestic swine production and in the rapidly growing foreign animal production industry remains largely uncharacterized. This continued expansion of arsenical drug use may likely increase the burden of global human arsenic exposure and risk.", "Inorganic arsenic in rice bran and its products are an order of magnitude higher than in bulk grain. Rice is more elevated in arsenic than all other grain crops tested to date, with whole grain (brown) rice having higher arsenic levels than polished (white). It is reported here that rice bran, both commercially purchased and specifically milled for this study, have levels of inorganic arsenic, a nonthreshold, class 1 carcinogen, reaching concentrations of approximately 1 mg/kg dry weight, around 10-20 fold higher than concentrations found in bulk grain. Although pure rice bran is used as a health food supplement, perhaps of more concern is rice bran solubles, which are marketed as a superfood and as a supplement to malnourished children in international aid programs. Five rice bran solubles products were tested, sourced from the United States and Japan, and were found to have 0.61-1.9 mg/kg inorganic arsenic. Manufactures recommend approximately 20 g servings of the rice bran solubles per day, which equates to a 0.012-0.038 mg intake of inorganic arsenic. There are no maximum concentration levels (MCLs) set for arsenic or its species in food stuffs. EU and U.S. water regulations, set at 0.01 mg/L total or inorganic arsenic, respectively, are based on the assumption that 1 L of water per day is consumed, i.e., 0.01 mg of arsenic/ day. At the manufacturers recommended rice bran solubles consumption rate, inorganic arsenic intake exceeds 0.01 mg/ day, remembering that rice bran solubles are targeted at malnourished children and that actual risk is based on mg kg(-1) day(-1) intake.", "Ranking the disease burden of 14 pathogens in food sources in the United States using attribution data from outbreak investigations and expert elic... Understanding the relative public health impact of major microbiological hazards across the food supply is critical for a risk-based national food safety system. This study was conducted to estimate the U.S. health burden of 14 major pathogens in 12 broad categories of food and to then rank the resulting 168 pathogen-food combinations. These pathogens examined were Campylobacter, Clostridium perfringens, Escherichia coli O157:H7, Listeria monocytogenes, norovirus, Salmonella enterica, Toxoplasma gondii, and all other FoodNet pathogens. The health burden associated with each pathogen was measured using new estimates of the cost of illness and loss of quality-adjusted life years (QALYs) from acute and chronic illness and mortality. A new method for attributing illness to foods was developed that relies on both outbreak data and expert elicitation. This method assumes that empirical data are generally preferable to expert judgment; thus, outbreak data were used for attribution except where evidence suggests that these data are considered not representative of food attribution. Based on evaluation of outbreak data, expert elicitation, and published scientific literature, outbreak-based attribution estimates for Campylobacter, Toxoplasma, Cryptosporidium, and Yersinia were determined not representative; therefore, expert-based attribution were included for these four pathogens. Sensitivity analyses were conducted to assess the effect of attribution data assumptions on rankings. Disease burden was concentrated among a relatively small number of pathogen-food combinations. The top 10 pairs were responsible for losses of over $8 billion and 36,000 QALYs, or more than 50 % of the total across all pairs. Across all 14 pathogens, poultry, pork, produce, and complex foods were responsible for nearly 60 % of the total cost of illness and loss of QALYs.", "Beyond celery and starter culture: advances in natural/organic curing processes in the United States. Over the past 10years there has been ongoing development of curing processes with natural ingredients designed to meet consumer demand and regulatory requirements for natural and organic processed meats. Initially, these processes utilized celery concentrates with a high nitrate content combined with a nitrate-reducing starter culture. Subsequent advances included celery concentrates with the nitrate converted to nitrite by suppliers. Further, as questions developed concerning reduced concentration of preservatives and the microbiological safety of these processed meats, additional advances have resulted in a wide variety of ingredients and processes designed to provide supplementary antimicrobial effects for improved product safety. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Aspartame bioassay findings portend human cancer hazards. The U.S. Food and Drug Administration (FDA) should reevaluate its position on aspartame as being safe under all conditions. Animal bioassay results predict human cancer risks, and a recent animal study confirms that there is a potential aspartame risk to humans. Aspartame is produced and packaged in China for domestic use and global distribution. Japan, France, and the United States are also major producers. No study of long-term adverse occupational health effects on aspartame workers have been conducted. The FDA should consider sponsoring a prospective epidemiologic study of aspartame workers."], ["High-dose ascorbic acid increases intercourse frequency and improves mood: a randomized controlled clinical trial. BACKGROUND: Ascorbic acid (AA) modulates catecholaminergic activity, decreases stress reactivity, approach anxiety and prolactin release, improves vascular function, and increases oxytocin release. These processes are relevant to sexual behavior and mood. METHODS: In this randomized double-blind, placebo-controlled 14 day trial of sustained-release AA (42 healthy young adults; 3000 mg/day Cetebe) and placebo (39 healthy young adults), subjects with partners recorded penile-vaginal intercourse (FSI), noncoital partner sex, and masturbation in daily diaries, and also completed the Beck Depression Inventory before and after the trial. RESULTS: The AA group reported greater FSI (but, as hypothesized, not other sexual behavior) frequency, an effect most prominent in subjects not cohabiting with their sexual partner, and in women. The AA but not placebo group also experienced a decrease in Beck Depression scores. CONCLUSIONS: AA appears to increase FSI, and the differential benefit to noncohabitants suggests that a central activation or disinhibition, rather than peripheral mechanism may be responsible.", "Effect of ascorbic acid and green tea on endogenous formation of N-nitrosodimethylamine and N-nitrosopiperidine in humans. Many constituents present in the human diet may inhibit endogenous formation of N-nitroso compounds (NOC). Studies with human volunteers showed inhibiting effects of intake of ascorbic acid and green tea consumption on nitrosation using the N-nitrosoproline test. The aim of the present study was to evaluate the effects of ascorbic acid and green tea on urinary excretion of carcinogenic N-nitrosodimethylamine (NDMA) and N-nitrosopiperidine (NPIP) in humans. Twenty-five healthy female volunteers consumed a fish meal rich in amines as nitrosatable precursors in combination with intake of nitrate-containing drinking water at the Acceptable Daily Intake level during 7 consecutive days. During 1 week before and after nitrate intake a diet low in nitrate was consumed. Using the same protocol, the effect of two different doses of ascorbic acid (250 mg and 1 g/day) and two different doses of green tea (2 g and 4 g/day) on formation of NDMA and NPIP was studied. Mean nitrate excretion in urine significantly increased from control (76+/-24) to 167+/-25 mg/24 h. Intake of nitrate and fish resulted in a significant increase in mean urinary excretion of NDMA compared with the control weeks: 871+/-430 and 640+/-277 ng/24 h during days 1-3 and 4-7, respectively, compared with 385+/-196 ng/24 h (p<0.0002). Excretion of NPIP in urine was not related to nitrate intake and composition of the diet. Intake of 250 mg and 1 g of ascorbic acid per day resulted in a significant decrease in urinary NDMA excretion during days 4-7 (p=0.0001), but not during days 1-3. Also, consumption of four cups of green tea per day (2 g) significantly decreased excretion of NDMA during days 4-7 (p=0.0035), but not during days 1-3. Surprisingly, consumption of eight cups of green tea per day (4 g) significantly increased NDMA excretion during days 4-7 (p=0.0001), again not during days 1-3. This increase is probably a result of catalytic effects of tea polyphenols on nitrosation, or of another, yet unknown, mechanism. These results suggest that intake of ascorbic acid and moderate consumption of green tea can reduce endogenous NDMA formation.", "A study on degradation kinetics of ascorbic acid in amla (Phyllanthus emblica L.) during cooking. The kinetics of ascorbic acid degradation in amla (Phyllanthus emblica L.) as well as in pure ascorbic acid solutions at initial concentrations present in amla over a temperature range of 50-120 degrees C (steady-state temperature) has been studied. The ascorbic acid degradation followed first-order reaction kinetics where the rate constant increased with an increase in temperature. The temperature dependence of degradation was adequately modeled by the Arrhenius equation. The activation energies were found to be 4.09 kcal/mole for amla and 4.49 kcal/mole for pure vitamin solution. The degradation kinetics of ascorbic acid was also evaluated in normal open pan cooking, pressure-cooking and a newly developed and patented fuel-efficient EcoCooker (unsteady state heating process). A mathematical model was developed using the steady-state kinetic parameters obtained to predict the losses of ascorbic acid from the time-temperature data of the unsteady state heating processing method. The results obtained indicate the ascorbic acid degradation is of a similar order of magnitude in all the methods of cooking.", "Effect of vitamin C supplements on urinary oxalate and pH in calcium stone-forming patients. BACKGROUND: The contribution of ascorbate to urinary oxalate is controversial. The present study aimed to determine whether urinary oxalate and pH may be affected by vitamin C supplementation in calcium stone-forming patients. METHODS: Forty-seven adult calcium stone-forming patients received either 1 g (N=23) or 2 g (N=24) of vitamin C supplement for 3 days and 20 healthy subjects received 1 g. A 24-hour urine sample was obtained both before and after vitamin C for calcium, oxalate, magnesium, citrate, sodium, potassium, and creatinine determination. The Tiselius index was used as a calcium oxalate crystallization index. A spot fasting morning urine sample was also obtained to determine the urinary pH before and after vitamin C. RESULTS: Fasting urinary pH did not change after 1 g (5.8 +/- 0.6 vs. 5.8 +/- 0.7) or 2 g vitamin C (5.8 +/- 0.8 vs. 5.8 +/- 0.7). A significant increase in mean urinary oxalate was observed in calcium stone-forming patients receiving either 1 g (50 +/- 16 vs. 31 +/- 12 mg/24 hours) or 2 g (48 +/- 21 vs. 34 +/- 12 mg/24 hours) of vitamin C and in healthy subjects (25 +/- 12 vs. 39 +/- 13 mg/24 hours). A significant increase in mean Tiselius index was observed in calcium stone-forming patients after 1 g (1.43 +/- 0.70 vs. 0.92 +/- 0.65) or 2 g vitamin C (1.61 +/- 1.05 vs. 0.99 +/- 0.55) and in healthy subjects (1.50 +/- 0.69 vs. 0.91 +/- 0.46). Ancillary analyses of spot urine obtained after vitamin C were performed in 15 control subjects in vessels with or without ethylenediaminetetraacetic acid (EDTA) with no difference in urinary oxalate between them (28 +/- 23 vs. 26 +/- 21 mg/L), suggesting that the in vitro conversion of ascorbate to oxalate did not occur. CONCLUSION: These data suggest that vitamin C supplementation may increase urinary oxalate excretion and the risk of calcium oxalate crystallization in calcium stone-forming patients.", "Evolution of dietary antioxidants. Oxygen is vital for most organisms but, paradoxically, damages key biological sites. Oxygenic threat is met by antioxidants that evolved in parallel with our oxygenic atmosphere. Plants employ antioxidants to defend their structures against reactive oxygen species (ROS; oxidants) produced during photosynthesis. The human body is exposed to these same oxidants, and we have also evolved an effective antioxidant system. However, this is not infallible. ROS breach defences, oxidative damage ensues, accumulates with age, and causes a variety of pathological changes. Plant-based, antioxidant-rich foods traditionally formed the major part of the human diet, and plant-based dietary antioxidants are hypothesized to have an important role in maintaining human health. This hypothesis is logical in evolutionary terms, especially when we consider the relatively hypoxic environment in which humans may have evolved. In this paper, the human diet is discussed briefly in terms of its evolutionary development, different strategies of antioxidant defence are outlined, and evolution of dietary antioxidants is discussed from the perspectives of plant need and our current dietary requirements. Finally, possibilities in regard to dietary antioxidants, evolution, and human health are presented, and an evolutionary cost-benefit analysis is presented in relation to why we lost the ability to make ascorbic acid (vitamin C) although we retained an absolute requirement for it."], ["Effects of very-low-carbohydrate (horsemeat- or beef-based) diets and restricted feeding on weight gain, feed and energy efficiency, as well as ser... BACKGROUND/AIMS: The beneficial or harmful effect of the low-carbohydrate (low-carb), high-protein, high-fat diet (Atkins diet) has not been clearly demonstrated. We determined the effect of a low-carb diet and restricted feeding (70% ad libitum intake) on serum levels of cholesterol, triacylglycerol, glucose, ketone bodies and insulin in rats. METHODS: In experiment 1, each of 4 groups with 10 adult rats was assigned to a high-carb diet (AIN-93G) + ad libitum intake or restricted feeding, or a low-carb diet (53% horsemeat) + ad libitum intake or restricted feeding (2 x 2 factorial). In experiment 2, each of 3 groups with 10 adult rats was assigned to a control (AIN-93G) or low-carb diets (53% beef or horsemeat). RESULTS: Restricted feeding and the low-carb diet reduced (p<0.01) serum triacylglycerol compared with ad libitum intake and the AIN-93G diet, respectively (experiment 1). The dietary effect on serum total cholesterol, high-density or low-density lipid cholesterol appeared to be inconsistent, but restricted feeding increased the low-density lipoprotein cholesterol level. The serum ketone body level was increased by the low-carb diet compared with AIN-93G (experiment 2). CONCLUSION: Restricted feeding and a low-carb diet are beneficial for alleviating cardiovascular disease risk factors, and their effects are additive, restricted feeding being more pronounced. Copyright 2009 S. Karger AG, Basel.", "Fructose: It\u2019s \u201cAlcohol Without the Buzz\u201d What do the Atkins Diet and the traditional Japanese diet have in common? The Atkins Diet is low in carbohydrate and usually high in fat; the Japanese diet is high in carbohydrate and usually low in fat. Yet both work to promote weight loss. One commonality of both diets is that they both eliminate the monosaccharide fructose. Sucrose (table sugar) and its synthetic sister high fructose corn syrup consist of 2 molecules, glucose and fructose. Glucose is the molecule that when polymerized forms starch, which has a high glycemic index, generates an insulin response, and is not particularly sweet. Fructose is found in fruit, does not generate an insulin response, and is very sweet. Fructose consumption has increased worldwide, paralleling the obesity and chronic metabolic disease pandemic. Sugar (i.e., fructose-containing mixtures) has been vilified by nutritionists for ages as a source of \u201cempty calories,\u201d no different from any other empty calorie. However, fructose is unlike glucose. In the hypercaloric glycogen-replete state, intermediary metabolites from fructose metabolism overwhelm hepatic mitochondrial capacity, which promotes de novo lipogenesis and leads to hepatic insulin resistance, which drives chronic metabolic disease. Fructose also promotes reactive oxygen species formation, which leads to cellular dysfunction and aging, and promotes changes in the brain\u2019s reward system, which drives excessive consumption. Thus, fructose can exert detrimental health effects beyond its calories and in ways that mimic those of ethanol, its metabolic cousin. Indeed, the only distinction is that because fructose is not metabolized in the central nervous system, it does not exert the acute neuronal depression experienced by those imbibing ethanol. These metabolic and hedonic analogies argue that fructose should be thought of as \u201calcohol without the buzz.\u201d", "Very-low-carbohydrate ketogenic diet v. low-fat diet for long-term weight loss: a meta-analysis of randomised controlled trials. The role of very-low-carbohydrate ketogenic diets (VLCKD) in the long-term management of obesity is not well established. The present meta-analysis aimed to investigate whether individuals assigned to a VLCKD (i.e. a diet with no more than 50 g carbohydrates/d) achieve better long-term body weight and cardiovascular risk factor management when compared with individuals assigned to a conventional low-fat diet (LFD; i.e. a restricted-energy diet with less than 30% of energy from fat). Through August 2012, MEDLINE, CENTRAL, ScienceDirect,Scopus, LILACS, SciELO, ClinicalTrials.gov and grey literature databases were searched, using no date or language restrictions, for randomised controlled trials that assigned adults to a VLCKD or a LFD, with 12 months or more of follow-up. The primary outcome was bodyweight. The secondary outcomes were TAG, HDL-cholesterol (HDL-C), LDL-cholesterol (LDL-C), systolic and diastolic blood pressure,glucose, insulin, HbA1c and C-reactive protein levels. A total of thirteen studies met the inclusion/exclusion criteria. In the overall analysis,five outcomes revealed significant results. Individuals assigned to a VLCKD showed decreased body weight (weighted mean difference 20\u00b791 (95% CI 21\u00b765, 20\u00b717) kg, 1415 patients), TAG (weighted mean difference 20\u00b718 (95% CI 20\u00b727, 20\u00b708) mmol/l, 1258 patients)and diastolic blood pressure (weighted mean difference 21\u00b743 (95% CI 22\u00b749, 20\u00b737) mmHg, 1298 patients) while increased HDL-C(weighted mean difference 0\u00b709 (95% CI 0\u00b706, 0\u00b712) mmol/l, 1257 patients) and LDL-C (weighted mean difference 0\u00b712 (95% CI 0\u00b704,0\u00b72) mmol/l, 1255 patients). Individuals assigned to a VLCKD achieve a greater weight loss than those assigned to a LFD in the longterm; hence, a VLCKD may be an alternative tool against obesity.", "Cheese intake in large amounts lowers LDL-cholesterol concentrations compared with butter intake of equal fat content. BACKGROUND: Despite its high content of saturated fatty acids, cheese does not seem to increase plasma total and LDL-cholesterol concentrations when compared with an equivalent intake of fat from butter. This effect may be due to the high calcium content of cheese, which results in a higher excretion of fecal fat. OBJECTIVES: The objective was to compare the effects of diets of equal fat content rich in either hard cheese or butter or a habitual diet on blood pressure and fasting serum blood lipids, C-reactive protein, glucose, and insulin. We also examined whether fecal fat excretion differs with the consumption of cheese or butter. DESIGN: The study was a randomized dietary intervention consisting of two 6-wk crossover periods and a 14-d run-in period during which the subjects consumed their habitual diet. The study included 49 men and women who replaced part of their habitual dietary fat intake with 13% of energy from cheese or butter. RESULTS: After 6 wk, the cheese intervention resulted in lower serum total, LDL-, and HDL-cholesterol concentrations and higher glucose concentrations than did the butter intervention. Cheese intake did not increase serum total or LDL-cholesterol concentrations compared with the run-in period, during which total fat and saturated fat intakes were lower. Fecal fat excretion did not differ between the cheese and butter periods. CONCLUSION: Cheese lowers LDL cholesterol when compared with butter intake of equal fat content and does not increase LDL cholesterol compared with a habitual diet. This trial is registered at clinicaltrials.gov as NCT01140165.", "The Mediterranean diet improves the systemic lipid and DNA oxidative damage in metabolic syndrome individuals. A randomized, controlled, trial. BACKGROUND & AIMS: Metabolic syndrome (MetS), in which a non-classic feature is an increase in systemic oxidative biomarkers, presents a high risk of diabetes and cardiovascular disease (CVD). Adherence to the Mediterranean Diet (MedDiet) is associated with a reduced risk of MetS. However, the effect of the MedDiet on biomarkers for oxidative damage has not been assessed in MetS individuals. We have investigated the effect of the MedDiet on systemic oxidative biomarkers in MetS individuals. METHODS: Randomized, controlled, parallel clinical trial in which 110 female with MetS, aged 55-80, were recruited into a large trial (PREDIMED Study) to test the efficacy of the traditional MedDiet on the primary prevention of CVD. Participants were assigned to a low-fat diet or two traditional MedDiets (MedDiet\u00a0+\u00a0virgin olive oil or MedDiet\u00a0+\u00a0nuts). Both MedDiet group participants received nutritional education and either free extra virgin olive oil for all the family (1\u00a0L/week), or free nuts (30\u00a0g/day). Diets were ad libitum. Changes in urine levels of F2-Isoprostane (F2-IP) and the DNA damage base 8-oxo-7,8-dihydro-2'-deoxyguanosine (8-oxo-dG) were evaluated at 1-year trial. RESULTS: After 1-year urinary F2-IP decreased in all groups, the decrease in MedDiet groups reaching a borderline significance versus that of the Control group. Urinary 8-oxo-dG was also reduced in all groups, with a higher decrease in both MedDiet groups versus the Control one (P\u00a0<\u00a00.001). CONCLUSIONS: MedDiet reduces oxidative damage to lipids and DNA in MetS individuals. Data from this study provide evidence to recommend the traditional MedDiet as a useful tool in the MetS management. Registered under Clinical Trials.gov Identifier no. NCT00123456. Copyright \u00a9 2012 Elsevier Ltd and European Society for Clinical Nutrition and Metabolism. All rights reserved."], ["Chemopreventive characteristics of avocado fruit. Phytochemicals are recognized as playing an important role in cancer prevention by fruits and vegetables. The avocado is a widely grown and consumed fruit that is high in nutrients and low in calories, sodium, and fats. Studies have shown that phytochemicals extracted from the avocado fruit selectively induce cell cycle arrest, inhibit growth, and induce apoptosis in precancerous and cancer cell lines. Our recent studies indicate that phytochemicals extracted with chloroform from avocado fruits target multiple signaling pathways and increase intracellular reactive oxygen leading to apoptosis. This review summarizes the reported phytochemicals in avocado fruit and discusses their molecular mechanisms and targets. These studies suggest that individual and combinations of phytochemicals from the avocado fruit may offer an advantageous dietary strategy in cancer prevention.", "Chemopreventive characteristics of avocado fruit. Phytochemicals are recognized as playing an important role in cancer prevention by fruits and vegetables. The avocado is a widely grown and consumed fruit that is high in nutrients and low in calories, sodium, and fats. Studies have shown that phytochemicals extracted from the avocado fruit selectively induce cell cycle arrest, inhibit growth, and induce apoptosis in precancerous and cancer cell lines. Our recent studies indicate that phytochemicals extracted with chloroform from avocado fruits target multiple signaling pathways and increase intracellular reactive oxygen leading to apoptosis. This review summarizes the reported phytochemicals in avocado fruit and discusses their molecular mechanisms and targets. These studies suggest that individual and combinations of phytochemicals from the avocado fruit may offer an advantageous dietary strategy in cancer prevention.", "Oxidative stability and shelf-life evaluation of selected culinary oils. Four out of eight 'healthier' oils-namely, almond oil, avocado oil, hazelnut oil and macadamia nut oil-studied were rich sources of monounsaturated fatty acids like olive oil. Grape seed oil, rice barn oil (marketed recently), toasted sesame oil and walnut oil contained high levels of essential fatty acids. The order of oxidative stability determined by Rancimat measuring of the induction period at four temperatures (90 degrees C, 100 degrees C, 110 degrees C, and 120 degrees C) was found to be macadamia oil > rice bran oil approximately toasted sesame oil > avocado oil > almond oil > hazelnut oil > grape seed oil > walnut oil. High-level monounsaturated fatty acid oils gave a linear relationship between 100 times the reciprocal of the induction period against the total unsaturated fatty acid content obtained as %C18:2 + 0.08 x C18:1 + 2.08 x %C18:3, while the polyunsaturated fatty acid oils gave an exponential relationship. In the case of rice bran and hazelnut oils, shelf-life prediction from the extrapolation of the Arrhenius plots and the Q(10) factors was compared well with that of storage time given by the oil producers. In the cases of the other oils (with an exception of macadamia nut oil), the predicted shelf-lives were significantly lower than that of the storage times; especially, walnut oil (very prone to oxidation) gave 15-20 times lower shelf-life than the best-before storage life.", "Diet, nutrition and the prevention of dental diseases. Oral health is related to diet in many ways, for example, nutritional influences on craniofacial development, oral cancer and oral infectious diseases. Dental diseases impact considerably on self-esteem and quality of life and are expensive to treat. The objective of this paper is to review the evidence for an association between nutrition, diet and dental diseases and to present dietary recommendations for their prevention. Nutrition affects the teeth during development and malnutrition may exacerbate periodontal and oral infectious diseases. However, the most significant effect of nutrition on teeth is the local action of diet in the mouth on the development of dental caries and enamel erosion. Dental erosion is increasing and is associated with dietary acids, a major source of which is soft drinks. Despite improved trends in levels of dental caries in developed countries, dental caries remains prevalent and is increasing in some developing countries undergoing nutrition transition. There is convincing evidence, collectively from human intervention studies, epidemiological studies, animal studies and experimental studies, for an association between the amount and frequency of free sugars intake and dental caries. Although other fermentable carbohydrates may not be totally blameless, epidemiological studies show that consumption of starchy staple foods and fresh fruit are associated with low levels of dental caries. Fluoride reduces caries risk but has not eliminated dental caries and many countries do not have adequate exposure to fluoride. It is important that countries with a low intake of free sugars do not increase intake, as the available evidence shows that when free sugars consumption is <15-20 kg/yr ( approximately 6-10% energy intake), dental caries is low. For countries with high consumption levels it is recommended that national health authorities and decision-makers formulate country-specific and community-specific goals for reducing the amount of free sugars aiming towards the recommended maximum of no more than 10% of energy intake. In addition, the frequency of consumption of foods containing free sugars should be limited to a maximum of 4 times per day. It is the responsibility of national authorities to ensure implementation of feasible fluoride programmes for their country.", "Marine edible algae as disease preventers. As modern lifestyles and new feeding habits settle in the world, noncommunicable diseases (NCDs) have evolved to be major causes of disability in developing as well as developed countries. As a concomitant effect, there is a growing interest in natural, healthy food and an increasing awareness of risk factors and determinants of disease. This chapter describes some nutritional facts about seaweeds, which have been used as food since ancient times in China, Japan, Egypt, and India and comments on the potential utilization of marine algae as functional foods. This concept and the description of metabolic syndrome are used as a basis to comprehension of seaweeds against two dreadful illnesses of our times: high blood pressure and cancer. Copyright \u00a9 2011 Elsevier Inc. All rights reserved."], ["Satiety: have we neglected dietary non-nutrients? Satiety, which is the inhibition of eating following the end of a meal, is influenced by a number of food characteristics, including compositional and structural factors. An increased understanding of these factors and the mechanisms whereby they exert their effects on satiety may offer a food-based approach to weight management. Water and gas, which are often neglected in nutrition, are major components of many foods and contribute to volume, and to sensory and other characteristics. A review of previous short-term studies that evaluated the effects of water or gas in foods on satiety showed that while satiety was generally increased, effects on subsequent intakes were not always apparent. These studies were diverse in terms of design, timings and food matrices, which precludes definitive conclusions. However, the results indicate that solids may be more effective at increasing satiety than liquids, but gas may be as effective as water. Although increased gastric distension may be the main mechanism underlying these effects, pre-ingestive and ingestive impacts on cognitive, anticipatory and sensory responses also appear to be involved. Furthermore, there is limited evidence that water on its own may be effective at increasing satiety and decreasing intakes when drunk before, but not with, a meal. Longer-term extrapolation suggests that increasing food volumes with water or gas may offer weight-management strategies. However, from a practical viewpoint, the effects of water and gas on satiety may be best exploited by using these non-nutrients to manipulate perceived portion sizes, without increasing energy contents.", "Perceptions of flatulence from bean consumption among adults in 3 feeding studies Background Many consumers avoid eating beans because they believe legume consumption will cause excessive intestinal gas or flatulence. An increasing body of research and the 2010 Dietary Guidelines for Americans supports the benefits of a plant-based diet, and legumes specifically, in the reduction of chronic disease risks. The purpose of the current research was to investigate the perception of increased flatulence and gastrointestinal discomfort among participants who consumed a \u00bd cup of beans daily for 8 or 12 weeks. Methods Participants in three studies to test the effects of beans on heart disease biomarkers completed the same weekly questionnaire to assess gastrointestinal discomfort issues such as increased flatulence, stool changes, and bloating. Studies 1 and 2 were randomized crossover trials. Participants consumed \u00bd cup of pinto beans, black-eyed peas, and canned carrots as control (n = 17) in Study 1 for three randomized 8-week phases. For Study 2, participants ate \u00bd cup baked beans or canned carrots as control (n = 29) for two randomized 8-week phases. Study 3 was a parallel arm trial with 40 subjects receiving \u00bd cup pinto beans and 40 consuming a control soup for 12 weeks. Changes in the frequency of perceived flatulence, stool characteristics, and bloating were the primary outcome measures. Chi-square distributions were examined for the presence or absence of symptoms and demographic characteristics to determine differences by gender, age, body mass index (BMI), and bean type. Results Less than 50% reported increased flatulence from eating pinto or baked beans during the first week of each trial, but only 19% had a flatulence increase with black-eyed peas. A small percentage (3-11%) reported increased flatulence across the three studies even on control diets without flatulence-producing components. Conclusions People's concerns about excessive flatulence from eating beans may be exaggerated. Public health nutritionists should address the potential for gastrointestinal discomfort when increasing fiber intake from beans with clients. It is important to recognize there is individual variation in response to different bean types.", "The development of the concept of dietary fiber in human nutrition. Fundamental studies of the laxative action of wheat bran were undertaken in the United States in the early decades of the 20th century. Walker in South Africa extended these studies among African blacks and later suggested that cereal fiber protected them against certain metabolic disorders. Trowell in Uganda elaborated this concept with regard to the rarity of common noninfective diseases of the colon. Another stream of inquiry stemmed from the hypothesis of Cleave who postulated that the presence of refined sugar, and to a lesser extent white flour, caused many metabolic diseases, while the loss of fiber caused certain colonic disorders. Meanwhile Burkitt had collected massive evidence of the rarity of appendicitis and many venous disorders in rural Africa and parts of Asia. In 1972 Trowell proposed a new physiological definition of fiber in terms of the residue of plant foods that resisted digestion by alimentary enzymes of man. Southgate has proposed chemical methods to analyze the components of dietary fiber: cellulose, hemicellulose, and lignin.", "Phaseolus beans: impact on glycaemic response and chronic disease risk in human subjects. Consumption of Phaseolus vulgaris bean species such as pinto, black, navy or kidney may be beneficial in the prevention and treatment of chronic diseases. In particular, conditions that are promoted by increased glycaemic stress (hyperglycaemia and hyperinsulinaemia) including diabetes, CVD and cancer seem to be reduced in individuals who eat more of these beans. The present paper discusses the influence of P. vulgaris species on glycaemic response and the impact that relationship may have on the risk of developing diabetes, CVD and cancer.", "Prevalence of diverticular disease, hiatus hernia, and pelvic phleboliths in black and white Americans. Phleboliths, and especially diverticular disease and hiatus hernia, are rarer in developing countries than in economically more developed communities, but all three conditions were as common in Black as in White Americans. This finding suggests that they are due to environmental rather than to genetic causes. A deficient intake of dietary fibre may be the common factor predisposing to these three conditions."], ["Bean consumption is associated with greater nutrient intake, reduced systolic blood pressure, lower body weight, and a smaller waist circumference ... BACKGROUND: Epidemiological studies have shown positive findings associated with legume consumption and measures of cardiovascular disease and obesity. However, few observational trials have examined beans as a separate food variable when determining associations with health parameters. OBJECTIVE: To determine the association of consuming beans on nutrient intakes and physiological parameters using the National Health and Examination Survey (NHANES) 1999-2002. METHODS: Using data from NHANES 1999-2002, a secondary analysis was completed with a reliable 24-hour dietary recall where three groups of bean consumers were identified (N = 1,475). We determined mean nutrient intakes and physiological values between bean consumers and non-consumers. Least square means, standard errors and ANOVA were calculated using appropriate sample weights following adjustment for age, gender, ethnicity and energy. RESULTS: Relative to non-consumers, bean consumers had higher intakes of dietary fiber, potassium, magnesium, iron, and copper (p's < 0.05). Those consuming beans had a lower body weight (p = 0.008) and a smaller waist size (p = 0.043) relative to non-consumers. Additionally, consumers of beans had a 23% reduced risk of increased waist size (p = 0.018) and a 22% reduced risk of being obese (p = 0.026). Also, baked bean consumption was associated with a lower systolic blood pressure. CONCLUSIONS: Bean consumers had better overall nutrient intake levels, better body weights and waist circumferences, and lower systolic blood pressure in comparison to non-consumers. These data support the benefits of bean consumption on improving nutrient intake and health parameters.", "A bean-free diet increases the risk of all-cause mortality among Taiwanese women: the role of the metabolic syndrome. OBJECTIVE: To evaluate the associations with chronic disease risk and mortality of the consequences of bean-free diets in Taiwanese adults with regard to gender. DESIGN: A sub-sample of the National Health Interview Survey (NHIS) in 2001 agreed to physical examination in the subsequent year. This group then took part in the Taiwanese Survey of Hyperglycaemia, Hyperlipidaemia and Hypertension (TwSHHH) in 2002. SETTING: Individual records were linked to the eventual death files from 2002 to 2008. SUBJECTS: Up to the end of 2008, a total of 2820 men and 2950 women were tracked by death registry over the 6\u00b78 years of follow-up. RESULTS: Among 38,077 person-years, an average follow-up 6\u00b75 years, 225 all-cause deaths were identified. Generalized linear models showed beans to be favourable for metabolic syndrome (other than for fasting glucose) in men; in women, beans were favourable for waist circumference and HbA1c. Cumulative logistic regression models for the effect of a bean-free diet on metabolic syndrome scores according to the Taiwanese-modified National Cholesterol Education Program-Adult Treatment Panel III (NCEP-tw) gave adjusted odds ratios of 1\u00b783 in men and 1\u00b745 in women. Cox regression models for the bean-free diet showed an increased hazard ratio for all-cause mortality among women (1\u00b798, 95% CI 1\u00b703, 3\u00b781) but not men (1\u00b728, 95% CI 0\u00b776, 2\u00b716). CONCLUSIONS: A bean-free diet may play a role in developing the metabolic syndrome in both genders, and is a significant predictor of all-cause mortality in Taiwanese women but not men.", "Beans and diabetes: Phaseolus vulgaris preparations as antihyperglycemic agents. Bean pods (Phaseolus vulgaris) are among the most widely used traditional remedies against diabetes mellitus. Historical knowledge is summarized and compared to recent study results. Reports dating from the first half of the 20(th) century as well as recent publications show contradictory results. It seems that Phaseolus preparations should not be considered the first choice in phytopharmaceutical treatment of diabetes or lead structure research. To be effective, fairly high doses of aqueous extracts need to be given. Because of their fiber content and an alpha-amylase inhibitory effect, beans might be more useful as food components in preventing or ameliorating type 2 diabetes.", "Perceptions of flatulence from bean consumption among adults in 3 feeding studies Background Many consumers avoid eating beans because they believe legume consumption will cause excessive intestinal gas or flatulence. An increasing body of research and the 2010 Dietary Guidelines for Americans supports the benefits of a plant-based diet, and legumes specifically, in the reduction of chronic disease risks. The purpose of the current research was to investigate the perception of increased flatulence and gastrointestinal discomfort among participants who consumed a \u00bd cup of beans daily for 8 or 12 weeks. Methods Participants in three studies to test the effects of beans on heart disease biomarkers completed the same weekly questionnaire to assess gastrointestinal discomfort issues such as increased flatulence, stool changes, and bloating. Studies 1 and 2 were randomized crossover trials. Participants consumed \u00bd cup of pinto beans, black-eyed peas, and canned carrots as control (n = 17) in Study 1 for three randomized 8-week phases. For Study 2, participants ate \u00bd cup baked beans or canned carrots as control (n = 29) for two randomized 8-week phases. Study 3 was a parallel arm trial with 40 subjects receiving \u00bd cup pinto beans and 40 consuming a control soup for 12 weeks. Changes in the frequency of perceived flatulence, stool characteristics, and bloating were the primary outcome measures. Chi-square distributions were examined for the presence or absence of symptoms and demographic characteristics to determine differences by gender, age, body mass index (BMI), and bean type. Results Less than 50% reported increased flatulence from eating pinto or baked beans during the first week of each trial, but only 19% had a flatulence increase with black-eyed peas. A small percentage (3-11%) reported increased flatulence across the three studies even on control diets without flatulence-producing components. Conclusions People's concerns about excessive flatulence from eating beans may be exaggerated. Public health nutritionists should address the potential for gastrointestinal discomfort when increasing fiber intake from beans with clients. It is important to recognize there is individual variation in response to different bean types.", "Phaseolus beans: impact on glycaemic response and chronic disease risk in human subjects. Consumption of Phaseolus vulgaris bean species such as pinto, black, navy or kidney may be beneficial in the prevention and treatment of chronic diseases. In particular, conditions that are promoted by increased glycaemic stress (hyperglycaemia and hyperinsulinaemia) including diabetes, CVD and cancer seem to be reduced in individuals who eat more of these beans. The present paper discusses the influence of P. vulgaris species on glycaemic response and the impact that relationship may have on the risk of developing diabetes, CVD and cancer."], ["Benzene in infant carrot juice: further insight into formation mechanism and risk assessment including consumption data from the DONALD study. Benzene was previously detected as a heat-induced contaminant in infant carrot juices. This study shows that carrot juice contains substances such as beta-carotene, phenylalanine or terpenes that may act as precursors for benzene formation during food processing. As benzene exposure has been associated with childhood leukaemia and other cancers, this study aimed to provide a quantitative risk assessment. To accomplish this, we used measured food consumption data from the Dortmund Nutritional and Anthropometric Longitudinally Designed (DONALD) study, along with survey data on benzene in different juice categories. The calculated exposures for infants between 3 and 12 months were low, with averages between 1 and 10 ng/kg bw/day, resulting in a margin of exposure above 100,000. The exposures were judged as unlikely to pose a health risk for infants. Nevertheless, carcinogenic contaminants should be reduced to levels as low as reasonably achievable. The focus should be set on improving the sterilization conditions. Copyright 2009 Elsevier Ltd. All rights reserved.", "Biological Clues to Potent DNA-Damaging Activities in Food and Flavoring Population differences in age-related diseases and cancer could stem from differences in diet. To characterize DNA strand-breaking activities in selected foods/beverages, flavorings, and some of their constituent chemicals, we used p53R cells, a cellular assay sensitive to such breaks. Substances testing positive included reference chemicals: quinacrine (peak response, 51X) and etoposide (33X); flavonoids: EGCG (19X), curcumin (12X), apigenin (9X), and quercetin (7X); beverages: chamomile (11X), green (21X), and black tea (26X) and coffee (3 to 29X); and liquid smoke (4 to 28X). Damage occurred at dietary concentrations: etoposide near 5 \u03bcg/ml produced responses similar to a 1:1000 dilution of liquid smoke, a 1:20 dilution of coffee, and a 1:5 dilution of tea. Pyrogallol-related chemicals and tannins are present in dietary sources and individually produced strong activity: pyrogallol (30X), 3-methoxycatechol (25X), gallic acid (21X), and 1,2,4-benzenetriol (21X). From structure-activity relationships, high activities depended on specific orientations of hydroxyls on the benzene ring. Responses accompanied cellular signals characteristic of DNA breaks such as H2AX phosphorylation. Breaks were also directly detected by comet assay. Cellular toxicological effects of foods and flavorings could guide epidemiologic and experimental studies of potential disease risks from DNA strand-breaking chemicals in diets.", "Concentration and profile of 22 urinary polycyclic aromatic hydrocarbon metabolites in the US population. Urinary monohydroxy polycyclic aromatic hydrocarbons (OH-PAHs) are a class of PAH metabolites used as biomarkers for assessing human exposure to PAHs. The Centers for Disease Control and Prevention's National Health and Nutrition Examination Survey (NHANES) uses OH-PAHs to establish reference range concentrations for the US population, and to set benchmarks for future epidemiologic and biomonitoring studies. For the years 2001 and 2002, 22 OH-PAH metabolites were measured in urine specimens from 2748 NHANES participants. Percentages of samples with detectable levels ranged from nearly 100% for metabolites of naphthalene, fluorene, phenanthrene, and pyrene, to less than 5% for metabolites from parent compounds with higher molecular weight such as chrysene, benzo[c]phenanthrene, and benz[a]anthracene. The geometric mean for 1-hydroxypyrene (1-PYR)--the most commonly used biomarker for PAH exposure--was 49.6 ng/L urine, or 46.4 ng/g creatinine. Children (ages 6-11) generally had higher levels than did adolescents (ages 12-19) or adults (ages 20 and older). Model-adjusted, least-square geometric means for 1-PYR were 87, 53 and 43 ng/L for children, adolescents (ages 12-19) and adults (ages 20 years and older), respectively. Log-transformed concentrations for major detectable OH-PAHs were significantly correlated with each other. The correlation coefficients between 1-PYR and other metabolites ranging from 0.17 to 0.63 support the use of 1-PYR as a useful surrogate representing PAH exposure.", "Biology and function of the aryl hydrocarbon receptor: report of an international and interdisciplinary conference. The aryl hydrocarbon receptor (AhR) is a ligand-activated transcription factor present in many cells. The AhR links environmental chemical stimuli with adaptive responses, such as detoxification, cellular homoeostasis or immune responses. Furthermore, novel roles of AhR in physiological and genetic functions are being discovered. This is a report of a recent meeting in D\u00fcsseldorf. The meeting highlighted that AhR research has moved from its focus on toxic effects of dioxins and other environmental pollutants to its biological roles. For instance, it was recently discovered that AhR-responsive elements in retrotransposons contribute to the functional structure of the genome. Other exciting new reports concerned the way plant-derived compounds in our diet are necessary for a fully functioning immune system of the gut. Also, human brain tumours use the AhR system to gain growth advantages. Other aspects covered were neurotoxicology, the circadian rhythm, or the breadth of the adaptive and innate immune system (hematopoietic stem cells, dendritic cells, T cells, mast cells). Finally, the meeting dealt with the discovery of new xenobiotic and natural ligands and their use in translational medicine, or cancer biology and AhR.", "The aryl hydrocarbon receptor and its xenobiotic ligands: a fundamental trigger for cardiovascular diseases. This review reconsiders a major cause of cardiovascular diseases, tobacco smoking, as the activation of the Aryl hydrocarbon Receptor (AhR), also known as the dioxin receptor, by aryl hydrocarbons from the tar fraction of tobacco in various organs of the cardiovascular domain. This concept sheds new light on well-known albeit controversial epidemiological concepts such as the Mediterranean diet and the French paradox. We also review the discovery that resveratrol, a natural AhR antagonist, may be of interest in the prevention and treatment of cardiovascular diseases."], ["Association between betel-nut chewing and chronic kidney disease in men. BACKGROUND: Betel-nut use is associated with metabolic syndrome and obesity. However, the association between betel-nut chewing and risk for chronic kidney disease (CKD) is unknown. The present study was conducted to determine the association between betel-nut chewing and CKD in men. METHODS: We retrospectively reviewed health-check records of 3264 men in a hospital-based cross-sectional screening programme from 2003 to 2006. CKD was defined as estimated glomerular filtration rate less than 60 ml/min/1.73 m2 calculated by the Modification of Diet in Renal Disease formula. Risk factors for CKD including diabetes, hypertension, BMI, smoking, alcohol consumption and age were also considered. RESULTS: A total of 677 (20.7 %) men were found to have CKD and 427 (13.1 %) participants reported a history of betel-nut use. The prevalence (24.8 %) of CKD in betel-nut users was significantly higher than that (11.3 %) of participants without betel-nut use (P = 0.026). In multivariate logistic regression analysis with adjustments for age, hypertension, diabetes and hyperlipidaemia, betel-nut use was independently associated with CKD (P < 0.001). The adjusted odds ratio for betel-nut use was 2.572 (95 % CI 1.917, 3.451). CONCLUSIONS: Betel-nut use is associated with CKD in men. The association between betel-nut use and CKD is independent of age, BMI, smoking, alcohol consumption, hypertension, diabetes and hyperlipidaemia.", "Regular Consumption of Nuts Is Associated with a Lower Risk of Cardiovascular Disease in Women with Type 2 Diabetes Higher nut consumption has been associated with lower risk of coronary heart disease (CHD) events in several epidemiologic studies. The study examined the association between intake of nuts and incident cardiovascular disease (CVD) in a cohort of women with type 2 diabetes. For the primary analysis, there were 6309 women with type 2 diabetes who completed a validated FFQ every 2\u20134 y between 1980 and 2002 and were without CVD or cancer at study entry. Major CVD events included incident myocardial infarction (MI), revascularization, and stroke. During 54,656 person-years of follow-up, there were 452 CHD events (including MI and revascularization) and 182 incident stroke cases. Frequent nut and peanut butter consumption was inversely associated with total CVD risk in age-adjusted analyses. After adjustment for conventional CVD risk factors, consumption of at least 5 servings/wk of nuts or peanut butter [serving size, 28 g (1 ounce) for nuts and 16 g (1 tablespoon) for peanut butter] was significantly associated with a lower risk of CVD (relative risk = 0.56; 95% CI: 0.36\u20130.89). Furthermore, when we evaluated plasma lipid and inflammatory biomarkers, we observed that increasing nut consumption was significantly associated with a more favorable plasma lipid profile, including lower LDL cholesterol, non-HDL cholesterol, total cholesterol, and apolipoprotein-B-100 concentrations. However, we did not observe significant associations for HDL cholesterol or inflammatory markers. These data suggest that frequent nut and peanut butter consumption is associated with a significantly lower CVD risk in women with type 2 diabetes.", "The role of nuts in the optimal diet: time for a critical appraisal? During the last decades, nuts have attracted the attention of researchers for their potential benefits in cardiovascular prevention. We discuss here some aspects of the assumed beneficial effects of nuts, weighing them against potential harm. Epidemiological observations and controlled intervention trials consistently suggest that nuts consumption is associated with improved serum lipid profile, thus helping decrease cardiovascular risk. Being nuts an energy dense food, their impact on energy balance and body weight should be considered. In particular, the claim that adding nuts to the habitual diet, thus increasing calorie intake, does not cause body fat accumulation still needs evidence and biological plausibility. The potential risk associated with the relatively frequent occurrence of allergic reactions following the consumption of nuts is also discussed. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Nuts and healthy body weight maintenance mechanisms. Nuts are rich sources of multiple nutrients and phytochemicals associated with health benefits, including reduced cardiovascular disease risk. This has prompted recommendations to increase their consumption. However, they are also high in fat and are energy dense. The associations between these properties, positive energy balance and body weight raise questions about such recommendations. Numerous epidemiological and clinical studies show that nuts are not associated with weight gain. Mechanistic studies indicate this is largely attributable to the high satiety and low metabolizable energy (poor bioaccessibility leading to inefficient energy absorption) properties of nuts. Compensatory dietary responses account for 55-75% of the energy provided by nuts. Limited data suggest that routine nut consumption is associated with elevated resting energy expenditure and the thermogenic effect of feeding, resulting in dissipation of another portion of the energy they provide. Additionally, trials contrasting weight loss through regimens that include or exclude nuts indicate improved compliance and greater weight loss when nuts are permitted. Nuts may be included in the diet, in moderation, to enhance palatability, nutrient quality, and chronic disease risk reduction without compromising weight loss or maintenance.", "Cultural and historical aspects of Mediterranean nuts with emphasis on their attributed healthy and nutritional properties. BACKGROUND AND AIMS: Nuts have been part of the human diet since prehistoric times. The aim of the present article is to describe the most important historical and cultural aspects of nut consumption throughout history. DATA SYNTHESIS: We discuss the following historical aspects of nuts originating in the Mediterranean: prehistory, the Egyptian civilization, their spread through the Mediterranean region by the Greek, Phoenician and Roman civilizations, and their reintroduction into Europe by means of the Al-Andalus culture. Particular emphasis is placed on the healthy and nutritional attributes that nuts have had throughout history. We also consider the role of the first globalization of food--the exchange of nuts between continents--and discuss the symbolism that nuts have had for humans throughout history in the context of cultural aspects of the Mediterranean region. CONCLUSIONS: Nuts and fruits are probably the earliest foods consumed by humans and are considered to be important because of their nutritional properties. Nuts have also been used in the past by different civilizations as drugs to prevent or treat several diseases. Copyright \u00a9 2010 Elsevier B.V. All rights reserved."], ["Bioavailability of natural carotenoids in human skin compared to blood. Skin functions and structure are significantly influenced by nutrients. Antioxidants protect the supportive layer of the skin against any damaging irradiation effects and the action of free radicals. A lack of suitable methods means that the pharmacokinetic properties of systemically applied carotenoids transferred into the skin remain poorly understood. In this study, a natural kale extract or placebo oil were given orally to 22 healthy volunteers for 4 weeks. Carotenoid bioaccessibility was evaluated using non-invasive resonance Raman spectroscopy on the palm and forehead skin. For the analysis of the blood serum, the standard HPLC method was used. The blood and skin levels of the carotenoids increased significantly during the study but compared to the blood serum values, increases in skin were delayed and depended on the dermal area as well as on the carotenoid. Lycopene, measured as being low in the extract, increases more in the skin compared to the blood indicating that the natural mixture of the extract stabilizes the antioxidative network in the skin. After supplementation had ended, the carotenoids decreased much faster in the blood than in the skin. The delayed decrease in the skin may indicate a peripheral buffer function of the skin for carotenoids. Copyright \u00a9 2010 Elsevier B.V. All rights reserved.", "Aluminum bioavailability from basic sodium aluminum phosphate, an approved food additive emulsifying agent, incorporated in cheese Oral aluminum (Al) bioavailability from drinking water has been previously estimated, but there is little information on Al bioavailability from foods. It was suggested that oral Al bioavailability from drinking water is much greater than from foods. The objective was to further test this hypothesis. Oral Al bioavailability was determined in the rat from basic [26Al]-sodium aluminum phosphate (basic SALP) in a process cheese. Consumption of ~ 1 gm cheese containing 1.5 or 3% basic SALP resulted in oral Al bioavailability (F) of ~ 0.1 and 0.3%, respectively, and time to maximum serum 26Al concentration (Tmax) of 8 to 9 h. These Al bioavailability results were intermediate to previously reported results from drinking water (F ~ 0.3%) and acidic-SALP incorporated into a biscuit (F ~ 0.1%), using the same methods. Considering the similar oral bioavailability of Al from food vs. water, and their contribution to the typical human\u2019s daily Al intake (~ 95 and 1.5%, respectively), these results suggest food contributes much more Al to systemic circulation, and potential Al body burden, than does drinking water. These results do not support the hypothesis that drinking water provides a disproportionate contribution to total Al absorbed from the gastrointestinal tract.", "Cadmium bioavailability from vegetable and animal-based foods assessed with in vitro digestion/caco-2 cell model. BACKGROUND: Chronic dietary cadmium (Cd) exposure results in kidney dysfunction and decrease in bone mineral density. OBJECTIVE: To determine and compare the bioavailability of Cd from vegetable and animal-based foods. MATERIAL AND METHOD: Caco-2 cells were exposed to Cd in boiled pig kidney, ark shell, kale, raw kale, mixed boiled pig kidney with raw kale and CdCl2 after in vitro digestion. Then cellular Cd uptake from the digests and reference CdCl2 solution was measured by atomic absorption spectrometry. RESULTS: Cd bioavailability from animal-based foods was higher than that from vegetable-based foods. In addition, raw kale exhibited an inhibitory effect on Cd bioavailability when mixed with boiled pig kidney. However Cd in kale was increasingly absorbed after boiling. CONCLUSION: Cd binding to different molecular species, other food components in vegetable and animal-based foods, food combination, as well as cooking processes influenced the uptake of dietary Cd. A relative bioavailability factor accounted for the food matrix might be necessary for exposure assessment and consequently for estimation and prevention of the risk of dietary Cd.", "Incorporation of EPA and DHA into plasma phospholipids in response to different omega-3 fatty acid formulations - a comparative bioavailability study of fish oil vs. krill oil Background Bioavailability of omega-3 fatty acids (FA) depends on their chemical form. Superior bioavailability has been suggested for phospholipid (PL) bound omega-3 FA in krill oil, but identical doses of different chemical forms have not been compared. Methods In a double-blinded crossover trial, we compared the uptake of three EPA+DHA formulations derived from fish oil (re-esterified triacylglycerides [rTAG], ethyl-esters [EE]) and krill oil (mainly PL). Changes of the FA compositions in plasma PL were used as a proxy for bioavailability. Twelve healthy young men (mean age 31 y) were randomized to 1680 mg EPA+DHA given either as rTAG, EE or krill oil. FA levels in plasma PL were analyzed pre-dose and 2, 4, 6, 8, 24, 48, and 72 h after capsule ingestion. Additionally, the proportion of free EPA and DHA in the applied supplements was analyzed. Results The highest incorporation of EPA+DHA into plasma PL was provoked by krill oil (mean AUC0-72 h: 80.03 \u00b1 34.71%*h), followed by fish oil rTAG (mean AUC0-72 h: 59.78 \u00b1 36.75%*h) and EE (mean AUC0-72 h: 47.53 \u00b1 38.42%*h). Due to high standard deviation values, there were no significant differences for DHA and the sum of EPA+DHA levels between the three treatments. However, a trend (p = 0.057) was observed for the differences in EPA bioavailability. Statistical pair-wise group comparison's revealed a trend (p = 0.086) between rTAG and krill oil. FA analysis of the supplements showed that the krill oil sample contained 22% of the total EPA amount as free EPA and 21% of the total DHA amount as free DHA, while the two fish oil samples did not contain any free FA. Conclusion Further studies with a larger sample size carried out over a longer period are needed to substantiate our findings and to determine differences in EPA+DHA bioavailability between three common chemical forms of LC n-3 FA (rTAG, EE and krill oil). The unexpected high content of free EPA and DHA in krill oil, which might have a significant influence on the availability of EPA+DHA from krill oil, should be investigated in more depth and taken into consideration in future trials.", "Vitamin B12 sources and bioavailability. The usual dietary sources of vitamin B(12) are animal foods, meat, milk, egg, fish, and shellfish. As the intrinsic factor-mediated intestinal absorption system is estimated to be saturated at about 1.5-2.0 microg per meal under physiologic conditions, vitamin B(12) bioavailability significantly decreases with increasing intake of vitamin B(12) per meal. The bioavailability of vitamin B(12) in healthy humans from fish meat, sheep meat, and chicken meat averaged 42%, 56%-89%, and 61%-66%, respectively. Vitamin B(12) in eggs seems to be poorly absorbed (< 9%) relative to other animal food products. In the Dietary Reference Intakes in the United States and Japan, it is assumed that 50% of dietary vitamin B(12) is absorbed by healthy adults with normal gastro-intestinal function. Some plant foods, dried green and purple lavers (nori) contain substantial amounts of vitamin B(12), although other edible algae contained none or only traces of vitamin B(12). Most of the edible blue-green algae (cyanobacteria) used for human supplements predominantly contain pseudovitamin B(12), which is inactive in humans. The edible cyanobacteria are not suitable for use as vitamin B(12) sources, especially in vegans. Fortified breakfast cereals are a particularly valuable source of vitamin B(12) for vegans and elderly people. Production of some vitamin B(12)-enriched vegetables is also being devised."], ["Inhibition of the growth of premalignant and malignant human oral cell lines by extracts and components of black raspberries. Black raspberries are a rich natural source of chemopreventive phytochemicals. Recent studies have shown that freeze-dried black raspberries inhibit the development of oral, esophageal, and colon cancer in rodents, and extracts of black raspberries inhibit benzo(a)pyrene-induced cell transformation of hamster embryo fibroblasts. However, the molecular mechanisms and the active components responsible for black raspberry chemoprevention are unclear. In this study, we found that 2 major chemopreventive components of black raspberries, ferulic acid and beta-sitosterol, and a fraction eluted with ethanol (RO-ET) during silica column chromatography of the organic extract of freeze-dried black raspberries inhibit the growth of premalignant and malignant but not normal human oral epithelial cell lines. Another fraction eluted with CH2Cl2/ethanol (DM:ET) and ellagic acid inhibited the growth of normal as well as premalignant and malignant human oral cell lines. We investigated the molecular mechanisms by which ferulic acid and beta-sitosterol and the RO-ET fraction selectively inhibited the growth of premalignant and malignant oral cells using flow cytometry and Western blotting of cell cycle regulatory proteins. There was no discernable change in the cell cycle distribution following treatment of cells with the RO-ET fraction. Premalignant and malignant cells redistributed to the G2/M phase of the cell cycle following incubation with ferulic acid. beta-sitosterol treated premalignant and malignant cells accumulated in the G0/G1 and G2/M phases, respectively. The RO-ET fraction reduced the levels of cyclin A and cell division cycle gene 2 (cdc2) in premalignant cells and cyclin B1, cyclin D1, and cdc2 in the malignant cell lines. This fraction also elevated the levels of p21waf1/cip1 in the malignant cell line. Ferulic acid treatment led to increased levels of cyclin B1 and cdc2 in both cell lines, and p21waf1/cip1 was induced in the malignant cell line. beta-sitosterol reduced the levels of cyclin B1 and cdc2 while increasing p21waf1/cip1 in both the premalignant and malignant cell lines. These results show for the first time that the growth inhibitory effects of black raspberries on premalignant and malignant human oral cells may reside in specific components that target aberrant signaling pathways regulating cell cycle progression.", "Topical Application of a Bioadhesive Black Raspberry Gel Modulates Gene Expression and Reduces Cyclooxygenase 2 Protein in Human Premalignant Oral Lesions Reduced expression of proapoptotic and terminal differentiation genes in conjunction with increased levels of the proinflammatory and angiogenesis-inducing enzymes, cyclooxygenase 2 (COX-2) and inducible nitric oxide synthase (iNOS), correlate with malignant transformation of oral intraepithelial neoplasia (IEN). Accordingly, this study investigated the effects of a 10% (w/w) freeze-dried black raspberry gel on oral IEN histopathology, gene expression profiles, intraepithelial COX-2 and iNOS proteins, and microvascular densities. Our laboratories have shown that freeze-dried black raspberries possess antioxidant properties and also induce keratinocyte apoptosis and terminal differentiation. Oral IEN tissues were hemisected to provide samples for pretreatment diagnoses and establish baseline biochemical and molecular variables. Treatment of the remaining lesional tissue (0.5 g gel applied four times daily for 6 weeks) began 1 week after the initial biopsy. RNA was isolated from snap-frozen IEN lesions for microarray analyses, followed by quantitative reverse transcription-PCR validation. Additional epithelial gene-specific quantitative reverse transcription-PCR analyses facilitated the assessment of target tissue treatment effects. Surface epithelial COX-2 and iNOS protein levels and microvascular densities were determined by image analysis quantified immunohistochemistry. Topical berry gel application uniformly suppressed genes associated with RNA processing, growth factor recycling, and inhibition of apoptosis. Although the majority of participants showed posttreatment decreases in epithelial iNOS and COX-2 proteins, only COX-2 reductions were statistically significant. These data show that berry gel application modulated oral IEN gene expression profiles, ultimately reducing epithelial COX-2 protein. In a patient subset, berry gel application also reduced vascular densities in the superficial connective tissues and induced genes associated with keratinocyte terminal differentiation.", "Formulation and In Vitro-In Vivo Evaluation of Black Raspberry Extract-Loaded PLGA/PLA Injectable Millicylindrical Implants for Sustained Delivery of Chemopreventive Anthocyanins Purpose The objective of this study was to formulate and evaluate freeze-dried black raspberry (FBR) ethanol extract (RE) loaded poly(DL-lactic-co-glycolic acid) (PLGA) and poly(DL-lactic acid) (PLA) injectable millicylindrical implants for sustained delivery of chemopreventive FBR anthocyanins (cyanidin-3-sambubioside (CS), cyanidin-3-glucoside (CG) and cyanidin-3-rutinoside (CR)). Methods Identification and quantitation of CS, CG, and CR in RE was performed by mass spectroscopy and HPLC. RE:triacetyl-\u03b2-cyclodextrin (TA-\u03b2-CD) inclusion complex (IC) was prepared by a kneading method and characterized by X-ray diffraction (XRD), nuclear magnetic resonance spectroscopy (NMR) and UV-visible spectroscopy. RE or RE:TA-\u03b2-CD IC-loaded PLGA or PLA implants were prepared by a solvent extrusion method. In vitro and in vivo controlled release studies were conducted in phosphate-buffered saline Tween-80 (pH 7.4, 37\u00b0C) and after subcutaneous administration in male Sprague-Dawley rats, respectively. Anthocyanins were quantified by HPLC at 520 nm. Results The content of CS, CG, and CR in RE was 0.2, 1.5, and 3.5 wt%, respectively. The chemical stability of anthocyanins in solution was determined to be pH-dependent, and their degradation rate increased with an increase in pH from 2.4 to 7.4. PLGA/PLA millicylindrical implants loaded with 5 or 10 wt% RE exhibited a high initial burst and short release duration of anthocyanins (35\u201352 and 80\u2013100% CG + CR release after 1 and 14 days, respectively). The cause for rapid anthocyanins release was linked to higher polymer water uptake and porosity associated with the high osmolytic components of large non-anthocyanin fraction of RE. XRD, 1H NMR and UV-visible spectroscopy indicated that the non-anthocyanin fraction molecules of RE formed an IC with TA-\u03b2-CD, decreasing the hydrophilicity of RE. Formation of an IC with hydrophobic carrier, TA-\u03b2-CD, provided better in vitro/in vivo sustained release of FBR anthocyanins (16\u201324 and 97\u201399% CG + CR release, respectively, after 1 and 28 days from 20 wt% RE:TA-\u03b2-CD IC/PLA implants) over 1 month, owing to reduced polymer water uptake and porosity. Conclusion PLA injectable millicylindrical implants loaded with RE:TA-\u03b2-CD IC are optimal dosage forms for 1-month slow and continuous delivery of chemopreventive FBR anthocyanins.", "Effect of freezing and storage on the phenolics, ellagitannins, flavonoids, and antioxidant capacity of red raspberries. Scottish-grown red raspberries are a rich source of vitamin C and phenolics, most notably, the anthocyanins cyanidin-3-sophoroside, cyanidin-3-(2(G)-glucosylrutinoside), and cyanidin-3-glucoside, and two ellagitannins, sanguiin H-6 and lambertianin C, which are present together with trace levels of flavonols, ellagic acid, and hydroxycinnamates. The antioxidant capacity of the fresh fruit and the levels of vitamin C and phenolics were not affected by freezing. When fruit were stored at 4 degrees C for 3 days and then at 18 degrees C for 24 h, mimicking the route fresh fruit takes after harvest to the supermarket and onto the consumer's table, anthocyanin levels were unaffected while vitamin C levels declined and those of elligitannins increased, and overall, there was no effect on the antioxidant capacity of the fruit. It is concluded, therefore, that freshly picked, fresh commercial, and frozen raspberries all contain similar levels of phytochemicals and antioxidants per serving.", "Black rice anthocyanins inhibit cancer cells invasion via repressions of MMPs and u-PA expression. Tumor metastasis is the most important cause of cancer death and various treatment strategies have targeted on preventing the occurrence of metastasis. Anthocyanins are natural colorants belonging to the flavonoid family, and are wildly used for their antioxidant properties. Here, we provided molecular evidence associated with the anti-metastatic effects of peonidin 3-glucoside and cyanidin 3-glucoside, major anthocyanins extracted from black rice (Oryza sativa L. indica), by showing a marked inhibition on the invasion and motility of SKHep-1 cells. This effect was associated with a reduced expression of matrix metalloproteinase (MMP)-9 and urokinase-type plasminogen activator (u-PA). Peonidin 3-glucoside and cyanidin 3-glucoside also exerted an inhibitory effect on the DNA binding activity and the nuclear translocation of AP-1. Furthermore, these compounds also exerted an inhibitory effect of cell invasion on various cancer cells (SCC-4, Huh-7, and HeLa). Finally, anthocyanins from O. sativa L. indica (OAs) were evidenced by its inhibition on the growth of SKHep-1 cells in vivo."], ["Platelet dysfunction in vascular pathologies and how can it be treated. Cardiovascular diseases are one of the leading causes of morbidity and mortality in industrialized countries, and although many processes play a role in the development of vascular disease, thrombosis is the primary event that precipitates stroke and acute coronary syndromes. The blood platelets are of significant importance in medicine. These cells are involved in many physiological processes, particularly haemostasis through their ability to aggregate and form clots in response to activation. In addition, these dynamic cells display activities that extend beyond thrombosis, including an important role in initiating and sustaining vascular inflammation. The expansion of knowledge from basic and clinical research has highlighted the critical position of platelets in several inflammatory diseases such as arthritis and atherosclerosis. Platelets are emerging as important mediators of inflammation and provide important signals to mediate phenotype of other blood and vascular cells. The important role of platelets in arterial thrombosis and the onset of acute myocardial infarction after atherosclerotic plaque rupture make inhibition of platelet aggregation a critical step in preventing thrombotic events associated with stroke, heart attack, and peripheral arterial thrombosis. However, the use of platelet inhibitors for thrombosis prevention must seek a delicate balance between inhibiting platelet activation and an associated increased bleeding risk. The aim of this review is to up-date the knowledge on platelets physiology and dysfunction in pathologies, such as diabetes mellitus, hypercholesterolemia, and hypertension, emphasizing the link between platelets and the inflammation-related atherosclerosis. The review evaluates the opportunities offered by the novel platelet inhibitors to efficiently alleviate the thrombotic events. Copyright \u00a9 2011 Elsevier Ltd. All rights reserved.", "Diet and thrombosis risk: nutrients for prevention of thrombotic disease. An increased prothrombotic state is a major risk factor for the development of heart attacks, strokes, and venous thromboembolism. Platelet activation and aggregation play an important role in determining a prothrombotic state. Although pharmaceutical agents such as aspirin, heparin, and warfarin are able to reduce prothrombotic tendency, long-term drug treatment may produce a variety of side effects, including bleeding. Diet is generally recognized to be significantly involved in modifying the individual risk for the development of thrombotic diseases, although its influence during the treatment of these disorders is probably less important. Dietary intervention has proven effective in lowering serum lipid levels, which are otherwise essential elements in the pathogenesis of cardiovascular disease. Likewise, certain dietary components have also been proven effective in decreasing platelet activation through various mechanisms and therefore may contribute to attenuating the future risk of thrombosis. This article provides an up-to-date review of the role of nutrient and nonnutrient supplements on platelet aggregation and risk of thrombosis. \u00a9 Thieme Medical Publishers.", "Antiplatelet, anticoagulant, and fibrinolytic activity in vitro of extracts from selected fruits and vegetables. A diet rich in fruits and vegetables is known to decrease the risk of cardiovascular disease. However, the information regarding the antithrombotic activity (antiplatelet, anticoagulant, and fibrinolytic) of fruits and vegetables is scarce. The aim of this study was to assess the antithrombotic activity of extracts from fruits and vegetables widely consumed in central Chile. The study included samples of 19 fruits and 26 vegetables, representative of the local diet. The extracts prepared from each sample included an aqueous (juice or pressed solubles) and/or methanol-soluble fraction. The extracts were evaluated for antiplatelet, anticoagulant, and fibrinolytic activity in vitro at a final concentration of 1 mg/ml. The antiplatelet activity was assessed by platelet aggregation inhibition; anticoagulant activity was measured by the prothrombin time (PT), diluted prothrombin time (dPT), activated partial thromboplastin time (APTT), kaolin clotting time (KCT), and thrombin time. The fibrinolytic effect was determined with the euglobin clot lysis time and fibrin plate methods. Extracts of green beans and tomatoes inhibited platelet aggregation induced by ADP and arachidonic acid, in a concentration-dependent manner. The methanolic extracts of grapes prolonged the PT and dPT. Finally, extracts of raspberry prolonged the APTT and also presented fibrinolytic activity. In conclusion, from a screening that included a variety of fruits and vegetables, we found antiplatelet activity in green beans and tomatoes, anticoagulant activities in grapes and raspberries, whereas fibrinolytic activity was observed only in raspberries. Further investigations are necessary to advance in knowledge of the active compounds of these fruits and vegetables and their mechanisms of action.", "Varicose Veins, Deep Vein Thrombosis, and Haemorrhoids: Epidemiology and Suggested Aetiology Current concepts on the aetiology of varicose veins, deep vein thrombosis, and haemorrhoids have been examined and, in the light of epidemiological evidence, found wanting.It is suggested that the fundamental cause of these disorders is faecal arrest which is the result of a low-residue diet.", "Dietary components and human platelet activity. Platelet hyperactivity is one of the most important factors responsible for the incidence of cardiovascular disease. There are many nutritive and non-nutritive compounds present in the diet which may affect platelet function in various ways. Recent discovery of anti-platelet factors in plants, vegetables and fruits provides a new dietary means for a long-term strategy to favorably modify human blood platelet activity. This review summarises the effects of these dietary components on human platelet function both in vitro and in vivo."], ["Does \u03b1-Amino-\u03b2-methylaminopropionic Acid (BMAA) Play a Role in Neurodegeneration? The association of \u03b1-amino-\u03b2-methylaminopropionic acid (BMAA) with elevated incidence of amyotrophic lateral sclerosis/Parkinson\u2019s disease complex (ALS/PDC) was first identified on the island of Guam. BMAA has been shown to be produced across the cyanobacterial order and its detection has been reported in a variety of aquatic and terrestrial environments worldwide, suggesting that it is ubiquitous. Various in vivo studies on rats, mice, chicks and monkeys have shown that it can cause neurodegenerative symptoms such as ataxia and convulsions. Zebrafish research has also shown disruption to neural development after BMAA exposure. In vitro studies on mice, rats and leeches have shown that BMAA acts predominantly on motor neurons. Observed increases in the generation of reactive oxygen species (ROS) and Ca2+ influx, coupled with disruption to mitochondrial activity and general neuronal death, indicate that the main mode of activity is via excitotoxic mechanisms. The current review pertaining to the neurotoxicity of BMAA clearly demonstrates its ability to adversely affect neural tissues, and implicates it as a potentially significant compound in the aetiology of neurodegenerative disease. When considering the potential adverse health effects upon exposure to this compound, further research to better understand the modes of toxicity of BMAA and the environmental exposure limits is essential.", "Cyanobacterial neurotoxin BMAA in ALS and Alzheimer's disease. OBJECTIVE: The aim of this study was to screen for and quantify the neurotoxic amino acid beta-N-methylamino-L-alanine (BMAA) in a cohort of autopsy specimens taken from Alzheimer's disease (AD), amyotrophic lateral sclerosis (ALS), Huntington's disease (HD), and non-neurological controls. BMAA is produced by cyanobacteria found in a variety of freshwater, marine, and terrestrial habitats. The possibility of geographically broad human exposure to BMAA had been suggested by the discovery of BMAA in brain tissues of Chamorro patients with ALS/Parkinsonism dementia complex from Guam and more recently in AD patients from North America. These observations warranted an independent study of possible BMAA exposures outside of the Guam ecosystem. METHODS: Postmortem brain specimens were taken from neuropathologically confirmed cases of 13 ALS, 12 AD, 8 HD patients, and 12 age-matched non-neurological controls. BMAA was quantified using a validated fluorescent HPLC method previously used to detect BMAA in patients from Guam. Tandem mass spectrometric (MS) analysis was carried out to confirm the identification of BMAA in neurological specimens. RESULTS: We detected and quantified BMAA in neuroproteins from postmortem brain tissue of patients from the United States who died with sporadic AD and ALS but not HD. Incidental detections observed in two out of the 24 regions were analyzed from the controls. The concentrations of BMAA were below what had been reported previously in Chamarro ALS/ Parkinsonism dementia complex patients, but demonstrated a twofold range across disease and regional brain area comparisons. The presence of BMAA in these patients was confirmed by triple quadrupole liquid chromatography/mass spectrometry/mass spectrometry. CONCLUSIONS: The occurrence of BMAA in North American ALS and AD patients suggests the possibility of a gene/environment interaction, with BMAA triggering neurodegeneration in vulnerable individuals. (c) 2009 The Authors Journal compilation (c) 2009 Blackwell Munksgaard.", "Cyanobacterial Blooms and the Occurrence of the neurotoxin beta-N-methylamino-L-alanine (BMAA) in South Florida Aquatic Food Webs Recent studies demonstrate that most cyanobacteria produce the neurotoxin beta-N-methylamino-L-alanine (BMAA) and that it can biomagnify in at least one terrestrial food chain. BMAA has been implicated as a significant environmental risk in the development of neurodegenerative diseases such as Alzheimer\u2019s disease, Parkinson\u2019s disease, and Amyotrophic Lateral Sclerosis (ALS). We examined several blooms of cyanobacteria in South Florida, and the BMAA content of resident animals, including species used as human food. A wide range of BMAA concentrations were found, ranging from below assay detection limits to approximately 7000 \u03bcg/g, a concentration associated with a potential long-term human health hazard.", "Biomagnification of cycad neurotoxins in flying foxes: implications for ALS-PDC in Guam. Beta-methylamino-L-alanine (BMAA) occurs in higher levels in museum specimens of the Guamanian flying fox than in the cycad seeds the flying foxes feed on, confirming the hypothesis that cycad neurotoxins are biomagnified within the Guam ecosystem. Consumption of a single flying fox may have resulted in an equivalent BMAA dose obtained from eating 174 to 1,014 kg of processed cycad flour. Traditional feasting on flying foxes may be related to the prevalence of neuropathologic disease in Guam.", "Spatial clustering of amyotrophic lateral sclerosis and the potential role of BMAA. Amyotrophic lateral sclerosis (ALS) is a fatal neurodegenerative syndrome which has no known cause, except for a small proportion of cases which are genetically inherited. The development of ALS likely involves both genetic and environmental risk factors. Environmental risk factors implicated in ALS have included heavy metals, trauma, pesticides, electrical injuries, electromagnetic radiation and the cyanobacterial-derived neurotoxin beta-N-methylamino-L-alanine (BMAA). To investigate possible environmental risks, a number of epidemiological studies of ALS have been conducted. Some of these studies employ spatial analysis techniques that examine for spatial clusters of ALS and can help guide further research into identifying environmental exposures. Despite identifying geographical disparities in the distribution of ALS cases, these studies have not provided any clear associations with environmental factors. We review the literature on important studies of spatial clustering of ALS and explore the hypothesized link between the neurotoxin BMAA and ALS."], ["Milk Consumption During Teenage Years and Risk of Hip Fractures in Older Adults Importance Milk consumption during adolescence is recommended to promote peak bone mass and thereby reduce fracture risk in later life. However, its role in hip fracture prevention is not established and high consumption may adversely influence risk by increasing height. Objective To determine whether milk consumption during teenage years influences risk of hip fracture in older adults and to investigate the role of attained height in this association. Design Prospective cohort study over 22 years of follow-up Setting United States Participants Over 96,000 Caucasian postmenopausal women from the Nurses\u2019 Health Study and men age 50 and older from the Health Professionals Follow-up Study Exposures Frequency of consumption of milk and other foods during ages 13\u201318 and attained height were reported at baseline. Current diet, weight, smoking, physical activity, medication use, and other risk factors for hip fractures were reported on biennial questionnaires. Main Outcome Measures Cox proportional hazards models were used to calculate relative risks (RR) of first incident hip fracture from low-trauma events per glass (8 fl oz or 240 mL) of milk consumed per day during teenage years. Results Over follow-up, 1226 hip fractures were identified in women and 490 in men. After controlling for known risk factors and current milk consumption, each additional glass of milk per day during teenage years was associated with a significant 9% higher risk of hip fracture in men (RR=1.09, 95% CI 1.01\u20131.17). The association was attenuated when height was added to the model (RR=1.06, 95% CI 0.98\u20131.14). Teenage milk consumption was not associated with hip fractures in women (RR=1.00, 95% CI 0.95\u20131.05 per glass per day). Conclusion and Relevance Greater milk consumption during teenage years was not associated with a lower risk of hip fracture in older adults. The positive association observed in men was partially mediated through attained height.", "Milk intake and risk of hip fracture in men and women: a meta-analysis of prospective cohort studies. Milk contains calcium, phosphorus, and protein and is fortified with vitamin D in the United States. All these ingredients may improve bone health. However, the potential benefit of milk on hip fracture prevention is not well established. The objective of this study was to assess the association of milk intake with risk of hip fracture based on a meta-analysis of cohort studies in middle-aged or older men and women. Data sources for this study were English and non-English publications via Medline (Ovid, PubMed) and EMBASE search up to June 2010, experts in the field, and reference lists. The idea was to compare prospective cohort studies on the same scale so that we could calculate the relative risk (RR) of hip fracture per glass of milk intake daily (approximately 300\u2009mg calcium per glass of milk). Pooled analyses were based on random effects models. The data were extracted by two independent observers. The results show that in women (6 studies, 195,102 women, 3574 hip fractures), there was no overall association between total milk intake and hip fracture risk (pooled RR per glass of milk per day\u2009=\u20090.99; 95% confidence interval [CI] 0.96-1.02; Q-test p\u2009=\u2009.37). In men (3 studies, 75,149 men, 195 hip fractures), the pooled RR per daily glass of milk was 0.91 (95% CI 0.81-1.01). Our conclusion is that in our meta-analysis of cohort studies, there was no overall association between milk intake and hip fracture risk in women but that more data are needed in men. Copyright \u00a9 2011 American Society for Bone and Mineral Research.", "Protein intake, calcium balance and health consequences. High-protein (HP) diets exert a hypercalciuric effect at constant levels of calcium intake, even though the effect may depend on the nature of the dietary protein. Lower urinary pH is also consistently observed for subjects consuming HP diets. The combination of these two effects was suspected to be associated with a dietary environment favorable for demineralization of the skeleton. However, increased calcium excretion due to HP diet does not seem to be linked to impaired calcium balance. In contrast, some data indicate that HP intakes induce an increase of intestinal calcium absorption. Moreover, no clinical data support the hypothesis of a detrimental effect of HP diet on bone health, except in a context of inadequate calcium supply. In addition, HP intake promotes bone growth and retards bone loss and low-protein diet is associated with higher risk of hip fractures. The increase of acid and calcium excretion due to HP diet is also accused of constituting a favorable environment for kidney stones and renal diseases. However, in healthy subjects, no damaging effect of HP diets on kidney has been found in either observational or interventional studies and it seems that HP diets might be deleterious only in patients with preexisting metabolic renal dysfunction. Thus, HP diet does not seem to lead to calcium bone loss, and the role of protein seems to be complex and probably dependent on other dietary factors and the presence of other nutrients in the diet.", "Yerba Mate (Ilex paraguariensis) consumption is associated with higher bone mineral density in postmenopausal women. Yerba Mate (Ilex paraguariensis) tea consumption is higher in Argentina and other South American countries than those of coffee or tea (Camellia sinensis). The effects of Yerba Mate on bone health have not previously been explored. From a program for osteoporosis prevention and treatment, postmenopausal women who drank at least 1 L of Yerba Mate tea daily during 4 or more years (n=146) were identified, and matched by age and time since menopause with an equal number of women who did not drink Yerba Mate tea. Their bone mineral density (BMD) was measured by dual-energy X-ray absorptiometry (DXA) at the lumbar spine and femoral neck. Yerba Mate drinkers had a 9.7% higher lumbar spine BMD (0.952 g/cm(2) versus 0.858 g/cm(2): p<0.0001) and a 6.2% higher femoral neck BMD (0.817 g/cm(2) versus 0.776 g/cm(2); p=0.0002). In multiple regression analysis, Yerba Mate drinking was the only factor, other than body mass index, which showed a positive correlation with BMD at both the lumbar spine (p<0.0001) and the femoral neck (p=0.0028). Results suggest a protective effect of chronic Yerba Mate consumption on bone. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Dietary protein and bone health: harmonizing conflicting theories. A precise understanding of the role of dietary protein in bone health has been evasive despite decades of research. It is known that a dietary acid load is harmful to bone, and sulfur-containing amino acids are metabolized to provide such an acid load. It is also known that protein elevates urine calcium loss. However, recent clinical studies and a meta-analysis have indicated either no effect or a modest benefit associated with higher protein intakes. These contradictory considerations may be explained by the existence of a two-faced relationship between protein and bone, with simultaneous positive and negative pathways. In opposition to the negative effects of dietary acid load, protein may exert positive effects related to improving calcium absorption, increasing insulin-like growth factor 1, or improving lean body mass, which, in turn, improves bone strength. Putative mechanisms behind these pathways are reviewed here, and some limitations in the historical literature as well as suggested measures to counter these in the future are identified. When positive and negative pathways are considered in tandem, protein may offer modest benefits to bone in the presence of adequate dietary calcium and acid-neutralizing fruits and vegetables. \u00a9 2011 International Life Sciences Institute."], ["Benign prostatic hyperplasia in primary care: what you need to know. PURPOSE: We reviewed recent literature and treatment guidelines regarding the prevalence, pathophysiology, and management of BPO related to BPH; and management of lower urinary tract symptoms secondary to BPH. MATERIALS AND METHODS: Published literature and current treatment concepts were reviewed regarding the diagnosis and treatment options for BPO. RESULTS: BPH is a histological diagnosis that can contribute to medical problems, including enlargement of the prostate and BPO. These conditions should be treated only if the symptoms are troublesome, there is considerable risk of progression, and/or cancer is suspected. Very effective medical and surgical options are available to treat BPO and improve patient quality of life. CONCLUSIONS: BPO is highly treatable, but should be managed in close collaboration with the patient. Pharmacological agents and minimally invasive procedures, when appropriate, are generally preferred to more invasive surgery. Patients with mild or moderate symptoms usually can be treated by a primary care physician; more complicated cases should be referred to a urologist for evaluation and management.", "Lifestyle factors, benign prostatic hyperplasia, and lower urinary tract symptoms. PURPOSE OF REVIEW: Although age, genetics, and sex steroid hormones play prominent roles in the cause of benign prostatic hyperplasia (BPH) and lower urinary tract symptoms (LUTS), recent epidemiological studies suggest that modifiable lifestyle factors also contribute substantially to the pathogenesis of these conditions. RECENT FINDINGS: Lifestyle and metabolic factors associated with significantly increased risks of benign prostatic hyperplasia and lower urinary tract symptoms include obesity, diabetes, and meat and fat consumption. Factors associated with decreased risks include physical activity, moderate alcohol intake, and vegetable consumption. Factors for which no clear risk patterns have emerged include lipids and smoking. Randomized clinical trials of lifestyle alterations - such as weight loss, exercise, and diet - for the prevention or treatment of benign prostatic hyperplasia and lower urinary tract symptoms have yet to be performed. SUMMARY: Lifestyle factors present a novel opportunity for the prevention and treatment of benign prostatic hyperplasia and lower urinary tract symptoms. Although clinical trials of lifestyle modifications have not yet been undertaken, promotion of healthy lifestyle alternatives within the context of standard benign prostatic hyperplasia and lower urinary tract symptoms treatment algorithms is potentially beneficial.", "Polycyclic aromatic hydrocarbons (PAHs) in coffee brew samples: analytical method by GC-MS, profile, levels and sources. Roasting is a crucial step for the production of coffee, as it enables the development of color, aroma, and flavor, which are essential for the characterization of the coffee quality. At the same time, roasting may lead to the formation of not desirable compounds, such as polycyclic aromatic hydrocarbons (PAHs). In this paper, we report a method for PAHs determination in coffee brew, based on saponification and liquid-liquid extraction with small volumes of hexane, with exclusion of further processes of purification since we analyze the extract by gas chromatography with mass spectrometric detectors in the single ion monitoring mode (SIM). The total concentration of the 28 compounds investigated, expressed as the sum of concentrations (SigmaPAH), in coffee brew varies from 0.52 to 1.8 microg/l. Carcinogenic PAHs, expressed as B[a]Peq ranged from 0.008 to 0.060 microg/l. The results indicate that coffee contributes with very insignificant quantities to the daily human intake of carcinogenic PAHs. The values of calculated isomeric ratios confirm that the PAHs identified in most of the coffee samples originate from high temperature processes.", "IMPACT OF BARBECUED MEAT CONSUMED IN PREGNANCY ON BIRTH OUTCOMES ACCOUNTING FOR PERSONAL PRENATAL EXPOSURE TO AIRBORNE POLYCYCLIC AROMATIC HYDROCARBONS. BIRTH COHORT STUDY IN POLAND We previously reported an association between prenatal exposure to airborne PAH and lower birth weight, birth length and head circumference. The main goal of the present analysis was to assess the possible impact of co-exposure to PAH-containing of barbecued meat consumed during pregnancy on birth outcomes. The birth cohort consisted of 432 pregnant women who gave birth at term (>36 weeks of gestation). Only non-smoking women with singleton pregnancies, 18-35 years of age, and who were free from chronic diseases such as diabetes and hypertension were included in the study. Detailed information on diet over pregnancy was collected through interviews and the measurement of exposure to airborne PAHs was carried out by personal air monitoring during the second trimester of pregnancy. The effect of barbecued meat consumption on birth outcomes (birthweight, length and head circumference at birth) was adjusted in multiple linear regression models for potential confounding factors such as prenatal exposure to airborne PAHs, child\u2019s sex, gestational age, parity, size of mother (maternal prepregnancy weight, weight gain in pregnancy) and prenatal environmental tobacco smoke (ETS). The multivariable regression model showed a significant deficit in birthweight associated with barbecued meat consumption in pregnancy (coeff = \u2212106.0 g; 95%CI: \u2212293.3, \u221235.8); The effect of exposure to airborne PAHs was about the same magnitude order (coeff. = \u2212164.6 g; 95%CI: \u2212172.3, \u2212 34.7). Combined effect of both sources of exposure amounted to birth weight deficit of 214.3 g (95%CI: \u2212419.0, \u2212 9.6). Regression models performed for birth length and head circumference showed similar trends but the estimated effects were of borderline significance level. As the intake of barbecued meat did not affect the duration of pregnancy, the reduced birthweight could not have been mediated by shortened gestation period. In conclusion, the study results provided epidemiologic evidence that prenatal PAH exposure from diet including grilled meat might be hazardous for fetal development.", "Internal exposure to pollutants and sexual maturation in Flemish adolescents. Flanders is densely populated with much industry and intensive farming. Sexual maturation of adolescents (aged 14-15 years) was studied in relation to internal exposure to pollutants. Serum levels of pollutants and sex hormones were measured in 1679 participants selected as a random sample of the adolescents residing in the study areas. Data on sexual development were obtained from the medical school examination files. Self-assessment questionnaires provided information on health, use of medication and lifestyle factors. In boys, serum levels of hexachlorobenzene (HCB), p,p'-DDE and polychlorinated biphenyls (sum of marker PCB138, 153 and 180) were significantly and positively associated with pubertal staging (pubic hair and genital development). Higher levels of serum HCB and blood lead were associated with, respectively, a lower and a higher risk of gynecomastia. In girls, significant and negative associations were detected between blood lead and pubic hair development; higher exposure to PCBs was significantly associated with a delay in timing of menarche. Environmental exposures to pollutants at levels actually present in the Flemish population are associated with measurable effects on pubertal development. However, further understanding of toxic mode of action and sensitive windows of exposure is needed to explain the current findings."], ["Can soy phytoestrogens decrease DNA methylation in BRCA1 and BRCA2 oncosuppressor genes in breast cancer? Although soy phytoestrogens have been postulated to exert a protective effect against breast cancer, the attendant mechanisms, in particular epigenetics underpinnings, have remained elusive. We investigated the putative effects on DNA methylation by two naturally occurring isoflavones, genistein and daidzein, in a study of the BRCA1 and BRCA2 oncosuppressor genes in breast cancer cell lines (MCF-7, MDA-MB 231, and MCF10a). A demethylant agent, the 5-azacytidine, and a methylant, the budesonide, were used as treatment controls. DNA methylation of BRCA1 and BRCA2 was investigated with methylated DNA immunoprecipitation coupled with PCR. In parallel, protein expression was determined by Western blot, immunohistochemistry, and confocal microscopy. Our results suggest that treatment with 18.5\u2009\u03bcM Genistein or 78.5\u2009\u03bcM Daidzein might reverse DNA hypermethylation and restore the expression of the oncosuppressor genes BRCA1 and BRCA2. 5-Azacitydine also enhanced the reexpression of these genes while budesonide had an opposite effect. To the best of our knowledge, these observations, while requiring replication, provide new evidence on potential epigenetic mechanisms by which genistein and daidzein might contribute to regulation of the BRCA1 and BRCA2. Future studies are warranted on whether the demethylating effect of genistein and daidzein is global or focused on select candidate genes.", "BRCA1-methylated sporadic breast cancers are BRCA-like in showing a basal phenotype and absence of ER expression. BRCA1 mutations have been associated with hereditary breast cancer only. Recent studies indicate that a subgroup of sporadic breast cancer might also be associated with reduction in BRCA1 mRNA levels and protein expression. However, the mechanism of reduced mRNA and protein expression is yet not fully elucidated. This study aims to assess BRCA1 protein expression and the role of BRCA1 promoter methylation in sporadic breast cancer in North Indian population and to correlate these with known prognostic factors and molecular profiles of breast cancer. BRCA1 protein expression was normal (>50\u00a0% tumour cells) in 41 (43\u00a0%) cases, reduced (20-50\u00a0% tumour cells) in 33 (35\u00a0%) cases and absent/markedly reduced (<20\u00a0% tumour cells) in 21 (22.1\u00a0%) cases. Cases which were negative for BRCA1 protein were more frequently positive for basal markers (29 versus 5\u00a0%) and were more often ER-negative (62 versus 39\u00a0%) than BRCA1-positive tumours. Methylation of BRCA1 promoter region was seen in 11/45 cases (24\u00a0%). All 11 cases showing BRCA1 methylation had absent (eight cases) or reduced (three cases) BRCA1 protein expression. BRCA1 protein-negative tumours were more frequently basal marker-positive and ER-negative, highlighting the 'BRCAness' of sporadic breast cancer with loss of BRCA1 protein expression through promoter hypermethylation similar to hereditary breast cancer with BRCA1 mutations. Loss of BRCA1 in sporadic breast cancer suggests that therapeutics targeting BRCA1 pathway in hereditary breast cancer like PARP inhibitors might be used as therapeutic targets for sporadic breast tumours.", "CpG Island Tumor Suppressor Promoter Methylation in Non-BRCA-Associated Early Mammary Carcinogenesis Background: Only 5% of all breast cancers are the result of BRCA1/2 mutations. Methylation silencing of tumor suppressor genes is well described in sporadic breast cancer; however, its role in familial breast cancer is not known. Methods: CpG island promoter methylation was tested in the initial random periareolar fine-needle aspiration sample from 109 asymptomatic women at high risk for breast cancer. Promoter methylation targets included RARB (M3 and M4), ESR1, INK4a/ARF, BRCA1, PRA, PRB, RASSF1A, HIN-1, and CRBP1. Results: Although the overall frequency of CpG island promoter methylation events increased with age (P < 0.0001), no specific methylation event was associated with age. In contrast, CpG island methylation of RARB M4 (P = 0.051), INK4a/ARF (P = 0.042), HIN-1 (P = 0.044), and PRA (P = 0.032), as well as the overall frequency of methylation events (P = 0.004), was associated with abnormal Masood cytology. The association between promoter methylation and familial breast cancer was tested in 40 unaffected premenopausal women in our cohort who underwent BRCA1/2 mutation testing. Women with BRCA1/2 mutations had a low frequency of CpG island promoter methylation (15 of 15 women had \u22644 methylation events), whereas women without a mutation showed a high frequency of promoter methylation events (24 of 25 women had 5-8 methylation events; P < 0.0001). Of women with a BRCA1/2 mutation, none showed methylation of HIN-1 and only 1 of 15 women showed CpG island methylation of RARB M4, INK4a/ARF, or PRB promoters. Conclusions: This is the first evidence of CpG island methylation of tumor suppressor gene promoters in non-BRCA1/2 familial breast cancer.", "Carcinogenesis in the GI tract: from morphology to genetics and back again. The genetic alterations in colorectal cancer progression are determined by one of two separate and distinct underlying pathways of genomic instability. The first pathway, chromosomal instability, is characterized by allelic losses and aneuploidy. The second pathway, microsatellite instability, is characterized by an abundance of subtle DNA mutations and diploidy. Although the genes causing chromosomal instability remain unknown, microsatellite instability is caused by inactivation of a DNA mismatch repair gene (predominantly MLH1 or MSH2). Microsatellite instability is present in 15% of colorectal cancers, and is diagnosed by analysis of tumor DNA from paraffin blocks and by demonstration of loss of mismatch repair protein expression in cancers. In addition to the unique profile of genetic alterations, colorectal cancers with microsatellite instability have distinct pathologic features and improved survival. Finally, cancers from most patients with hereditary non-polyposis colorectal cancer (or Lynch syndrome) have microsatellite instability due to germline mutations in the DNA mismatch repair genes. Identification of the microsatellite instability pathway has enormous implications for the clinical investigation and management of colorectal cancer patients.", "Growth Hormone Receptor Deficiency is Associated With a Major Reduction in Pro-aging Signaling, Cancer and Diabetes in Humans Life span extending mutations in growth signaling pathways protect against age-dependent DNA damage in yeast and decrease insulin resistance and cancer in mice. To test their effect in humans, we monitored for 22 years Ecuadorian subjects with mutations in the growth hormone receptor gene leading to severe growth hormone receptor (GHR) and IGF-I deficiencies and combined this information with surveys to identify the cause and age of death for subjects who died before this period. The individuals with GHR deficiency (GHRD) exhibited only one non-lethal malignancy and no cases of diabetes, in contrast to 17% cancer and 5% diabetes prevalence in the controls. A possible explanation for the very low incidence of cancer may be revealed by in vitro studies: serum from GHRD subjects reduced DNA breaks but increased apoptosis in human mammary epithelial cells (HMECs) treated with hydrogen peroxide. We also observed reduced insulin concentrations (1.4 \u03bcU/ml vs. 4.4\u03bcU/ml in unaffected relatives) and a very low homoeostasis model assessment of insulin resistance (HOMA-IR) index (0.34 vs. 0.96 in unaffected relatives) in GHRD individuals, indicating increased insulin sensitivity, which could explain the absence of diabetes in these subjects. Incubation of HMECs with GHRD serum also resulted in reduced expression of RAS, PKA and TOR, and up-regulation of SOD2, changes that promote cellular protection and life span extension in model organisms. These results provide evidence for a role of evolutionarily conserved pathways in promoting aging and diseases in humans and identify a candidate drug target for healthy life span extension."], ["Mastalgia: a review of management. Mastalgia affects up to two-thirds of women at some time during their reproductive lives. It is usually benign, but thefear of underlying breast cancer is why many women present for evaluation. Mastalgia can be associated with premenstrual syndrome, fibrocystic breast disease, psychologic disturbance and, rarely, breast cancer. Occasionally, extramammary conditions, like Tietzie syndrome, present as mastalgia. A thorough clinical evaluation is required to assess the cause. The majority of women can be reassured after a clinical evaluation. Approximately 15% require pain-relieving therapy. Mechanical breast support; a low-fat, high-carbohydrate diet; and topical nonsteroidal antiinflammatory agents are reasonable first-line treatments. Hormonal agents, such as bromocriptine, tamoxifen and danazol, have all demonstrated efficacy in the treatment of mastalgia. Side effects, however, limit their extensive use. Danazol is the only FDA-approved hormonal treatment and is best used in cyclic form to limit the adverse effects. Lisuride maleate is a new agent recently studied for the treatment of mastalgia. Initial data on this medication are encouraging. Sixty percent of cyclic mastalgia recurs after treatment. Noncyclic mastalgia responds poorly to treatment but resolves spontaneously in up to 50% of cases.", "Mastalgia. OBJECTIVE: To review the current management of women with breast pain. OPTIONS: The effect of various treatment modes and health practices, including medications, was considered for the management of both cyclical and noncyclical breast pain. OUTCOMES: Effective and timely management of the woman with breast pain and improved quality of life. EVIDENCE: A literature search was performed to identify reports published in English between 1975 and July 2003 using MEDLINE and Cochrane Database of Systematic Reviews. VALUES: Levels of evidence, as outlined, have been determined using the criteria outlined by the Canadian Task Force on the Periodic Health Examination. Participants were the principal authors: a clinical dietitian, a surgeon oncologist, and a nurse. BENEFITS, HARMS, AND COSTS: Utilizing the information will increase knowledge, enabling a consistent approach, which will reduce the number of ineffective interventions and ensure appropriate use medications. VALIDATION: Comparison has been made with management protocols in the literature, but no clinical guidelines have been located. No formal clinical testing has taken place. SPONSOR: The Society of Obstetricians and Gynaecologists of Canada (SOGC). Work on these guidelines was initiated by team members to fill a need for practice guidelines at Winnipeg Regional Health Authority Breast Health Centre, Winnipeg, MB. RECOMMENDATIONS: 1. Education and reassurance is an integral part of the management of mastalgia and should be the first-line treatment. (II-1 A) 2. The use of a well-fitting bra that provides good support should be considered for the relief of cyclical and noncyclical mastalgia. (II-3 B) 3. A change in dose, formulation, or scheduling should be considered for women on HRT. HRT may be discontinued if appropriate. (III C) 4. Women with breast pain should not be advised to reduce caffeine intake. (1 E) 5. Vitamin E should not be considered for the treatment of mastalgia. (1 E) 6. There is presently insufficient evidence to recommend the use of evening primrose oil (EPO) in the treatment of breast pain. (II-2 C) 7. Flaxseed should be considered as a first-line treatment for cyclical mastalgia. (I A) 8. Topical non-steroidal anti-inflammatory gel, such as diclofenac 2% in pluronic lethicin organogel, should be considered for pain control for localized treatment of mastalgia. (I A) 9. Tamoxifen 10 mg daily or danazol 200 mg daily should be considered when first-line treatments are ineffective. (I A) 10. Mastectomy or partial mastectomy should not be considered an effective treatment for mastalgia. (III E).", "Is there a role for surgery in the treatment of mastalgia? Breast pain is a common condition affecting most women at some stage in their reproductive life. Mastalgia is resistant to treatment in 6% of cyclical and 26% non-cyclical patients. Surgery is not widely used to treat this condition and only considered in patients with severe mastalgia resistant to medication. The aims of this study were to audit the efficacy of surgery in severe treatment resistant mastalgia and to assess patient satisfaction following surgery. This is a retrospective review of the medical records of all patients seen in mastalgia clinic in the University Hospital of Wales, Cardiff since 1973. A postal questionnaire was distributed to all patients who had undergone surgery. Results showed that of the 1054 patients seen in mastalgia clinic, 12 (1.2%) had undergone surgery. Surgery included 8 subcutaneous mastectomies with implants (3 bilateral, 5 unilateral), 1 bilateral simple mastectomy and 3 quadrantectomies (1 having a further simple mastectomy). The median duration of symptoms was 6.5 years (range 2-16 years). Five patients (50%) were pain free following surgery, 3 developed capsular contractures and 2 wound infections with dehiscence. Pain persisted in both patients undergoing quadrantectomy. We conclude that surgery for mastalgia should only be considered in a minority of patients. Patients should be informed of possible complications inherent of reconstructive surgery and warned that in 50% cases their pain will not be improved.", "A double blind trial of the prolactin inhibitor bromocriptine in painful benign breast disease. A double blind crossover trial of the prolactin inhibitor bromocriptine in painful benign breast disease is reported. Twenty-nine women with cyclical mastalgia and 11 with non-cyclical pain were treated with bromocriptine, 5 mg daily, and placebo over six menstrual cycels. Assessment of response to treatment was made by a linear analogue system and clinical examination together with plasma prolactin estimations. Bromocriptine produced a significant improvement in breast symptoms and a significant fall in prolactin levels in the cyclical pain group, but had no effect in the non-cyclical group. These results suggest that bromocriptine offers a new and effective approach in the management of cyclical breast pain.", "Serum prolactin and oestradiol levels in women with cyclical mastalgia. Basal serum prolactin and serum oestradiol-17-beta concentrations were measured four times during one menstrual cycle in 20 women with severe cyclical mastalgia and normal to slightly fibroadenotic breasts. A group of 10 normal women who had never experienced mastalgia served as controls. Basal serum prolactin was significantly elevated in patients compared to normals, although within the normal range. Serum oestradiol concentrations did not differ in the two groups and were also within the normal range. A significant positive correlation between oestradiol and prolactin was found in patients and normals, but with larger prolactin levels in patients. The results point towards a prolactin secretory hypersensitivity for oestradiol in patients with cyclical mastalgia. Prolactin is considered a central factor in the eliciting of cyclical mastalgia."], ["Bronchiolitis obliterans and consumer exposure to butter-flavored microwave popcorn: a case series. Respiratory exposure to diacetyl and diacetyl-containing flavorings used in butter-flavored microwave popcorn (BFMP) causes lung disease, including bronchiolitis obliterans (BO), in flavorings and popcorn manufacturing workers. However, there are no published reports of lung disease among BFMP consumers. We present a case series of three BFMP consumers with biopsy-confirmed BO. We review data relating to consumer exposures, estimate case exposures, and compare them to diacetyl-containing flavoring-exposed manufacturing workers with lung disease. These consumer cases' exposure levels are comparable to those that caused disease in workers. We were unable to identify any other exposures or diseases known or suspected to cause BO in these cases. BFMP poses a significant respiratory risk to consumers. Some manufacturers have substituted diacetyl with other alpha-diketones that are likely to pose a similar risk. Simple consumer practices such as cooling the popcorn bag would eliminate the risk of severe lung disease.", "Bronchiolitis obliterans organizing pneumonia (BOOP) after thoracic radiotherapy for breast carcinoma Common complications of thoracic radiotherapy include esophagitis and radiation pneumonitis. However, it is important to be aware of uncommon post-radiotherapy complications such as bronchiolitis obliterans organizing pneumonia (BOOP). We report on two patients with carcinoma of the breast who developed an interstitial lung disease consistent with BOOP. BOOP responds to treatment with corticosteroids and the prognosis is generally good despite of the need for long-term administration of corticosteroids as relapses can occur during tapering of steroids. This report provides guidelines for the evaluation and treatment of patients with pulmonary infiltrates after radiotherapy.", "Popcorn-worker lung caused by corporate and regulatory negligence: an avoidable tragedy. Diacetyl-containing butter flavor was identified as the cause of an outbreak of bronchiolitis obliterans (BO) and other lung diseases in popcorn-plant workers. Litigation documents show that the outbreak was both predictable and preventable. The industry trade organization was aware of BO cases in workers at butter-flavoring and popcorn-manufacturing plants but often failed to implement industrial hygiene improvements and actively hid pertinent warning information. Due to weaknesses in the organization and mandates of regulatory bodies, organizations such as NIOSH, OSHA, the FDA, particularly the \\\"generally recognized as safe\\\" (GRAS) system, and the EPA failed to detect and prevent the outbreak, which highlights the need for systemic changes in food-product regulation, including the need for corporations to act responsibly, for stronger regulations with active enforcement, for a restructuring of the GRAS system, and for criminal penalties against corporations and professionals who knowingly hide information relevant to worker protection.", "Extracorporeal membrane oxygenation and conventional medical therapy in neonates with persistent pulmonary hypertension of the newborn: a prospecti... Thirty-nine newborn infants with severe persistent pulmonary hypertension and respiratory failure who met criteria for 85% likelihood of dying were enrolled in a randomized trial in which extracorporeal membrane oxygenation (ECMO) therapy was compared with conventional medical therapy (CMT). In phase I, 4 of 10 babies in the CMT group died and 9 of 9 babies in the ECMO group survived. Randomization was halted after the fourth CMT death, as planned before initiating the study, and the next 20 babies were treated with ECMO (phase II). Of the 20, 19 survived. All three treatment groups (CMT and ECMO in phase I and ECMO, phase II) were comparable in severity of illness and mechanical ventilator support. The overall survival of ECMO-treated infants was 97% (28 of 29) compared with 60% (6 of 10) in the CMT group (P less than .05).", "Atrial fibrillation associated with chocolate intake abuse and chronic salbutamol inhalation abuse. The use of substances as the substrate for atrial fibrillation is not frequently recognized. Chocolate is derived from the roasted seeds of the plant theobroma cacao and its components are the methylxanthine alkaloids theobromine and caffeine. Caffeine is a methylxanthine whose primary biological effect is the competitive antagonism of the adenosine receptor. Normal consumption of caffeine was not associated with risk of atrial fibrillation or flutter. Sympathomimetic effects, due to circulating catecholamines cause the cardiac manifestations of caffeine overdose toxicity, produce tachyarrhythmias such as supraventricular tachycardia, atrial fibrillation, ventricular tachycardia, and ventricular fibrillation.The commonly used doses of inhaled or nebulized salbutamol induced no acute myocardial ischaemia, arrhythmias or changes in heart rate variability in patients with coronary artery disease and clinically stable asthma or chronic obstructive pulmonary disease. Two-week salbutamol treatment shifts the cardiovascular autonomic regulation to a new level characterized by greater sympathetic responsiveness and slight beta2-receptor tolerance. We present a case of atrial fibrillation associated with chocolate intake abuse in a 19-year-old Italian woman with chronic salbutamol inhalation abuse. This case focuses attention on chocolate intake abuse associated with chronic salbutamol abuse as the substrate for atrial fibrillation. Copyright \u00a9 2008 Elsevier Ireland Ltd. All rights reserved."], ["Why the Bush administration and the global sugar industry are determined to demolish the 2004 WHO global strategy on diet, physical activity and he... OBJECTIVE: To indicate why the world's most powerful nation state and one powerful sector of the food and drink production and manufacturing industry are determined to demolish the 2004 WHO (World Health Organization) global strategy on diet, physical activity and health, and to disassociate it from the 2003 WHO/FAO (Food and Agriculture Organization) expert report on diet, nutrition and the prevention of chronic diseases, which with its background papers is the immediate scientific basis for the strategy. To encourage representatives of nation states at the 2004 WHO World Health Assembly to support the strategy together with the report, so that the strategy is explicit and quantified, and responds to the need expressed by member states at the 2002 World Health Assembly. This is for an effective global strategy to prevent and control chronic diseases whose prevalence is increased by nutrient-poor food low in vegetables and fruits and high in energy-dense fatty, sugary and/or salty foods and drinks and also by physical inactivity. Of these diseases, obesity, diabetes, cardiovascular diseases and cancers of several sites are now the chief causes of morbidity and mortality in most countries in the world. METHOD: A summary of the global strategy and its roots in scientific knowledge accumulated over the last half-century. Reasons why the global strategy and the expert report are opposed by the current US government and the world sugar industry, with some reference to modern historical context. A summary of the trajectory of the global strategy since its first draft made in early 2003, and a further summary of its weaknesses, strengths and potential. CONCLUSION: The 2004 WHO global strategy and the 2003 WHO/FAO expert report are perceived by the current US administration as an impediment to US trade and international policy, within a general context of current US government hostility to the UN (United Nations) system as a brake on the exercise of its power as the world's dominant nation. Policy-makers throughout the world should be aware of the contexts of current pressures put on them by powerful nation states and sectors of industry whose ideologies and commercial interests are challenged by international initiatives designed to improve public health and to leave a better legacy for future generations.", "Political context of the World Health Organization: sugar industry threatens to scupper the WHO. The Sugar Association, representing the U.S. sugar industry, is highly critical of a WHO report on guidelines for healthy eating, which suggests that sugar should account for no more than 10 percent of a healthy diet. The association has demanded that Congress end its funding of the World Health Organization unless the WHO withdraws the guidelines, and the association and six other big food industry groups have also asked the U.S. Secretary of Health and Human Services to use his influence to get the WHO report withdrawn. The WHO strongly rejects the sugar lobby's criticisms.", "Americans Do Not Meet Federal Dietary Recommendations A longstanding goal of dietary surveillance has been to estimate the proportion of the population with intakes above or below a target, such as a recommended level of intake. However, until now, statistical methods for assessing the alignment of food intakes with recommendations have been lacking. The purposes of this study were to demonstrate the National Cancer Institute\u2019s method of estimating the distribution of usual intake of foods and determine the proportion of the U.S. population who does not meet federal dietary recommendations. Data were obtained from the 2001\u20132004 NHANES for 16,338 persons, aged 2 y and older. Quantities of foods reported on 24-h recalls were translated into amounts of various food groups using the MyPyramid Equivalents Database. Usual dietary intake distributions were modeled, accounting for sequence effect, weekend/weekday effect, sex, age, poverty income ratio, and race/ethnicity. The majority of the population did not meet recommendations for all of the nutrient-rich food groups, except total grains and meat and beans. Concomitantly, overconsumption of energy from solid fats, added sugars, and alcoholic beverages (\u201cempty calories\u201d) was ubiquitous. Over 80% of persons age \u226571 y and over 90% of all other sex-age groups had intakes of empty calories that exceeded the discretionary calorie allowances. In conclusion, nearly the entire U.S. population consumes a diet that is not on par with recommendations. These findings add another piece to the rather disturbing picture that is emerging of a nation\u2019s diet in crisis.", "Plant foods and plant-based diets: protective against childhood obesity? The objective of this article is to review the epidemiologic literature examining the role of plant foods and plant-based diets in the prevention of childhood obesity. Available data suggest a protective effect of ready-to-eat cereal on risk of obesity, although prospective studies are still needed. Studies on fruit and vegetables; grains other than cereal; high-protein foods, including beans, legumes, and soy; fiber; and plant-based dietary patterns are inconsistent or generally null. The evidence base is limited, and most studies are fraught with methodologic limitations, including cross-sectional design, inadequate adjustment for potential confounders, and lack of consideration of reporting errors, stage of growth, and genetic influences. Well-designed prospective studies are needed. The lack of evidence showing an association between plant-based diets and childhood obesity does not mean that such diets should not be encouraged. Plant foods are highlighted in the Dietary Guidelines for Americans, and children do not meet the current recommendations for most plant foods. Although the advice to consume a plant-based, low-energy-dense diet is sound, ethical questions arise concerning the relatively high price of these diets in the United States and the way in which such diets are perceived in other parts of the world. Reducing the burden of childhood obesity, eliminating health disparities, and preventing the further spread of the disease around the globe will require not only policy interventions to ensure that plant foods are affordable and accessible to children of all income levels but also awareness of sociocultural norms that affect consumption.", "The economic burden of dry eye disease in the United States: a decision tree analysis. PURPOSE: The aim of this study was to estimate both the direct and indirect annual cost of managing dry eye disease (DED) in the United States from a societal and a payer's perspective. METHODS: A decision analytic model was developed to estimate the annual cost for managing a cohort of patients with dry eye with differing severity of symptoms and treatment. The direct costs included ocular lubricants, cyclosporine, punctal plugs, physician visits, and nutritional supplements. The indirect costs were measured as the productivity loss because of absenteeism and presenteeism. The model was populated with data that were obtained from surveys that were completed by dry eye sufferers who were recruited from online databases. Sensitivity analyses were employed to evaluate the impact of changes in parameters on the estimation of costs. All costs were converted to 2008 US dollars. RESULTS: Survey data were collected from 2171 respondents with DED. Our analysis indicated that the average annual cost of managing a patient with dry eye at $783 (variation, $757-$809) from the payers' perspective. When adjusted to the prevalence of DED nationwide, the overall burden of DED for the US healthcare system would be $3.84 billion. From a societal perspective, the average cost of managing DED was estimated to be $11,302 per patient and $55.4 billion to the US society overall. CONCLUSIONS: DED poses a substantial economic burden on the payer and on the society. These findings may provide valuable information for health plans or employers regarding budget estimation."], ["Acute and subacute toxicity of tyramine, spermidine, spermine, putrescine and cadaverine in rats. The acute and subacute toxicity of five biogenic amines-tyramine, spermidine, spermine, putrescine and cadaverine-were examined in Wistar rats. Tyramine and cadaverine had a low acute oral toxicity of more than 2000 mg/kg body weight. Putrescine had an acute oral toxicity of 2000 mg/kg body weight and spermidine and spermine each of 600 mg/kg body weight. All amines investigated caused a dose-related decrease in blood pressure after intravenous administration, except for tyramine, where an increase was found. In 6-wk studies the biogenic amines were administered in the diet to groups of 10 male and 10 female rats. Tyramine and cadaverine were given at levels of 0, 200, 2000 or 10,000 ppm, spermine and putrescine at levels of 0, 200, 2000 or 5000 ppm and spermidine at levels of 0, 20, 200 or 500/1000 ppm in the first study and at levels of 0 or 10,000 ppm in a second study. Spermine was the most toxic. The high dose level showed a great number of changes, such as emaciation, aggressiveness, convulsions and paralysis of the hind legs. Growth, food intake and water intake were considerably decreased. Slight anaemia (males) and changes in plasma clinical chemistry occurred. The relative weights of the thyroid, adrenals, spleen and heart were increased and that of the liver decreased. Impaired kidney function, together with renal histopathological changes and changes in plasma electrolytes and urea, occurred with spermine. Histopathological examinations also revealed decreased glycogen content in the liver, reduction of spermatogenesis, severe depletion of splenic white pulp, acute involution of the thymus and moderate myocardial degeneration in the heart. Myocardial degeneration was also seen in one mid-dose male. Adverse effects were also observed in the top dose groups of all other amines. Decreased body weights associated with diminished food intake were generally seen. Slight increases in packed cell volume, haemoglobin concentration and thrombocytes occurred with cadaverine. With spermidine, decreased plasma creatinine, calcium and inorganic phosphate were observed and decreased potassium levels with cadaverine. The no-observed-adverse-effect level was 2000 ppm (180 mg/kg body weight/day) for tyramine, cadaverine and putrescine, 1000 ppm (83 mg/kg body weight/day) for spermidine and 200 ppm (19 mg/kg body weight/day) for spermine.", "Biogenic amines in fish: roles in intoxication, spoilage, and nitrosamine formation--a review. Biogenic amines are non-volatile amines formed by decarboxylation of amino acids. Although many biogenic amines have been found in fish, only histamine, cadaverine, and putrescine have been found to be significant in fish safety and quality determination. Despite a widely reported association between histamine and scombroid food poisoning, histamine alone appears to be insufficient to cause food toxicity. Putrescine and cadaverine have been suggested to potentiate histamine toxicity. With respect to spoilage on the other hand, only cadaverine has been found to be a useful index of the initial stage of fish decomposition. The relationship between biogenic amines, sensory evaluation, and trimethylamine during spoilage are influenced by bacterial composition and free amino acid content. A mesophilic bacterial count of log 6-7 cfu/g has been found to be associated with 5 mg histamine/100 g fish, the Food and Drug Administration (FDA) maximum allowable histamine level. In vitro studies have shown the involvement of cadaverine and putrescine in the formation of nitrosamines, nitrosopiperidine (NPIP), and nitrosopyrrolidine (NPYR), respectively. In addition, impure salt, high temperature, and low pH enhance nitrosamine formation, whereas pure sodium chloride inhibits their formation. Understanding the relationships between biogenic amines and their involvement in the formation of nitrosamines could explain the mechanism of scombroid poisoning and assure the safety of many fish products.", "In vitro and in vivo efficacy of sulfo-carrabiose, a sugar-based cosmetic ingredient with anti-cellulite properties. Most of adult women exhibit cellulite on the hips, buttock and thighs. Although extracellular matrix and lymphatic system disorders can increase its appearance, cellulite basically results from an excessive fat storage in the adipose tissue which exerts considerable pressure on the surrounding skin tissue and creates a dimpled irregular appearance. Caffeine, the most widely used anti-cellulite ingredient, favours fat break-down by inhibiting the phosphodiesterase enzyme and encouraging a high intracellular level of cAMP. A series of studies has shown that spermine and spermidine, two ubiquitous polyamines, encouraged fat storage and slowed fat break-down in the adipose tissue. Besides, it was shown that heparan sulfate glycosaminoglycans had a strong affinity for polyamines. To design a new cosmetic ingredient with anti-cellulite properties, we used molecular modelling to screen several ingredients with a structure similar to that of heparan sulfate glycosaminoglycans. This way, we identified sulfo-carrabiose as a potent molecule for trapping spermine and spermidine. These virtual results were first confirmed in tubo where sulfo-carrabiose was shown to dose-dependently inactivate spermine and spermidine. In vitro, adipocytes cultured with sulfo-carrabiose exhibited a significant reduction of lipogenesis and a significant increase of lipolysis. When sulfo-carrabiose was incorporated in a cosmetic formula, significant improvements were observed in thigh circumference, with better results than those obtained with caffeine after 28 days of use. Furthermore, a combination of caffeine and sulfo-carrabiose led to results significantly better than those obtained with caffeine alone. As measured by fringe projection, thigh volume was also significantly reduced after sulfo-carrabiose treatment. Finally, the appearance of cellulite assessed by clinical evaluation was also significantly reduced within 28 days. \u00a9 2010 BASF Beauty Care Solutions. ICS \u00a9 2010 Society of Cosmetic Scientists and the Soci\u00e9t\u00e9 Fran\u00e7aise de Cosm\u00e9tologie.", "Zinc and multi-mineral supplementation should mitigate the pathogenic impact of cadmium exposure. High-level cadmium (Cd) exposure has long been known to induce nephropathy, severe osteoporosis, and fractures in humans. More recent epidemiology, however, reveals that, in populations not known to have important industrial exposure to this heavy metal, high-normal blood or urine Cd levels correlate with increased risk for vascular disorders, cancers, diabetes, and total mortality, as well as osteoporosis and nephropathy. Since these disorders appear unlikely to expedite Cd absorption, and since Cd has promoted these pathologies in rodent studies, it seems reasonable to conclude that Cd is an important mediating risk factor for these disorders in humans. Avoiding tobacco smoke or frequent ingestion of shellfish or organ meats can lessen humans exposure to Cd, but the chief dietary sources of Cd are plant-derived foods - green leafy vegetables, whole grains, tubers, and root vegetables - typically recommended for their health-supportive properties; indeed, among non-smokers, vegans tend to have the highest Cd body burden. Fortunately, iron sufficiency and ample dietary intakes of calcium, magnesium, and zinc can impede absorption of dietary Cd, both by down-regulating intestinal expression of mineral transporters, and by directly competing with Cd for access to these transporters. Correction of iron deficiency appears to be of particular importance for controlling Cd absorption. Moreover, zinc supplementation can counteract the toxicity of Cd already in the body via induction of metallothionein, which binds Cd avidly via its sulfhydryl groups; so long as it remains sequestered in this form, Cd is innocuous. Zinc supplementation may in any case be recommendable, as optimal zinc status exerts protective anti-inflammatory, antioxidant, and immunosupportive effects. Inasmuch as the toxicity of Cd appears to be mediated in large part by oxidative stress, ingestion of spirulina, lipoic acid, melatonin, and N-acetylcysteine may also have potential for mitigating the risk associated with Cd exposure, as suggested by rodent studies. Hence, although Cd may prove to be a major risk factor for morbidity and mortality in humans, practical strategies for limiting its absorption and pathogenic impact are at hand. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Diet and nutrients are contributing factors that influence blood cadmium levels. Studies suggested the intake of Cd from diet can be approximately equivalent to that from smoking. Moreover, a mutual metabolic influence between Cd and nutrients has been reported. The purpose of this study was to evaluate the relationship between blood cadmium concentration (BCdC) and food consumption, nutrients intake (Ca, Fe, Zn, vitamin C, and vitamin D), tobacco smoking, and some other variables (age, body mass index, and residence) in 243 adults living in the Italian island of Sardinia (Sassari Province). Specifically, we hypothesized that offal consumption contributes to Cd intakes and blood levels. The BCdC was quantified by graphite furnace atomic absorption spectrometry, and information on personal data was collected through questionnaires. Smoke significantly contributed to the BCdC (P < .001). Nonsmoker subjects who eat offal showed significantly higher BCdC (P = .04). Moreover, slightly higher BCdCs were also observed in nonsmoker subjects who eat rice, fish, and bread. The BCdC positively correlated with age of subjects (r = 0.144; P = .025) and offal daily intake in nonsmokers (r = 0.393; P < .001). The intake of Ca was negatively correlated (r = -0.281; P = .001) with the BCdC in females. The multiple linear regression analysis showed smoking > consumption of offal > body mass index \u2248 age as the most important risk factors for the BCdC in the selected population. Copyright \u00a9 2011 Elsevier Inc. All rights reserved."], ["Caloric restriction in humans: potential pitfalls and health concerns. To date, the only intervention that has consistently been shown to slow the rate of aging, and to increase mean and maximum lifespan in short-lived species, is life-long calorie restriction. It is yet unclear whether long-term calorie restriction in longer lived species (i.e. primates and humans) will have a similar effect. In humans, several studies investigating short-term calorie restriction or \\\"weight loss\\\" programs suggest beneficial outcomes on parameters of cardiovascular disease. Studies on long-term calorie restriction are performed on a self-selected group of human subjects and show similar effects. However, few studies are currently investigating the quality of life and potential pitfalls of long-term calorie restriction in humans. It is likely that some of the physiological and psychological effects of caloric restriction that occur in animals may impact the human life very differently. For certain, calorie restriction has a plethora of health benefits in mammals, such as a reduction in age-related diseases such as cancer. However, despite the \\\"magic\\\" of CR, this intervention in humans may present itself with a number of health concerns, which may not be applicable to or impact the life of experimental animals, but may do so in humans. These potential pitfalls and \\\"side effects\\\" are not clearly addressed in the literature and will be a focus of this review.", "Caloric restriction, the traditional Okinawan diet, and healthy aging: the diet of the world's longest-lived people and its potential impact on mor... Long-term caloric restriction (CR) is a robust means of reducing age-related diseases and extending life span in multiple species, but the effects in humans are unknown. The low caloric intake, long life expectancy, and the high prevalence of centenarians in Okinawa have been used as an argument to support the CR hypothesis in humans. However, no long-term, epidemiologic analysis has been conducted on traditional dietary patterns, energy balance, and potential CR phenotypes for the specific cohort of Okinawans who are purported to have had a calorically restricted diet. Nor has this cohort's subsequent mortality experience been rigorously studied. Therefore, we investigated six decades of archived population data on the elderly cohort of Okinawans (aged 65-plus) for evidence of CR. Analyses included traditional diet composition, energy intake, energy expenditure, anthropometry, plasma DHEA, mortality from age-related diseases, and current survival patterns. Findings include low caloric intake and negative energy balance at younger ages, little weight gain with age, life-long low BMI, relatively high plasma DHEA levels at older ages, low risk for mortality from age-related diseases, and survival patterns consistent with extended mean and maximum life span. This study lends epidemiologic support for phenotypic benefits of CR in humans and is consistent with the well-known literature on animals with regard to CR phenotypes and healthy aging.", "Insights into the beneficial effect of caloric/ dietary restriction for a healthy and prolonged life Over the last several years, new evidence has kept pouring in about the remarkable effect of caloric restriction (CR) on the conspicuous bedfellows- aging and cancer. Through the use of various animal models, it is now well established that by reducing calorie intake one can not only increase life span but, also, lower the risk of various age related diseases such as cancer. Cancer cells are believed to be more dependent on glycolysis for their energy requirements than normal cells and, therefore, can be easily targeted by alteration in the energy-metabolic pathways, a hallmark of CR. Apart from inhibiting the growth of transplantable tumors, CR has been also shown to inhibit the development of spontaneous, radiation, and chemically induced tumors. The question regarding the potentiality of the anti-tumor effect of CR in humans has been in part answered by the resistance of a cohort of women, who had suffered from anorexia in their early life, to breast cancer. However, human research on the beneficial effect of CR is still at an early stage and needs further validation. Though the complete mechanism of the anti-tumor effect of CR is far from clear, the plausible involvement of nutrient sensing pathways or IGF-1 pathways proposed for its anti-aging action cannot be overruled. In fact, cancer cell lines, mutant for proteins involved in IGF-1 pathways, failed to respond to CR. In addition, CR decreases the levels of many growth factors, anabolic hormones, inflammatory cytokines, and oxidative markers that are deregulated in several cancers. In this review, we discuss the anti-tumor effect of CR, describing experiments done in vitro in tumor models and in vivo in mouse models in which the tumor was induced by means of radiation or chemical exposure, expressing oncogenes or deleting tumor suppression genes. We also discuss the proposed mechanisms of CR anti-tumor action. Lastly, we argue the necessity of gene expression studies in cancerous versus normal cells upon CR.", "Macronutrient balance and lifespan Dietary restriction (DR) without malnutrition is widely regarded to be a universal mechanism for prolonging lifespan. It is generally believed that the benefits of DR arise from eating fewer calories (termed caloric restriction, CR). Here we argue that, rather than calories, the key determinant of the relationship between diet and longevity is the balance of protein to non-protein energy ingested. This ratio affects not only lifespan, but also total energy intake, metabolism, immunity and the likelihood of developing obesity and associated metabolic disorders. Among various possible mechanisms linking macronutrient balance to lifespan, the nexus between the TOR and AMPK signaling pathways is emerging as a central coordinator.", "Longevity. The allostatic load of dietary restriction. Restriction of food intake by 10-50% of ad libitum on a per unit of weight or energy content basis can extend the lifespan of a wide variety of species and prevent or delay age-related disease. This review first briefly summarizes the data delineating mortality trajectories of various species' populations maintained on restricted diets to provide insight into the effects of nutrient deprivation on distinct components of the aging process. Next, I discuss a number of important studies that have addressed the question whether it is the lack of calories and/or specific nutrients that determines the longevity response to dietary restriction. Finally, I review the evidence for hormesis as a proximate mechanism underpinning the impact of dietary restriction on lifespan. In aggregate, the currently available demographic data suggest that dietary restriction can both slow the age-related progressive accumulation of cellular damage and also enhance the ability of organisms to cope with irreversible injury. Restriction of essential nutrients as well as calories may affect life expectancy, perhaps in a species specific fashion. Hormesis, i.e. an evolutionary conserved stress response routine providing protection against a wide variety of (other) hazards in response to low levels of stress, is very likely to contribute to the beneficial health effects of dietary restriction. Copyright \u00c2\u00a9 2011 Elsevier Inc. All rights reserved."], ["Is oral sex really a dangerous carcinogen? Let's take a closer look. INTRODUCTION: Questions have recently arisen in the popular press about the association between specific sexual behaviors, namely, fellatio and cunnilingus, with head and neck cancers. Although there has been an overall decline in the incidence of head and neck cancers over the past 25 years, there has been a shift in the distribution of these cancers toward a particular type known as oral squamous cell carcinomas (OSCCs), and a younger demographic. These particular cancers, OSCCs, have been shown to be associated with the human papillomavirus (HPV). Several researchers have suggested that this shift in the epidemiology of head and neck cancers might be attributable to changing sexual practices. While this speculation has caught on in the popular press, there are several interesting contradictions in the existing evidence that suggest this conclusion might be premature and overreached. AIM: The intent of this article is to help clarify the issues so that sexual medicine professionals can give accurate and up-to-date information to their patients. MAIN OUTCOME MEASURES: This is a review article; no outcome data are reported. This is a review article; no measures were collected. METHODS: Pubmed search on HPV, oral sex, oral cancers, and OSCCs. RESULTS: One hundred ninety-six articles on HPV were found; 63 articles on oral sex, 55 on oral cancer, and 5 articles on OSCCs were identified as relevant. CONCLUSIONS: HPV infections occur commonly and are usually cleared within 18 months, thus HPV infection should not be a cause for concern among monogamous couples with a rich and varied sex life as long as the sexual system remains closed and other immune compromising factors are not present. HPV becomes a concern in the context of immune system compromise and infection persistence. Factors contributing to immune system compromise, HPV persistence, and oncogenesis are reviewed. \u00a9 2012 International Society for Sexual Medicine.", "Postinfectious functional gastrointestinal disorders. Functional gastrointestinal disorders are associated with low health-related quality of life and high resource utilization. Postinfectious irritable bowel syndrome (PI-IBS) is a functional gastrointestinal disorder defined as the acute onset of new IBS symptoms in an individual who has not previously met the Rome criteria for IBS, immediately after an acute illness characterized by 2 or more of the following: fever, vomiting, diarrhea, or a positive bacterial stool culture. Although the pathophysiological mechanisms involved in PI-IBS are currently unknown, it is believed that a transitory inflammation leads to subtle but permanent changes in the structure and function of the digestive system that induce symptoms. This review considers recent evidence surrounding the role of inflammatory mediators in the development of hypersensitivity, along with the mediators and mechanisms of abdominal pain and discomfort once the acute inflammation has cleared. Recent data suggest that anatomic changes to mast cells-nerve fibers are necessary, but not sufficient to induce symptoms. It is now possible to estimate the risk of developing PI-FGID based on the presence and relative severity of different risk factors, including prolonged duration of initial illness, toxicity of infecting bacterial strain, smoking, mucosal markers of inflammation, female sex, depression, hypochondriasis, and adverse life events in the preceding 3 months.", "Prevalence of potentially neuropathic Campylobacter jejuni strains on commercial broiler chicken products. Campylobacteriosis is the most common antecedent infection leading to the development of inflammatory neuropathies including Guillain Barr\u00e9 syndrome (GBS) and Miller Fisher syndrome (MFS), with alterations in surface proteins and genetic polymorphisms conferring increased risk. Poultry is the most common source of C. jejuni infection in industrialized countries, including the US. There are no data on the prevalence on consumer poultry products of various strains of C. jejuni, including those hypothesized to be associated with neuropathy. To study this, C. jejuni was isolated from fresh broiler chicken products purchased from grocery stores in the Baltimore area. LOS subtypes and specific genetic polymorphisms were determined by PCR and DNA sequencing. The observed relative proportions of LOS subtypes and genetic polymorphisms in the cstII gene (encoding bacterial sialyltransferases involved in LOS synthesis in C. jejuni) were characterized and compared to those reported in published studies of patients with GBS, MFS and uncomplicated enteritis. Commercial poultry products carry a relatively high prevalence of C. jejuni strains that have been associated with neuropathic sequelae. The relative proportions of LOS classes in poultry isolates were similar to those reported in isolates from human enteritis cases, and in some instances also similar to isolates from patients diagnosed with neuropathic disease. In terms of cstII polymorphisms, there were also similarities between isolates from poultry and those from patients with GBS and MFS. Copyright \u00a9 2010 Elsevier B.V. All rights reserved.", "Gastrointestinal infections and the development of irritable bowel syndrome. PURPOSE OF REVIEW: Approximately 10% of the millions of persons with functional gastrointestinal disorders (FGDs) including irritable bowel syndrome (IBS) had their illness onset following an acute bout of infectious diarrhea and are referred to as having postinfectious (PI) FGD or PI-IBS. Recent studies have helped to identify the pathogenesis and natural history of these disorders. RECENT FINDINGS: Groups of patients with acute diarrhea or dysentery (passage of grossly bloody stools) are being followed for development of PI-IBS. Persistent mucosal inflammation, air trapping in the gut, and alteration of intestinal motility contribute to the disease symptoms in genetically susceptible persons. The prognosis of postinfectious forms of IBS is more favorable compared with people with idiopathic forms of the disorder. SUMMARY: With full characterization of postdiarrhea forms of FGDs, we should be able to define the mechanisms of disease early in the course of chronic illness and to better understand the more common idiopathic forms of the disease. We are likely to identify specific alteration of gut pathophysiology in postinfectious FGDs and to then classify them not as a poorly characterized group of functional disorders but as specific gastrointestinal disorders.", "Guillain-barr\u00e9 syndrome: modern theories of etiology. Guillain-Barr\u00e9 syndrome (GBS) is a classic failure of the immune system with a life-threatening attack upon a critical self-component. The active phase of the disease is short, concordant with the latency of a primary adaptive immune response. Triggers for GBS include infection and (rarely) vaccination; cross-reactivity between infectious and neural epitopes has been well demonstrated, particularly for Campylobacter jejuni and motor axonal forms of GBS in which non-protein gangliosides are antigenic. Most people are probably exposed to a GBS trigger, but only rarely does the disease develop. We propose that GBS illustrates competing determinants of the immune system's decision about whether to mount a response, and that in unlucky affected individuals, co-presentation of cross-reactive antigens with danger signals activating pattern-recognition receptors overcomes normal self-recognition such that a primary response is initiated that attacks the nerve. Then, in most cases of GBS, the response rapidly turns off, and second attacks rarely occur. This suggests active restoration of tolerance, and specific privileged site attributes of nerve and declining danger signals as the trigger wanes may contribute to this restoration. Standard immunosuppression has not been effective in GBS. We suggest this is because immune tolerance is already being restored by the time such therapies are initiated. This in turn suggests that improvements in GBS outcomes are likely to come from better protection of the nerve cells under attack while normal resumption of tolerance is permitted to proceed rather than exploring more aggressive immunosuppressive approaches."], ["Heterocyclic amines: Mutagens/carcinogens produced during cooking of meat and fish. Research leading to the discovery of a series of mutagenic and carcinogenic heterocyclic amines (HCAs) was inspired by the idea that smoke produced during cooking of food, especially meat or fish, might be carcinogenic. More than ten kinds of HCAs, actually produced by cooking or heating of meat or fish, have now been isolated and their structures determined, most being previously unregistered compounds. They are highly mutagenic towards Salmonella typhimurium in the presence of S9 mix and are also mutagenic in vitro and in vivo toward mammalian cells. HCAs have now been chemically synthesized in quantity and subjected to long-term animal testing. When HCAs were fed in the diet, rodents developed cancers in many organs, including the colon, breast and prostate, and one HCA produced hepatomas in monkeys. The lesions exhibited alteration in genes including Apc, beta-catenin and Ha-ras, and these changes provide clues to the induction mechanisms. The HCAs are oxidized to hydroxyamino derivatives by cytochrome P450s, and further converted to ester forms by acetyltransferase and sulfotransferase. Eventually, they produce DNA adducts through the formation of N-C bonds at guanine bases. There are HCA-sensitive and resistant strains of rodents and a search for the responsible genes is now under way. While the content of HCAs in dishes consumed in ordinary life is low and not sufficient in itself to explain human cancer, the coexistence of many other mutagens/carcinogens of either autobiotic or xenobiotic type and the possibility that HCAs induce genomic instability and heightened sensitivity to tumor promoters suggest that avoidance of exposure to HCAs or reduction of HCAs' biological effects as far as possible are to be highly recommended. Usage of microwave ovens for cooking and supplementation of the diet, for example with soy-isoflavones, which have been found to suppress the occurrence of HCA-induced breast cancers, should be encouraged. Advice to the general public about how to reduce the carcinogenic load imposed by HCAs would be an important contribution to cancer prevention.", "Carcinogenicity and regulation of caramel colorings. 2- and 4-methylimidazoles are present as contaminants in caramel colorings manufactured with ammonia catalysts. Both contaminants have been shown to induce cancer in animals and may be present in caramel colorings in amounts that exceed federal guidelines. California requires warning notices on products that could lead to consumption of more than 30 micrograms per day. The US Food and Drug Administration should bar the use of excessively contaminated caramel coloring in food.", "Formation and biochemistry of carcinogenic heterocyclic aromatic amines in cooked meats. Heteroyclic aromatic amines (HAAs) are a class of hazardous chemicals that are receiving heightened attention as a risk factor for human cancer. HAAs arise during the cooking of meats, fish, and poultry, and several HAAs also occur in tobacco smoke condensate and diesel exhaust. Many HAAs are carcinogenic and induce tumors at multiple sites in rodents. A number of epidemiologic studies have reported that frequent consumption of well-done cooked meats containing HAAs can result in elevated risks for colon, prostate, and mammary cancers. Moreover, DNA adducts of HAAs have been detected in human tissues, demonstrating that HAAs induce genetic damage even though the concentrations of these compounds in cooked meats are generally in the low parts-per-billion (ppb) range. With recent improvements in sensitivity of mass spectrometry instrumentation, HAAs, their metabolites, and DNA adducts can be detected at trace amounts in biological fluids and tissues of humans. The incorporation of HAA biomarkers in epidemologic studies will help to clarify the role of these dietary genotoxicants in the etiology of human cancer.", "Human exposure to endocrine disrupters: carcinogenic risk assessment. Human exposure to endocrine disrupters (EDs) is widespread and is considered to pose a growing threat to human health. Recent advances in molecular and genetic research and better understanding of mechanisms of blastic cell transformation have led to efforts to improve cancer risk assessment for populations exposed to this family of xenobiotics. In risk assessment, low dose extrapolation of cancer incidence data from both experimental animals and epidemiology studies has been largely based on models assuming linear correlation at low doses, despite existence of evidence showing otherwise. Another weakness of ED risk assessment is poor exposure data in ecological studies. Those are frequently rough estimates derived from contaminated items of local food basket surveys. Polyhalogenated hydrocarbons are treated as examples. There is growing sense of urgency to develop a biologically based dose response model of cancer risk, integrating emerging data from molecular biology and epidemiology to provide more realistic data for risk assessors, public, public health managers and environmental issues administrators.", "Effects of vitamins C and E on N-nitroso compound formation, carcinogenesis, and cancer. The properties of N-nitroso compounds (NNC) and of vitamins C and E are briefly described. The author reviews the ability of vitamins C and E to inhibit NNC formation in chemical systems, in nitrite-preserved meat, in experimental animals and in humans. Dietary vitamins C and E both produced 30% to 60% inhibitions in most carcinogenesis experiments employing preformed carcinogens. Vitamin C reversed transformation in an in vitro system. Carcinogenicity tests of the vitamins are reviewed (vitamin C can promote bladder carcinogenesis). Intake of fresh fruits and vegetables (which contain vitamin C) is negatively correlated with cancer of the stomach, esophagus, larynx, mouth and cervix. For gastric and esophageal cancer, there is evidence that this association is due to an inhibition of in vivo NNC formation. Vitamin C is apparently not a useful treatment for cancer. The author supports the recommendation that fresh fruit and vegetable intake be increased to lower the risk of cancer."], ["Carrageenans and their use in meat products. Carrageenans are sulfated linear polysaccharides of D-galactose and 3,6-anhydro-D-galactose extracted from red seaweeds. They have been used by the food industry for their gelling, thickening, and stabilizing properties, and more recently by the meat industry for reduced fat products. Meat is a complex system of muscle tissue, connective tissue, fat, and water; during processing, numerous interactions occur among all these components. These interactions are responsible for the functional properties of the meat system. In meat products, carrageenans contribute to gel formation and water retention. Their addition is of special interest in low-fat meat products because fat reduction often leads to unacceptable, tough textures. When carrageenans are incorporated in these formulations, they improve the textural characteristics of the product by decreasing toughness and increasing juiciness. Although carrageenan interactions with milk proteins have been studied extensively, the mechanism by which carrageenans interact with meat proteins and the other meat components is not fully understood.", "Review of harmful gastrointestinal effects of carrageenan in animal experiments. In this article I review the association between exposure to carrageenan and the occurrence of colonic ulcerations and gastrointestinal neoplasms in animal models. Although the International Agency for Research on Cancer in 1982 identified sufficient evidence for the carcinogenicity of degraded carrageenan in animals to regard it as posing a carcinogenic risk to humans, carrageenan is still used widely as a thickener, stabilizer, and texturizer in a variety of processed foods prevalent in the Western diet. I reviewed experimental data pertaining to carrageenan's effects with particular attention to the occurrence of ulcerations and neoplasms in association with exposure to carrageenan. In addition, I reviewed from established sources mechanisms for production of degraded carrageenan from undegraded or native carrageenan and data with regard to carrageenan intake. Review of these data demonstrated that exposure to undegraded as well as to degraded carrageenan was associated with the occurrence of intestinal ulcerations and neoplasms. This association may be attributed to contamination of undegraded carrageenan by components of low molecular weight, spontaneous metabolism of undegraded carrageenan by acid hydrolysis under conditions of normal digestion, or the interactions with intestinal bacteria. Although in 1972, the U.S. Food and Drug Administration considered restricting dietary carrageenan to an average molecular weight > 100,000, this resolution did not prevail, and no subsequent regulation has restricted use. Because of the acknowledged carcinogenic properties of degraded carrageenan in animal models and the cancer-promoting effects of undegraded carrageenan in experimental models, the widespread use of carrageenan in the Western diet should be reconsidered.", "Carrageenan induces cell cycle arrest in human intestinal epithelial cells in vitro. Multiple studies in animal models have shown that the commonly used food additive carrageenan (CGN) induces inflammation and intestinal neoplasia. We performed the first studies to determine the effects of CGN exposure on human intestinal epithelial cells (IEC) in tissue culture and tested the effect of very low concentrations (1-10 mg/L) of undegraded, high-molecular weight CGN. These concentrations of CGN are less than the anticipated exposure of the human colon to CGN from the average Western diet. In the human colonic epithelial cell line NCM460 and in primary human colonic epithelial cells that were exposed to CGN for 1-8 d, we found increased cell death, reduced cell proliferation, and cell cycle arrest compared with unexposed control cells. After 6-8 d of CGN exposure, the percentage of cells reentering G0-G1 significantly decreased and the percentages of cells in S and G2-M phases significantly increased. Increases in activated p53, p21, and p15 followed CGN exposure, consistent with CGN-induced cell cycle arrest. Additional data, including DNA ladder, poly ADP ribose polymerase Western blot, nuclear DNA staining, and activities of caspases 3 and 7, indicated no evidence of increased apoptosis following CGN exposure and were consistent with CGN-induced necrotic cell death. These data document for the first time, to our knowledge, marked adverse effects of low concentrations of CGN on survival of normal human IEC and suggest that CGN exposure may have a role in development of human intestinal pathology.", "Ciguatera: recent advances but the risk remains. Ciguatera is an important form of human poisoning caused by the consumption of seafood. The disease is characterised by gastrointestinal, neurological and cardiovascular disturbances. In cases of severe toxicity, paralysis, coma and death may occur. There is no immunity, and the toxins are cumulative. Symptoms may persist for months or years, or recur periodically. The epidemiology of ciguatera is complex and of central importance to the management and future use of marine resources. Ciguatera is an important medical entity in tropical and subtropical Pacific and Indian Ocean regions, and in the tropical Caribbean. As reef fish are increasingly exported to other areas, it has become a world health problem. The disease is under-reported and often misdiagnosed. Lipid-soluble, polyether toxins known as ciguatoxins accumulated in the muscles of certain subtropical and tropical marine finfish cause ciguatera. Ciguatoxins arise from biotransformation in the fish of less polar ciguatoxins (gambiertoxins) produced by Gambierdiscus toxicus, a marine dinoflagellate that lives on macroalgae, usually attached to dead coral. The toxins and their metabolites are concentrated in the food chain when carnivorous fish prey on smaller herbivorous fish. Humans are exposed at the end of the food chain. More than 400 species of fish can be vectors of ciguatoxins, but generally only a relatively small number of species are regularly incriminated in ciguatera. Ciguateric fish look, taste and smell normal, and detection of toxins in fish remains a problem. More than 20 precursor gambiertoxins and ciguatoxins have been identified in G. toxicus and in herbivorous and carnivorous fish. The toxins become more polar as they undergo oxidative metabolism and pass up the food chain. The main Pacific ciguatoxin (P-CTX-1) causes ciguatera at levels=0.1 microg/kg in the flesh of carnivorous fish. The main Caribbean ciguatoxin (C-CTX-1) is less polar and 10-fold less toxic than P-CTX-1. Ciguatoxins activate sodium ion (Na ) channels, causing cell membrane excitability and instability. Worldwide coral bleaching is now well documented, and there is a strong association between global warming and the bleaching and death of coral. This, together with natural environmental factors such as earthquakes and hurricanes, and man-made factors such as tourism, dock construction, sewage and eutrophication, may create more favourable environments for G. toxicus. While low levels of G. toxicus are found throughout tropical and subtropical waters, the presence of bloom numbers is unpredictable and patchy. Only certain genetic strains produce ciguatoxins, and environmental triggers for increasing toxin production are unknown.", "TRP channel blamed for burning cold after a tropical fish meal EMBO J (2012) 31 19, 3795\u20133808 doi:10.1038/emboj.2012.207; published online July312012 Ciguatera is one of the most common forms of food poisoning, occurring after consumption of fish contaminated with ciguatoxins. New work by Vetter et al (2012) reveals the key molecular players that underlie the altered temperature sensation associated with ciguatera. In particular, they show that ciguatoxins act on sensory neurons that express TRPA1, an ion channel implicated in the detection of noxious cold."], ["Anti-proliferative activity and chemoprotective effects towards DNA oxidative damage of fresh and cooked Brassicaceae. Epidemiological evidence shows that regular consumption of Brassicaceae is associated with a reduced risk of cancer and heart disease. Cruciferous species are usually processed before eating and the real impact of cooking practices on their bioactive properties is not fully understood. We have evaluated the effect of common cooking practices (boiling, microwaving, and steaming) on the biological activities of broccoli, cauliflower and Brussels sprouts. Anti-proliferative and chemoprotective effects towards DNA oxidative damage of fresh and cooked vegetable extracts were evaluated by 3-(4,5-dimethylthiazol-2-yl)-5-(3-carboxymethoxyphenyl)-2-(4-sulfophenyl)-2H-tetrazolium and Comet assays on HT-29 human colon carcinoma cells. The fresh vegetable extracts showed the highest anti-proliferative and antioxidant activities on HT-29 cells (broccoli>cauliflower = Brussels sprouts). No genotoxic activity was detected in any of the samples tested. The cooking methods that were applied influenced the anti-proliferative activity of Brassica extracts but did not alter considerably the antioxidant activity presented by the raw vegetables. Raw, microwaved, boiled (except broccoli) and steamed vegetable extracts, at different concentrations, presented a protective antioxidative action comparable with vitamin C (1 mm). These data provide new insight into the influence of domestic treatment on the quality of food, which could support the recent epidemiological studies suggesting that consumption of cruciferous vegetables, mainly cooked, may be related to a reduced risk of developing cancer.", "Glucoraphanin and 4-hydroxyglucobrassicin contents in seeds of 59 cultivars of broccoli, raab, kohlrabi, radish, cauliflower, brussels sprouts, kal... The importance of dietary sulforaphane in helping maintain good health continues to gain support within the health-care community and awareness among U.S. consumers. In addition to the traditional avenue for obtaining sulforaphane, namely, the consumption of appropriate cruciferous vegetables, other consumer products containing added glucoraphanin, the natural precursor to sulforaphane, are now appearing in the United States. Crucifer seeds are a likely source for obtaining glucoraphanin, owing to a higher concentration of glucoraphanin and the relative ease of processing seeds as compared to vegetative parts. Seeds of several commonly consumed crucifers were analyzed not only for glucoraphanin but also for components that might have negative health implications, such as certain indole-containing glucosinolates and erucic acid-containing lipids. Glucoraphanin, 4-hydroxyglucobrassicin, other glucosinolates, and lipid erucic acid were quantified in seeds of 33 commercially available cultivars of broccoli, 4 cultivars each of kohlrabi, radish, cauliflower, Brussels sprouts, kale, and cabbage, and 2 cultivars of raab.", "Broccoli sprouts: An exceptionally rich source of inducers of enzymes that protect against\u2009chemical\u2009carcinogens Induction of phase 2 detoxication enzymes [e.g., glutathione transferases, epoxide hydrolase, NAD(P)H: quinone reductase, and glucuronosyltransferases] is a powerful strategy for achieving protection against carcinogenesis, mutagenesis, and other forms of toxicity of electrophiles and reactive forms of oxygen. Since consumption of large quantities of fruit and vegetables is associated with a striking reduction in the risk of developing a variety of malignancies, it is of interest that a number of edible plants contain substantial quantities of compounds that regulate mammalian enzymes of xenobiotic metabolism. Thus, edible plants belonging to the family Cruciferae and genus Brassica (e.g., broccoli and cauliflower) contain substantial quantities of isothiocyanates (mostly in the form of their glucosinolate precursors) some of which (e.g., sulforaphane or 4-methylsulfinylbutyl isothiocyanate) are very potent inducers of phase 2 enzymes. Unexpectedly, 3-day-old sprouts of cultivars of certain crucifers including broccoli and cauliflower contain 10\u2013100 times higher levels of glucoraphanin (the glucosinolate of sulforaphane) than do the corresponding mature plants. Glucosinolates and isothiocyanates can be efficiently extracted from plants, without hydrolysis of glucosinolates by myrosinase, by homogenization in a mixture of equal volumes of dimethyl sulfoxide, dimethylformamide, and acetonitrile at \u221250\u00b0C. Extracts of 3-day-old broccoli sprouts (containing either glucoraphanin or sulforaphane as the principal enzyme inducer) were highly effective in reducing the incidence, multiplicity, and rate of development of mammary tumors in dimethylbenz(a)anthracene-treated rats. Notably, sprouts of many broccoli cultivars contain negligible quantities of indole glucosinolates, which predominate in the mature vegetable and may give rise to degradation products (e.g., indole-3-carbinol) that can enhance tumorigenesis. Hence, small quantities of crucifer sprouts may protect against the risk of cancer as effectively as much larger quantities of mature vegetables of the same variety.", "Antimutagenic effect of broccoli flower head by the ames salmonella reverse mutation assay. A study was performed to investigate the antimutagenic effect of broccoli flower head by the Ames Salmonella reverse mutation assay. Broccoli flower head being the most highly edible part in the plant was analysed for its antimutagenic effect. Without isolating the phytomolecules, the crude ethanol extract of broccoli flower head was tested for suppressing the mutagenic effect induced by certain chemical mutagens. Three strains - TA 98, TA102 and TA 1535 were used in the study. The tester strains were challenged with their respective mutagens. These were challenged with the ethanol extract of broccoli flower head at concentrations of 23 and 46 mg/plate. The plates were incubated for 72 h and the revertant colonies were counted. The crude extract did not prove to be promutagenic. The ethanol extract of the broccoli flower head at 46 mg/plate suppressed the mutagenic effect induced by the corresponding positive mutagens on all the three tester strains used in this study. The crude extract of broccoli flower head alone was not cytotoxic even at the maximum concentration tested (46 mg/plate). In conclusion, the ethanol extract of broccoli at 46 mg/plate suggests their diverse antimutagenic potential against the mutagenic chemicals employed in this study. (c) 2007 John Wiley & Sons, Ltd.", "Antiproliferative effects of fresh and thermal processed green and red cultivars of curly kale (Brassica oleracea L. convar. acephala var. sabellica). Brassica vegetables contain a diverse range of phytochemicals with biological properties such as antioxidant and anticancer activity. However, knowledge about how biological activities are affected by processing is lacking. A green cultivar and a red cultivar of curly kale were evaluated for water/methanol-soluble phytochemicals before and after processing involving blanching, freeze storage, and boil-in-bag heat treatment. In both kale cultivars, processing resulted in a significant decrease of total phenolics, antioxidant capacity, and content and distribution of flavonols, anthocyanins, hydroxycinnamic acids, glucosinolates, and vitamin C. Interestingly, the red curly kale cultivar had a higher capacity to withstand thermal loss of phytochemicals. The extracts of both green and red curly kale inhibited the cell proliferation of three human colon cancer cell lines (Caco-2, HT-29, and HCT 116). However, extracts from fresh plant material had a significantly stronger antiproliferative effect than extracts from processed plant material."], ["Vitamin D and sterol composition of 10 types of mushrooms from retail suppliers in the United States. Vitamin D(2) (ergocalciferol) and sterols were analyzed in mushrooms sampled nationwide in the United States to update the USDA Nutrient Database for Standard Reference. Vitamin D(2) was assayed using HPLC with [(3)H]-vitamin D(3) internal standard and sterols by GC-FID mass spectrometric (MS) confirmation. Vitamin D(2) was low (0.1-0.3 \u03bcg/100 g) in Agaricus bisporus (white button, crimini, portabella) and enoki, moderate in shiitake and oyster (0.4-0.7 \u03bcg/100 g), and high in morel, chanterelle, maitake (5.2-28.1 \u03bcg/100 g) and UV-treated portabella (3.4-20.9 \u03bcg/100 g), with significant variability among composites for some types. Ergosterol (mg/100 g) was highest in maitake and shiitake (79.2, 84.9) and lowest in morel and enoki (26.3, 35.5); the range was <10 mg/100 g among white button composites but 12-50 mg/100 g among samples of other types. All mushrooms contained ergosta-5,7-dienol (22,23-dihydroergosterol) (3.53-18.0 mg/100 g) and (except morel) ergosta-7-enol. Only morel contained brassicasterol (28.6 mg/100 g) and campesterol (1.23-4.54 mg/100 g) and no ergosta-7,22-dienol. MS was critical in distinguishing campesterol from ergosta-7,22-dienol.", "The immunobiology of mushrooms. There has been enormous interest in the biologic activity of mushrooms and innumerable claims have been made that mushrooms have beneficial effects on immune function with subsequent implications for inhibition of tumor growth. The majority of these observations are anecdotal and often lack standardization. However, there remains considerable data on both in vitro and in vivo effects that reflect on the potential of mushroom compounds to influence human immunity. A number of these effects are beneficial but, unfortunately, many responses are still characterized based on phenomenology and there is more speculation than substance. With respect to tumor biology, although many neoplastic lesions are immunogenic, tumor antigens frequently are self antigens and induce tolerance and many patients with cancer exhibit suppressed immune responses, including defective antigen presentation. Therefore, if and when mushroom extracts are effective, they more likely function as a result of improved antigen presentation by dendritic cells than by a direct cytopathic effect. In this review we attempt to place these data in perspective, with a particular focus on dendritic cell populations and the ability of mushroom extracts to modulate immunity. There is, at present, no scientific basis for the use of either mushrooms or mushroom extracts in the treatment of human patients but there is significant potential for rigorous research to understand the potential of mushrooms in human disease and thence to focus on appropriate clinical trials to demonstrate effectiveness and/ or potential toxicity.", "Mushrooms, tumors, and immunity: an update. There is significant interest in the use of mushrooms and/or mushroom extracts as dietary supplements based on theories that they enhance immune function and promote health. To some extent, select mushrooms have been shown to have stimulatory action on immune responsiveness, particularly when studied in vitro. However, despite their widespread use for potential health benefits, there is a surprising paucity of epidemiologic and experimental studies that address the biologic activities of mushrooms after oral administration to animals or humans. There have been a number of studies that have addressed the ability of mushrooms to modulate mononuclear cell activation and the phenotypic expression of cytokines and their cognate receptors. There have also been a number of attempts to determine antitumor activities of mushrooms. Such studies are important because many of the components of mushrooms do potentially have significant biologic activity. All data, however, should be tempered by the possibility that there are toxic levels of metals, including arsenic, lead, cadmium, and mercury as well as the presence of radioactive contamination with 137Cs. In this review, we will present the comparative biology with respect to both immunological and antitumor activities of mushroom extracts and also highlight the need for further evidence-based research.", "Chemical composition and nutritional value of the most widely appreciated cultivated mushrooms: an inter-species comparative study. Herein, it was reported and compared the chemical composition and nutritional value of the most consumed species as fresh cultivated mushrooms: Agaricus bisporus (white and brown mushrooms), Pleurotus ostreatus (oyster mushroom), Pleurotus eryngii (King oyster mushroom), Lentinula edodes (Shiitake) and Flammulina velutipes (Golden needle mushroom). Shiitake revealed the highest levels of macronutrients, unless proteins, as also the highest sugars, tocopherols and PUFA levels, and the lowest SFA content. White and brown mushrooms showed similar macronutrients composition, as also similar values of total sugars, MUFA, PUFA and total tocopherols. Oyster and king oyster mushrooms gave the highest MUFA contents with similar contents in PUFA, MUFA and SFA in both samples. They also revealed similar moisture, ash, carbohydrates and energy values. This study contributes to the elaboration of nutritional databases of the most consumed fungi species worldwide, allowing comparison between them. Moreover it was reported that cultivated and the wild samples of the same species have different chemical composition, including sugars, fatty acids and tocopherols profiles. Copyright \u00a9 2011 Elsevier Ltd. All rights reserved.", "The Science of Salsa: Antimicrobial Properties of Salsa Components to Learn Scientific Methodology Most ethnic foods and cooking practices have incorporated the use of spices and other food additives. Many common spices have crossed cultural boundaries and appear in multiple ethnic cuisines. Recent studies have demonstrated that many of these ingredients possess antimicrobial properties against common food spoilage microorganisms. We developed a laboratory exercise that promotes the use of scientific methodology to evaluate the effectiveness of salsa components at inhibiting the growth of undesirable microorganisms. Tomato, onion, garlic, cilantro, and jalape\u00f1o were tested for antimicrobial properties against a representative fungus, Saccharomyces cerevisiae, and the common food spoilage bacteria Staphylococcus aureus, Bacillus cereus, and Escherichia coli. Each component was ethanol extracted and a modification of the Kirby-Bauer method of antimicrobial sensitivity was employed. Garlic demonstrated the greatest inhibitory effects against all organisms tested. Onion demonstrated a slight inhibition of all four organisms, while cilantro showed some inhibition of all three bacteria but no effect against the fungus. Jalape\u00f1o may have slightly inhibited E. coli and S. aureus, as evidenced by a consistently measured increase in the zone of inhibition that was not statistically significant when compared to that of the control. Following the initial exercise, students were given the opportunity to repeat the exercise using other spices such as cinnamon, clove, nutmeg, and coriander. Student learning outcomes were evaluated using preliminary and secondary surveys, mainly focusing on definitions of science and hypothesis as well as the process of science. Students enjoyed this exercise and met the learning goals of understanding the process and methodology of science, as well as the interdisciplinarity inherent in the sciences. Student learning was evidenced by an increase in the number of correct responses on the secondary survey in comparison to the preliminary."], ["An unexpected mortality increase in the United States follows arrival of the radioactive plume from Fukushima: is there a correlation? The multiple nuclear meltdowns at the Fukushima plants beginning on March 11, 2011, are releasing large amounts of airborne radioactivity that has spread throughout Japan and to other nations; thus, studies of contamination and health hazards are merited. In the United States, Fukushima fallout arrived just six days after the earthquake, tsunami, and meltdowns. Some samples of radioactivity in precipitation, air, water, and milk, taken by the U.S. government, showed levels hundreds of times above normal; however, the small number of samples prohibits any credible analysis of temporal trends and spatial comparisons. U.S. health officials report weekly deaths by age in 122 cities, about 25 to 35 percent of the national total. Deaths rose 4.46 percent from 2010 to 2011 in the 14 weeks after the arrival of Japanese fallout, compared with a 2.34 percent increase in the prior 14 weeks. The number of infant deaths after Fukushima rose 1.80 percent, compared with a previous 8.37 percent decrease. Projecting these figures for the entire United States yields 13,983 total deaths and 822 infant deaths in excess of the expected. These preliminary data need to be followed up, especially in the light of similar preliminary U.S. mortality findings for the four months after Chernobyl fallout arrived in 1986, which approximated final figures.", "Death by polonium-210: lessons learned from the murder of former Soviet spy Alexander Litvinenko. The medical response to radiation--whether the result of radiological warfare, terrorist deployment of improvised radiation dispersal weapons, political assassination, occupational or industrial accidents or the medically radiated patient remains one of the least taught among all disciplines within medical education. In the aftermath of 9/11 among medical vulnerabilities to toxicant threats, of all the categories of weapons of mass destruction (WMD)--whether using the CBRNE (chemical, biological, radiological, nuclear, explosive) or NBC (nuclear, biological, chemical) acronym--radiation is the least taught in professional schools, responder cultures or civil preparedness organizations. To date, few health care professionals (HCP) possess the fundamental knowledge or skills to identify and diagnose, let alone treat a radiation victim; this vulnerability made even more obvious in the aftermath of the high profile assassination of former Russian agent Alexander Litvinenko. He was poisoned with Polonium210. Radioactive substances are ubiquitous with radiation sources being in or transported through virtually every region nationwide. It is essential to increase preparedness among community and rural health care facilities as well as urban and university hospitals. Managing radiation injuries effectively requires access to specialized equipment and expertise. Radiation sickness is progressive and may require acute, critical and long-term care throughout the course of illness. Regardless of the source, preparedness rests upon acknowledging a threat exists and dedicating the resources to address the risks including the enhancement of training and equipment. Mass or individual exposures to radiation present unique challenges to the entire response continuum from law enforcement, first responders and emergency medical care. Increased education about and practice in responding to radiological threats is essential to enhance preparedness.", "Evaluation of chromosomal aberrations, micronuclei, and sister chromatid exchanges in hospital workers chronically exposed to ionizing radiation. Cytogenetic analysis was performed in peripheral blood lymphocytes from hospital workers chronically exposed to ionizing radiation in comparison to matched non-exposed individuals. The accumulated absorbed doses calculated for the radiation workers ranged from 9.5 to 209.4 mSv. The endpoints used were chromosomal aberrations (CA), micronuclei (MN), and sister chromatid exchanges (SCE). The frequencies of CA/100 cells observed for the exposed group were significantly (P=0.018) higher than in the control group: 3.2 and 2.6, respectively. Similarly, the mean numbers of SCE per cell were statistically higher (P=0.025) in the exposed group (6.2) in comparison with the control group (5.8). In the case of micronuclei analysis, no significant (P=0,06) difference between both groups was found, but these data should be cautiously interpreted since an increase in the frequencies of MN was found for radiation workers (3.0 MN/100 cells), compared to the control group (2.6 MN/100 cells) and this increase occur in parallel to CA and SCE frequencies. The difference between the results could be explained by the nature of CA and MN generation. The increased frequencies of CA and SCE in radiation workers indicate the cumulative effect of low-level chronic exposure to ionizing radiation, and the relevance of conducting cytogenetic analysis in parallel to physical dosimetry in the working place. Copyright 2001 Wiley-Liss, Inc.", "Wet deposition of fission-product isotopes to North America from the Fukushima Dai-ichi incident, March 2011. Using the infrastructure of the National Atmospheric Deposition Program (NADP), numerous measurements of radionuclide wet deposition over North America were made for 167 NADP sites before and after the Fukushima Dai-ichi Nuclear Power Station incident of March 12, 2011. For the period from March 8 through April 5, 2011, wet-only precipitation samples were collected by NADP and analyzed for fission-product isotopes within whole-water and filterable solid samples by the United States Geological Survey using gamma spectrometry. Variable amounts of (131)I, (134)Cs, or (137)Cs were measured at approximately 21% of sampled NADP sites distributed widely across the contiguous United States and Alaska. Calculated 1- to 2-week individual radionuclide deposition fluxes ranged from 0.47 to 5100 Becquerels per square meter during the sampling period. Wet deposition activity was small compared to measured activity already present in U.S. soil. NADP networks responded to this complex disaster, and provided scientifically valid measurements that are comparable and complementary to other networks in North America and Europe.", "Radioactive fallout in the United States due to the Fukushima nuclear plant accident. The release of radioactivity into the atmosphere from the damaged Fukushima Daiichi nuclear power plant started on March 12th, 2011. Among the various radionuclides released, iodine -131 ((131)I) and cesium isotopes ((137)Cs and (134)Cs) were transported across the Pacific Ocean and reached the United States on 17-18 March 2011. Consequently, an elevated level of fission products (131)I, (132)I, (132)Te, (134)Cs and (137)Cs were detected in air, water, and milk samples collected across the United States between March 17 and April 4, 2011. The continuous monitoring of activities over a period of 25 days and spatial variations across more than 100 sampling locations in the United States made it possible to characterize the contaminated air masses. For the entire period, the highest detected activity values ranged from less than 1 m Bq m(-3) to 31 m Bq m(-3) for the particulate (131)I, and up to 96 m Bq m(-3) for the gaseous (131)I fraction."], ["Nutritional quality and health benefits of chickpea (Cicer arietinum L.): a review. Chickpea (Cicer arietinum L.) is an important pulse crop grown and consumed all over the world, especially in the Afro-Asian countries. It is a good source of carbohydrates and protein, and protein quality is considered to be better than other pulses. Chickpea has significant amounts of all the essential amino acids except sulphur-containing amino acids, which can be complemented by adding cereals to the daily diet. Starch is the major storage carbohydrate followed by dietary fibre, oligosaccharides and simple sugars such as glucose and sucrose. Although lipids are present in low amounts, chickpea is rich in nutritionally important unsaturated fatty acids such as linoleic and oleic acids. \u03b2-Sitosterol, campesterol and stigmasterol are important sterols present in chickpea oil. Ca, Mg, P and, especially, K are also present in chickpea seeds. Chickpea is a good source of important vitamins such as riboflavin, niacin, thiamin, folate and the vitamin A precursor \u03b2-carotene. As with other pulses, chickpea seeds also contain anti-nutritional factors which can be reduced or eliminated by different cooking techniques. Chickpea has several potential health benefits, and, in combination with other pulses and cereals, it could have beneficial effects on some of the important human diseases such as CVD, type 2 diabetes, digestive diseases and some cancers. Overall, chickpea is an important pulse crop with a diverse array of potential nutritional and health benefits.", "Nutritional quality of legumes, and their role in cardiometabolic risk prevention: a review. Legumes (including alfalfa, clover, lupins, green beans and peas, peanuts, soybeans, dry beans, broad beans, dry peas, chickpeas, and lentils) represent an important component of the human diet in several areas of the world, especially in the developing countries, where they complement the lack of proteins from cereals, roots, and tubers. In some regions of the world, legume seeds are the only protein supply in the diet. The health benefits of legume consumption have received rising interest from researchers, and their consumption and production extends worldwide. Among European countries, higher legume consumption is observed around the Mediterranean, with per capita daily consumption between 8 and 23 g, while in Northern Europe, the daily consumption is less than 5 g per capita. The physiological effects of different legumes vary significantly. These differences may result from the polysaccharides composition, in particular, the quantity and variety of dietary fibers and starch, protein make-up, and variability in phytochemical content. The majority of legumes contain phytochemicals: bioactive compounds, including enzyme inhibitors, phytohemagglutinins (lectins), phytoestrogens, oligosaccharides, saponins, and phenolic compounds, which play metabolic roles in humans who frequently consume these foods. Dietary intake of phytochemicals may provide health benefits, protecting against numerous diseases or disorders, such as coronary heart disease, diabetes, high blood pressure and inflammation. The synergistic or antagonistic effects of these phytochemical mixtures from food legumes, their interaction with other components of the diet, and the mechanism of their action have remained a challenge with regard to understanding the role of phytochemicals in health and diseases. Their mitigating effects and the mechanism of their action need to be further addressed if we are to understand the role of phytochemicals in health and diseases. This review provides an overview of the nutritional quality of legumes and their potential contribution in cardiometabolic risk prevention.", "Beans and diabetes: Phaseolus vulgaris preparations as antihyperglycemic agents. Bean pods (Phaseolus vulgaris) are among the most widely used traditional remedies against diabetes mellitus. Historical knowledge is summarized and compared to recent study results. Reports dating from the first half of the 20(th) century as well as recent publications show contradictory results. It seems that Phaseolus preparations should not be considered the first choice in phytopharmaceutical treatment of diabetes or lead structure research. To be effective, fairly high doses of aqueous extracts need to be given. Because of their fiber content and an alpha-amylase inhibitory effect, beans might be more useful as food components in preventing or ameliorating type 2 diabetes.", "Phaseolus beans: impact on glycaemic response and chronic disease risk in human subjects. Consumption of Phaseolus vulgaris bean species such as pinto, black, navy or kidney may be beneficial in the prevention and treatment of chronic diseases. In particular, conditions that are promoted by increased glycaemic stress (hyperglycaemia and hyperinsulinaemia) including diabetes, CVD and cancer seem to be reduced in individuals who eat more of these beans. The present paper discusses the influence of P. vulgaris species on glycaemic response and the impact that relationship may have on the risk of developing diabetes, CVD and cancer.", "In vitro investigations of the potential health benefits of Australian-grown faba beans (Vicia faba L.): chemopreventative capacity and inhibitory ... The functional properties, including antioxidant and chemopreventative capacities as well as the inhibitory effects on angiotensin-converting enzyme (ACE), \u03b1-glucosidase and pancreatic lipase, of three Australian-grown faba bean genotypes (Nura, Rossa and TF(Ic*As)*483/13) were investigated using an array of in vitro assays. Chromatograms of on-line post column derivatisation assay coupled with HPLC revealed the existence of active phenolics (hump) in the coloured genotypes, which was lacking in the white-coloured breeding line, TF(Ic*As)*483/13. Roasting reduced the phenolic content, and diminished antioxidant activity by 10-40 % as measured by the reagent-based assays (diphenylpicrylhydrazyl, 2,2'-azino-bis(3-ethylbenzthiazoline-6-sulphonic acid) and oxygen radical absorbance capacity) in all genotypes. Cell culture-based antioxidant activity assay (cellular antioxidant activity) showed an increase of activity in the coloured genotypes after roasting. Faba bean extracts demonstrated cellular protection ability against H\u2082O\u2082-induced DNA damage (assessed using RAW264.7 cells), and inhibited the proliferation of all human cancer cell lines (BL13, AGS, Hep G2 and HT-29) evaluated. However, the effect of faba bean extracts on the non-transformed human cells (CCD-18Co) was negligible. Flow cytometric analyses showed that faba bean extracts successfully induced apoptosis of HL-60 (acute promyelocytic leukaemia) cells. The faba bean extracts also exhibited ACE, \u03b1-glucosidase and pancreatic lipase inhibitory activities. Overall, extracts from Nura (buff-coloured) and Rossa (red-coloured) were comparable, while TF(Ic*As)*483/13 (white-coloured) contained the lowest phenolic content and exhibited the least antioxidant and enzyme inhibition activities. These results are important to promote the utilisation of faba beans in human diets for various health benefits."], ["Effects of chlorophyll and chlorophyllin on low-dose aflatoxin B(1) pharmacokinetics in human volunteers. Chlorophyll (Chla) and chlorophyllin (CHL) were shown previously to reduce carcinogen bioavailability, biomarker damage, and tumorigenicity in trout and rats. These findings were partially extended to humans, where CHL reduced excretion of aflatoxin B(1) (AFB(1))-DNA repair products in Chinese unavoidably exposed to dietary AFB(1). However, neither AFB(1) pharmacokinetics nor Chla effects were examined. We conducted an unblinded crossover study to establish AFB(1) pharmacokinetic parameters among four human volunteers, and to explore possible effects of CHL or Chla cotreatment in three of those volunteers. For protocol 1, fasted subjects received an Institutional Review Board-approved dose of 14C-AFB(1) (30 ng, 5 nCi) by capsule with 100 mL water, followed by normal eating and drinking after 2 hours. Blood and cumulative urine samples were collected over 72 hours, and 14C- AFB(1) equivalents were determined by accelerator mass spectrometry. Protocols 2 and 3 were similar except capsules also contained 150 mg of purified Chla or CHL, respectively. Protocols were repeated thrice for each volunteer. The study revealed rapid human AFB(1) uptake (plasma k(a), 5.05 + or - 1.10 h(-1); T(max), 1.0 hour) and urinary elimination (95% complete by 24 hours) kinetics. Chla and CHL treatment each significantly impeded AFB(1) absorption and reduced Cmax and AUCs (plasma and urine) in one or more subjects. These initial results provide AFB(1) pharmacokinetic parameters previously unavailable for humans, and suggest that Chla or CHL co-consumption may limit the bioavailability of ingested aflatoxin in humans, as they do in animal models.", "Natural compounds in the human diet and their ability to bind mutagens prevents DNA-mutagen intercalation. Human diet may contain many mutagenic or carcinogenic aromatic compounds as well as some beneficial physiologically active dietary components, especially plant food phytochemicals, which act as mutagenesis or carcinogenesis inhibitors. This study compared the binding properties of natural compounds in the human diet (caffeine, theophylline, theobromine, and resveratrol) with a water-soluble derivative of chlorophyll to bind to acridine orange, a known mutagen. An analysis was conducted to determine which substances were effective binding agents and may thus be useful in prevention of chemical-induced mutagenesis and carcinogenesis. Data indicated that in order to bind 50% of the mutagen in a complex, less than twice the concentration of chlorophyllin was needed, the resveratrol concentration was 20-fold higher, while a 1000-fold or even 10,000-fold excess of xanthines were required to bind acridine orange.", "gamma-Irradiation dose: effects on baby-leaf spinach ascorbic acid, carotenoids, folate, alpha-tocopherol, and phylloquinone concentrations. Ionizing radiation of fruits and vegetables, in the form of gamma rays or electron beams, is effective in overcoming quarantine barriers in trade and prolonging shelf life, but a void of information persists on ionizing radiation effects of vitamin profiles in individual foods. Baby-leaf spinach from commercial cultivars, flat-leafed 'Lazio' and crinkled-leaf 'Samish', was grown, harvested, and surface sanitized according to industry practices. Baby-leaf spinach of each cultivar was packaged under air or N(2) atmosphere, representing industry practices, then exposed to cesium-137 gamma-radiation at 0.0, 0.5, 1.0, 1.5, or 2.0 kGy. Following irradiation, leaf tissues were assayed for vitamin (C, E, K, B(9)) and carotenoid (lutein/zeaxanthin, neoxanthin, violoxanthin, and beta-carotene) concentrations. Atmospheres by irradiation had little consistent effect, but N(2) versus air was associated with elevated dihydroascorbic acid levels. Four phytonutrients (vitamins B(9), E, and K and neoxanthin) exhibited little or no change in concentration with increasing doses of irradiation. However, total ascorbic acid (vitamin C), free ascorbic acid, lutein/zeaxanthin, violaxanthin, and beta-carotene all were significantly reduced at 2.0 kGy and, depending on cultivar, were affected at lesser doses of 0.5 and 1.5 kGy. Dihydroascorbic acid, the most affected compound and an indicator of stress, likely due to irradiation-generated oxidative radicals, increased with increasing irradiation doses >0.5 kGy.", "Bioavailability of natural carotenoids in human skin compared to blood. Skin functions and structure are significantly influenced by nutrients. Antioxidants protect the supportive layer of the skin against any damaging irradiation effects and the action of free radicals. A lack of suitable methods means that the pharmacokinetic properties of systemically applied carotenoids transferred into the skin remain poorly understood. In this study, a natural kale extract or placebo oil were given orally to 22 healthy volunteers for 4 weeks. Carotenoid bioaccessibility was evaluated using non-invasive resonance Raman spectroscopy on the palm and forehead skin. For the analysis of the blood serum, the standard HPLC method was used. The blood and skin levels of the carotenoids increased significantly during the study but compared to the blood serum values, increases in skin were delayed and depended on the dermal area as well as on the carotenoid. Lycopene, measured as being low in the extract, increases more in the skin compared to the blood indicating that the natural mixture of the extract stabilizes the antioxidative network in the skin. After supplementation had ended, the carotenoids decreased much faster in the blood than in the skin. The delayed decrease in the skin may indicate a peripheral buffer function of the skin for carotenoids. Copyright \u00a9 2010 Elsevier B.V. All rights reserved.", "The influence of dietary lutein and zeaxanthin on visual performance. The idea that normal constituents of the diet can influence visual function is not new. As early as 1782, Buzzi identified the yellow of the macula and Schulze (1866) specifically postulated that the yellow pigments led to improvements in human vision. These pigments were later found to be derived from dietary lutein and zeaxanthin that are known to be oxygenated carotenoids (xanthophylls). Walls and Judd (1933) postulated that these yellow intraocular pigments could improve visual performance by absorbing light scattered both within (for example, glare) and outside of the eye (increasing visual range by absorbing blue light scattered in the atmosphere), and by improving spatial vision through enhancing contrast and reducing chromatic blur. In this article, evidence for these ideas is reviewed with particular emphasis towards more recent data on glare effects."], ["Cinnamon and health. Cinnamon has been used as a spice and as traditional herbal medicine for centuries. The available in vitro and animal in vivo evidence suggests that cinnamon has anti-inflammatory, antimicrobial, antioxidant, antitumor, cardiovascular, cholesterol-lowering, and immunomodulatory effects. In vitro studies have demonstrated that cinnamon may act as an insulin mimetic, to potentiate insulin activity or to stimulate cellular glucose metabolism. Furthermore, animal studies have demonstrated strong hypoglycemic properties. However, there are only very few well-controlled clinical studies, a fact that limits the conclusions that can be made about the potential health benefits of cinnamon for free-living humans. The use of cinnamon as an adjunct to the treatment of type 2 diabetes mellitus is the most promising area, but further research is needed before definitive recommendations can be made.", "Cinnamon intake lowers fasting blood glucose: meta-analysis. Cinnamon, the dry bark and twig of Cinnamomum spp., is a rich botanical source of polyphenolics that has been used for centuries in Chinese medicine and has been shown to affect blood glucose and insulin signaling. Cinnamon's effects on blood glucose have been the subject of many clinical and animal studies; however, the issue of cinnamon intake's effect on fasting blood glucose (FBG) in people with type 2 diabetes and/or prediabetes still remains unclear. A meta-analysis of clinical studies of the effect of cinnamon intake on people with type 2 diabetes and/or prediabetes that included three new clinical trials along with five trials used in previous meta-analyses was done to assess cinnamon's effectiveness in lowering FBG. The eight clinical studies were identified using a literature search (Pub Med and Biosis through May 2010) of randomized, placebo-controlled trials reporting data on cinnamon and/or cinnamon extract and FBG. Comprehensive Meta-Analysis (Biostat Inc., Englewood, NJ, USA) was performed on the identified data for both cinnamon and cinnamon extract intake using a random-effects model that determined the standardized mean difference ([i.e., Change 1(control) - Change 2(cinnamon)] divided by the pooled SD of the post scores). Cinnamon intake, either as whole cinnamon or as cinnamon extract, results in a statistically significant lowering in FBG (-0.49\u00b10.2 mmol/L; n=8, P=.025) and intake of cinnamon extract only also lowered FBG (-0.48 mmol/L\u00b10.17; n=5, P=.008). Thus cinnamon extract and/or cinnamon improves FBG in people with type 2 diabetes or prediabetes.", "Cinnamon intake lowers fasting blood glucose: meta-analysis. Cinnamon, the dry bark and twig of Cinnamomum spp., is a rich botanical source of polyphenolics that has been used for centuries in Chinese medicine and has been shown to affect blood glucose and insulin signaling. Cinnamon's effects on blood glucose have been the subject of many clinical and animal studies; however, the issue of cinnamon intake's effect on fasting blood glucose (FBG) in people with type 2 diabetes and/or prediabetes still remains unclear. A meta-analysis of clinical studies of the effect of cinnamon intake on people with type 2 diabetes and/or prediabetes that included three new clinical trials along with five trials used in previous meta-analyses was done to assess cinnamon's effectiveness in lowering FBG. The eight clinical studies were identified using a literature search (Pub Med and Biosis through May 2010) of randomized, placebo-controlled trials reporting data on cinnamon and/or cinnamon extract and FBG. Comprehensive Meta-Analysis (Biostat Inc., Englewood, NJ, USA) was performed on the identified data for both cinnamon and cinnamon extract intake using a random-effects model that determined the standardized mean difference ([i.e., Change 1(control) - Change 2(cinnamon)] divided by the pooled SD of the post scores). Cinnamon intake, either as whole cinnamon or as cinnamon extract, results in a statistically significant lowering in FBG (-0.49\u00b10.2 mmol/L; n=8, P=.025) and intake of cinnamon extract only also lowered FBG (-0.48 mmol/L\u00b10.17; n=5, P=.008). Thus cinnamon extract and/or cinnamon improves FBG in people with type 2 diabetes or prediabetes.", "Effects of short-term cinnamon ingestion on in vivo glucose tolerance. AIMS: Various spices display insulin-potentiating activity in vitro, and in particular, cinnamon spice and its phenolic extracts have been shown to exhibit these capabilities. In vivo study shows that cinnamon may have beneficial effects on glucose homeostasis; therefore the aim of this study was to further investigate this phenomenon in humans. METHODS: Seven lean healthy male volunteers, aged 26 +/- 1 years, body mass index 24.5 +/- 0.3 kg/m(2) (mean +/- s.e.m.), underwent three oral glucose tolerance tests (OGTT) supplemented with either a 5 g placebo (OGTT(control)), 5 g of cinnamon (OGTT(cin)), or 5 g of cinnamon taken 12 h before (OGTT(cin12hpre)) in a randomized-crossover design. RESULTS: Cinnamon ingestion reduced total plasma glucose responses (AUC) to oral glucose ingestion [-13% and -10% for OGTT(cin) (p < 0.05) and OGTT(cin12hpre) (p < 0.05), respectively], as well as improving insulin sensitivity as assessed by insulin sensitivity index measures based on Matsuda's model in both OGTT(cin) (p < 0.05) and OGTT(cin12hpre) (p < 0.05) trials compared with OGTT(control). CONCLUSIONS: These data illustrate that cinnamon spice supplementation may be important to in vivo glycaemic control and insulin sensitivity in humans, and not only are its effects immediate, they also appear to be sustained for 12 h.", "Changes in glucose tolerance and insulin sensitivity following 2 weeks of daily cinnamon ingestion in healthy humans. Cinnamon can improve fasting glucose in humans yet data on insulin sensitivity are limited and controversial. Eight male volunteers (aged 25 +/- 1 years, body mass 76.5 +/- 3.0 kg, BMI 24.0 +/- 0.7 kg m(-2); mean +/- SEM) underwent two 14-day interventions involving cinnamon or placebo supplementation (3 g day(-1)). Placebo supplementation was continued for 5 days following this 14 day period. Oral glucose tolerance tests (OGTT) were performed on days 0, 1, 14, 16, 18, and 20. Cinnamon ingestion reduced the glucose response to OGTT on day 1 (-13.1 +/- 6.3% vs. day 0; P < 0.05) and day 14 (-5.5 +/- 8.1% vs. day 0; P = 0.09). Cinnamon ingestion also reduced insulin responses to OGTT on day 14 (-27.1 +/- 6.2% vs. day 0; P < 0.05), as well as improving insulin sensitivity on day 14 (vs. day 0; P < 0.05). These effects were lost following cessation of cinnamon feeding. Cinnamon may improve glycaemic control and insulin sensitivity, but the effects are quickly reversed."], ["Food and drug reward: overlapping circuits in human obesity and addiction. Both drug addiction and obesity can be defined as disorders in which the saliency value of one type of reward (drugs and food, respectively) becomes abnormally enhanced relative to, and at the expense of others. This model is consistent with the fact that both drugs and food have powerful reinforcing effects-partly mediated by dopamine increases in the limbic system-that, under certain circumstances or in vulnerable individuals, could overwhelm the brain's homeostatic control mechanisms. Such parallels have generated significant interest in understanding the shared vulnerabilities and trajectories between addiction and obesity. Now, brain imaging discoveries have started to uncover common features between these two conditions and to delineate some of the overlapping brain circuits whose dysfunctions may explain stereotypic and related behavioral deficits in human subjects. These results suggest that both obese and drug-addicted individuals suffer from impairments in dopaminergic pathways that regulate neuronal systems associated not only with reward sensitivity and incentive motivation, but also with conditioning (memory/learning), impulse control (behavioural inhibition), stress reactivity, and interoceptive awareness. Here, we integrate findings predominantly derived from positron emission tomography that shed light on the role of dopamine in drug addiction and in obesity, and propose an updated working model to help identify treatment strategies that may benefit both of these conditions.", "Obesity and addiction: neurobiological overlaps. Drug addiction and obesity appear to share several properties. Both can be defined as disorders in which the saliency of a specific type of reward (food or drug) becomes exaggerated relative to, and at the expense of others rewards. Both drugs and food have powerful reinforcing effects, which are in part mediated by abrupt dopamine increases in the brain reward centres. The abrupt dopamine increases, in vulnerable individuals, can override the brain's homeostatic control mechanisms. These parallels have generated interest in understanding the shared vulnerabilities between addiction and obesity. Predictably, they also engendered a heated debate. Specifically, brain imaging studies are beginning to uncover common features between these two conditions and delineate some of the overlapping brain circuits whose dysfunctions may underlie the observed deficits. The combined results suggest that both obese and drug-addicted individuals suffer from impairments in dopaminergic pathways that regulate neuronal systems associated not only with reward sensitivity and incentive motivation, but also with conditioning, self-control, stress reactivity and interoceptive awareness. In parallel, studies are also delineating differences between them that centre on the key role that peripheral signals involved with homeostatic control exert on food intake. Here, we focus on the shared neurobiological substrates of obesity and addiction. \u00a9 2012 The Authors. obesity reviews \u00a9 2012 International Association for the Study of Obesity.", "Changes in brain activation associated with reward processing in smokers and nonsmokers. A positron emission tomography study. Tobacco smoking is the most frequent form of substance abuse. Several studies have shown that the addictive action of nicotine is mediated by the mesolimbic dopamine system. This system is implicated in reward processing. In order to better understand the relationship between nicotine addiction and reward in humans, we investigated differences between smokers and nonsmokers in the activation of brain regions involved in processing reward information. Using [H2(15O)] positron emission tomography (PET), we measured regional cerebral blood flow (rCBF) in healthy smokers and nonsmokers while they performed a prelearned, pattern-recognition task. We compared two conditions involving nonmonetary reinforcement or monetary reward with a baseline condition in which nonsense feedback was presented. With monetary reward, we found activation in the frontal and orbitofrontal cortex, occipital cortex, cingulate gyrus, cerebellum, and midbrain in both groups. Additionally, monetary reward activated typical dopaminergic regions such as the striatum in nonsmokers but not in smokers. We found a similar pattern of activation associated with nonmonetary reinforcement in nonsmokers, whereas activation was found in smokers only in the cerebellum. The different patterns of activation suggest that the brains of smokers react in a different way to reward than those of nonsmokers. This difference involves in particular the regions of the dopaminergic system including the striatum. In principle these observations could be interpreted either as a consequence of tobacco use or as a primitive condition of the brain that led people to smoke. Supported by related nonimaging studies, we interpret these differences as a consequence of tobacco smoking, even if a short-term effect of smoking prior to the experiment cannot be excluded.", "Atrial fibrillation associated with chocolate intake abuse and chronic salbutamol inhalation abuse. The use of substances as the substrate for atrial fibrillation is not frequently recognized. Chocolate is derived from the roasted seeds of the plant theobroma cacao and its components are the methylxanthine alkaloids theobromine and caffeine. Caffeine is a methylxanthine whose primary biological effect is the competitive antagonism of the adenosine receptor. Normal consumption of caffeine was not associated with risk of atrial fibrillation or flutter. Sympathomimetic effects, due to circulating catecholamines cause the cardiac manifestations of caffeine overdose toxicity, produce tachyarrhythmias such as supraventricular tachycardia, atrial fibrillation, ventricular tachycardia, and ventricular fibrillation.The commonly used doses of inhaled or nebulized salbutamol induced no acute myocardial ischaemia, arrhythmias or changes in heart rate variability in patients with coronary artery disease and clinically stable asthma or chronic obstructive pulmonary disease. Two-week salbutamol treatment shifts the cardiovascular autonomic regulation to a new level characterized by greater sympathetic responsiveness and slight beta2-receptor tolerance. We present a case of atrial fibrillation associated with chocolate intake abuse in a 19-year-old Italian woman with chronic salbutamol inhalation abuse. This case focuses attention on chocolate intake abuse associated with chronic salbutamol abuse as the substrate for atrial fibrillation. Copyright \u00a9 2008 Elsevier Ireland Ltd. All rights reserved.", "The grapefruit: an old wine in a new glass? Metabolic and cardiovascular perspectives Summary Grapefruit is a popular, tasty and nutritive fruit enjoyed globally. Biomedical evidence in the last 10 years has, however, shown that consumption of grapefruit or its juice is associated with drug interactions, which, in some cases, have been fatal. Grapefruit-induced drug interactions are unique in that the cytochrome P450 enzyme CYP3A4, which metabolises over 60% of commonly prescribed drugs as well as other drug transporter proteins such as P-glycoprotein and organic cation transporter proteins, which are all expressed in the intestines, are involved. However, the extent to which grapefruit\u2013drug interactions impact on clinical settings has not been fully determined, probably because many cases are not reported. It has recently emerged that grapefruit, by virtue of its rich flavonoid content, is beneficial in the management of degenerative diseases such as diabetes and cardiovascular disorders. This potentially explosive subject is reviewed here."], ["Coffee and its consumption: benefits and risks. Coffee is the leading worldwide beverage after water and its trade exceeds US $10 billion worldwide. Controversies regarding its benefits and risks still exist as reliable evidence is becoming available supporting its health promoting potential; however, some researchers have argued about the association of coffee consumption with cardiovascular complications and cancer insurgence. The health-promoting properties of coffee are often attributed to its rich phytochemistry, including caffeine, chlorogenic acid, caffeic acid, hydroxyhydroquinone (HHQ), etc. Many research investigations, epidemiological studies, and meta-analyses regarding coffee consumption revealed its inverse correlation with that of diabetes mellitus, various cancer lines, Parkinsonism, and Alzheimer's disease. Moreover, it ameliorates oxidative stress because of its ability to induce mRNA and protein expression, and mediates Nrf2-ARE pathway stimulation. Furthermore, caffeine and its metabolites help in proper cognitive functionality. Coffee lipid fraction containing cafestol and kahweol act as a safeguard against some malignant cells by modulating the detoxifying enzymes. On the other hand, their higher levels raise serum cholesterol, posing a possible threat to coronary health, for example, myocardial and cerebral infarction, insomnia, and cardiovascular complications. Caffeine also affects adenosine receptors and its withdrawal is accompanied with muscle fatigue and allied problems in those addicted to coffee. An array of evidence showed that pregnant women or those with postmenopausal problems should avoid excessive consumption of coffee because of its interference with oral contraceptives or postmenopausal hormones. This review article is an attempt to disseminate general information, health claims, and obviously the risk factors associated with coffee consumption to scientists, allied stakeholders, and certainly readers. \u00a9 Taylor and Francis Group, LLC", "Association of Coffee Drinking with Total and Cause-Specific Mortality Background Coffee is one of the most widely consumed beverages, but the association between coffee consumption and the risk of death remains unclear. Methods We examined the association of coffee drinking with subsequent total and cause-specific mortality among 229,119 men and 173,141 women in the National Institutes of Health\u2013AARP Diet and Health Study who were 50 to 71 years of age at baseline. Participants with cancer, heart disease, and stroke were excluded. Coffee consumption was assessed once at baseline. Results During 5,148,760 person-years of follow-up between 1995 and 2008, a total of 33,731 men and 18,784 women died. In age-adjusted models, the risk of death was increased among coffee drinkers. However, coffee drinkers were also more likely to smoke, and, after adjustment for tobacco-smoking status and other potential confounders, there was a significant inverse association between coffee consumption and mortality. Adjusted hazard ratios for death among men who drank coffee as compared with those who did not were as follows: 0.99 (95% confidence interval [CI], 0.95 to 1.04) for drinking less than 1 cup per day, 0.94 (95% CI, 0.90 to 0.99) for 1 cup, 0.90 (95% CI, 0.86 to 0.93) for 2 or 3 cups, 0.88 (95% CI, 0.84 to 0.93) for 4 or 5 cups, and 0.90 (95% CI, 0.85 to 0.96) for 6 or more cups of coffee per day (P<0.001 for trend); the respective hazard ratios among women were 1.01 (95% CI, 0.96 to 1.07), 0.95 (95% CI, 0.90 to 1.01), 0.87 (95% CI, 0.83 to 0.92), 0.84 (95% CI, 0.79 to 0.90), and 0.85 (95% CI, 0.78 to 0.93) (P<0.001 for trend). Inverse associations were observed for deaths due to heart disease, respiratory disease, stroke, injuries and accidents, diabetes, and infections, but not for deaths due to cancer. Results were similar in subgroups, including persons who had never smoked and persons who reported very good to excellent health at baseline. Conclusions In this large prospective study, coffee consumption was inversely associated with total and cause-specific mortality. Whether this was a causal or associational finding cannot be determined from our data. (Funded by the Intramural Research Program of the National Institutes of Health, National Cancer Institute, Division of Cancer Epidemiology and Genetics.)", "Effects of habitual coffee consumption on cardiometabolic disease, cardiovascular health, and all-cause mortality. Coffee, after water, is the most widely consumed beverage in the United States, and is the principal source of caffeine intake among adults. The biological effects of coffee may be substantial and are not limited to the actions of caffeine. Coffee is a complex beverage containing hundreds of biologically active compounds, and the health effects of chronic coffee intake are wide ranging. From a cardiovascular (CV) standpoint, coffee consumption may reduce the risk of type 2 diabetes mellitus and hypertension, as well as other conditions associated with CV risk such as obesity and depression; but it may adversely affect lipid profiles depending on how the beverage is prepared. Regardless, a growing body of data suggests that habitual coffee consumption is neutral to beneficial regarding the risks of a variety of adverse CV outcomes including coronary heart disease, congestive heart failure, arrhythmias, and stroke. Moreover, large epidemiological studies suggest that regular coffee drinkers have reduced risks of mortality, both CV and all-cause. The potential benefits also include protection against neurodegenerative diseases, improved asthma control, and lower risk of select gastrointestinal diseases. A daily intake of \u223c2 to 3 cups of coffee appears to be safe and is associated with neutral to beneficial effects for most of the studied health outcomes. However, most of the data on coffee's health effects are based on observational data, with very few randomized, controlled studies, and association does not prove causation. Additionally, the possible advantages of regular coffee consumption have to be weighed against potential risks (which are mostly related to its high caffeine content) including anxiety, insomnia, tremulousness, and palpitations, as well as bone loss and possibly increased risk of fractures. Copyright \u00a9 2013 American College of Cardiology Foundation. Published by Elsevier Inc. All rights reserved.", "Effects of habitual coffee consumption on cardiometabolic disease, cardiovascular health, and all-cause mortality. Coffee, after water, is the most widely consumed beverage in the United States, and is the principal source of caffeine intake among adults. The biological effects of coffee may be substantial and are not limited to the actions of caffeine. Coffee is a complex beverage containing hundreds of biologically active compounds, and the health effects of chronic coffee intake are wide ranging. From a cardiovascular (CV) standpoint, coffee consumption may reduce the risk of type 2 diabetes mellitus and hypertension, as well as other conditions associated with CV risk such as obesity and depression; but it may adversely affect lipid profiles depending on how the beverage is prepared. Regardless, a growing body of data suggests that habitual coffee consumption is neutral to beneficial regarding the risks of a variety of adverse CV outcomes including coronary heart disease, congestive heart failure, arrhythmias, and stroke. Moreover, large epidemiological studies suggest that regular coffee drinkers have reduced risks of mortality, both CV and all-cause. The potential benefits also include protection against neurodegenerative diseases, improved asthma control, and lower risk of select gastrointestinal diseases. A daily intake of \u223c2 to 3 cups of coffee appears to be safe and is associated with neutral to beneficial effects for most of the studied health outcomes. However, most of the data on coffee's health effects are based on observational data, with very few randomized, controlled studies, and association does not prove causation. Additionally, the possible advantages of regular coffee consumption have to be weighed against potential risks (which are mostly related to its high caffeine content) including anxiety, insomnia, tremulousness, and palpitations, as well as bone loss and possibly increased risk of fractures. Copyright \u00a9 2013 American College of Cardiology Foundation. Published by Elsevier Inc. All rights reserved.", "A meta-analysis of prospective studies of coffee consumption and mortality for all causes, cancers and cardiovascular diseases. Several prospective studies considered the relation between coffee consumption and mortality. Most studies, however, were underpowered to detect an association, since they included relatively few deaths. To obtain quantitative overall estimates, we combined all published data from prospective studies on the relation of coffee with mortality for all causes, all cancers, cardiovascular disease (CVD), coronary/ischemic heart disease (CHD/IHD) and stroke. A bibliography search, updated to January 2013, was carried out in PubMed and Embase to identify prospective observational studies providing quantitative estimates on mortality from all causes, cancer, CVD, CHD/IHD or stroke in relation to coffee consumption. A systematic review and meta-analysis was conducted to estimate overall relative risks (RR) and 95\u00a0% confidence intervals (CI) using random-effects models. The pooled RRs of all cause mortality for the study-specific highest versus low (\u22641 cup/day) coffee drinking categories were 0.88 (95\u00a0% CI 0.84-0.93) based on all the 23 studies, and 0.87 (95\u00a0% CI 0.82-0.93) for the 19 smoking adjusting studies. The combined RRs for CVD mortality were 0.89 (95\u00a0% CI 0.77-1.02, 17 smoking adjusting studies) for the highest versus low drinking and 0.98 (95\u00a0% CI 0.95-1.00, 16 studies) for the increment of 1 cup/day. Compared with low drinking, the RRs for the highest consumption of coffee were 0.95 (95\u00a0% CI 0.78-1.15, 12 smoking adjusting studies) for CHD/IHD, 0.95 (95\u00a0% CI 0.70-1.29, 6 studies) for stroke, and 1.03 (95\u00a0% CI 0.97-1.10, 10 studies) for all cancers. This meta-analysis provides quantitative evidence that coffee intake is inversely related to all cause and, probably, CVD mortality."], ["Cerebral air gas embolism from concentrated hydrogen peroxide ingestion. INTRODUCTION: Ingestion of a small amount of concentrated hydrogen peroxide can cause cerebral air gas embolism (CAGE). Hyperbaric oxygen therapy (HBOT) is the standard of care in the treatment of CAGE. We report a case of CAGE after accidental ingestion of 33%hydrogen peroxide treated with HBOT resulting in reversal of both the clinical and radiologic abnormalities. CASE REPORT: A 48 year-old male took two sips of 33% hydrogen peroxide. A short time later, he developed hematemesis, left sided hemiplegia, confusion, and left homonymous hemianopsia. Initial laboratory studies, chest x-ray, and brain CT were normal. MRI demonstrated areas of restricted diffusion and T2 hyper intensities in multiple vascular territories consistent with ischemia due to CAGE. Eighteen hours after arrival, the patient underwent HBOT at 3 atmospheres absolute (ATA) for 30 minutes and 2.5 ATA for 60 minutes with clinical improvement. Follow-up MRI at six months demonstrated resolution of the hyper intensities. DISCUSSION: A search of MEDLINE from 1950 to present revealed only two cases of CAGE from ingestion of concentrated hydrogen peroxide treated with HBOT. Both cases, similar to ours, had complete resolution of symptoms. Of the seven reported cases of CAGE from hydrogen peroxide that did not undergo HBOT, only in one patient was there a report of symptom resolution. CONCLUSION: Ingestion of even a small amount of concentrated hydrogen peroxide can result in cerebral air gas embolism. Hyperbaric oxygen therapy may be of benefit in reversing the symptoms and preventing permanent neurological impairment.", "Hydrogen peroxide poisoning. Hydrogen peroxide is an oxidising agent that is used in a number of household products, including general-purpose disinfectants, chlorine-free bleaches, fabric stain removers, contact lens disinfectants and hair dyes, and it is a component of some tooth whitening products. In industry, the principal use of hydrogen peroxide is as a bleaching agent in the manufacture of paper and pulp. Hydrogen peroxide has been employed medicinally for wound irrigation and for the sterilisation of ophthalmic and endoscopic instruments. Hydrogen peroxide causes toxicity via three main mechanisms: corrosive damage, oxygen gas formation and lipid peroxidation. Concentrated hydrogen peroxide is caustic and exposure may result in local tissue damage. Ingestion of concentrated (>35%) hydrogen peroxide can also result in the generation of substantial volumes of oxygen. Where the amount of oxygen evolved exceeds its maximum solubility in blood, venous or arterial gas embolism may occur. The mechanism of CNS damage is thought to be arterial gas embolisation with subsequent brain infarction. Rapid generation of oxygen in closed body cavities can also cause mechanical distension and there is potential for the rupture of the hollow viscus secondary to oxygen liberation. In addition, intravascular foaming following absorption can seriously impede right ventricular output and produce complete loss of cardiac output. Hydrogen peroxide can also exert a direct cytotoxic effect via lipid peroxidation. Ingestion of hydrogen peroxide may cause irritation of the gastrointestinal tract with nausea, vomiting, haematemesis and foaming at the mouth; the foam may obstruct the respiratory tract or result in pulmonary aspiration. Painful gastric distension and belching may be caused by the liberation of large volumes of oxygen in the stomach. Blistering of the mucosae and oropharyngeal burns are common following ingestion of concentrated solutions, and laryngospasm and haemorrhagic gastritis have been reported. Sinus tachycardia, lethargy, confusion, coma, convulsions, stridor, sub-epiglottic narrowing, apnoea, cyanosis and cardiorespiratory arrest may ensue within minutes of ingestion. Oxygen gas embolism may produce multiple cerebral infarctions. Although most inhalational exposures cause little more than coughing and transient dyspnoea, inhalation of highly concentrated solutions of hydrogen peroxide can cause severe irritation and inflammation of mucous membranes, with coughing and dyspnoea. Shock, coma and convulsions may ensue and pulmonary oedema may occur up to 24-72 hours post exposure. Severe toxicity has resulted from the use of hydrogen peroxide solutions to irrigate wounds within closed body cavities or under pressure as oxygen gas embolism has resulted. Inflammation, blistering and severe skin damage may follow dermal contact. Ocular exposure to 3% solutions may cause immediate stinging, irritation, lacrimation and blurred vision, but severe injury is unlikely. Exposure to more concentrated hydrogen peroxide solutions (>10%) may result in ulceration or perforation of the cornea. Gut decontamination is not indicated following ingestion, due to the rapid decomposition of hydrogen peroxide by catalase to oxygen and water. If gastric distension is painful, a gastric tube should be passed to release gas. Early aggressive airway management is critical in patients who have ingested concentrated hydrogen peroxide, as respiratory failure and arrest appear to be the proximate cause of death. Endoscopy should be considered if there is persistent vomiting, haematemesis, significant oral burns, severe abdominal pain, dysphagia or stridor. Corticosteroids in high dosage have been recommended if laryngeal and pulmonary oedema supervene, but their value is unproven. Endotracheal intubation, or rarely, tracheostomy may be required for life-threatening laryngeal oedema. Contaminated skin should be washed with copious amounts of water. Skin lesions should be treated as thermal burns; surgery may be required for deep burns. In the case of eye exposure, the affected eye(s) shod eye(s) should be irrigated immediately and thoroughly with water or 0.9% saline for at least 10-15 minutes. Instillation of a local anaesthetic may reduce discomfort and assist more thorough decontamination.", "Cognitive Changes and Quality of Life in Neurocysticercosis: A Longitudinal Study Background Few studies have focused on the cognitive morbidity of neurocysticercosis (NCC), one of the most common parasitic infections of the central nervous system. We longitudinally assessed the cognitive status and quality of life (QoL) of patients with incident symptomatic NCC cases and matched controls. Methodology/Principal Findings The setting of the study was the Sabogal Hospital and Cysticercosis Unit, Department of Transmissible Diseases, National Institute of Neurological Sciences, Lima, Peru. The design was a longitudinal study of new onset NCC cases and controls. Participants included a total of 14 patients with recently diagnosed NCC along with 14 healthy neighborhood controls and 7 recently diagnosed epilepsy controls. A standardized neuropsychological battery was performed at baseline and at 6 months on NCC cases and controls. A brain MRI was performed in patients with NCC at baseline and 6 months. Neuropsychological results were compared between NCC cases and controls at both time points. At baseline, patients with NCC had lower scores on attention tasks (p<0.04) compared with epilepsy controls but no significant differences compared to healthy controls. Six months after receiving anti-parasitic treatment, the NCC group significantly improved on tasks involving psychomotor speed (p<0.02). QoL at baseline suggested impaired mental function and social function in both the NCC and epilepsy group compared with healthy controls. QoL gains in social function (p\u200a=\u200a0.006) were noted at 6 months in patients with NCC. Conclusions/Significance Newly diagnosed patients with NCC in this sample had mild cognitive deficits and more marked decreases in quality of life at baseline compared with controls. Improvements were found in both cognitive status and quality of life in patients with NCC after treatment. Author Summary Neurocysticercosis (NCC) is one of the most common parasitic infections of the central nervous system. Cognitive changes have been frequently reported with this disease but have not been well studied. Our study team recruited a group of new onset NCC cases and a matched set of healthy neighborhood controls and new onset epilepsy controls in Lima, Peru for this study. A neuropsychological battery was administered at baseline and at 6 months to all groups. Brain MRI studies were also obtained on NCC cases at baseline and at 6 months. Newly diagnosed patients with NCC had mild cognitive deficits and more marked decreases in quality of life at baseline compared with controls. Improvements were found in both cognitive status and quality of life in patients with NCC after treatment. This study is the first to assess cognitive status and quality of life longitudinally in patients with NCC and provides new data on an important clinical morbidity outcome.", "Psychiatric manifestations of neurocysticercosis: a study of 38 patients from a neurology clinic in Brazil. OBJECTIVE: To determine the frequency and features of psychiatric morbidity in a cross section of 38 outpatients with neurocysticercosis. METHODS: Diagnosis of neurocysticercosis was established by CT, MRI, and CSF analysis. Psychiatric diagnoses were made by using the present state examination and the schedule for affective disorders and schizophrenia-lifetime version; cognitive state was assessed by mini mental state examination and Strub and Black's mental status examination. RESULTS: Signs of psychiatric disease and cognitive decline were found in 65.8 and 87.5% of the cases respectively. Depression was the most frequent psychiatric diagnosis (52.6%) and 14.2% of the patients were psychotic. Active disease and intracranial hypertension were associated with higher psychiatric morbidity, and previous history of mood disorders was strongly related to current depression. Other variables, such as number and type of brain lesions, severity of neuropsychological deficits, epilepsy, and use of steroids did not correlate with mental disturbances in this sample. CONCLUSIONS: Psychiatric abnormalities, particularly depression syndromes, are frequent in patients with neurocysticercosis. Although regarded as a rare cause of dementia, mild cognitive impairment may be a much more prevalent neuropsychological feature of patients with neurocysticercosis. The extent to which organic mechanisms related to brain lesions may underlie the mental changes is yet unclear, although the similar sex distribution of patients with and without depression, as well as the above mentioned correlations, provide further evidence of the part played by organic factors in the cause of these syndromes.", "Traumatic brain injury: a risk factor for Alzheimer's disease. Traumatic brain injury (TBI) constitutes a major global health and socio-economic problem with neurobehavioral sequelae contributing to long-term disability. It causes brain swelling, axonal injury and hypoxia, disrupts blood brain barrier function and increases inflammatory responses, oxidative stress, neurodegeneration and leads to cognitive impairment. Epidemiological studies show that 30% of patients, who die of TBI, have A\u03b2 plaques which are pathological features of Alzheimer's disease (AD). Thus TBI acts as an important epigenetic risk factor for AD. This review focuses on AD related genes which are expressed during TBI and its relevance to progression of the disease. Such understanding will help to diagnose the risk of TBI patients to develop AD and design therapeutic interventions. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved."], ["Effects of different cooking methods on nutritional and physicochemical characteristics of selected vegetables. The objective of the present study was to evaluate the effect of three common cooking practices (i.e., boiling, steaming, and frying) on phytochemical contents (i.e., polyphenols, carotenoids, glucosinolates, and ascorbic acid), total antioxidant capacities (TAC), as measured by three different analytical assays [Trolox equivalent antioxidant capacity (TEAC), total radical-trapping antioxidant parameter (TRAP), ferric reducing antioxidant power (FRAP)] and physicochemical parameters of three vegetables (carrots, courgettes, and broccoli). Water-cooking treatments better preserved the antioxidant compounds, particularly carotenoids, in all vegetables analyzed and ascorbic acid in carrots and courgettes. Steamed vegetables maintained a better texture quality than boiled ones, whereas boiled vegetables showed limited discoloration. Fried vegetables showed the lowest degree of softening, even though antioxidant compounds were less retained. An overall increase of TEAC, FRAP, and TRAP values was observed in all cooked vegetables, probably because of matrix softening and increased extractability of compounds, which could be partially converted into more antioxidant chemical species. Our findings defy the notion that processed vegetables offer lower nutritional quality and also suggest that for each vegetable a cooking method would be preferred to preserve the nutritional and physicochemical qualities.", "Traditional non-Western diets. In traditional cultures, balancing health with a balanced lifestyle was a core belief. The diseases of modern civilization were rare. Indigenous people have patterns of illness very different from Western civilization; yet, they rapidly develop diseases once exposed to Western foods and lifestyles. Food and medicine were interwoven. All cultures used special or functional foods to prevent disease. Food could be used at different times either as food or medicine. Foods, cultivation, and cooking methods maximized community health and well-being. With methods passed down through generations, cooking processes were utilized that enhanced mineral and nutrient bioavailability. This article focuses on what researchers observed about the food traditions of indigenous people, their disease patterns, the use of specific foods, and the environmental factors that affect people who still eat traditional foods.", "A study on degradation kinetics of ascorbic acid in amla (Phyllanthus emblica L.) during cooking. The kinetics of ascorbic acid degradation in amla (Phyllanthus emblica L.) as well as in pure ascorbic acid solutions at initial concentrations present in amla over a temperature range of 50-120 degrees C (steady-state temperature) has been studied. The ascorbic acid degradation followed first-order reaction kinetics where the rate constant increased with an increase in temperature. The temperature dependence of degradation was adequately modeled by the Arrhenius equation. The activation energies were found to be 4.09 kcal/mole for amla and 4.49 kcal/mole for pure vitamin solution. The degradation kinetics of ascorbic acid was also evaluated in normal open pan cooking, pressure-cooking and a newly developed and patented fuel-efficient EcoCooker (unsteady state heating process). A mathematical model was developed using the steady-state kinetic parameters obtained to predict the losses of ascorbic acid from the time-temperature data of the unsteady state heating processing method. The results obtained indicate the ascorbic acid degradation is of a similar order of magnitude in all the methods of cooking.", "Heterocyclic amines: Mutagens/carcinogens produced during cooking of meat and fish. Research leading to the discovery of a series of mutagenic and carcinogenic heterocyclic amines (HCAs) was inspired by the idea that smoke produced during cooking of food, especially meat or fish, might be carcinogenic. More than ten kinds of HCAs, actually produced by cooking or heating of meat or fish, have now been isolated and their structures determined, most being previously unregistered compounds. They are highly mutagenic towards Salmonella typhimurium in the presence of S9 mix and are also mutagenic in vitro and in vivo toward mammalian cells. HCAs have now been chemically synthesized in quantity and subjected to long-term animal testing. When HCAs were fed in the diet, rodents developed cancers in many organs, including the colon, breast and prostate, and one HCA produced hepatomas in monkeys. The lesions exhibited alteration in genes including Apc, beta-catenin and Ha-ras, and these changes provide clues to the induction mechanisms. The HCAs are oxidized to hydroxyamino derivatives by cytochrome P450s, and further converted to ester forms by acetyltransferase and sulfotransferase. Eventually, they produce DNA adducts through the formation of N-C bonds at guanine bases. There are HCA-sensitive and resistant strains of rodents and a search for the responsible genes is now under way. While the content of HCAs in dishes consumed in ordinary life is low and not sufficient in itself to explain human cancer, the coexistence of many other mutagens/carcinogens of either autobiotic or xenobiotic type and the possibility that HCAs induce genomic instability and heightened sensitivity to tumor promoters suggest that avoidance of exposure to HCAs or reduction of HCAs' biological effects as far as possible are to be highly recommended. Usage of microwave ovens for cooking and supplementation of the diet, for example with soy-isoflavones, which have been found to suppress the occurrence of HCA-induced breast cancers, should be encouraged. Advice to the general public about how to reduce the carcinogenic load imposed by HCAs would be an important contribution to cancer prevention.", "Effect of cooking and germination on phenolic composition and biological properties of dark beans (Phaseolus vulgaris L.). Legumes are the bas\u00e9s diet in several countries. They hold a high nutritional value, but other properties related to human health are nowadays being studied. The aim of this work was to study the influence of processes (boiling or germination) on the phenolic composition of dark beans (Phaseolus vulgaris L. c.v. Tolosana) and their effect on their antioxidant, neuroprotective and anticancer ability. Phenolic composition of raw and processed dark beans was analysed by HPLC-PAD and HPLC-ESI/MS. The antioxidant activity was evaluated by ORAC. Astrocytes cultures (U-373) have been used to test their neuroprotective effect. Anticancer activities were evaluated on three different cell lines (renal adenocarcinoma (TK-10), breast adenocarcinoma (MCF-7) and melanoma (UACC-62)) by sulphorhodamine B method. Qualitative and quantitative differences in phenolic composition have been observed between raw and processed dark beans that influence the antioxidant activity, mainly for germinated samples which show a decrease of antioxidant capacity. Although every assayed extracts decreased reactive oxygen species release and exhibited cytotoxicity activities on cancer cell lines, raw beans proved to be the most active in neuroprotective and antitumoral effects; this sample is especially rich in phenolic compounds, mainly anthocyanins. This study further demonstrated that phenolic composition of dark beans is related with cooking process and so with their neuroprotective and anticancer activity; cooking of dark beans improves their digestion and absorption at intestinal level, while maintaining its protective ability on oxidative process at cellular level. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved."], ["Psychological and neuroendocrinological effects of odor of saffron (Crocus sativus). AIM: The purpose of this study was to clarify the effects of saffron odor on symptoms unique to women, such as premenstrual syndrome (PMS), dysmenorrhea (menstrual pain) and irregular menstruation. MATERIALS AND METHODS: Thirty-five women with a normal sense of smell were exposed to saffron odor for 20 min. Saliva samples were then collected to measure levels of cortisol (C), testosterone (T) and 17-\u03b2 estradiol (E) by enzyme immunoassay, and the State-Trait Anxiety Inventory (STAI) was administered as a psychological test. RESULTS: Saffron odor significantly decreased C levels after short-term stimulation (20 min) in both follicular and luteal phases. E level after exposure to saffron odor was increased in both the follicular- and luteal-phase groups. STAI score decreased in the follicular and luteal phases in the saffron group. CONCLUSIONS: The present findings support the existence of physiological and psychological effects of saffron odor in women. Our results indicate that saffron odor exert some effects in the treatment of PMS, dysmenorrhea and irregular menstruation. This is the first report to suggest that saffron odor may be effective in treating menstrual distress. Copyright \u00a9 2010 Elsevier GmbH. All rights reserved.", "A pilot study of potassium supplementation in the treatment of hypokalemic patients with rheumatoid arthritis: a randomized, double-blinded, placeb... Patients with rheumatoid arthritis (RA) have been described as having significantly low serum potassium concentrations than that in healthy subjects. We assessed the therapeutic efficacy and tolerability of oral potassium supplement dissolved in grape juice in female hypokalemic patients with active RA. Thirty-two hypokalemic patients with active RA were investigated in a parallel, randomized design. In addition to their usual medication, the control group received placebo and the intervention group received 6000 mg chloride potassium dissolved in grape juice on 28 consecutive days. The primary outcome parameter was the change of pain on a visual analog scale (VAS). The American College of Rheumatology (ACR) percent response criteria and Disease Activity Score 28 (DAS28, 28-joint count) and the European League Against Rheumatism (EULAR) moderate response were assessed. Mean age was 48.6 +/- 6 years. In the potassium group, 43.75% (7/16) of the patients met the criteria of 33% lower pain intensity compared with 6.25% (1/16) in the placebo group (P < .02) at day 28. Also, 31.25% (5/16) of the patients in the intervention group achieved moderate responses, according to the EULAR criteria. The corresponding percentage for patients receiving placebo was 6.25% (1/16) (P < .05). Potassium supplements appeared to decrease pain intensity. PERSPECTIVE: This article reports a trial evaluating the effect of potassium supplementation in the treatment of pain in hypokalemic patients with rheumatoid arthritis. The elevated serum cortisol and potassium values in the treatment group correlate negatively with patient's assessment of pain intensity, reflecting an anti-pain effect for potassium supplementation.", "Bitter melon (Momordica charantia) extract suppresses adrenocortical cancer cell proliferation through modulation of the apoptotic pathway, steroid... Adrenocortical carcinomas are rare but present with extremely poor prognosis. One of the approaches to control cancer progression and reduce cancer risk is prevention through diet. Bitter melon is widely consumed as a vegetable and especially as a traditional medicine in many countries. In this study, we have used human and mouse adrenocortical cancer cells as an in vitro model to assess the efficacy of bitter melon extract (BME) as an anticancer agent. The protein concentrations of BME and other extracts were measured before use. First, BME treatment of adrenocortical cancer cells resulted in a significantly dose-dependent decrease in cell proliferation. However, we did not observe an antiproliferative effect in adrenocortical cancer cells treated with extracts from blueberry, zucchini, and acorn squash. Second, apoptosis of adrenocortical cancer cells was accompanied by increased caspase-3 activation and poly(ADP-ribose) polymerase cleavage. BME treatment enhanced cellular tumor antigen p53, cyclin-dependent kinase inhibitor 1A (also called p21), and cyclic AMP-dependent transcription factor-3 levels and inhibited G1/S-specific cyclin D1, D2, and D3, and mitogen-activated protein kinase 8 (also called Janus kinase) expression, suggesting an additional mechanism involving cell cycle regulation and cell survival. Third, BME treatment decreased the key proteins involved in steroidogenesis in adrenocortical cancer cells. BME treatment decreased the level of phosphorylation of cyclin-dependent kinase 7, which is required, at least in part, for steroidogenic factor 1 activation. Finally, we observed that BME treatment significantly reduced the level of insulin-like growth factor 1 receptor and its downstream signaling pathway as evidenced by lower levels of phosphorylated RAC-\u03b1 serine/threonine-protein kinase. Taken together, these data illustrate the inhibitory effect of bitter melon on cell proliferation of adrenocortical cancer through modulation of diverse mechanisms.", "Spearmint herbal tea has significant anti-androgen effects in polycystic ovarian syndrome. A randomized controlled trial. Hirsutism in polycystic ovarian syndrome (PCOS), consequent to elevated androgen levels leads to significant cosmetic and psychological problems. Recent research in Turkey has shown that spearmint tea has antiandrogenic properties in females with hirsutism. No research has yet been undertaken to assess whether a reduction in androgen levels brought about by spearmint tea, translates to a clinical improvement in the degree of hirsutism. This study was a two centre, 30 day randomized controlled trial. Forty two volunteers were randomized to take spearmint tea twice a day for a 1 month period and compared with a placebo herbal tea. At 0, 15 and 30 days of the study serum androgen hormone levels and gonadotrophins were checked, the degree of hirsutism was clinically rated using the Ferriman-Galwey score and a questionnaire (the modified DQLI = Dermatology Quality of Life Index) was used to assess improvements in the level of self-reported hirsutism. Forty one of 42 patients completed the study. Free and total testosterone levels were significantly reduced over the 30 day period in the spearmint tea group (p < 0.05). LH and FSH also increased (p < 0.05). Patient's subjective assessments of their degree of hirsutism scored by the modified DQLI were significantly reduced in the spearmint tea group (p < 0.05). There was, however, no significant reduction in the objective Ferriman-Galwey ratings of hirsutism between the two trial groups over the trial duration (p = 0.12). There was a clear and significant alteration in the relevant hormone levels. This is associated clinically with a reduction in the self-reported degree of hirsutism but unfortunately not with the objectively rated score. It was demonstrated and confirmed that spearmint has antiandrogen properties, the simple fact that this does not clearly translate into clinical practice is due to the relationship between androgen hormones and follicular hair growth and cell turnover time. Simply put, the study duration was not long enough. The original studies from Turkey were in fact only 5 days long. The time taken for hirsutism to resolve is significant and a much longer future study is proposed as the preliminary findings are encouraging that spearmint has the potential for use as a helpful and natural treatment for hirsutism in PCOS. (c) 2009 John Wiley & Sons, Ltd.", "Development of an LC-MS/MS method to quantify sex hormones in bovine milk and influence of pregnancy in their levels. Hormones work in harmony in the body, and this status must be maintained to avoid metabolic disequilibrium and the subsequent illness. Besides, it has been reported that exogenous steroids (presence in the environment and food products) influence the development of several important illnesses in humans. Endogenous steroid hormones in food of animal origin are unavoidable as they occur naturally in these products. The presence of hormones in food has been connected with several human health problems. Bovine milk contains considerable quantities of hormones and it is of particular concern. A liquid chromatography-tandem mass spectrometry (LC-MS/MS) method, based on hydroxylamine derivatisation, has been developed and validated for the quantification of six sex hormones in milk [pregnenolone (P\u2085), progesterone (P\u2084), estrone (E\u2081), testosterone (T), androstenedione (A) and dehydroepiandrosterone (DHEA)]. This method has been applied to real raw milk samples and the existence of differences between milk from pregnant and non-pregnant cows has been statistically confirmed. Basing on a revision of existing published data, it could be concluded that maximum daily intakes for hormones are not reached through milk ingestion. Although dairy products are an important source of hormones, other products of animal origin must be considered as well for intake calculations."], ["Baking soda: a potentially fatal home remedy. We present a case of a six-week-old infant who developed life-threatening complications after unintentional sodium bicarbonate intoxication. Baking soda was being used by the mother as a home remedy to \\\"help the baby burp.\\\" A review of the literature regarding the use (or misuse) of baking soda follows. Our patient, along with the other noted case reports, emphasizes the need for warnings on baking soda products whose labels recommend its use as an antacid. Poisonings must be high in the differential diagnosis of any patient, regardless of age, who presents with altered mental status or status epilepticus.", "[Floppy baby with macrocytic anemia and vegan mother]. We report the case of a 7 month-old girl that presented with acute anemia, generalized muscular hypotonia and failure to thrive. Laboratory evaluation revealed cobalamin deficiency, due to a vegan diet of the mother. The clinical triad of an acquired floppy baby syndrome with megaloblastic anemia and failure to thrive is pathognomic for infantile cobalamin deficiency. Neurological abnormalities are often irreversible and may be associated with delayed myelinization in the MRI. A normal cobalamin level in maternal serum and absence of anemia do not exclude subclinical deficiency. If cobalamin deficiency is suspected, e.g. in pregnant women on vegan diet, urinary methylmalonic acid excretion and plasma homocysteine levels should be determined and cobalamin substitution should be started at an early stage to avoid potentially irreversible damage of the fetus.", "Too much of too little: xylitol, an unusual trigger of a chronic metabolic hyperchloremic acidosis. Homeopathic globules are frequently used in children as a first-line treatment. Most of these globules are coated with sugar substitutes like xylitol; these substitutes are known for their laxative effect. Our patient shows that consumption of globules coated with xylitol does not have only laxative effects. It may cause indeed considerable weight loss and life-threatening enteral bicarbonate loss by diarrhea when overdosed in an infant.", "The beriberi analogy to myocardial infarction. Two pandemics of heart attack deaths have plagued the world's population during the past 130 years. The first pandemic, induced by beriberi, was caused by the industrial revolution altering the nutritional composition of rice. By 1892 a simple working knowledge, then at hand, could have terminated the beriberi plague; however, orthodox medicine being then enchanted with the false concept that all disease was caused by germs, permitted millions of Asians to die needlessly of beriberi by refusing to tell them to eat rice bran or to drink rice bran tea. A second pandemic of heart attack deaths, called myocardial infarction (MI), struck the developed nations of the Western World in full force after 1930. As a hypothesis, it is suggested that this MI pandemic, still raging today, was caused by a change in food processing that occurred after 1920, when the new oil seed industry introduced into our food three greatly harmful lipid substances. The unnatural trans-trans isomer of linoleic acid, which had never been in human food prior to 1920 and which entered our food in margarines and refined oils, blocked the conversion of natural cis-cis linoleic acid to prostaglandin E1, which tends to prevent MI, both by acting as a vasodilator and by minimizing platelet aggregation. Harmful lactones were also introduced into our food, increasing the risk of MI by decreasing the fibrinolytic activity of our blood. The oil seed industry also introduced into our diet free radical lipid peroxides that make the myocardium more vulnerable to infarction. It is suggested that except for the one in 500 of us who is afflicted by familial hypercholesterolemia, the cholesterol concept of MI is as false today as was the concept in 1900 that germs caused beriberi. It is further suggested that a working knowledge is at hand today that can make death from MI just as rare as death is now from a beriberi-induced heart attack.", "Left subclavian arterioesophageal fistula induced by chicken bone with upper gastrointestinal hemorrhage and unexpected death: report of a case. Left subclavian arterioesophageal fistula resulting from chicken bone ingestion is a rare occurrence. The authors report the death of a 42-year-old Thai female with mental retardation who presented to the hospital with severe hematemesis and arrested Death occurred about 24 hours after laparotomy due to hypovolemic shock Postmortem examination revealed a chicken bone embedded in middle part of esophagus with fistula between the esophagus and the left subclavian artery."], ["Immunity: plants as effective mediators. In the domain of nutrition, exploring the diet-health linkages is major area of research. The outcomes of such interventions led to widespread acceptance of functional and nutraceutical foods; however, augmenting immunity is a major concern of dietary regimens. Indeed, the immune system is incredible arrangement of specific organs and cells that enabled humans to carry out defense against undesired responses. Its proper functionality is essential to maintain the body homeostasis. Array of plants and their components hold immunomodulating properties. Their possible inclusion in diets could explore new therapeutic avenues to enhanced immunity against diseases. The review intended to highlight the importance of garlic (Allium sativum), green tea (Camellia sinensis), ginger (Zingiber officinale), purple coneflower (Echinacea), black cumin (Nigella sativa), licorice (Glycyrrhiza glabra), Astragalus and St. John's wort (Hypericum perforatum) as natural immune boosters. These plants are bestowed with functional ingredients that may provide protection against various menaces. Modes of their actions include boosting and functioning of immune system, activation and suppression of immune specialized cells, interfering in several pathways that eventually led to improvement in immune responses and defense system. In addition, some of these plants carry free radical scavenging and anti-inflammatory activities that are helpful against cancer insurgence. Nevertheless, interaction between drugs and herbs/botanicals should be well investigated before recommended for their safe use, and such information must be disseminated to the allied stakeholders.", "Effect of spiced food on metabolic rate. Since the time of Lavoisier it has been known that the ingestion of food in animals and man produces an increase in oxygen consumption. This increase in metabolic rate was originally called 'specific dynamic action' (SDA) and is now widely referred to as the thermic effect (TE) of food or diet-induced thermogenesis (DIT) (Rothwell & Stock, 1981). Much of the early work on the thermic effect was confined to the type and amount of food, notably the macronutrients--proteins, fats and carbohydrates. Later, it was shown that certain minor constituents of the diet such as caffeine and associated methylxanthines (Zahorska-Markrewicz, 1980; Jung et al., 1981) in tea and coffee could also have a profound effect on metabolic rate. The consumption of alcohol was also shown to increase metabolic rate (Rosenberg & Durnin, 1978). The work described in this paper reports the effect of another minor constituent of food, spices, on metabolic rate. Although the use of spices in our food has steadily increased with time little information exists on their effect on the metabolic rate. It has been estimated that approximately 40 different spices are used in our diet today. This communication reports the effect of chilli (red pepper, capsicum annuum) and mustard (Brassica juncea).", "Phytochemicals and their impact on adipose tissue inflammation and diabetes. Type 2 diabetes mellitus is an inflammatory disease and the mechanisms that underlie this disease, although still incompletely understood, take place in the adipose tissue of obese subjects. Concurrently, the prevalence of obesity caused by Western diet's excessive energy intake and the lack of exercise escalates, and is believed to be causative for the chronic inflammatory state in adipose tissue. Overnutrition itself as an overload of energy may induce the adipocytes to secrete chemokines activating and attracting immune cells to adipose tissue. But also inflammation-mediating food ingredients like saturated fatty acids are believed to directly initiate the inflammatory cascade. In addition, hypoxia in adipose tissue as a direct consequence of obesity, and its effect on gene expression in adipocytes and surrounding cells in fat tissue of obese subjects appears to play a central role in this inflammatory response too. In contrast, revisiting diet all over the world, there are also some natural food products and beverages which are associated with curative effects on human health. Several natural compounds known as spices such as curcumin, capsaicin, and gingerol, or secondary plant metabolites catechin, resveratrol, genistein, and quercetin have been reported to provide an improved health status to their consumers, especially with regard to diabetes, and therefore have been investigated for their anti-inflammatory effect. In this review, we will give an overview about these phytochemicals and their role to interfere with inflammatory cascades in adipose tissue and their potential for fighting against inflammatory diseases like diabetes as investigated in vivo. Copyright \u00a9 2012 Elsevier Inc. All rights reserved.", "Fresh aromatic herbs containing methylchavicol did not exhibit the pro-oxidative effects of pure methylchavicol on a human hepatoma cell line, HepG2. Methylchavicol (CH(3)-CV), an important aromatic constituent of different plants like tarragon and basils, has been shown to be carcinogenic by a mechanism yet unclear, although it has been reported that carcinogenicity of CH(3)-CV in rodent might be linked to its metabolic conversion into a genotoxic electrophilic metabolite generated through a two steps bioactivation pathway catalyzed by cytochrome P450 enzymes and sulfotransferases. The induction of carcinogenesis by certain agents has been associated with the generation of oxidative stress. The aim of the present study was to determine whether pure methylchavicol applied on a human hepatoma cell line, HepG2, could promote oxidative stress and might alter the expression of procarcinogenic biomarkers such as the drug-metabolizing enzyme (CYP2E1), the inducible form of nitric oxide synthase (iNOS) and might induce the expression of Cu/Zn-superoxide dismutase (Cu/Zn-SOD) and Mn-SOD that control the redox equilibrium of the cells. CH(3)-CV was shown to cause a significant induction of oxidative stress, as revealed by luminol-dependent chemiluminescence (LDCL) and to alter dramatically the expression of CYP2E1, iNOS and Mn-SOD, indicating that the toxic effect of CH(3)-CV could be mediated through a nitric oxide dependent mechanism. Under similar experimental conditions, the extracts from tarragon, chervil and basil did not induce such biological changes. These results provide evidence that the generation of an oxidative stress may be a significant event occurring during CH(3)-CV-induced toxicity. It also suggests that natural extracts containing different amounts of CH(3)-CV (tarragon, chervil and basil) did not elicit such toxicity and might contain compounds able to counteract this detrimental property. Copyright \u00a9 2012. Published by Elsevier Masson SAS.", "Cinnamon and health. Cinnamon has been used as a spice and as traditional herbal medicine for centuries. The available in vitro and animal in vivo evidence suggests that cinnamon has anti-inflammatory, antimicrobial, antioxidant, antitumor, cardiovascular, cholesterol-lowering, and immunomodulatory effects. In vitro studies have demonstrated that cinnamon may act as an insulin mimetic, to potentiate insulin activity or to stimulate cellular glucose metabolism. Furthermore, animal studies have demonstrated strong hypoglycemic properties. However, there are only very few well-controlled clinical studies, a fact that limits the conclusions that can be made about the potential health benefits of cinnamon for free-living humans. The use of cinnamon as an adjunct to the treatment of type 2 diabetes mellitus is the most promising area, but further research is needed before definitive recommendations can be made."], ["Diet, infection and wheezy illness: lessons from adults. An increase in asthma and atopic disease has been recorded in many countries where society has become more prosperous. We have investigated two possible explanations: a reduction in childhood infections and a change in diet. In a cohort of people followed up since 1964, originally selected as a random sample of primary school children, we have investigated the relevance of family size and the common childhood infectious diseases to development of eczema, hay fever and asthma. Although membership of a large family reduced risks of hay fever and eczema (but not asthma), this was not explained by the infections the child had suffered. Indeed, the more infections the child had had, the greater the likelihood of asthma, although measles gave a modest measure of protection. We have investigated dietary factors in two separate studies. In the first, we have shown the risks of bronchial hyper-reactivity are increased seven-fold among those with the lowest intake of vitamin C, while the lowest intake of saturated fats gave a 10-fold protection. In the second, we have shown that the risk of adult-onset wheezy illness is increased five-fold by the lowest intake of vitamin E and doubled by the lowest intake of vitamin C. These results were supported by direct measurements of the vitamins and triglycerides in plasma. We have proposed that changes in the diet of pregnant women may have reflected those observed in the population as a whole and that these may have resulted in the birth of cohorts of children predisposed to atopy and asthma. The direct test of this is to study the diet and nutritional status of a large cohort of pregnant women and to follow their offspring forward. This is our current research.", "Death by polonium-210: lessons learned from the murder of former Soviet spy Alexander Litvinenko. The medical response to radiation--whether the result of radiological warfare, terrorist deployment of improvised radiation dispersal weapons, political assassination, occupational or industrial accidents or the medically radiated patient remains one of the least taught among all disciplines within medical education. In the aftermath of 9/11 among medical vulnerabilities to toxicant threats, of all the categories of weapons of mass destruction (WMD)--whether using the CBRNE (chemical, biological, radiological, nuclear, explosive) or NBC (nuclear, biological, chemical) acronym--radiation is the least taught in professional schools, responder cultures or civil preparedness organizations. To date, few health care professionals (HCP) possess the fundamental knowledge or skills to identify and diagnose, let alone treat a radiation victim; this vulnerability made even more obvious in the aftermath of the high profile assassination of former Russian agent Alexander Litvinenko. He was poisoned with Polonium210. Radioactive substances are ubiquitous with radiation sources being in or transported through virtually every region nationwide. It is essential to increase preparedness among community and rural health care facilities as well as urban and university hospitals. Managing radiation injuries effectively requires access to specialized equipment and expertise. Radiation sickness is progressive and may require acute, critical and long-term care throughout the course of illness. Regardless of the source, preparedness rests upon acknowledging a threat exists and dedicating the resources to address the risks including the enhancement of training and equipment. Mass or individual exposures to radiation present unique challenges to the entire response continuum from law enforcement, first responders and emergency medical care. Increased education about and practice in responding to radiological threats is essential to enhance preparedness.", "HPV-mediated cervical carcinogenesis: concepts and clinical implications. Persistent infection with a high-risk human papillomavirus (hrHPV) is generally accepted as a necessary cause of cervical cancer. However, cervical cancer is a rare complication of an hrHPV infection since most such infections are transient, not even giving rise to cervical lesions. On average, it takes 12-15 years before a persistent hrHPV infection may ultimately, via consecutive premalignant stages (ie CIN lesions), lead to an overt cervical carcinoma. This argues that HPV-induced cervical carcinogenesis is multi-step in nature. In this review, the data from hrHPV-mediated in vitro transformation studies and those obtained from analysis of clinical specimens have been merged into a cervical cancer progression model. According to this model, a crucial decision maker in the early stages following infection involves individual susceptibility for certain HPV types depending on the genetic make-up of immune surveillance determinants. Once a CIN lesion has developed, altered transcriptional regulation of the viral E6/E7 oncogenes, resulting in genomic instability and distinguishing the process of cell transformation from a productive viral infection, probably provides the subsequent important step towards malignancy. The additional (epi)genetic alterations that subsequently accumulate in high-grade CIN lesions may result in overt malignancy via immortality and growth conditions that gradually become less sensitive to growth-modulating influences mediated by cytokines and cell-cell and cell-matrix adhesions. The potential implications of hrHPV testing and some other biomarkers deduced from this model for cervical screening and the clinical management of CIN disease are also discussed. Copyright 2006 Pathological Society of Great Britain and Ireland. Published by John Wiley & Sons, Ltd.", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "European bans on surfactant trigger transatlantic debate. U.S. and European regulators and researchers disagree over risks of a common class of surfactants."], ["Cretinism revisited. Endemic cretinism includes two syndromes: a more common neurological disorder with brain damage, deaf mutism, squint and spastic paresis of the legs and a less common syndrome of severe hypothyroidism, growth retardation and less severe mental defect. Both conditions are due to dietary iodine deficiency and can be prevented by correction of iodine deficiency before pregnancy. Endemic cretinism is now included in the spectrum of the effects of iodine deficiency in a population termed the 'iodine deficiency disorders (IDDs)', which also includes a wide range of lesser degrees of cognitive defect that can be prevented by the correction of iodine deficiency. Iodine deficiency is now recognised by the World Health Organization (WHO) as the most common preventable cause of brain damage with in excess of 2 billion at risk from 130 countries. A global United Nations (UN) programme of prevention has achieved 68% household usage of iodised salt by the year 2000 compared with less than 20% prior to 1990. Copyright 2009 Elsevier Ltd. All rights reserved.", "Neurocysticercosis in pregnancy: not just another headache. Infection with pork tapeworm, or Taenia solium, affects approximately 50 million people worldwide. The most important and potentially devastating form of the infestation, neurocysticercosis, occurs when the parasite invades the central nervous system. There has been a significant increase in the number of cases in the United States due to immigration from endemic areas. This case study of a pregnant woman in the 35th week of gestation exemplifies the serious consequences of this infection in pregnancy, and discusses an evidence-based approach to the diagnosis, treatment and eradication of this preventable disease. \u00a9 2012 AWHONN.", "Sensitivity-related illness: the escalating pandemic of allergy, food intolerance and chemical sensitivity. The prevalence of allergic-related diseases, food intolerance, and chemical sensitivities in both the pediatric and adult population has increased dramatically over the last two decades, with escalating rates of associated morbidity. Conditions of acquired allergy, food intolerance and chemical hypersensitivity are frequently the direct sequelae of a toxicant induced loss of tolerance (TILT) in response to a significant initiating toxic exposure. Following the primary toxicant insult, the individuals become sensitive to low levels of diverse and unrelated triggers in their environment such as commonly encountered chemical, inhalant or food antigens. Among sensitized individuals, exposure to assorted inciting stimuli may precipitate diverse clinical and/or immune sequelae as may be evidenced by clinical symptoms as well as varied lymphocyte, antibody, or cytokine responses in some cases. Recently recognized as a mechanism of disease development, TILT and resultant sensitivity-related illness (SRI) may involve various organ systems and evoke wide-ranging physical or neuropsychological manifestations. With escalating rates of toxicant exposure and bioaccumulation in the population-at-large, an increasing proportion of contemporary illness is the direct result of TILT and ensuing SRI. Avoidance of triggers will preclude symptoms, and desensitization immunotherapy or immune suppression may ameliorate symptomatology in some cases. Resolution of SRI generally occurs on a gradual basis following the elimination of bioaccumulated toxicity and avoidance of further initiating adverse environmental exposures. As has usually been the case throughout medical history whenever new evidence regarding disease mechanisms emerges, resistance to the translation of knowledge abounds. Copyright \u00a9 2010 Elsevier B.V. All rights reserved.", "Fish odour syndrome Fish odour syndrome (trimethylaminuria) is a metabolic syndrome caused by abnormal excretion of trimethylamine in the breath, urine, sweat, saliva and vaginal secretions. Trimethylamine is derived from the intestinal bacterial degradation of foods rich in choline and carnitine and is normally oxidised by the liver to odourless trimethylamine N-oxide which is then excreted in the urine. Impaired oxidation of trimethylamine is thought to be the cause of the fish odour syndrome and is responsible for the smell of rotting fish. Certain foods rich in choline exacerbate the condition and the patients have a variety of psychological problems. Recognition of the condition is important as dietary adjustments reduce the excretion of trimethylamine and may reduce the odour. Occasionally, a short course of metronidazole, neomycin and lactulose may suppress production of trimethylamine by reducing the activity of gut microflora. Keywords: fish odour syndrome; trimethylaminuria", "Anisakiasis, an underestimated infection: effect on intestinal permeability of Anisakis simplex-sensitized patients. Anisakis simplex is a parasite that, if present in uncooked and contaminated saltwater fish, can invade the human gut. Two different clinical situations are recognized: the first, known as a gastrointestinal disease, varying from an asymptomatic episode to vomiting and diarrhea, and the second, classified as an adverse reaction to food, characterized by a wide spectrum of allergic reactions like rhinitis, conjunctivitis, or even anaphylaxis causing hypotension and/or shock. The intestinal epithelium, the major defense system against external molecules, represents an open gate for toxins and allergens if its protective function is compromised. Previous data have demonstrated a strict relationship between an altered intestinal permeability (I.P.) and worsening of the clinical manifestations in patients with adverse reactions to the food. In this article we evaluated the sensitization to A. simplex among patients who referred clinical symptoms of allergy. All subjects underwent commonly used alimentary skin prick test for food allergens, to which Ani s1, an A. simplex allergen, was added. In addition, in A. simplex-sensitized subjects, I.P. was determined upon their enrolment to the study (time 0) and after 6 months of consuming a raw fish-free diet (time 6). Five hundred and forty subjects were screened, and 170 had a positive skin prick test, 87 (51.2%) of whom were positive to Ani s1. Increased I.P. was evidenced in A. simplex-sensitized subjects with worse clinical symptoms, which receded after 6 months' elimination of raw seafood. With our data we demonstrated that the alimentary habit to eat raw fish represents a high risk for the integrity of the intestinal mucosa, and we suggest that this pathological situation may constitute an ideal, under-estimated, open gate for molecules that predispose to other, more important pathologies."], ["Docosahexaenoic acid from a cultured microalga inhibits cell growth and induces apoptosis by upregulating Bax/Bcl-2 ratio in human breast carcinoma... Docosahexaenoic acid (DHA) is an omega-3 fatty acid that comprises 22 carbons and 6 alternative double bonds in its hydrocarbon chain (22:6omega3). Previous studies have shown that DHA from fish oil controls the growth and development of different cancers; however, safety issues have been raised repeatedly about contamination of toxins in fish oil that makes it no longer a clean and safe source of the fatty acid. We investigated the cell growth inhibition of DHA from the cultured microalga Crypthecodinium cohnii (algal DHA [aDHA]) in human breast carcinoma MCF-7 cells. aDHA exhibited growth inhibition on breast cancer cells dose-dependently by 16.0% to 59.0% of the control level after 72-h incubations with 40 to 160 microM of the fatty acid. DNA flow cytometry shows that aDHA induced sub-G(1) cells, or apoptotic cells, by 64.4% to 171.3% of the control levels after incubations with 80 mM of the fatty acid for 24, 48, and 72 h. Western blot studies further show that aDHA did not modulate the expression of proapoptotic Bax protein but induced the downregulation of anti-apoptotic Bcl-2 expression time-dependently, causing increases of Bax/Bcl-2 ratio by 303.4% and 386.5% after 48- and 72-h incubations respectively with the fatty acid. Results from this study suggest that DHA from the cultured microalga is also effective in controlling cancer cell growth and that downregulation of antiapoptotic Bcl-2 is an important step in the induced apoptosis.", "Bioequivalence of Docosahexaenoic acid from different algal oils in capsules and in a DHA-fortified food. Docosahexaenoic acid (DHA), a long-chain omega-3 fatty acid, is important for eye and brain development and ongoing visual, cognitive, and cardiovascular health. Unlike fish-sourced oils, the bioavailability of DHA from vegetarian-sourced (algal) oils has not been formally assessed. We assessed bioequivalence of DHA oils in capsules from two different algal strains versus bioavailability from an algal-DHA-fortified food. Our 28-day randomized, placebo-controlled, parallel group study compared bioavailability of (a) two different algal DHA oils in capsules (\\\"DHASCO-T\\\" and \\\"DHASCO-S\\\") at doses of 200, 600, and 1,000 mg DHA per day (n = 12 per group) and of (b) an algal-DHA-fortified food (n = 12). Bioequivalence was based on changes in plasma phospholipid and erythrocyte DHA levels. Effects on arachidonic acid (ARA), docosapentaenoic acid-n-6 (DPAn-6), and eicosapentaenoic acid (EPA) were also determined. Both DHASCO-T and DHASCO-S capsules produced equivalent DHA levels in plasma phospholipids and erythrocytes. DHA response was dose-dependent and linear over the dose range, plasma phospholipid DHA increased by 1.17, 2.28 and 3.03 g per 100 g fatty acid at 200, 600, and 1,000 mg dose, respectively. Snack bars fortified with DHASCO-S oil also delivered equivalent amounts of DHA on a DHA dose basis. Adverse event monitoring revealed an excellent safety and tolerability profile. Two different algal oil capsule supplements and an algal oil-fortified food represent bioequivalent and safe sources of DHA.", "Omega-3 fatty acids for nutrition and medicine: considering microalgae oil as a vegetarian source of EPA and DHA. Long-chain EPA/DHA omega-3 fatty acid supplementation can be co-preventative and co-therapeutic. Current research suggests increasing accumulated long chain omega-3s for health benefits and as natural medicine in several major diseases. But many believe plant omega-3 sources are nutritionally and therapeutically equivalent to the EPA/DHA omega-3 in fish oil. Although healthy, precursor ALA bio-conversion to EPA is inefficient and production of DHA is nearly absent, limiting the protective value of ALA supplementation from flax-oil, for example. Along with pollutants certain fish acquire high levels of EPA/DHA as predatory species. However, the origin of EPA/DHA in aquatic ecosystems is algae. Certain microalgae produce high levels of EPA or DHA. Now, organically produced DHA-rich microalgae oil is available. Clinical trials with DHA-rich oil indicate comparable efficacies to fish oil for protection from cardiovascular risk factors by lowering plasma triglycerides and oxidative stress. This review discusses 1) omega-3 fatty acids in nutrition and medicine; 2) omega-3s in physiology and gene regulation; 3) possible protective mechanisms of EPA/DHA in major diseases such as coronary heart disease, atherosclerosis, cancer and type 2 diabetes; 4) EPA and DHA requirements considering fish oil safety; and 5) microalgae EPA and DHA-rich oils and recent clinical results.", "Exploration of biomarkers for total fish intake in pregnant Norwegian women. OBJECTIVE: Few biomarkers for dietary intake of various food groups have been established. The aim of the present study was to explore whether selenium (Se), iodine, mercury (Hg) or arsenic may serve as a biomarker for total fish and seafood intake in addition to the traditionally used n-3 fatty acids EPA and DHA. DESIGN: Intake of fish and seafood estimated by an FFQ was compared with intake assessed by a 4 d weighed food diary and with biomarkers in blood and urine. SETTING: Validation study in the Norwegian Mother and Child Cohort Study (MoBa). SUBJECTS: One hundred and nineteen women. RESULTS: Total fish/seafood intake (median 39 g/d) calculated with the MoBa FFQ was comparable to intake calculated by the food diary (median 30 g/d, rS = 0.37, P < 0.001). Erythrocyte DHA and blood Hg, Se and arsenic concentrations were positively correlated with intake of fish and seafood, but the association for DHA was weakened by the widespread use of supplements. The main finding was the consistent positive association between the intake of fish/seafood and blood arsenic concentration. In multivariate analyses, blood arsenic was associated with blood Hg and fish and seafood intake. In these models, arsenic turned out to be the best indicator of intake of fish and seafood, both totally and in subgroups of fish/seafood intake. CONCLUSIONS: While DHA reflected the intake of fatty fish and n-3 PUFA supplements, blood arsenic concentration also reflected the intake of lean fish and seafood. Blood arsenic appears to be a useful biomarker for total fish and seafood intake.", "DHEA, DHEAS and PCOS. Approximately 20-30% of PCOS women demonstrate excess adrenal precursor androgen (APA) production, primarily using DHEAS as a marker of APA in general and more specifically DHEA, synthesis. The role of APA excess in determining or causing PCOS is unclear, although observations in patients with inherited APA excess (e.g., patients with 21-hydroxylase deficient congenital classic or non-classic adrenal hyperplasia) demonstrate that APA excess can result in a PCOS-like phenotype. Inherited defects of the enzymes responsible for steroid biosynthesis, or defects in cortisol metabolism, account for only a very small fraction of women suffering from hyperandrogenism or APA excess. Rather, women with PCOS and APA excess appear to have a generalized exaggeration in adrenal steroidogenesis in response to ACTH stimulation, although they do not have an overt hypothalamic-pituitary-adrenal axis dysfunction. In general, extra-adrenal factors, including obesity, insulin and glucose levels, and ovarian secretions, play a limited role in the increased APA production observed in PCOS. Substantial heritabilities of APAs, particularly DHEAS, have been found in the general population and in women with PCOS; however, the handful of SNPs discovered to date account only for a small portion of the inheritance of these traits. Paradoxically, and as in men, elevated levels of DHEAS appear to be protective against cardiovascular risk in women, although the role of DHEAS in modulating this risk in women with PCOS remains unknown. In summary, the exact cause of APA excess in PCOS remains unclear, although it may reflect a generalized and inherited exaggeration in androgen biosynthesis of an inherited nature. Copyright \u00a9 2014 Elsevier Ltd. All rights reserved."], ["Higher Diet Quality Is Associated with Decreased Risk of All-Cause, Cardiovascular Disease, and Cancer Mortality among Older Adults Increased attention in dietary research and guidance has been focused on dietary patterns, rather than on single nutrients or food groups, because dietary components are consumed in combination and correlated with one another. However, the collective body of research on the topic has been hampered by the lack of consistency in methods used. We examined the relationships between 4 indices\u2014the Healthy Eating Index\u20132010 (HEI-2010), the Alternative Healthy Eating Index\u20132010 (AHEI-2010), the alternate Mediterranean Diet (aMED), and Dietary Approaches to Stop Hypertension (DASH)\u2014and all-cause, cardiovascular disease (CVD), and cancer mortality in the NIH-AARP Diet and Health Study (n = 492,823). Data from a 124-item food-frequency questionnaire were used to calculate scores; adjusted HRs and 95% CIs were estimated. We documented 86,419 deaths, including 23,502 CVD- and 29,415 cancer-specific deaths, during 15 y of follow-up. Higher index scores were associated with a 12\u201328% decreased risk of all-cause, CVD, and cancer mortality. Specifically, comparing the highest with the lowest quintile scores, adjusted HRs for all-cause mortality for men were as follows: HEI-2010 HR: 0.78 (95% CI: 0.76, 0.80), AHEI-2010 HR: 0.76 (95% CI: 0.74, 0.78), aMED HR: 0.77 (95% CI: 0.75, 0.79), and DASH HR: 0.83 (95% CI: 0.80, 0.85); for women, these were HEI-2010 HR: 0.77 (95% CI: 0.74, 0.80), AHEI-2010 HR: 0.76 (95% CI: 0.74, 0.79), aMED HR: 0.76 (95% CI: 0.73, 0.79), and DASH HR: 0.78 (95% CI: 0.75, 0.81). Similarly, high adherence on each index was protective for CVD and cancer mortality examined separately. These findings indicate that multiple scores reflect core tenets of a healthy diet that may lower the risk of mortality outcomes, including federal guidance as operationalized in the HEI-2010, Harvard\u2019s Healthy Eating Plate as captured in the AHEI-2010, a Mediterranean diet as adapted in an Americanized aMED, and the DASH Eating Plan as included in the DASH score.", "Comparison of Nutritional Quality of the Vegan, Vegetarian, Semi-Vegetarian, Pesco-Vegetarian and Omnivorous Diet The number of studies comparing nutritional quality of restrictive diets is limited. Data on vegan subjects are especially lacking. It was the aim of the present study to compare the quality and the contributing components of vegan, vegetarian, semi-vegetarian, pesco-vegetarian and omnivorous diets. Dietary intake was estimated using a cross-sectional online survey with a 52-items food frequency questionnaire (FFQ). Healthy Eating Index 2010 (HEI-2010) and the Mediterranean Diet Score (MDS) were calculated as indicators for diet quality. After analysis of the diet questionnaire and the FFQ, 1475 participants were classified as vegans (n = 104), vegetarians (n = 573), semi-vegetarians (n = 498), pesco-vegetarians (n = 145), and omnivores (n = 155). The most restricted diet, i.e., the vegan diet, had the lowest total energy intake, better fat intake profile, lowest protein and highest dietary fiber intake in contrast to the omnivorous diet. Calcium intake was lowest for the vegans and below national dietary recommendations. The vegan diet received the highest index values and the omnivorous the lowest for HEI-2010 and MDS. Typical aspects of a vegan diet (high fruit and vegetable intake, low sodium intake, and low intake of saturated fat) contributed substantially to the total score, independent of the indexing system used. The score for the more prudent diets (vegetarians, semi-vegetarians and pesco-vegetarians) differed as a function of the used indexing system but they were mostly better in terms of nutrient quality than the omnivores.", "Bacterial Vaginosis Is Associated with Variation in Dietary Indices Bacterial vaginosis (BV) is a common condition of unknown etiology and has been linked to adverse reproductive and obstetric health outcomes. Prior dietary research on BV has focused on specific macro- and micronutrients, but not dietary indices. We assessed the relationship between BV and selected dietary indicators among a cohort of 1735 nonpregnant women ages 15\u201344 y from Birmingham, Alabama. Annual intake was assessed with the Block98 FFQ, and the glycemic index, glycemic load (GL), and Healthy Eating Index were calculated by the Block Dietary Data System. The Naturally Nutrient Rich (NNR) score was also calculated. Vaginal flora was evaluated using Nugent Gram-stain criteria. Crude OR and adjusted OR were determined by multinomial and logistic regression in cross-sectional and prospective analyses, respectively. Participants were predominantly African American (85.5%) aged 25.3 \u00b1 6.8 y (mean \u00b1 SD). Per 10-unit increase, GL was positively (adjusted OR = 1.01, 95% CI = 1.00\u20131.03) and NNR was negatively (adjusted OR = 0.93, 95% CI = 0.88\u20130.99) associated with BV compared to normal vaginal flora. In prospective analyses, only GL was associated with BV progression (adjusted OR = 1.03, 95% CI = 1.00\u20131.05) and persistence (adjusted OR = 1.02, 95% CI = 1.01\u20131.04) after adjustment. Both GL and NNR were associated with greater BV prevalence and GL was associated with an increase in BV persistence and acquisition. These results suggest that diet composition may contribute to vaginal flora imbalances and be important for elucidating the etiology of BV.", "An algorithm to assess intestinal iron availability for use in dietary surveys In nutritional epidemiology, it is often assumed that nutrient absorption is proportional to nutrient intake. For several nutrients, including non-haem Fe, this assumption may not hold. Depending on the nutrients ingested with non-haem Fe, its availability for absorption varies greatly. Therefore, using Fe intake to examine associations between Fe and health can impact upon the validity of findings. Previous algorithms that adjust Fe intakes for dietary factors known to affect absorption have been found to underestimate Fe absorption and, in the present study, perform poorly on independent dietary data. We have designed a new algorithm to adjust Fe intakes for the effects of ascorbic acid, meat, fish and poultry, phytate, polyphenols and Ca, incorporating not only absorption data from test meals but also current understanding of Fe absorption. In so doing, we have created a robust and universal Fe algorithm with potential for use in large cohorts. The algorithm described aims not to predict Fe absorption but available Fe in the gut, a measure we believe to be of greater use in epidemiological research. Available Fe is Fe available for absorption from the gastrointestinal tract, taking into account enhancing or inhibiting effects of dietary modifiers. Our algorithm successfully estimated average Fe availability in test meal data used to construct the algorithm and, unlike other algorithms tested, also provided plausible predictions when applied to independent dietary data. Future research is needed to evaluate the extent to which this algorithm is useful in epidemiological research to relate Fe to health outcomes.", "Nutrient based estimation of acid-base balance in vegetarians and non-vegetarians. A first objective of the present study was to estimate the acid-base balance of the food intake in vegetarians and non-vegetarians. A second objective was to evaluate if additional input of specific food items on the existing potential renal acid load (PRAL) list was necessary for the comparison of the two dietary patterns. Thirty vegetarians between the age of 18 and 30 years were matched for sex, age and BMI with 30 non-vegetarians. Based on the 3-days food diaries the acid-base status of the food intake was estimated using the PRAL method. Mean PRAL values as estimated with the standard table yielded an alkaline load of -5.4 +/- 14.4 mEq/d in the vegetarians compared to an acid load of 10.3 +/- 14.4 mEq/d in the nonvegetarians (p<0.001). Mean PRAL values as estimated with the extended table yielded an alkaline load of -10.9 +/-19.7 mEq/d in the vegetarians compared to an acid load of 13.8 +/- 17.1 mEq/d for the non-vegetarians (p<0.001). The findings of this study indicate that vegetarian food intake produces more alkaline outcomes compared to non-vegetarian diets. The use of the standard PRAL table was sufficient for discrimination between the two diets."], ["Domoic acid and human exposure risks: a review. Domoic acid is a potent neurotoxin that is naturally produced by several diatom species of the genus Pseudo-nitzschia. The toxin acts as a glutamate agonist and is excitotoxic in the vertebrate central nervous system and other glutamate receptor-rich organs. Human exposure to domoic acid occurs via the consumption of contaminated shellfish that have accumulated the toxin while filter feeding on toxigenic phytoplankton during blooms. The first reported human domoic acid poisoning event occurred in Canada in 1987 during which clinical signs of acute toxicity such as gastrointestinal distress, confusion, disorientation, memory loss, coma and death were observed. The illness was named amnesic shellfish poisoning (ASP) and due to effective seafood monitoring programs there have been no documented ASP cases since 1987. However, domoic acid poisoning has a significant effect on marine wildlife and multiple poisoning events have occurred in marine birds and mammals over the last few decades. Currently, domoic acid producing diatom blooms are thought to be increasing in frequency world wide, posing an increasing threat to wildlife and human health. Of particular concern are the potential impacts of long-term low-level exposure in \\\"at risk\\\" human populations. The impacts of repetitive low-level domoic acid exposure are currently unknown. This review provides a basic description of the mechanism of action of domoic acid as well as a synthesis of information pertaining to domoic acid exposure routes, toxin susceptibility, and the importance of effective monitoring programs. The importance of investigating the potential human health impacts of long-term low-level domoic acid exposure in \\\"at risk\\\" human populations is also discussed. Published by Elsevier Ltd.", "Amnesic shellfish poison. Amnesic shellfish poisoning (ASP) is caused by consumption of shellfish that have accumulated domoic acid, a neurotoxin produced by some strains of phytoplankton. The neurotoxic properties of domoic acid result in neuronal degeneration and necrosis in specific regions of the hippocampus. A serious outbreak of ASP occurred in Canada in 1987 and involved 150 reported cases, 19 hospitalisations and 4 deaths after consumption of contaminated mussels. Symptoms ranged from gastrointestinal disturbances, to neurotoxic effects such as hallucinations, memory loss and coma. Monitoring programmes are in place in numerous countries worldwide and closures of shellfish harvesting areas occur when domoic acid concentrations exceed regulatory limits. This paper reviews the chemistry, sources, metabolism and toxicology of domoic acid as well as human case reports of ASP and discusses a possible mechanism of toxicity.", "Antifungal mechanisms supporting boric acid therapy of Candida vaginitis. BACKGROUND: Boric acid is a commonly cited treatment for recurrent and resistant yeast vaginitis, but data about the extent and mechanism of its antifungal activity are lacking. OBJECTIVES: The aim of this study was to use in vitro methods to understand the spectrum and mechanism of boric acid as a potential treatment for vaginal infection. METHODS: Yeast and bacterial isolates were tested by agar dilution to determine the intrinsic antimicrobial activity of boric acid. Established microbial physiology methods illuminated the mechanism of the action of boric acid against Candida albicans. RESULTS: C. albicans strains (including fluconazole-resistant strains) were inhibited at concentrations attainable intravaginally; as were bacteria. Broth dilution MICs were between 1563 and 6250 mg/L and boric acid proved fungistatic (also reflected by a decrease in CO(2) generation); prolonged culture at 50,000 mg/L was fungicidal. Several organic acids in yeast nitrogen broth yielded a lower pH than equimolar boric acid and sodium borate but were less inhibitory. Cold or anaerobic incubation protected yeast at high boric acid concentrations. Cells maintained integrity for 6 h in boric acid at 37 degrees C, but after 24 h modest intrusion of propidium iodide occurred; loss of plate count viability preceded uptake of vital stain. Growth at sub-MIC concentrations of boric acid decreased cellular ergosterol. The drug efflux pump CDR1 did not protect Candida as CDR1 expression was abrogated by boric acid. Boric acid interfered with the development of biofilm and hyphal transformation. CONCLUSIONS: Boric acid is fungistatic to fungicidal depending on concentration and temperature. Inhibition of oxidative metabolism appears to be a key antifungal mechanism, but inhibition of virulence probably contributes to therapeutic efficacy in vivo.", "Boric acid inhibits embryonic histone deacetylases: a suggested mechanism to explain boric acid-related teratogenicity. Histone deacetylases (HDAC) control gene expression by changing histonic as well as non histonic protein conformation. HDAC inhibitors (HDACi) are considered to be among the most promising drugs for epigenetic treatment for cancer. Recently a strict relationship between histone hyperacetylation in specific tissues of mouse embryos exposed to two HDACi (valproic acid and trichostatin A) and specific axial skeleton malformations has been demonstrated. The aim of this study is to verify if boric acid (BA), that induces in rodents malformations similar to those valproic acid and trichostatin A-related, acts through similar mechanisms: HDAC inhibition and histone hyperacetylation. Pregnant mice were treated intraperitoneally with a teratogenic dose of BA (1000 mg/kg, day 8 of gestation). Western blot analysis and immunostaining were performed with anti hyperacetylated histone 4 (H4) antibody on embryos explanted 1, 3 or 4 h after treatment and revealed H4 hyperacetylation at the level of somites. HDAC enzyme assay was performed on embryonic nuclear extracts. A significant HDAC inhibition activity (compatible with a mixed type partial inhibition mechanism) was evident with BA. Kinetic analyses indicate that BA modifies substrate affinity by a factor alpha=0.51 and maximum velocity by a factor beta=0.70. This work provides the first evidence for HDAC inhibition by BA and suggests such a molecular mechanism for the induction of BA-related malformations.", "Studies on the antidiarrhoeal effect of dragon's blood from Croton urucurana. The red sap obtained by slashing the bark of Croton urucurana Baill. (Euphorbiaceae), also known as dragon's blood, was screened for a possible antidiarrhoeal activity on castor oil-induced diarrhoea in rats, cholera toxin-induced intestinal secretion in mice and on small intestinal transit in mice. Dragon's blood at an oral dose of 600 mg/kg caused in marked inhibition of the diarrhoeal response following castor oil administration as well as the intestinal fluid accumulation promoted by cholera toxin. At a similar dose the red sap significantly inhibited the small intestinal transit which was, however, found to be independent of the opioid mechanism. These results suggest a potential usefulness of the red sap from Croton urucurana Baill. in the control of secretory diarrhoea associated pathologies. Copyright 2001 John Wiley & Sons, Ltd."], ["Can deceiving patients be morally acceptable? Daniel K Sokol argues that on rare occasions benignly deceiving patients can be morally acceptable, and he has devised a decision checklist to help doctors facing such a dilemma", "Placebos in clinical practice: comparing attitudes, beliefs, and patterns of use between academic psychiatrists and nonpsychiatrists. Controversial and ethically tenuous, the use of placebos is central to medicine but even more pivotal to psychosocial therapies. Scholars, researchers, and practitioners largely disagree about the conceptualization of placebos. While different professionals often confound the meanings of placebo effects with placebo responses, physicians continue to prescribe placebos as part of clinical practice. Our study aims to review attitudes and beliefs concerning placebos outside of clinical research. Herein we compare patterns of placebo use reported by academic psychiatrists with those reported by physicians from different specialties across Canadian medical schools. Using a web-based tool, we circulated an online survey to all 17 Canadian medical schools, with a special emphasis on psychiatry departments therein and in university-affiliated teaching hospitals. A variation on earlier efforts, our 5-minute, 21-question survey was anonymous. Among the 606 respondents who completed our online survey, 257 were psychiatrists. Our analysis revealed that psychiatrists prescribed significantly more subtherapeutic doses of medication than physicians in other specialties, although about 20% of both psychiatrists and nonpsychiatrists prescribed placebos regularly as part of routine clinical practice. However, compared with 6% of nonpsychiatrists, only 2% of psychiatrists deemed placebos of no clinical benefit. In addition, more than 60% of psychiatrists either agreed or strongly agreed that placebos had therapeutic effects relative to fewer than 45% of other practitioners. Findings from this pan-Canadian survey suggest that, compared with other physicians, psychiatrists seem to better value the influence placebos wield on the mind and body and maintain more favourable beliefs and attitudes toward placebo phenomena.", "Review of postcontrast MRI studies on diffusion of human lumbar discs. Diffusion is the only source of nutrition to the intervertebral discs, and alteration of diffusion is considered to be the final common pathway for disc degeneration. Yet diffusion remains poorly understood due to the paucity of reliable methods to study diffusion noninvasively in humans in vivo. In recent years, postcontrast MRI has emerged as a powerful and reliable tool for analyzing diffusion in lumbar discs. Since it is noninvasive and safe, it can be used to document the process of diffusion temporally over a period of 24 hours. Well-designed studies have shown that diffusion is a very slow process, and that the endplate is the main structure that controls the process of diffusion. Contrast MRI studies have also made it possible to identify endplate breaks in vivo. In the future this technique may be applied to study the influence of smoking, mechanical loading of the discs, abnormal posture, and atherosclerosis of the lumbar arteries on diffusion. These conditions have all been implicated in disc degeneration through a final common pathway of altered diffusion and decreased nutrition. This review article focuses on the current knowledge, methodology, various factors that influence the diffusion properties of the discs, and future applications of this promising technique. (c) 2007 Wiley-Liss, Inc.", "Origin and fate of dietary nanoparticles and microparticles in the gastrointestinal tract. Humans have evolved with oral exposure to dietary microparticles and nanoparticles as a normal occurrence but the ever-growing exploitation of nanotechnology is likely to increase exposure further, both qualitatively and quantitatively. Moreover, unlike the situation with respirable particles, relatively little is known about gastrointestinal intake and handling of nanoparticles. With a long term interest in gut exposure and responses to dietary microparticles, our group is now applying its expertise to nanoparticles in the gastrointestinal tract. Here we aim to address (i) the current challenges associated with the characterisation of particle-host or particle-cell interactions, (ii) the origin and mechanisms of uptake of particles in the gastrointestinal tract, especially via the Peyer's patch and (iii) potential cellular effects of nanoparticles in the generation of reactive oxygen species and inflammasome activation, or microparticles in their adjuvant activity in pro-inflammatory signalling and immune responsiveness. Copyright 2010 Elsevier Ltd. All rights reserved.", "Clostridium difficile infection in humans and piglets: a 'One Health' opportunity. Clostridium difficile causes infectious diarrhoea in humans and animals. It has been found in both diarrhoeal and non-diarrhoeal pigs, horses and cattle, suggesting a potential reservoir for human insection, and in 20-40\u00a0% of meat products in Canada and the USA, suggesting the possibility, albeit not proven, of food-borne transmission. Although it is not yet completely clear, it is likely that excessive antimicrobial exposure is driving the establishment of C. difficile in animals, in a manner analogous to human infection, rather than the organism just being normal flora of the animal gastrointestinal tract. PCR ribotype 078 is the most common ribotype of C. difficile found in pigs (83\u00a0% in one study in the USA) and cattle (up to 100\u00a0%) and this ribotype is now the third most common ribotype of C. difficile found in human infection in Europe. Human and pig strains of C. difficile are genetically identical in Europe confirming that a zoonosis exists. Rates of community-acquired C. difficile infection (CDI) are increasing world wide, a fact that sits well with the notion that animals are a reservoir for human infection. Thus, there are three problems that require resolution: a human health issue, an animal health issue and the factor common to both these problems, environmental contamination. To successfully deal with these recent changes in the epidemiology of CDI will require a 'one health' approach involving human health physicians, veterinarians and environmental scientists."], ["The development of the concept of dietary fiber in human nutrition. Fundamental studies of the laxative action of wheat bran were undertaken in the United States in the early decades of the 20th century. Walker in South Africa extended these studies among African blacks and later suggested that cereal fiber protected them against certain metabolic disorders. Trowell in Uganda elaborated this concept with regard to the rarity of common noninfective diseases of the colon. Another stream of inquiry stemmed from the hypothesis of Cleave who postulated that the presence of refined sugar, and to a lesser extent white flour, caused many metabolic diseases, while the loss of fiber caused certain colonic disorders. Meanwhile Burkitt had collected massive evidence of the rarity of appendicitis and many venous disorders in rural Africa and parts of Asia. In 1972 Trowell proposed a new physiological definition of fiber in terms of the residue of plant foods that resisted digestion by alimentary enzymes of man. Southgate has proposed chemical methods to analyze the components of dietary fiber: cellulose, hemicellulose, and lignin.", "Is oral sex really a dangerous carcinogen? Let's take a closer look. INTRODUCTION: Questions have recently arisen in the popular press about the association between specific sexual behaviors, namely, fellatio and cunnilingus, with head and neck cancers. Although there has been an overall decline in the incidence of head and neck cancers over the past 25 years, there has been a shift in the distribution of these cancers toward a particular type known as oral squamous cell carcinomas (OSCCs), and a younger demographic. These particular cancers, OSCCs, have been shown to be associated with the human papillomavirus (HPV). Several researchers have suggested that this shift in the epidemiology of head and neck cancers might be attributable to changing sexual practices. While this speculation has caught on in the popular press, there are several interesting contradictions in the existing evidence that suggest this conclusion might be premature and overreached. AIM: The intent of this article is to help clarify the issues so that sexual medicine professionals can give accurate and up-to-date information to their patients. MAIN OUTCOME MEASURES: This is a review article; no outcome data are reported. This is a review article; no measures were collected. METHODS: Pubmed search on HPV, oral sex, oral cancers, and OSCCs. RESULTS: One hundred ninety-six articles on HPV were found; 63 articles on oral sex, 55 on oral cancer, and 5 articles on OSCCs were identified as relevant. CONCLUSIONS: HPV infections occur commonly and are usually cleared within 18 months, thus HPV infection should not be a cause for concern among monogamous couples with a rich and varied sex life as long as the sexual system remains closed and other immune compromising factors are not present. HPV becomes a concern in the context of immune system compromise and infection persistence. Factors contributing to immune system compromise, HPV persistence, and oncogenesis are reviewed. \u00a9 2012 International Society for Sexual Medicine.", "Update on the biological effects of ionizing radiation, relative dose factors and radiation hygiene. Diagnostic imaging is an indispensable part of contemporary medical and dental practice. Over the last few decades there has been a dramatic increase in the use of ionizing radiation for diagnostic imaging. The carcinogenic effects of high-dose exposure are well known. Does diagnostic radiation rarely cause cancer? We don't know but we should act as if it does. Accordingly, dentists should select patients wisely - only make radiographs when there is patient-specific reason to believe there is a reasonable expectation the radiograph will offer unique information influencing diagnosis or treatment. Low-dose examinations should be made: intraoral imaging - use fast film or digital sensors, thyroid collars, rectangular collimation; panoramic and lateral cephalometric imaging - use digital systems or rare-earth film screen combinations; and cone beam computed tomography - use low-dose machines, restrict field size to region of interest, reduce mA and length of exposure arc as appropriate. \u00a9 2012 Australian Dental Association.", "Clinical, Agricultural, and Evolutionary Biology of Myostatin: A Comparative Review The discovery of myostatin and our introduction to the \u201cMighty Mouse\u201d over a decade ago spurred both basic and applied research and impacted popular culture as well. The myostatin-null genotype produces \u201cdouble muscling\u201d in mice and livestock and was recently described in a child. The field\u2019s rapid growth is by no means surprising considering the potential benefits of enhancing muscle growth in clinical and agricultural settings. Indeed, several recent studies suggest that blocking myostatin\u2019s inhibitory effects could improve the clinical treatment of several muscle growth disorders, whereas comparative studies suggest that these actions are at least partly conserved. Thus, neutralizing myostatin\u2019s effects could also have agricultural significance. Extrapolating between studies that use different vertebrate models, particularly fish and mammals, is somewhat confusing because whole genome duplication events have resulted in the production and retention of up to four unique myostatin genes in some fish species. Such comparisons, however, suggest that myostatin\u2019s actions may not be limited to skeletal muscle per se, but may additionally influence other tissues including cardiac muscle, adipocytes, and the brain. Thus, therapeutic intervention in the clinic or on the farm must consider the potential of alternative side effects that could impact these or other tissues. In addition, the presence of multiple and actively diversifying myostatin genes in most fish species provides a unique opportunity to study adaptive molecular evolution. It may also provide insight into myostatin\u2019s nonmuscle actions as results from these and other comparative studies gain visibility in biomedical fields.", "Freezing of infested pork muscle kills cysticerci. A method for culturing cysticerci that allows successful evagination and growth of scolexes from metacestodes of Taenia solium was used to study the survival of cysticerci subjected to low temperatures. Refrigeration of pork muscle infested with cysticerci at temperatures above 0 degrees C did not affect the parasites' survival in culture. Conversely, freezing of meat prevented survival of cysts. A practical procedure to kill cysticerci is the storage of pork muscle for four days at -5 degrees C, three days at -15 degrees C, or one day at -24 degrees C. These simple measures would help prevent the most frequent parasitosis of man's central nervous system."], ["Extracorporeal membrane oxygenation for newborn respiratory failure: forty-five cases. Almost all types of newborn respiratory failure are reversible. However, supportive treatment (oxygen and positive airway pressure) can damage the lung, and newborn respiratory failure remains a major cause of morbidity and death in infants. Prolonged extracorporeal membrane oxygenation (ECMO) provides life support while allowing the lung to \\\"rest.\\\" We have used ECMO in 45 moribund newborn infants; 25 survived. Neonatologists referred patients who were unresponsive to maximal therapy. The right atrium and aortic arch were cannulated via the jugular vein and carotid artery. Heparin was infused continuously to main activated clotting time at 200 to 300 seconds. Airway oxygenation and pressure were reduced to low levels. Primary diagnoses were hyaline membrane disease, 14 (6 survived, 8 died); meconium aspiration, 22 (15 survived, 7 died); persistent fetal circulation including diaphragmatic hernia, 5 (3 survived, 2 died); and sepsis, 4 (1 survived, 3 died). Growth, development, and brain and lung function are normal in 20 of 25 survivors. ECMO decreased newborn respiratory failure mortality and morbidity rates in this phase I trial. A controlled randomized study is underway. The results suggest that ECMO may be effective in older patients if used before irreversible lung damage occurs.", "Extracorporeal membrane oxygenation and conventional medical therapy in neonates with persistent pulmonary hypertension of the newborn: a prospecti... Thirty-nine newborn infants with severe persistent pulmonary hypertension and respiratory failure who met criteria for 85% likelihood of dying were enrolled in a randomized trial in which extracorporeal membrane oxygenation (ECMO) therapy was compared with conventional medical therapy (CMT). In phase I, 4 of 10 babies in the CMT group died and 9 of 9 babies in the ECMO group survived. Randomization was halted after the fourth CMT death, as planned before initiating the study, and the next 20 babies were treated with ECMO (phase II). Of the 20, 19 survived. All three treatment groups (CMT and ECMO in phase I and ECMO, phase II) were comparable in severity of illness and mechanical ventilator support. The overall survival of ECMO-treated infants was 97% (28 of 29) compared with 60% (6 of 10) in the CMT group (P less than .05).", "Spatial and temporal dynamics of the endothelium. The endothelium is a highly metabolically active organ that is involved in many physiological processes, including the control of vasomotor tone, barrier function, leukocyte adhesion and trafficking, inflammation, and hemostasis. Endothelial cell phenotypes are differentially regulated in space and time. Endothelial cell heterogeneity has important implications for developing strategies in basic research, diagnostics and therapeutics. The goals of this review are to: (i) consider mechanisms of endothelial cell heterogeneity; (ii) discuss the bench-to-bedside gap in endothelial biomedicine; (iii) revisit definitions for endothelial cell activation and dysfunction; and (iv) propose new goals in diagnosis and therapy. Finally, these themes will be applied to an understanding of vascular bed-specific hemostasis.", "Haff disease after eating salmon. While fish consumption is considered a component of a heart-healthy diet, many illnesses have been associated with eating contaminated fish. The authors describe two cases of muscle weakness and rhabdomyolysis that occurred after eating salmon. Cases of rhabdomyolysis and muscle weakness after consumption of fresh water fish have rarely been reported in the United States but have been frequently reported from the Baltic region. This illness is known as Haff disease. While the etiology is unknown, it is felt to be a toxin. Palytoxin, found in marine fish, has been associated with rhabdomyolysis, and may serve as a model for further study of the suspected toxin responsible for rhabdomyolysis after consumption of fresh water fish. If a case of Haff disease is suspected, contact the Centers for Disease Control and Prevention and collect any uneaten fish, which may be sent for laboratory analysis.", "A wholly nutritional 'multifocal angiostatic therapy' for control of disseminated cancer. A great deal of effort is now being devoted to the development of new drugs that hopefully will control the spread of inoperable cancer by safely inhibiting tumor-evoked angiogenesis. However, there is growing evidence that certain practical nutritional measures have the potential to slow tumor angiogenesis, and it is reasonable to anticipate that, by combining several measures that work in distinct but complementary ways to impede the angiogenic process, a clinically useful 'multifocal angiostatic therapy' (MAT) might be devised. Several measures which might reasonably be included in such a protocol are discussed below, and include: a low-fat, low-glycemic index vegan diet, which may down-regulate the systemic IGF-I activity that supports angiogenesis; supplemental omega-3-rich fish oil, which has been shown to inhibit endothelial expression of Flk-1, a functionally crucial receptor for VEGF, and also can suppress tumor production of pro-angiogenic eicosanoids; high-dose selenium, which has recently been shown to inhibit tumor production of VEGF; green tea polyphenols, which can suppress endothelial responsiveness to both VEGF and fibroblast growth factor; and high-dose glycine, whose recently reported angiostatic activity may reflect inhibition of endothelial cell mitosis, possibly mediated by activation of glycine-gated chloride channels. In light of evidence that tumor-evoked angiogenesis has a high requirement for copper, copper depletion may have exceptional potential as an angiostatic measure, and is most efficiently achieved with the copper-chelating drug tetrathiomolybdate. If logistical difficulties make it difficult to acquire this experimental drug, high-dose zinc supplementation can achieve a slower depletion of the body's copper pool, and in any case can be used as maintenance therapy to maintain an adequate level of copper depletion. A provisional protocol is offered for a nutritionally based MAT entailing a vegan diet and supplemental intakes of fish oil, selenium, green tea polyphenols, glycine, and zinc. Inasmuch as cox-2 is overexpressed in many cancers, and cAMP can boost tumor production of various angiogenic factors as well as autogenous growth factors, adjunctive use of cox-2-specific NSAIDS may be warranted in some cases."], ["Amount and fate of egg protein escaping assimilation in the small intestine of humans. Studies attempting to evaluate protein assimilation in humans have hitherto relied on either ileostomy subjects or intubation techniques. The availability of stable isotope-labeled protein allowed us to determine the amount and fate of dietary protein escaping digestion and absorption in the small intestine of healthy volunteers using noninvasive tracer techniques. Ten healthy volunteers were studied once after ingestion of a cooked test meal, consisting of 25 g of (13)C-, (15)N-, and (2)H-labeled egg protein, and once after ingestion of the same but raw meal. Amounts of 5.73% and 35.10% (P < 0.005) of cooked and raw test meal, respectively, escaped digestion and absorption in the small intestine. A significantly higher percentage of the malabsorbed raw egg protein was recovered in urine as fermentation metabolites. These results 1) confirm that substantial amounts of even easily digestible proteins may escape assimilation in healthy volunteers and 2) further support the hypothesis that the metabolic fate of protein in the colon is affected by the amount of protein made available.", "Does Flavanol Intake Influence Mortality from Nitric Oxide-Dependent Processes? Ischemic Heart Disease, Stroke, Diabetes Mellitus, and Cancer in Panama Substantial data suggest that flavonoid-rich food could help prevent cardiovascular disease and cancer. Cocoa is the richest source of flavonoids, but current processing reduces the content substantially. The Kuna living in the San Blas drink a flavanol-rich cocoa as their main beverage, contributing more than 900 mg/day and thus probably have the most flavonoid-rich diet of any population. We used diagnosis on death certificates to compare cause-specific death rates from year 2000 to 2004 in mainland and the San Blas islands where only Kuna live. Our hypothesis was that if the high flavanoid intake and consequent nitric oxide system activation were important the result would be a reduction in the frequency of ischemic heart disease, stroke, diabetes mellitus, and cancer \u2013 all nitric oxide sensitive processes. There were 77,375 deaths in mainland Panama and 558 deaths in the San Blas. In mainland Panama, as anticipated, cardiovascular disease was the leading cause of death (83.4 \u00b1 0.70 age adjusted deaths/100,000) and cancer was second (68.4 \u00b1 1.6). In contrast, the rate of CVD and cancer among island-dwelling Kuna was much lower (9.2 \u00b1 3.1) and (4.4 \u00b1 4.4) respectively. Similarly deaths due to diabetes mellitus were much more common in the mainland (24.1 \u00b1 0.74) than in the San Blas (6.6 \u00b1 1.94). This comparatively lower risk among Kuna in the San Blas from the most common causes of morbidity and mortality in much of the world, possibly reflects a very high flavanol intake and sustained nitric oxide synthesis activation. However, there are many risk factors and an observational study cannot provide definitive evidence.", "Hyperthyroidism caused by excessive consumption of sausages. Hyperthyroidism results from excessive production of thyroid hormones. This is usually caused by Graves disease, but exogenous thyroid hormones can lead to similar symptoms. Recognition of the latter is difficult as excessive intake of thyroid hormone is not usually admitted nor recognised. To our knowledge, exogenous hyperthyroidism caused by thyroid-contaminated food has been described twice, but not in the Netherlands. A 77-year-old man presented at the Outpatient Department of Internal Medicine with lab values revealing hyperthyroidism. There were no abnormal findings at the physical examination. Antibodies against the thyroidstimulating hormone (TSH) receptor were not detectable. Thyroid scintigraphy with 123I showed an uptake of less than 1%. Silent thyroiditis was diagnosed and the natural course was awaited, but with no improvement in the thyroid values. The thyroglobulin was very low. Further anamnesis revealed an excessive daily consumption of sausages. Thyroid hormones were detectable in these sausages. After the patient stopped eating them, he became and remained euthyroid. The case stipulates the importance of a thorough anamnesis.", "Monosodium glutamate 'allergy': menace or myth? Monosodium glutamate (MSG) is a salt form of a non-essential amino acid commonly used as a food additive for its unique flavour enhancing qualities. Since the first description of the 'Monosodium glutamate symptom complex', originally described in 1968 as the 'Chinese restaurant syndrome', a number of anecdotal reports and small clinical studies of variable quality have attributed a variety of symptoms to the dietary ingestion of MSG. Descriptions of MSG-induced asthma, urticaria, angio-oedema, and rhinitis have prompted some to suggest that MSG should be an aetiologic consideration in patients presenting with these conditions. This review prevents a critical review of the available literature related to the possible role of MSG in the so-called 'Chinese restaurant syndrome' and in eliciting asthmatic bronchospasm, urticaria, angio-oedema, and rhinitis. Despite concerns raised by early reports, decades of research have failed to demonstrate a clear and consistent relationship between MSG ingestion and the development of these conditions.", "Avenanthramides inhibit proliferation of human colon cancer cell lines in vitro. A high intake of whole grain foods is associated with reduced risk of colon cancer, but the mechanism underlying this protection has yet to be elucidated. Chronic inflammation and associated cyclooxygenase-2 (COX-2) expression in the colon epithelium are causally related to epithelial carcinogenesis, proliferation, and tumor growth. We examined the effect of avenanthramides (Avns), unique polyphenols from oats with anti-inflammatory properties, on COX-2 expression in macrophages, colon cancer cell lines, and on proliferation of human colon cancer cell lines. We found that Avns-enriched extract of oats (AvExO) had no effect on COX-2 expression, but it did inhibit COX enzyme activity and prostaglandin E(2) (PGE(2)) production in lipopolysaccharide-stimulated mouse peritoneal macrophages. Avns (AvExO, Avn-C, and the methylated form of Avn-C (CH3-Avn-C)) significantly inhibited cell proliferation of both COX-2-positive HT29, Caco-2, and LS174T, and COX-2-negative HCT116 human colon cancer cell lines, CH3-Avn-C being the most potent. However, Avns had no effect on COX-2 expression and PGE(2) production in Caco-2 and HT29 colon cancer cells. These results indicate that the inhibitory effect of Avns on colon cancer cell proliferation may be independent of COX-2 expression and PGE(2) production. Thus, Avns might reduce colon cancer risk through inhibition of macrophage PGE(2) production and non-COX-related antiproliferative effects in colon cancer cells. Interestingly, Avns had no effect on cell viability of confluence-induced differentiated Caco-2 cells, which display the characteristics of normal colonic epithelial cells. Our results suggest that the consumption of oats and oat bran may reduce the risk of colon cancer not only because of their high fiber content but also due to Avns, which attenuate proliferation of colonic cancer cells."], ["Endocrine-Disrupting Chemicals: Associated Disorders and Mechanisms of Action The incidence and/or prevalence of health problems associated with endocrine-disruption have increased. Many chemicals have endocrine-disrupting properties, including bisphenol A, some organochlorines, polybrominated flame retardants, perfluorinated substances, alkylphenols, phthalates, pesticides, polycyclic aromatic hydrocarbons, alkylphenols, solvents, and some household products including some cleaning products, air fresheners, hair dyes, cosmetics, and sunscreens. Even some metals were shown to have endocrine-disrupting properties. Many observations suggesting that endocrine disruptors do contribute to cancer, diabetes, obesity, the metabolic syndrome, and infertility are listed in this paper. An overview is presented of mechanisms contributing to endocrine disruption. Endocrine disruptors can act through classical nuclear receptors, but also through estrogen-related receptors, membrane-bound estrogen-receptors, and interaction with targets in the cytosol resulting in activation of the Src/Ras/Erk pathway or modulation of nitric oxide. In addition, changes in metabolism of endogenous hormones, cross-talk between genomic and nongenomic pathways, cross talk with estrogen receptors after binding on other receptors, interference with feedback regulation and neuroendocrine cells, changes in DNA methylation or histone modifications, and genomic instability by interference with the spindle figure can play a role. Also it was found that effects of receptor activation can differ in function of the ligand.", "Inadvertent exposure to xenoestrogens. Over the last 40 years there have been constant reports concerning environmental chemicals with hormone-like effects in wildlife. An endocrine disruptor is an exogenous substance that causes adverse health effects in an intact organism or its progeny, secondary to changes in endocrine function. Endocrine disruptors of widely diverse chemical structures that have oestrogenic properties are known as oestrogenic xenobiotics or xenoestrogens. Some of these substances, such as phytoestrogens and mycoestrogens, can come from diet or from the environment. Although the oestrogenic activity of these substances is weaker than that of oestradiol, new chemicals with endocrine disrupting potential continue to be discovered, inadvertent forms of exposure are constantly being identified, and there is increasing concern about cumulative effects. Studies in the 1960s and 1970s characterized the oestrogenicity of a number of industrial compounds and the pesticides o,p-DDT, kepone, methoxychlor, phenolic derivatives and polychlorinated biphenyls (PCBs). In the last 5 years, several environmental chemicals have been added to the list of xenoestrogens, including the pesticides toxaphene, dieldrin and endosulphan, and several different compounds used in the food industry, antioxidants such a t-butylhydroxyanisole; plasticizers such as benzylbutylphthalate and 4-OH-alkylphenols; and substances used in dental restorations, such as bisphenol-A. The relevance of these newly discovered endocrine disruptors to human health is now starting to emerge. The few studies that have investigated their effect in humans point in the same direction: if there is indeed an association between exposure to substances with hormone-disruptive activity and certain disorders of endocrine organs, the incidence of such disorders would be greater in areas where exposure to agents with this activity is high. A closer scrutiny is required to determine whether these newly discovered endocrine disrupting chemicals contribute, together with oestrogenic pesticides, to the exposure of humans to xenoestrogens.", "Endocrine-disrupting chemicals and obesity development in humans: a review. This study reviewed the literature on the relations between exposure to chemicals with endocrine-disrupting abilities and obesity in humans. The studies generally indicated that exposure to some of the endocrine-disrupting chemicals was associated with an increase in body size in humans. The results depended on the type of chemical, exposure level, timing of exposure and gender. Nearly all the studies investigating dichlorodiphenyldichloroethylene (DDE) found that exposure was associated with an increase in body size, whereas the results of the studies investigating polychlorinated biphenyl (PCB) exposure were depending on dose, timing and gender. Hexachlorobenzene, polybrominated biphenyls, beta-hexachlorocyclohexane, oxychlordane and phthalates were likewise generally associated with an increase in body size. Studies investigating polychlorinated dibenzodioxins and polychlorinated dibenzofurans found either associations with weight gain or an increase in waist circumference, or no association. The one study investigating relations with bisphenol A found no association. Studies investigating prenatal exposure indicated that exposure in utero may cause permanent physiological changes predisposing to later weight gain. The study findings suggest that some endocrine disruptors may play a role for the development of the obesity epidemic, in addition to the more commonly perceived putative contributors. \u00a9 2011 The Authors. obesity reviews \u00a9 2011 International Association for the Study of Obesity.", "Evidence of effects of environmental chemicals on the endocrine system in children. Pollutant chemicals that are widespread in the environment can affect endocrine signaling, as evidenced in laboratory experiments and in wildlife with relatively high exposures. Although humans are commonly exposed to such pollutant chemicals, the exposures are generally low, and clear effects on endocrine function from such exposures have been difficult to demonstrate. Several instances in which there are data from humans on exposure to the chemical agent and the endocrine outcome are reviewed, including age at weaning, age at puberty, and sex ratio at birth, and the strength of the evidence is discussed. Although endocrine disruption in humans by pollutant chemicals remains largely undemonstrated, the underlying science is sound and the potential for such effects is real.", "Environmental obesogens: organotins and endocrine disruption via nuclear receptor signaling. Over the last two decades, the incidence of obesity and associated metabolic syndrome diseases has risen dramatically, becoming a global health crisis. Increased caloric intake and decreased physical activity are believed to represent the root causes of this dramatic rise. However, recent findings highlight the possible involvement of environmental obesogens, xenobiotic chemicals that can disrupt the normal developmental and homeostatic controls over adipogenesis and energy balance. Environmental estrogens, i.e. chemicals with estrogenic potential, have been reported to perturb adipogenic mechanisms using in vitro model systems, but other classes of endocrine-disrupting chemicals are now coming under scrutiny as well. Organotins represent one class of widespread persistent organic pollutants with potent endocrine-disrupting properties in both invertebrates and vertebrates. New data identify tributyltin chloride and triphenyltin chloride as nanomolar agonist ligands for retinoid X receptor (RXR alpha, RXR beta, and RXR gamma) and peroxisome proliferator-activated receptor gamma, nuclear receptors that play pivotal roles in lipid homeostasis and adipogenesis. The environmental obesogen hypothesis predicts that inappropriate receptor activation by organotins will lead directly to adipocyte differentiation and a predisposition to obesity and/or will sensitize exposed individuals to obesity and related metabolic disorders under the influence of the typical high-calorie, high-fat Western diet. The linking of organotin exposure to adipocyte differentiation and obesity opens an important new area of research into potential environmental influences on human health and disease."], ["Energy and Fructose From Beverages Sweetened With Sugar or High-Fructose Corn Syrup Pose a Health Risk for Some People Sugar intake in the United States has increased by >40 fold since the American Revolution. The health concerns that have been raised about the amounts of sugar that are in the current diet, primarily as beverages, are the subject of this review. Just less than 50% of the added sugars (sugar and high-fructose corn syrup) are found in soft drinks and fruit drinks. The intake of soft drinks has increased 5-fold between 1950 and 2000. Most meta-analyses have shown that the risk of obesity, diabetes, cardiovascular disease, and metabolic syndrome are related to consumption of beverages sweetened with sugar or high-fructose corn syrup. Calorically sweetened beverage intake has also been related to the risk of nonalcoholic fatty liver disease, and, in men, gout. Calorically sweetened beverages contribute to obesity through their caloric load, and the intake of beverages does not produce a corresponding reduction in the intake of other food, suggesting that beverage calories are \u201cadd-on\u201d calories. The increase in plasma triglyceride concentrations by sugar-sweetened beverages can be attributed to fructose rather than glucose in sugar. Several randomized trials of sugar-containing soft drinks versus low-calorie or calorie-free beverages show that either sugar, 50% of which is fructose, or fructose alone increases triglycerides, body weight, visceral adipose tissue, muscle fat, and liver fat. Fructose is metabolized primarily in the liver. When it is taken up by the liver, ATP decreases rapidly as the phosphate is transferred to fructose in a form that makes it easy to convert to lipid precursors. Fructose intake enhances lipogenesis and the production of uric acid. By worsening blood lipids, contributing to obesity, diabetes, fatty liver, and gout, fructose in the amounts currently consumed is hazardous to the health of some people.", "Dietary sugar and body weight: have we reached a crisis in the epidemic of obesity and diabetes?: health be damned! Pour on the sugar. Sugar-sweetened drinks have been associated with several health problems. In the point narrative as presented below, we provide our opinion and review of the data to date that we need to reconsider consumption of dietary sugar based on the growing concern of obesity and type 2 diabetes. In the counterpoint narrative following our contribution, Drs. Kahn and Sievenpiper provide a defense and suggest that dietary sugar is not the culprit. Data from the National Health and Nutrition Examination Survey and U.S. Department of Agriculture dietary surveys along with commercial Homescan data on household purchases were used to understand changes in sugar and fructose consumption. Meta-analyses and randomized clinical trials were used to evaluate outcomes of beverage and fructose intake. About 75% of all foods and beverages contain added sugar in a large array of forms. Consumption of soft drinks has increased fivefold since 1950. Meta-analyses suggest that consumption of sugar-sweetened beverages (SSBs) is related to the risk of diabetes, the metabolic syndrome, and cardiovascular disease. Drinking two 16-ounce SSBs per day for 6 months induced features of the metabolic syndrome and fatty liver. Randomized controlled trials in children and adults lasting 6 months to 2 years have shown that lowering the intake of soft drinks reduced weight gain. Recent studies suggest a gene-SSB potential relationship. Consumption of calorie-sweetened beverages has continued to increase and plays a role in the epidemic of obesity, the metabolic syndrome, and fatty liver disease. Reducing intake of soft drinks is associated with less weight gain.", "The potential toxicity of artificial sweeteners. Since their discovery, the safety of artificial sweeteners has been controversial. Artificial sweeteners provide the sweetness of sugar without the calories. As public health attention has turned to reversing the obesity epidemic in the United States, more individuals of all ages are choosing to use these products. These choices may be beneficial for those who cannot tolerate sugar in their diets (e.g., diabetics). However, scientists disagree about the relationships between sweeteners and lymphomas, leukemias, cancers of the bladder and brain, chronic fatigue syndrome, Parkinson's disease, Alzheimer's disease, multiple sclerosis, autism, and systemic lupus. Recently these substances have received increased attention due to their effects on glucose regulation. Occupational health nurses need accurate and timely information to counsel individuals regarding the use of these substances. This article provides an overview of types of artificial sweeteners, sweetener history, chemical structure, biological fate, physiological effects, published animal and human studies, and current standards and regulations.", "Review of the efficacy of green tea, isoflavones and aloe vera supplements based on randomised controlled trials. We assess the evidence for health benefits of three commonly consumed plant food supplements (PFS), green tea, isoflavone and aloe vera, based on published systematic reviews of randomised controlled trials (RCTs). Whilst the potential benefits of green tea have been reported in a wide range of health areas, it is only in the area of the metabolic syndrome that the number of RCTs is approaching sufficient to judge such efficacy. Isoflavone supplements are widely used, and RCTs indicate that they affect bone resorption at lower doses in postmenopausal women undergoing estrogen-related bone loss, but this is only translated to attenuation of bone loss at higher doses of isoflavones. A systematic review on RCTs concluded that the effects of isoflavones on hot flashes in postmenopausal women were highly variable and no conclusions could be drawn. Despite the popularity of aloe vera as a PFS, the evaluation of its efficacy as a coadjuvant therapy for certain metabolic or digestive pathologies remains scarce; it constitutes a typical example of a naturally occurring ingredient whose efficacy in topical applications presupposes its efficacy in systemic applications. Nevertheless, its possible toxic effects on oral consumption call for caution in its utility as a PFS. Since 2007, efficacy evaluation of PFS in Europe has been covered by European Union Nutrition and Health Claims legislation. The European Food Safety Authority has adopted an approach relying on RCTs, while medicinal effects are accepted based on traditional use. In general, there are insufficient RCTs for claims to be made, and conclusive results on PFS should be obtained in the future by conducting studies with more homogeneous populations, by using supplements with optimised and measured bioavailability, and by conducting larger RCTs.", "Determination of total aluminum, chromium, copper, iron, manganese, and nickel and their fractions leached to the infusions of black tea, green tea... Total aluminum, chromium, copper, iron, manganese, and nickel were determined in black tea, green tea, Hibiscus sabdariffa, and Ilex paraguariensis (mate) by electrothermal atomic absorption spectrometry after nitric/perchloric acid digestion. In each case, one ground sample of commercially available leafy material was prepared and three 0.5-g subsamples were run in parallel. The infusions were also analyzed and the percentage of each element leached into the liquor was evaluated. The obtained results indicated that hibiscus and mate contained lower levels of aluminum (272+/-19 microg/g and 369+/-22 microg/g, respectively) as referred to black tea (759+/-31 microg/g) or green tea (919micro29 microg/g) and suggested that mate drinking could be a good dietary source of essential micronutrient manganese (total content 2223+/-110 microg/g, 48.1% leached to the infusion). It was also found that the infusion of hibiscus could supply greater amounts of iron (111+/-5 microg/g total, 40.5% leached) and copper (5.9+/-0.3 microg/g total, 93.4% leached) as compared to other infusions. Moreover, it was found that the percentage of element leached to the infusion was strongly related to the tannins content in the beverage (correlation coefficients > 0.82 with the exception for nickel); for lower tannins level, better leaching was observed."], ["A wholly nutritional 'multifocal angiostatic therapy' for control of disseminated cancer. A great deal of effort is now being devoted to the development of new drugs that hopefully will control the spread of inoperable cancer by safely inhibiting tumor-evoked angiogenesis. However, there is growing evidence that certain practical nutritional measures have the potential to slow tumor angiogenesis, and it is reasonable to anticipate that, by combining several measures that work in distinct but complementary ways to impede the angiogenic process, a clinically useful 'multifocal angiostatic therapy' (MAT) might be devised. Several measures which might reasonably be included in such a protocol are discussed below, and include: a low-fat, low-glycemic index vegan diet, which may down-regulate the systemic IGF-I activity that supports angiogenesis; supplemental omega-3-rich fish oil, which has been shown to inhibit endothelial expression of Flk-1, a functionally crucial receptor for VEGF, and also can suppress tumor production of pro-angiogenic eicosanoids; high-dose selenium, which has recently been shown to inhibit tumor production of VEGF; green tea polyphenols, which can suppress endothelial responsiveness to both VEGF and fibroblast growth factor; and high-dose glycine, whose recently reported angiostatic activity may reflect inhibition of endothelial cell mitosis, possibly mediated by activation of glycine-gated chloride channels. In light of evidence that tumor-evoked angiogenesis has a high requirement for copper, copper depletion may have exceptional potential as an angiostatic measure, and is most efficiently achieved with the copper-chelating drug tetrathiomolybdate. If logistical difficulties make it difficult to acquire this experimental drug, high-dose zinc supplementation can achieve a slower depletion of the body's copper pool, and in any case can be used as maintenance therapy to maintain an adequate level of copper depletion. A provisional protocol is offered for a nutritionally based MAT entailing a vegan diet and supplemental intakes of fish oil, selenium, green tea polyphenols, glycine, and zinc. Inasmuch as cox-2 is overexpressed in many cancers, and cAMP can boost tumor production of various angiogenic factors as well as autogenous growth factors, adjunctive use of cox-2-specific NSAIDS may be warranted in some cases.", "Excretion, isolation and structure of a new phenolic constituent of female urine. The regular occurrence of a peak due to an unidentified substance (X) in the gas chromatographic traces obtained from phenolic extracts of urine from human pregnant and non-pregnant females has been reported. The biphasic excretion of X with maxima in the luteal phase of the ovulatory cycle and relatively high levels in the first trimester of pregnancy were noteworthy and suggested that the substance may have a biological significance. Close similarities between the excretory pattern, the chemical and chromatographic properties of X and of those of the known phenolic steroids suggested initially that this compound was steroidal in nature. The same, or a similar, substance seems to be excreted in the vervet monkey (Cercopithecus aethiops pygerythrus). We now report the excretory pattern of X in more detail, the isolation of the pure compound from pooled pregnancy urine and the chemical structure. The structure determined by mass spectrometry, IR spectroscopy and NMR spectrometry is: trans-(+/-)-3,4-bis[(3-hydroxyphenyl)methyl]dihydro-2-(3H)-furanone (HPMF) and was confirmed by synthesis.", "An introduction to migraine: from ancient treatment to functional pharmacology and antimigraine therapy. Migraine treatment has evolved from the realms of the supernatural into the scientific arena, but it seems still controversial whether migraine is primarily a vascular or a neurological dysfunction. Irrespective of this controversy, the levels of serotonin (5-hydroxytryptamine; 5-HT), a vasoconstrictor and a central neurotransmitter, seem to decrease during migraine (with associated carotid vasodilatation) whereas an i.v. infusion of 5-HT can abort migraine. In fact, 5-HT as well as ergotamine, dihydroergotamine and other antimigraine agents invariably produce vasoconstriction in the external carotid circulation. The last decade has witnessed the advent of sumatriptan and second generation triptans (e.g. zolmitriptan, rizatriptan, naratriptan), which belong to a new class of drugs, now known as 5-HT1B/1D/1F receptor agonists. Compared to sumatriptan, the second-generation triptans have a higher oral bioavailability and longer plasma half-life. In line with the vascular and neurogenic theories of migraine, all triptans produce selective carotid vasoconstriction (via 5-HT1B receptors) and presynaptic inhibition of the trigeminovascular inflammatory responses implicated in migraine (via 5-HT1D/5-ht1F receptors). Moreover, selective agonists at 5-HT1D (PNU-142633) and 5-ht1F (LY344864) receptors inhibit the trigeminovascular system without producing vasoconstriction. Nevertheless, PNU-142633 proved to be ineffective in the acute treatment of migraine, whilst LY344864 did show some efficacy when used in doses which interact with 5-HT1B receptors. Finally, although the triptans are effective antimigraine agents producing selective cranial vasoconstriction, efforts are being made to develop other effective antimigraine alternatives acting via the direct blockade of vasodilator mechanisms (e.g. antagonists at CGRP receptors, antagonists at 5-HT7 receptors, inhibitors of nitric oxide biosynthesis, etc). These alternatives will hopefully lead to fewer side-effects.", "The influence of Aspalathus linearis (Rooibos) and dihydrochalcones on adrenal steroidogenesis: quantification of steroid intermediates and end pro... The steroid hormone output of the adrenal gland is crucial in the maintenance of hormonal homeostasis, with hormonal imbalances being associated with numerous clinical conditions which include, amongst others, hypertension, metabolic syndrome, cardiovascular disease, insulin resistance and type 2 diabetes. Aspalathus linearis (Rooibos), which has been reported to aid stress-related symptoms linked to metabolic diseases, contains a wide spectrum of bioactive phenolic compounds of which aspalathin is unique. In this study the inhibitory effects of Rooibos and the dihydrochalcones, aspalathin and nothofagin, were investigated on adrenal steroidogenesis. The activities of both cytochrome P450 17\u03b1-hydroxylase/17,20 lyase and cytochrome P450 21-hydroxylase were significantly inhibited in COS-1 cells. In order to study the effect of these compounds in H295R cells, a human adrenal carcinoma cell line, a novel UPLC-MS/MS method was developed for the detection and quantification of twenty-one steroid metabolites using a single chromatographic separation. Under both basal and forskolin-stimulated conditions, the total amount of steroids produced in H295R cells significantly decreased in the presence of Rooibos, aspalathin and nothofagin. Under stimulated conditions, Rooibos decreased the total steroid output 4-fold and resulted in a significant reduction of aldosterone and cortisol precursors. Dehydroepiandrosterone-sulfate levels were unchanged, while the levels of androstenedione (A4) and 11\u03b2-hydroxyandrostenedione (11\u03b2OH-A4) were inhibited 5.5 and 2.3-fold, respectively. Quantification of 11\u03b2OH-A4 showed this metabolite to be a major product of steroidogenesis in H295R cells and we confirm, for the first time, that this steroid metabolite is the product of the hydroxylation of A4 by human cytochrome P450 11\u03b2-hydroxylase. Taken together our results demonstrate that Rooibos, aspalathin and nothofagin influence steroid hormone biosynthesis and the flux through the mineralocorticoid, glucocorticoid and androgen pathways, thus possibly contributing to the alleviation of negative effects arising from elevated glucocorticoid levels. Copyright \u00a9 2011 Elsevier Ltd. All rights reserved.", "Development of an LC-MS/MS method to quantify sex hormones in bovine milk and influence of pregnancy in their levels. Hormones work in harmony in the body, and this status must be maintained to avoid metabolic disequilibrium and the subsequent illness. Besides, it has been reported that exogenous steroids (presence in the environment and food products) influence the development of several important illnesses in humans. Endogenous steroid hormones in food of animal origin are unavoidable as they occur naturally in these products. The presence of hormones in food has been connected with several human health problems. Bovine milk contains considerable quantities of hormones and it is of particular concern. A liquid chromatography-tandem mass spectrometry (LC-MS/MS) method, based on hydroxylamine derivatisation, has been developed and validated for the quantification of six sex hormones in milk [pregnenolone (P\u2085), progesterone (P\u2084), estrone (E\u2081), testosterone (T), androstenedione (A) and dehydroepiandrosterone (DHEA)]. This method has been applied to real raw milk samples and the existence of differences between milk from pregnant and non-pregnant cows has been statistically confirmed. Basing on a revision of existing published data, it could be concluded that maximum daily intakes for hormones are not reached through milk ingestion. Although dairy products are an important source of hormones, other products of animal origin must be considered as well for intake calculations."], ["How evidence-based medicine biases physicians against nutrition. Medical students in the United States are taught little about nutrition and dietetics. Worse yet, their training biases them against the studies that show the power of dietary approaches to managing disease. The current approach to evidence-based medicine encourages physicians to ignore any information that does not come from a double-blind, randomized controlled trial. Yet human beings cannot be blinded to a dietary intervention. As a result, physicians are biased toward drug treatments and against dietary interventions for the management of chronic disease. Copyright \u00a9 2013 Elsevier Ltd. All rights reserved.", "Homeopathy: what does the \\\"best\\\" evidence tell us? OBJECTIVE: To evaluate the evidence for and against the effectiveness of homeopathy. DATA SOURCES: The Cochrane Database of Systematic Reviews (generally considered to be the most reliable source of evidence) was searched in January 2010. STUDY SELECTION: Cochrane reviews with the term \\\"homeopathy\\\" in the title, abstract or keywords were considered. Protocols of reviews were excluded. Six articles met the inclusion criteria. DATA EXTRACTION: Each of the six reviews was examined for specific subject matter; number of clinical trials reviewed; total number of patients involved; and authors' conclusions. The reviews covered the following conditions: cancer, attention-deficit hyperactivity disorder, asthma, dementia, influenza and induction of labour. DATA SYNTHESIS: The findings of the reviews were discussed narratively (the reviews' clinical and statistical heterogeneity precluded meta-analysis). CONCLUSIONS: The findings of currently available Cochrane reviews of studies of homeopathy do not show that homeopathic medicines have effects beyond placebo.", "How does physician advice influence patient behavior? Evidence for a priming effect. OBJECTIVE: To explore a potential \\\"priming effect\\\" of physician advice on patient responses to behavioral change interventions. DESIGN: Randomized controlled trial with a 3-month follow-up. SETTING: Four community-based group family medicine clinics in southeastern Missouri. PARTICIPANTS: Adult patients (N = 915). INTERVENTIONS: Printed educational materials designed to encourage patients to quit smoking, eat less fat, and increase physical activity. MAIN OUTCOME MEASURES: Recall, rating, and use of the educational materials; changes in smoking behavior, dietary fat consumption, and physical activity. RESULTS: Patients who received physician advice to quit smoking, eat less fat, or get more exercise prior to receiving intervention materials on the same topic were more likely to remember the materials, show them to others, and perceive the materials as applying to them specifically. They were also more likely to report trying to quit smoking (odds ratio [OR] = 1.54, 95% confidence interval [CI] = 0.95-2.40), quitting for at least 24 hours (OR = 1.85, 95% CI = 1.02-3.34), and making some changes in diet (OR = 1.35, 95% CI = 1.00-1.84) and physical activity (OR = 1.51, 95% CI = 0.95-2.40). CONCLUSIONS: Findings support an integrated model of disease prevention in which physician advice is a catalyst for change and is supported by a coordinated system of information and activities that can provide the depth of detail and individualization necessary for sustained behavioral change.", "Bach flower remedies: a systematic review of randomised clinical trials. Bach flower remedies continue to be popular and its proponents make a range of medicinal claims for them. The aim of this systematic review was to critically evaluate the evidence for these claims. Five electronic databases were searched without restrictions on time or language. All randomised clinical trials of flower remedies were included. Seven such studies were located. All but one were placebo-controlled. All placebo-controlled trials failed to demonstrate efficacy. It is concluded that the most reliable clinical trials do not show any differences between flower remedies and placebos.", "The emergence of \\\"lifestyle medicine\\\" as a structured approach for management of chronic disease. Chronic diseases with a lifestyle-based aetiology currently make up a significant proportion of primary care consultations, but management often falls between the demands of public and clinical health. A modified clinical approach, based around the concept of \\\"lifestyle medicine\\\", helps fill the gap by adding behavioural, motivational and environmental skills to conventional medical practice. When used in a multidisciplinary setting, lifestyle medicine offers potential cost and effectiveness benefits, which are beginning to be realised."], ["Effects of dietary factors and other metabolic modifiers on quality and nutritional value of meat. A number of technologies that increase feed efficiency and lean tissue deposition while decreasing fat deposition have been developed in an effort to improve profitability of animal production. In general, the mode of action of these metabolic modifiers is to increase muscle deposition while often simultaneously reducing fat deposition. However, there have been some concerns that the focus on increasing production efficiency and lean meat yield has been to the detriment of meat quality. The aim of this review is to collate data on the effects of these metabolic modifiers on meat quality, and then discuss these overall effects. When data from the literature are collated and subject to meta-analyses it appears that conservative use of each of these technologies will result in a 5-10% (0.3-0.5kg) increase in shear force with a similar reduction in perception of tenderness. However, it should be borne in mind that the magnitude of these increases are similar to those observed with similar increases in carcass leanness obtained through other means (e.g. nutritional, genetic selection) and may be an inherent consequence of the production of leaner meat. To counter this, there are some other metabolic factors and dietary additives that offer some potential to improve meat quality (for example immuncastration) and it is possible that these can be used on their own or in conjunction with somatotropin, approved \u03b2-agonists, anabolic implants and CLA to maintain or improve meat quality.", "The environmental and public health risks associated with arsenical use in animal feeds. Arsenic exposures contribute significantly to the burden of preventable disease worldwide, specifically related to increased risks of cancer, diabetes, and cardiovascular disease. Most exposures are associated with natural contamination of groundwater, which is difficult to mitigate when these sources are used for drinking water. An anthropogenic source of arsenic exposure stems from the widespread use of arsenical drugs in food-animal production in the United States and China, among many countries. This use results in residual contamination of food products from animals raised with the drugs, as well as environmental contamination associated with disposal of wastes from these animals. Land disposal of these wastes can contaminate surface and ground water, and the conversion of animal wastes into fertilizer pellets for home use as well as the introduction of animal waste incinerators may increase opportunities for exposure. As an intentional additive to animal feed, use of arsenical drugs is a preventable source of human exposure. The domestic practice of using these drugs in poultry production has been the subject of media attention and limited research, though the use of these drugs in domestic swine production and in the rapidly growing foreign animal production industry remains largely uncharacterized. This continued expansion of arsenical drug use may likely increase the burden of global human arsenic exposure and risk.", "Factors related to the prevalence of pathogenic Yersinia enterocolitica on pig farms. A survey of 788 pigs from 120 farms was conducted to determine the within-farm prevalence of pathogenic Yersinia enterocolitica and a questionnaire of management conditions was mailed to the farms afterwards. A univariate statistical analysis with carriage and shedding as outcomes was conducted with random-effects logistic regression with farm as a clustering factor. Variables with a P value <0\u00b715 were included into the respective multivariate random-effects logistic regression model. The use of municipal water was discovered to be a protective factor against carriage and faecal shedding of the pathogen. Organic production and buying feed from a certain feed manufacturer were also protective against total carriage. Tonsillar carriage, a different feed manufacturer, fasting pigs before transport to the slaughterhouse, higher-level farm health classification, and snout contacts between pigs were risk factors for faecal shedding. We concluded that differences in management can explain different prevalences of Y. enterocolitica between farms.", "The nitrate story--no end in sight. It has been demonstrated that nitrates are reduced to nitrites in humans, possibly through bacterial activity. Nitrites, together with ubiquitous amines, can lead to an in-vivo synthesis of carcinogenic nitrosamines. The average daily intake of nitrates depends upon the amount of vegetables consumed and on the nitrate concentration in drinking water. Agricultural practices play an important part in the concentration of nitrate in both water and vegetables. If nitrate is taken up by the plant and not metabolised to amino acids, proteins or nucleic acids, it is stored in cell vacuoles as a reserve. However, with an over-supply of nitrate relative to possible photosynthesis, this stored nitrate is still present at harvest and leads to high concentrations in plant tissue. The nitrate content in plants also depends upon other factors, such as plant variety (cultivar), kind and amount of fertiliser, time of harvest and environmental factors such as light intensity, temperature, etc. It is suggested that we should try to meet the recommendations of toxicologists who believe a dramatic reduction nitrate intake for humans is necessary. It has been demonstrated that modern biological-organic farming methods clearly lead both to lower leaching of nitrates and to lower nitrate content in vegetables. Since no synthetic fungicides are used in this farming method, problems with the reaction of metabolites of such products and nitrites e.g. to highly cancerogenic and multigenic nitroso-ethylenethiourea do not exist.", "Bronchiolitis obliterans and consumer exposure to butter-flavored microwave popcorn: a case series. Respiratory exposure to diacetyl and diacetyl-containing flavorings used in butter-flavored microwave popcorn (BFMP) causes lung disease, including bronchiolitis obliterans (BO), in flavorings and popcorn manufacturing workers. However, there are no published reports of lung disease among BFMP consumers. We present a case series of three BFMP consumers with biopsy-confirmed BO. We review data relating to consumer exposures, estimate case exposures, and compare them to diacetyl-containing flavoring-exposed manufacturing workers with lung disease. These consumer cases' exposure levels are comparable to those that caused disease in workers. We were unable to identify any other exposures or diseases known or suspected to cause BO in these cases. BFMP poses a significant respiratory risk to consumers. Some manufacturers have substituted diacetyl with other alpha-diketones that are likely to pose a similar risk. Simple consumer practices such as cooling the popcorn bag would eliminate the risk of severe lung disease."], ["In vitro investigations of the potential health benefits of Australian-grown faba beans (Vicia faba L.): chemopreventative capacity and inhibitory ... The functional properties, including antioxidant and chemopreventative capacities as well as the inhibitory effects on angiotensin-converting enzyme (ACE), \u03b1-glucosidase and pancreatic lipase, of three Australian-grown faba bean genotypes (Nura, Rossa and TF(Ic*As)*483/13) were investigated using an array of in vitro assays. Chromatograms of on-line post column derivatisation assay coupled with HPLC revealed the existence of active phenolics (hump) in the coloured genotypes, which was lacking in the white-coloured breeding line, TF(Ic*As)*483/13. Roasting reduced the phenolic content, and diminished antioxidant activity by 10-40 % as measured by the reagent-based assays (diphenylpicrylhydrazyl, 2,2'-azino-bis(3-ethylbenzthiazoline-6-sulphonic acid) and oxygen radical absorbance capacity) in all genotypes. Cell culture-based antioxidant activity assay (cellular antioxidant activity) showed an increase of activity in the coloured genotypes after roasting. Faba bean extracts demonstrated cellular protection ability against H\u2082O\u2082-induced DNA damage (assessed using RAW264.7 cells), and inhibited the proliferation of all human cancer cell lines (BL13, AGS, Hep G2 and HT-29) evaluated. However, the effect of faba bean extracts on the non-transformed human cells (CCD-18Co) was negligible. Flow cytometric analyses showed that faba bean extracts successfully induced apoptosis of HL-60 (acute promyelocytic leukaemia) cells. The faba bean extracts also exhibited ACE, \u03b1-glucosidase and pancreatic lipase inhibitory activities. Overall, extracts from Nura (buff-coloured) and Rossa (red-coloured) were comparable, while TF(Ic*As)*483/13 (white-coloured) contained the lowest phenolic content and exhibited the least antioxidant and enzyme inhibition activities. These results are important to promote the utilisation of faba beans in human diets for various health benefits.", "Beans and diabetes: Phaseolus vulgaris preparations as antihyperglycemic agents. Bean pods (Phaseolus vulgaris) are among the most widely used traditional remedies against diabetes mellitus. Historical knowledge is summarized and compared to recent study results. Reports dating from the first half of the 20(th) century as well as recent publications show contradictory results. It seems that Phaseolus preparations should not be considered the first choice in phytopharmaceutical treatment of diabetes or lead structure research. To be effective, fairly high doses of aqueous extracts need to be given. Because of their fiber content and an alpha-amylase inhibitory effect, beans might be more useful as food components in preventing or ameliorating type 2 diabetes.", "Phaseolus beans: impact on glycaemic response and chronic disease risk in human subjects. Consumption of Phaseolus vulgaris bean species such as pinto, black, navy or kidney may be beneficial in the prevention and treatment of chronic diseases. In particular, conditions that are promoted by increased glycaemic stress (hyperglycaemia and hyperinsulinaemia) including diabetes, CVD and cancer seem to be reduced in individuals who eat more of these beans. The present paper discusses the influence of P. vulgaris species on glycaemic response and the impact that relationship may have on the risk of developing diabetes, CVD and cancer.", "Influence of frequent and long-term bean consumption on colonic function and fermentation. The objective of this study was to determine the influence of frequent and long-term consumption of legume seeds on colonic function. Two groups of subjects were studied--one group habitually consumed legume seeds as part of their normal diet, a second group only infrequently consumed legumes. No differences between these groups could be detected for fecal output and frequency, intestinal transit time, VFA excretion or fecal pH during 23-day study periods in which subjects consumed either their usual diet or 100 g red kidney beans, daily. However, the addition of beans to the diets of both groups provided significantly more dietary fiber, and produced greater fecal output and a higher concentration of VFA in feces. Fecal output appeared to be determined by two independent parameters--dietary fiber intake and VFA excretion. Beans provided a physiologically useful source of dietary fiber and favorably influenced colonic function.", "Perceptions of flatulence from bean consumption among adults in 3 feeding studies Background Many consumers avoid eating beans because they believe legume consumption will cause excessive intestinal gas or flatulence. An increasing body of research and the 2010 Dietary Guidelines for Americans supports the benefits of a plant-based diet, and legumes specifically, in the reduction of chronic disease risks. The purpose of the current research was to investigate the perception of increased flatulence and gastrointestinal discomfort among participants who consumed a \u00bd cup of beans daily for 8 or 12 weeks. Methods Participants in three studies to test the effects of beans on heart disease biomarkers completed the same weekly questionnaire to assess gastrointestinal discomfort issues such as increased flatulence, stool changes, and bloating. Studies 1 and 2 were randomized crossover trials. Participants consumed \u00bd cup of pinto beans, black-eyed peas, and canned carrots as control (n = 17) in Study 1 for three randomized 8-week phases. For Study 2, participants ate \u00bd cup baked beans or canned carrots as control (n = 29) for two randomized 8-week phases. Study 3 was a parallel arm trial with 40 subjects receiving \u00bd cup pinto beans and 40 consuming a control soup for 12 weeks. Changes in the frequency of perceived flatulence, stool characteristics, and bloating were the primary outcome measures. Chi-square distributions were examined for the presence or absence of symptoms and demographic characteristics to determine differences by gender, age, body mass index (BMI), and bean type. Results Less than 50% reported increased flatulence from eating pinto or baked beans during the first week of each trial, but only 19% had a flatulence increase with black-eyed peas. A small percentage (3-11%) reported increased flatulence across the three studies even on control diets without flatulence-producing components. Conclusions People's concerns about excessive flatulence from eating beans may be exaggerated. Public health nutritionists should address the potential for gastrointestinal discomfort when increasing fiber intake from beans with clients. It is important to recognize there is individual variation in response to different bean types."], ["Pseudo-maple syrup urine disease due to maternal prenatal ingestion of fenugreek. Fenugreek, maple syrup and the urine of maple syrup urine disease (MSUD) patients all share a characteristic odour originating from a common component, sotolone. Ingestion of fenugreek by mothers during labour resulted in a maple syrup-like odour in their newborn infants, leading to a false suspicion of MSUD.", "Spearmint herbal tea has significant anti-androgen effects in polycystic ovarian syndrome. A randomized controlled trial. Hirsutism in polycystic ovarian syndrome (PCOS), consequent to elevated androgen levels leads to significant cosmetic and psychological problems. Recent research in Turkey has shown that spearmint tea has antiandrogenic properties in females with hirsutism. No research has yet been undertaken to assess whether a reduction in androgen levels brought about by spearmint tea, translates to a clinical improvement in the degree of hirsutism. This study was a two centre, 30 day randomized controlled trial. Forty two volunteers were randomized to take spearmint tea twice a day for a 1 month period and compared with a placebo herbal tea. At 0, 15 and 30 days of the study serum androgen hormone levels and gonadotrophins were checked, the degree of hirsutism was clinically rated using the Ferriman-Galwey score and a questionnaire (the modified DQLI = Dermatology Quality of Life Index) was used to assess improvements in the level of self-reported hirsutism. Forty one of 42 patients completed the study. Free and total testosterone levels were significantly reduced over the 30 day period in the spearmint tea group (p < 0.05). LH and FSH also increased (p < 0.05). Patient's subjective assessments of their degree of hirsutism scored by the modified DQLI were significantly reduced in the spearmint tea group (p < 0.05). There was, however, no significant reduction in the objective Ferriman-Galwey ratings of hirsutism between the two trial groups over the trial duration (p = 0.12). There was a clear and significant alteration in the relevant hormone levels. This is associated clinically with a reduction in the self-reported degree of hirsutism but unfortunately not with the objectively rated score. It was demonstrated and confirmed that spearmint has antiandrogen properties, the simple fact that this does not clearly translate into clinical practice is due to the relationship between androgen hormones and follicular hair growth and cell turnover time. Simply put, the study duration was not long enough. The original studies from Turkey were in fact only 5 days long. The time taken for hirsutism to resolve is significant and a much longer future study is proposed as the preliminary findings are encouraging that spearmint has the potential for use as a helpful and natural treatment for hirsutism in PCOS. (c) 2009 John Wiley & Sons, Ltd.", "Vegetarian diet ameliorates symptoms of atopic dermatitis through reduction of the number of peripheral eosinophils and of PGE2 synthesis by monocy... Many patients with atopic dermatitis are dissatisfied with conventional treatments based on topical steroids and have experienced some traditional remedies and alternative therapies. However, most of such therapies have not been evaluated scientifically and clinically by specialists. This study was designed to assess whether a certain vegetarian diet might be effective for atopic dermatitis and if so, to identify the mechanisms of this remedy through analyses of immunological parameters. An open-trial study was carried out in twenty patients with atopic dermatitis. An improvement of dermatitis was evaluated by SCORAD index and serological and immunological parameters were monitored. After a two-month treatment, the severity of dermatitis was strikingly inhibited, as assessed by SCORAD index and serological parameters including LDH5 activity and a number of peripheral eosinophils. A sharp reduction in eosinophils and neutrophils was observed prior to improvement in the skin inflammation. In addition, PGE2 production by peripheral blood mononuclear cells was reduced by this treatment. In contrast, serum IgE levels did not change during the same period. Although this study is an open-trial one, it suggests that this treatment may be useful for the treatment of adult patients with severe atopic dermatitis.", "Pyrogallol, an active compound from the medicinal plant Emblica officinalis, regulates expression of pro-inflammatory genes in bronchial epithelial... The most relevant cause of morbidity and mortality in cystic fibrosis (CF) patients is the lung pathology characterized by chronic infection and inflammation sustained mainly by Pseudomonas aeruginosa (P. aeruginosa). Innovative pharmacological approaches to control the excessive inflammatory process in the lung of CF patients are thought to be beneficial to reduce the extensive airway tissue damage. Medicinal plants from the so-called traditional Asian medicine are attracting a growing interest because of their potential efficacy and safety. Due to the presence of different active compounds in each plant extract, understanding the effect of each component is important to pursue selective and reproducible applications. Extracts from Emblica officinalis (EO) were tested in IB3-1 CF bronchial epithelial cells exposed to the P. aeruginosa laboratory strain PAO1. EO strongly inhibited the PAO1-dependent expression of the neutrophil chemokines IL-8, GRO-alpha, GRO-gamma, of the adhesion molecule ICAM-1 and of the pro-inflammatory cytokine IL-6. Pyrogallol, one of the compounds extracted from EO, inhibited the P. aeruginosa-dependent expression of these pro-inflammatory genes similarly to the whole EO extract, whereas a second compound purified from EO, namely 5-hydroxy-isoquinoline, had no effect. These results identify Pyrogallol as an active compound responsible for the anti-inflammatory effect of EO and suggest to extend the investigation in pre-clinical studies in airway animal models in vivo, to test the efficacy and safety of this molecule in CF chronic lung inflammatory disease.", "Artemisia dracunculus L. (tarragon): a critical review of its traditional use, chemical composition, pharmacology, and safety. Artemisia dracunculus L. (tarragon) has a long history of use as a spice and remedy. Two well-described \\\"cultivars\\\" (Russian and French) are used widely and differ in ploidy level, morphology, and chemistry. Key biologically active secondary metabolites are essential oils (0.15-3.1%), coumarins (>1%), flavonoids, and phenolcarbonic acids. In vivo studies mainly in rodents, particularly from Russian sources, highlight potential anti-inflammatory, hepatoprotective, and antihyperglycemic effects. Despite concerns about the toxic effects of two of its main constituents, estragole (up to 82%) and methyleugenol (up to 39%), no acute toxicity or mutagenic activity has been reported at doses relevant for human consumption. Water extracts of A. dracunculus contain very low amounts of estragole and methyleugenol and, therefore, are considered to pose a very limited risk. Overall, a stronger focus on clinical studies and precise taxonomic and phytochemical definition of the source material will be essential for future research efforts."], ["Suicide mortality in the European Union. BACKGROUND: There are an estimated one million completed suicides per year worldwide. As a response to increasing concern about suicide within Europe, the EUROSAVE (European Review of Suicide and Violence Epidemiology) study was undertaken to examine recent trends in the epidemiology of suicide and self-inflicted injury mortality in the European Union (EU). METHODS: Suicide and self-inflicted injury mortality data for the 15 EU countries for the years 1984-1998 were obtained from the World Health Organisation (WHO), the European Statistical Office of the European Commission (EUROSTAT) and national statistical agencies. Data were also obtained for a second group of deaths classified as 'undetermined' or 'other violence'. Age-standardized mortality rates were calculated and examined for trends over time. RESULTS: Finland had the highest suicide rate, while Greece had the lowest for the latest available year (1997). Age-standardized suicide rates tended to be lowest in the Mediterranean countries. Significant downward linear time trends in suicide mortality were observed in most countries, although rates varied markedly between countries. Both Ireland and Spain displayed significant upward linear trends in suicide mortality. Portugal had the highest rate of undetermined deaths both in 1984 and 1998 while Greece had the lowest in both 1984 and 1997. Five countries (including Ireland and Spain) showed significant downward trends in deaths due to undetermined causes whereas Belgium and Germany showed borderline significant upward linear trends in deaths due to undetermined causes. CONCLUSIONS: Although suicide rates in most countries seem to be decreasing, the validity of the data is uncertain. Misclassification may contribute to the geographical and temporal variation in suicide rates in some EU countries but it does not explain the phenomenon. More detailed research comparing suicide-recording procedures and practices across the EU is required. In the absence of adequate EU wide data on suicide epidemiology, effective prevention of this distressing phenomenon is likely to remain elusive.", "Spatial clustering of amyotrophic lateral sclerosis in Finland at place of birth and place of death. Previous evidence for spatial clustering of amyotrophic lateral sclerosis is inconclusive. Studies that have identified apparent clusters have often been based on a small number of cases, which means the results may have occurred by chance processes. Also, most studies have used the geographic location at the time of death as the basis for cluster detection, rather than exploring clusters at other points in the life cycle. In this study, the authors examine 1,000 cases of amyotrophic lateral sclerosis distributed throughout Finland who died between June 1985 and December 1995. Using a spatial-scan statistic, the authors examine whether there are significant clusters of the disease at both time of birth and time of death. Two significant, neighboring clusters were identified in southeast and south-central Finland at the time of death. A single significant cluster was identified in southeast Finland at the time of birth, closely matching one of the clusters identified at the time of death. These results are based on a large sample of cases, and they provide convincing evidence of spatial clustering of this condition. The results demonstrate also that, if the cluster analysis is conducted at different stages of the cases' life cycle, different conclusions about where potential risk factors may exist might result.", "Dioxins, polychlorinated biphenyls, methyl mercury and omega-3 polyunsaturated fatty acids as biomarkers of fish consumption. BACKGROUND/OBJECTIVES: To assess biomarkers and frequency questions as measures of fish consumption. SUBJECTS/METHODS: Participants in the Fishermen substudy numbered 125 men and 139 women (aged 22-74), and in the Health 2000 substudy, 577 men and 712 women (aged 45-74) participated. The aim of the Fishermen study was to examine the overall health effect of fish consumption in a high-consumption population, whereas the aim of the Health 2000 substudy was to obtain in-depth information on cardiovascular diseases and diabetes. Fish consumption was measured by the same validated food frequency questionnaire (FFQ) in both the studies, with a further two separate frequency questions used in the Fishermen substudy. Dioxins, polychlorinated biphenyls (PCBs) and methyl mercury (MeHg) (in the Fishermen substudy alone), and omega-3 polyunsaturated fatty acids (omega-3 PUFAs) (in both studies) were analyzed from fasting serum/blood samples. RESULTS: The Spearman's correlation coefficients between FFQ fish consumption and dioxins, PCBs, MeHg and omega-3 PUFAs were respectively 0.46, 0.48, 0.43 and 0.38 among the Fishermen substudy men, and 0.28, 0.36, 0.45 and 0.31 among women. Similar correlation coefficients were observed between FFQ fish consumption and serum omega-3 PUFAs in the Health 2000 substudy, and also between FFQ fish consumption and the frequency questions on fish consumption in the Fishermen substudy. According to multiple regression modeling and LMG metrics, the most important fish consumption biomarkers were dioxins and PCBs among the men and MeHg among the women. CONCLUSIONS: Environmental contaminants seemed to be slightly better fish consumption biomarkers than omega-3 PUFAs in the Baltic Sea area. The separate frequency questions measured fish consumption equally well when compared with the FFQ.", "A Multicountry Ecological Study of Cancer Incidence Rates in 2008 with Respect to Various Risk-Modifying Factors Observational and ecological studies are generally used to determine the presence of effect of cancer risk-modifying factors. Researchers generally agree that environmental factors such as smoking, alcohol consumption, poor diet, lack of physical activity, and low serum 25-hdyroxyvitamin D levels are important cancer risk factors. This ecological study used age-adjusted incidence rates for 21 cancers for 157 countries (87 with high-quality data) in 2008 with respect to dietary supply and other factors, including per capita gross domestic product, life expectancy, lung cancer incidence rate (an index for smoking), and latitude (an index for solar ultraviolet-B doses). The factors found to correlate strongly with multiple types of cancer were lung cancer (direct correlation with 12 types of cancer), energy derived from animal products (direct correlation with 12 types of cancer, inverse with two), latitude (direct correlation with six types, inverse correlation with three), and per capita gross national product (five types). Life expectancy and sweeteners directly correlated with three cancers, animal fat with two, and alcohol with one. Consumption of animal products correlated with cancer incidence with a lag time of 15\u201325 years. Types of cancer which correlated strongly with animal product consumption, tended to correlate weakly with latitude; this occurred for 11 cancers for the entire set of countries. Regression results were somewhat different for the 87 high-quality country data set and the 157-country set. Single-country ecological studies have inversely correlated nearly all of these cancers with solar ultraviolet-B doses. These results can provide guidance for prevention of cancer.", "Children as guinea pigs: historical perspective. Experimentation involving children is not a new phenomenon. Children have been used as research subjects in a diverse set of experiments, including the trials of new vaccines and sera, in efforts to understand normal pediatric anatomy and physiology and in the development of new drugs and procedures. Concern about child participants in research is also not a new development. For more than a century, critics of medical research have called attention to the fact that children and other vulnerable populations--pregnant women, prisoners, the mentally ill--have too often served as the unwitting and unwilling subjects of medical experiments. This paper looks at several early cases in which children participated, including the first trial of cowpox vaccine, the first human trial of rabies vaccine, and the first treatment of Listerian wound antisepsis. The history of concern for children, especially institutionalized children, in medical research is considered along with the development of regulations or guidelines, including the Declaration of Helsinki (1964)."], ["Supplementation of flaxseed oil diminishes skin sensitivity and improves skin barrier function and condition. BACKGROUND: Skin sensitivity is a common problem in the Western population correlated with changes of skin properties like skin barrier function, hydration and skin physiology. Skin properties can be modulated by dietary fatty acids (FA), especially poly-unsaturated FA. The present study was performed to evaluate the effect of daily supplementation with flaxseed oil and safflowerseed oil on healthy volunteers with sensitive skin. METHODS: The study was designed as a randomized, double-blind 12-week intervention with 2 female treatment groups (n = 13). Plasma FA profile, skin sensitivity, skin hydration, transepidermal water loss (TEWL) and skin surface were evaluated on day 0, week 6 and week 12. RESULTS: Supplementation with flaxseed oil led to significant decreases in sensitivity (after nicotinate irritation), TEWL, skin roughness and scaling, while smoothness and hydration were increased. Concomitantly, the ratio of n-6/n-3 FA in plasma decreased. Upon supplementation with safflowerseed oil, only a significant improvement in skin roughness and hydration was observed; however, the effects were less pronounced and determined at a later point in time than with flaxseed oil. The plasma n-6/n-3 FA ratio increased. CONCLUSION: The data provide evidence that daily intake of flaxseed oil modulates skin condition. Copyright \u00a9 2010 S. Karger AG, Basel.", "Flaxseed: a potential source of food, feed and fiber. Flaxseed is one of the most important oilseed crops for industrial as well as food, feed, and fiber purposes. Almost every part of the flaxseed plant is utilized commercially, either directly or after processing. The stem yields good quality fiber having high strength and durability. The seed provides oil rich in omega-3, digestible proteins, and lignans. In addition to being one of the richest sources of \u03b1-linolenic acid oil and lignans, flaxseed is an essential source of high quality protein and soluble fiber and has considerable potential as a source of phenolic compounds. Flaxseed is emerging as an important functional food ingredient because of its rich contents of \u03b1-linolenic acid (ALA), lignans, and fiber. Lignans appear to be anti-carcinogenic compounds. The omega-3s and lignan phytoestrogens of flaxseed are in focus for their benefits for a wide range of health conditions and may possess chemo-protective properties in animals and humans. This paper presents a review of literature on the nutritional composition of flaxseed, its health benefits, and disease-prevention qualities, utilization of flaxseed for food, feed, and fiber, and processing of flaxseed.", "Dietary milled flaxseed and flaxseed oil improve N-3 fatty acid status and do not affect glycemic control in individuals with well-controlled type ... OBJECTIVE: To determine the effects of dietary consumption of milled flaxseed or flaxseed oil on glycemic control, n-3 fatty acid status, anthropometrics, and adipokines in individuals with type 2 diabetes. DESIGN: Thirty-four participants were randomized into a parallel, controlled trial. SUBJECTS: The participants were adults with type 2 diabetes (age 52.4 +/- 1.5 years, body mass index 32.4 +/- 1.0 kg/m(2), n = 17 men and 17 women). INTERVENTIONS: Participants consumed a selection of bakery products containing no flax (control group [CTL], n = 9), milled flaxseed (FXS, n = 13; 32 g/d), or flaxseed oil (FXO, n = 12; 13 g/d) daily for 12 weeks. The FXS and FXO groups received equivalent amounts of alpha-linolenic acid (ALA; 7.4 g/day). MEASURES OF OUTCOME: The primary outcome measures were fasting plasma hemoglobin A(1c), glucose, insulin, and phospholipid fatty acid composition. The secondary outcome measures were fasting circulating leptin and adiponectin, as well as body weight, body mass index, and waist circumference. Dietary intake assessment and calculations for homeostasis model assessment for insulin resistance and quantified insulin sensitivity check were also completed. RESULTS: The FXS and FXO groups had increases in plasma phospholipid n-3 fatty acids (ALA, eicosapentaenoic acid [EPA], or decosapentaenoic acid [DPA], but not docosahexaenoic acid), and the FXO group had more EPA and DPA in plasma phospholipids compared to the FXS group. All groups had similar caloric intakes; however, the CTL group experienced a 4% weight gain compared to baseline (p < 0.05), while both flax groups had constant body weights during the study period. All other parameters, including glycemic control, were unchanged by dietary treatment. CONCLUSIONS: Milled FXS and FXO intake does not affect glycemic control in adults with well-controlled type 2 diabetes. Possible prevention of weight gain by flax consumption warrants further investigation.", "Flaxseed - a miraculous defense against some critical maladies. Presence of omega-3, omega-6 rich oil, alpha-linoleic acid, dietary fibers, secoisolariciresinol diglucoside, protein and minerals in flaxseed constitute a very strong basis for the utilization of flaxseed in various food preparations as a curative agent. An extensive body of literature illustrates that flaxseed has gained a significant position in the domain of nutritional sciences owing to its pivotal role as an antioxidant agent. The review discusses at length, numerous health benefits of flaxseed typically focusing its preventive role against cardiovascular diseases, cancer, diabetes and enhancement of spatial memory. Massive increase in the size of population with a special emphasize to the developing countries, there is an urge for exploration of the alternative dietary resources that can meet the dietary and nutritional needs of forthcoming generations. With respect to its remarkable nutritional importance, the review in question enables researchers engaged in nutritional sciences to further investigate the therapeutic value of flaxseed functional components and their dietary application in various food products and availability in processed foods as well as in the human cell line.", "Potent antihypertensive action of dietary flaxseed in hypertensive patients. Flaxseed contains \u03c9-3 fatty acids, lignans, and fiber that together may provide benefits to patients with cardiovascular disease. Animal work identified that patients with peripheral artery disease may particularly benefit from dietary supplementation with flaxseed. Hypertension is commonly associated with peripheral artery disease. The purpose of the study was to examine the effects of daily ingestion of flaxseed on systolic (SBP) and diastolic blood pressure (DBP) in peripheral artery disease patients. In this prospective, double-blinded, placebo-controlled, randomized trial, patients (110 in total) ingested a variety of foods that contained 30 g of milled flaxseed or placebo each day over 6 months. Plasma levels of the \u03c9-3 fatty acid \u03b1-linolenic acid and enterolignans increased 2- to 50-fold in the flaxseed-fed group but did not increase significantly in the placebo group. Patient body weights were not significantly different between the 2 groups at any time. SBP was \u2248 10 mm Hg lower, and DBP was \u2248 7 mm Hg lower in the flaxseed group compared with placebo after 6 months. Patients who entered the trial with a SBP \u2265 140 mm Hg at baseline obtained a significant reduction of 15 mm Hg in SBP and 7 mm Hg in DBP from flaxseed ingestion. The antihypertensive effect was achieved selectively in hypertensive patients. Circulating \u03b1-linolenic acid levels correlated with SBP and DBP, and lignan levels correlated with changes in DBP. In summary, flaxseed induced one of the most potent antihypertensive effects achieved by a dietary intervention."], ["From the Cover: The extremely slow and variable activity of dihydrofolate reductase in human liver and its implications for high folic acid intake Numerous clinical trials using folic acid for prevention of cardiovascular disease, stroke, cognitive decline, and neural tube defects have been completed or are underway. Yet, all functions of folate are performed by tetrahydrofolate and its one-carbon derivatives. Folic acid is a synthetic oxidized form not significantly found in fresh natural foods; to be used it must be converted to tetrahydrofolate by dihydrofolate reductase (DHFR). Increasing evidence suggests that this process may be slow in humans. Here we show, using a sensitive assay we developed, that the reduction of folic acid by DHFR per gram of human liver (n = 6) obtained from organ donors or directly from surgery is, on average, less than 2% of that in rat liver at physiological pH. Moreover, in contrast to rats, there was almost a 5-fold variation of DHFR activity among the human samples. This limited ability to activate the synthetic vitamer raises issues about clinical trials using high levels of folic acid. The extremely low rate of conversion of folic acid suggests that the benefit of its use in high doses will be limited by saturation of DHFR, especially in individuals possessing lower than average activity. These results are also consistent with the reports of unmetabolized folic acid in plasma and urine.", "Safety considerations and potential interactions of vitamins: should vitamins be considered drugs? OBJECTIVE: To examine adverse effects, adverse events, and potential interactions of vitamins in light of their current prevalence of use, and to discuss whether vitamins should be considered over-the-counter drugs or natural health products/dietary supplements. DATA SOURCES: We performed a MEDLINE/PubMed search, explored 4 online databases (Medline Plus, Drug Digest, Natural Medicine Comprehensive Database, and the database of the University of Maryland), and examined reference lists of included studies published from 1966 through October 2009. STUDY SELECTION AND DATA EXTRACTION: The studies were reviewed, with an emphasis on randomized controlled clinical trials. We included articles with the most clinically important information with regard to adverse events and interactions. DATA SYNTHESIS: Vitamins are used by over one third of the North American population. Vitamins have documented adverse effects and toxicities, and most have documented interactions with drugs. While some vitamins (biotin, pantothenic acid, riboflavin, thiamine, vitamin B(12), vitamin K) have minor and reversible adverse effects, others, such as fat-soluble vitamins (A, E, D), can cause serious adverse events. Two water-soluble vitamins, folic acid and niacin, can also have significant toxicities and adverse events. CONCLUSIONS: Our recommendation is that vitamins A, E, D, folic acid, and niacin should be categorized as over-the-counter medications. Labeling of vitamins, especially those intended for children and other vulnerable groups, should include information on possible toxicities, dosing, recommended upper intake limits, and concurrent use with other products. Vitamin A should be excluded from multivitamin supplements and food fortificants.", "Essentials of Healthy Eating: A Guide Enough solid evidence now exists to offer women several fundamental strategies for healthy eating. They include emphasizing healthful unsaturated fats, whole grains, good protein \u201cpackages,\u201d and fruits and vegetables; limiting consumption of trans and saturated fats, highly refined grains, and sugary beverages; and taking a multivitamin with folic acid and extra vitamin D as a nutritional safety net. A diet based on these principles is healthy through virtually all life stages, from young adulthood through planning for pregnancy, pregnancy, and on into old age.", "The Effect of Replacement of Methionine by Homocystine on Survival of Malignant and Normal Adult Mammalian Cells in Culture In tissue cultures of normal adult and malignant mammalian cells, homocystine has been substituted for methionine in a medium rich in folic acid and cyanocobalamin. Normal adult cells thrive. Three highly malignant cell types from three different species, including man, die.", "[Floppy baby with macrocytic anemia and vegan mother]. We report the case of a 7 month-old girl that presented with acute anemia, generalized muscular hypotonia and failure to thrive. Laboratory evaluation revealed cobalamin deficiency, due to a vegan diet of the mother. The clinical triad of an acquired floppy baby syndrome with megaloblastic anemia and failure to thrive is pathognomic for infantile cobalamin deficiency. Neurological abnormalities are often irreversible and may be associated with delayed myelinization in the MRI. A normal cobalamin level in maternal serum and absence of anemia do not exclude subclinical deficiency. If cobalamin deficiency is suspected, e.g. in pregnant women on vegan diet, urinary methylmalonic acid excretion and plasma homocysteine levels should be determined and cobalamin substitution should be started at an early stage to avoid potentially irreversible damage of the fetus."], ["Mastalgia: a review of management. Mastalgia affects up to two-thirds of women at some time during their reproductive lives. It is usually benign, but thefear of underlying breast cancer is why many women present for evaluation. Mastalgia can be associated with premenstrual syndrome, fibrocystic breast disease, psychologic disturbance and, rarely, breast cancer. Occasionally, extramammary conditions, like Tietzie syndrome, present as mastalgia. A thorough clinical evaluation is required to assess the cause. The majority of women can be reassured after a clinical evaluation. Approximately 15% require pain-relieving therapy. Mechanical breast support; a low-fat, high-carbohydrate diet; and topical nonsteroidal antiinflammatory agents are reasonable first-line treatments. Hormonal agents, such as bromocriptine, tamoxifen and danazol, have all demonstrated efficacy in the treatment of mastalgia. Side effects, however, limit their extensive use. Danazol is the only FDA-approved hormonal treatment and is best used in cyclic form to limit the adverse effects. Lisuride maleate is a new agent recently studied for the treatment of mastalgia. Initial data on this medication are encouraging. Sixty percent of cyclic mastalgia recurs after treatment. Noncyclic mastalgia responds poorly to treatment but resolves spontaneously in up to 50% of cases.", "A wholly nutritional 'multifocal angiostatic therapy' for control of disseminated cancer. A great deal of effort is now being devoted to the development of new drugs that hopefully will control the spread of inoperable cancer by safely inhibiting tumor-evoked angiogenesis. However, there is growing evidence that certain practical nutritional measures have the potential to slow tumor angiogenesis, and it is reasonable to anticipate that, by combining several measures that work in distinct but complementary ways to impede the angiogenic process, a clinically useful 'multifocal angiostatic therapy' (MAT) might be devised. Several measures which might reasonably be included in such a protocol are discussed below, and include: a low-fat, low-glycemic index vegan diet, which may down-regulate the systemic IGF-I activity that supports angiogenesis; supplemental omega-3-rich fish oil, which has been shown to inhibit endothelial expression of Flk-1, a functionally crucial receptor for VEGF, and also can suppress tumor production of pro-angiogenic eicosanoids; high-dose selenium, which has recently been shown to inhibit tumor production of VEGF; green tea polyphenols, which can suppress endothelial responsiveness to both VEGF and fibroblast growth factor; and high-dose glycine, whose recently reported angiostatic activity may reflect inhibition of endothelial cell mitosis, possibly mediated by activation of glycine-gated chloride channels. In light of evidence that tumor-evoked angiogenesis has a high requirement for copper, copper depletion may have exceptional potential as an angiostatic measure, and is most efficiently achieved with the copper-chelating drug tetrathiomolybdate. If logistical difficulties make it difficult to acquire this experimental drug, high-dose zinc supplementation can achieve a slower depletion of the body's copper pool, and in any case can be used as maintenance therapy to maintain an adequate level of copper depletion. A provisional protocol is offered for a nutritionally based MAT entailing a vegan diet and supplemental intakes of fish oil, selenium, green tea polyphenols, glycine, and zinc. Inasmuch as cox-2 is overexpressed in many cancers, and cAMP can boost tumor production of various angiogenic factors as well as autogenous growth factors, adjunctive use of cox-2-specific NSAIDS may be warranted in some cases.", "Diagnostic accuracy of holotranscobalamin, methylmalonic acid, serum cobalamin, and other indicators of tissue vitamin B\u2081\u2082 status in the elderly. BACKGROUND: Vitamin B\u2081\u2082 deficiency is common among the elderly, and early detection is clinically important. However, clinical signs and symptoms have limited diagnostic accuracy and there is no accepted reference test method. METHODS: In elderly subjects (n = 700; age range 63-97 years), we investigated the ability of serum cobalamin, holotranscobalamin (holoTC), total homocysteine (tHcy), methylmalonic acid (MMA), serum and erythrocyte folate, and other hematologic variables to discriminate cobalamin deficiency, defined as red blood cell cobalamin <33 pmol/L. RESULTS: Serum holoTC was the best predictor, with area under the ROC curve (95% CI) 0.90 (0.86-0.93), and this was significantly better (P \u2264 0.0002) than the next best predictors; serum cobalamin, 0.80 (0.75-0.85), and MMA, 0.78 (0.72-0.83). For these 3 analytes, we constructed a 3-zone partition of positive and negative zones and a deliberate indeterminate zone between. The boundaries were values of each test that resulted in a posttest probability of deficiency of 60% and a posttest probability of no deficiency of 98%. The proportion of indeterminate observations for holoTC, cobalamin, and MMA was 14%, 45%, and 50%, respectively. Within the holoTC indeterminate zone (defined as 20-30 pmol/L), discriminant analysis selected only erythrocyte folate, which correctly allocated 65% (58/89) of the observations. Renal dysfunction compromised the diagnostic accuracy of MMA but not holoTC or serum cobalamin. CONCLUSIONS: This study supports the use of holoTC as the first-line diagnostic procedure for vitamin B\u2081\u2082 status.", "The effect of Momordica charantia capsule preparation on glycemic control in type 2 diabetes mellitus needs further studies. BACKGROUND AND OBJECTIVES: Momordica charantia, locally known as Ampalaya, is being widely used and advertised for its hypoglycemic effects. However, to date, no large clinical trial has been published on the efficacy of any type of preparation. The main objective of this study is to determine if addition of M. charantia capsules to standard therapy can decrease glycosylated hemoglobin (hemoglobin A1c or HbA1c) levels in diabetic patients with poor sugar control. STUDY DESIGN AND SETTING: A randomized, double-blind, placebo-controlled trial was conducted between April and September 2004 at the outpatient clinics of the Philippine General Hospital. The trial included 40 patients, 18 years old and above, who were either newly diagnosed or poorly controlled type 2 diabetics with A1c levels between 7% and 9%. On top of the standard therapy, the patients were randomized to either M. charantia capsules or placebo. The treatment group received two capsules of M. charantia three times a day after meals, for 3 months. The control group received placebo at the same dose. The primary efficacy endpoint was change in the A1c level in the two groups. The secondary efficacy endpoints included its effect on fasting blood sugar, serum cholesterol, and weight. Safety endpoints included effects on serum creatinine, hepatic transaminases (Alanine aminotransferase/ALT and Aspartate aminotransferase/AST), sodium, potassium, and adverse events. RESULTS: Baseline characteristics between the treatment and control groups were similar. The difference in mean change in A1c between the two groups was 0.22% in favor of M. charantia (95% CI: -0.40 to 0.84) with P=0.4825. There was no significant effect on mean fasting blood sugar, total cholesterol, and weight or on serum creatinine, ALT, AST, sodium, and potassium. There were few adverse events and these were generally mild. CONCLUSION: This is the first randomized controlled trial to shed light on the issue concerning the hypoglycemic effects of M. charantia. The investigators targeted a 1% decline in A1c at the outset with an estimated power of 88%. With the observed decline of 0.24%, the achieved power was only 11%. For this reason, we are unable to make a definite conclusion about the effectiveness of M. charantia. However, the results of this study can be used estimate the sample size for bigger studies.", "Keratomalacia. Xerophthalmia and keratomalacia are public health problems of great magnitude which are usually associated with multiple vitamin and protein deficiencies. The authors report the case of a 27-year-old commune member who subjected herself to a bizarre protein and vitamin deficient diet for many months. This ultimately produced nyctalopia, xerophthalmia and keratomalacia with bilateral corneal perforation. Despite therapy, she remained comatose and expired shortly after admission. Ocular pathological changes included bilateral corneal melting with prolapse of intraocular contents, conjunctival epidermidalization, goblet cell atrophy and thinning of the outer nuclear layer of the retina. It is noted that ocular findings in pure avitaminosis A produced experimentalyy include epithelial atrophy followed by keratinization."], ["Fructose: It\u2019s \u201cAlcohol Without the Buzz\u201d What do the Atkins Diet and the traditional Japanese diet have in common? The Atkins Diet is low in carbohydrate and usually high in fat; the Japanese diet is high in carbohydrate and usually low in fat. Yet both work to promote weight loss. One commonality of both diets is that they both eliminate the monosaccharide fructose. Sucrose (table sugar) and its synthetic sister high fructose corn syrup consist of 2 molecules, glucose and fructose. Glucose is the molecule that when polymerized forms starch, which has a high glycemic index, generates an insulin response, and is not particularly sweet. Fructose is found in fruit, does not generate an insulin response, and is very sweet. Fructose consumption has increased worldwide, paralleling the obesity and chronic metabolic disease pandemic. Sugar (i.e., fructose-containing mixtures) has been vilified by nutritionists for ages as a source of \u201cempty calories,\u201d no different from any other empty calorie. However, fructose is unlike glucose. In the hypercaloric glycogen-replete state, intermediary metabolites from fructose metabolism overwhelm hepatic mitochondrial capacity, which promotes de novo lipogenesis and leads to hepatic insulin resistance, which drives chronic metabolic disease. Fructose also promotes reactive oxygen species formation, which leads to cellular dysfunction and aging, and promotes changes in the brain\u2019s reward system, which drives excessive consumption. Thus, fructose can exert detrimental health effects beyond its calories and in ways that mimic those of ethanol, its metabolic cousin. Indeed, the only distinction is that because fructose is not metabolized in the central nervous system, it does not exert the acute neuronal depression experienced by those imbibing ethanol. These metabolic and hedonic analogies argue that fructose should be thought of as \u201calcohol without the buzz.\u201d", "Energy and Fructose From Beverages Sweetened With Sugar or High-Fructose Corn Syrup Pose a Health Risk for Some People Sugar intake in the United States has increased by >40 fold since the American Revolution. The health concerns that have been raised about the amounts of sugar that are in the current diet, primarily as beverages, are the subject of this review. Just less than 50% of the added sugars (sugar and high-fructose corn syrup) are found in soft drinks and fruit drinks. The intake of soft drinks has increased 5-fold between 1950 and 2000. Most meta-analyses have shown that the risk of obesity, diabetes, cardiovascular disease, and metabolic syndrome are related to consumption of beverages sweetened with sugar or high-fructose corn syrup. Calorically sweetened beverage intake has also been related to the risk of nonalcoholic fatty liver disease, and, in men, gout. Calorically sweetened beverages contribute to obesity through their caloric load, and the intake of beverages does not produce a corresponding reduction in the intake of other food, suggesting that beverage calories are \u201cadd-on\u201d calories. The increase in plasma triglyceride concentrations by sugar-sweetened beverages can be attributed to fructose rather than glucose in sugar. Several randomized trials of sugar-containing soft drinks versus low-calorie or calorie-free beverages show that either sugar, 50% of which is fructose, or fructose alone increases triglycerides, body weight, visceral adipose tissue, muscle fat, and liver fat. Fructose is metabolized primarily in the liver. When it is taken up by the liver, ATP decreases rapidly as the phosphate is transferred to fructose in a form that makes it easy to convert to lipid precursors. Fructose intake enhances lipogenesis and the production of uric acid. By worsening blood lipids, contributing to obesity, diabetes, fatty liver, and gout, fructose in the amounts currently consumed is hazardous to the health of some people.", "\u2018Catalytic\u2019 doses of fructose may benefit glycaemic control without harming cardiometabolic risk factors: a small meta-analysis of randomised controlled feeding trials Contrary to concerns that fructose may have adverse metabolic effects, there is evidence that small, \u2018catalytic\u2019 doses (\u00a0\u2264\u00a010\u00a0g/meal) of fructose decrease the glycaemic response to high-glycaemic index meals in human subjects. To assess the longer-term effects of \u2018catalytic\u2019 doses of fructose, we undertook a meta-analysis of controlled feeding trials. We searched MEDLINE, EMBASE, CINAHL and the Cochrane Library. Analyses included all controlled feeding trials \u2265\u00a07\u00a0d featuring \u2018catalytic\u2019 fructose doses (\u00a0\u2264\u00a036\u00a0g/d) in isoenergetic exchange for other carbohydrates. Data were pooled by the generic inverse variance method using random-effects models and expressed as mean differences (MD) with 95\u00a0% CI. Heterogeneity was assessed by the Q statistic and quantified by I2. The Heyland Methodological Quality Score assessed study quality. A total of six feeding trials (n 118) met the eligibility criteria. \u2018Catalytic\u2019 doses of fructose significantly reduced HbA1c (MD \u2212\u00a00\u00b740, 95\u00a0% CI \u2212\u00a00\u00b772, \u2212\u00a00\u00b708) and fasting glucose (MD \u2212\u00a00\u00b725, 95\u00a0% CI \u2212\u00a00\u00b744, \u2212\u00a00\u00b707). This benefit was seen in the absence of adverse effects on fasting insulin, body weight, TAG or uric acid. Subgroup and sensitivity analyses showed evidence of effect modification under certain conditions. The small number of trials and their relatively short duration limit the strength of the conclusions. In conclusion, this small meta-analysis shows that \u2018catalytic\u2019 fructose doses (\u00a0\u2264\u00a036\u00a0g/d) may improve glycaemic control without adverse effects on body weight, TAG, insulin and uric acid. There is a need for larger, longer (\u00a0\u2265\u00a06 months) trials using \u2018catalytic\u2019 fructose to confirm these results.", "The effects of high fructose syrup. High fructose corn syrup (HFCS) has become an increasingly common food ingredient in the last 40 years. However, there is concern that HFCS consumption increases the risk for obesity and other adverse health outcomes compared to other caloric sweeteners. The most commonly used types of HFCS (HFCS-42 and HFCS-55) are similar in composition to sucrose (table sugar), consisting of roughly equal amounts of fructose and glucose. The primary difference is that these monosaccharides exist free in solution in HFCS, but in disaccharide form in sucrose. The disaccharide sucrose is easily cleaved in the small intestine, so free fructose and glucose are absorbed from both sucrose and HFCS. The advantage to food manufacturers is that the free monosaccharides in HFCS provide better flavor enhancement, stability, freshness, texture, color, pourability, and consistency in foods in comparison to sucrose. Because the composition of HFCS and sucrose is so similar, particularly on absorption by the body, it appears unlikely that HFCS contributes more to obesity or other conditions than sucrose does. Nevertheless, few studies have evaluated the potentially differential effect of various sweeteners, particularly as they relate to health conditions such as obesity, which develop over relatively long periods of time. Improved nutrient databases are needed to analyze food consumption in epidemiologic studies, as are more strongly designed experimental studies, including those on the mechanism of action and relationship between fructose dose and response. At the present time, there is insufficient evidence to ban or otherwise restrict use of HFCS or other fructose-containing sweeteners in the food supply or to require the use of warning labels on products containing HFCS. Nevertheless, dietary advice to limit consumption of all added caloric sweeteners, including HFCS, is warranted.", "Sugar, Uric Acid, and the Etiology of Diabetes and Obesity The intake of added sugars, such as from table sugar (sucrose) and high-fructose corn syrup has increased dramatically in the last hundred years and correlates closely with the rise in obesity, metabolic syndrome, and diabetes. Fructose is a major component of added sugars and is distinct from other sugars in its ability to cause intracellular ATP depletion, nucleotide turnover, and the generation of uric acid. In this article, we revisit the hypothesis that it is this unique aspect of fructose metabolism that accounts for why fructose intake increases the risk for metabolic syndrome. Recent studies show that fructose-induced uric acid generation causes mitochondrial oxidative stress that stimulates fat accumulation independent of excessive caloric intake. These studies challenge the long-standing dogma that \u201ca calorie is just a calorie\u201d and suggest that the metabolic effects of food may matter as much as its energy content. The discovery that fructose-mediated generation of uric acid may have a causal role in diabetes and obesity provides new insights into pathogenesis and therapies for this important disease."], ["Galactose-\u03b1-1,3-galactose and Delayed Anaphylaxis, Angioedema, and Urticaria in Children BACKGROUND AND OBJECTIVE: Despite a thorough history and comprehensive testing, many children who present with recurrent symptoms consistent with allergic reactions elude diagnosis. Recent research has identified a novel cause for \u201cidiopathic\u201d allergic reactions; immunoglobulin E (IgE) antibody specific for the carbohydrate galactose-\u03b1-1,3-galactose (\u03b1-Gal) has been associated with delayed urticaria and anaphylaxis that occurs 3 to 6 hours after eating beef, pork, or lamb. We sought to determine whether IgE antibody to \u03b1-Gal was present in sera of pediatric patients who reported idiopathic anaphylaxis or urticaria. METHODS: Patients aged 4 to 17 were enrolled in an institutional review board\u2013approved protocol at the University of Virginia and private practice allergy offices in Lynchburg, VA. Sera was obtained and analyzed by ImmunoCAP for total IgE and specific IgE to \u03b1-Gal, beef, pork, cat epithelium and dander, Fel d 1, dog dander, and milk. RESULTS: Forty-five pediatric patients were identified who had both clinical histories supporting delayed anaphylaxis or urticaria to mammalian meat and IgE antibody specific for \u03b1-Gal. In addition, most of these cases had a history of tick bites within the past year, which itched and persisted. CONCLUSIONS: A novel form of anaphylaxis and urticaria that occurs 3 to 6 hours after eating mammalian meat is not uncommon among children in our area. Identification of these cases may not be straightforward and diagnosis is best confirmed by specific testing, which should certainly be considered for children living in the area where the Lone Star tick is common.", "Delayed Anaphylaxis to Red Meat in Patients with IgE Specific for Galactose alpha-1,3-Galactose (alpha-gal) Anaphylaxis is a severe allergic reaction that can be rapidly progressing and fatal. In instances where the triggering allergen is not known, establishing the etiology of anaphylaxis is pivotal to long-term risk management. Our recent work has identified a novel IgE antibody (Ab) response to a mammalian oligosaccharide epitope, galactose-alpha-1,3-galactose (alpha-gal), that has been associated with two distinct forms of anaphylaxis: (1) immediate onset anaphylaxis during first exposure to intravenous cetuximab, and (2) delayed onset anaphylaxis 3\u20136 h after ingestion of mammalian food products (e.g., beef and pork). The results of our studies strongly suggest that tick bites are a cause, if not the only significant cause, of IgE Ab responses to alpha-gal in the southern, eastern and central United States. Patients with IgE Ab to alpha-gal continue to emerge and, increasingly, these cases involve children. This IgE Ab response cross-reacts with cat and dog but does not appear to pose a risk for asthma; however, it may impair diagnostic testing in some situations.", "Delayed anaphylaxis, angioedema, or urticaria after consumption of red meat in patients with IgE antibodies specific for galactose-\u03b1-1,3-galactose Background Carbohydrate moieties are frequently encountered in food and can elicit IgE responses, the clinical significance of which has been unclear. Recent work, however, has shown that IgE antibodies to galactose-\u03b1-1,3-galactose (\u03b1-gal), a carbohydrate commonly expressed on nonprimate mammalian proteins, are capable of eliciting serious, even fatal, reactions. Objective We sought to determine whether IgE antibodies to \u03b1-gal are present in sera from patients who report anaphylaxis or urticaria after eating beef, pork, or lamb. Methods Detailed histories were taken from patients presenting to the University of Virginia Allergy Clinic. Skin prick tests (SPTs), intradermal skin tests, and serum IgE antibody analysis were performed for common indoor, outdoor, and food allergens. Results Twenty-four patients with IgE antibodies to \u03b1-gal were identified. These patients described a similar history of anaphylaxis or urticaria 3 to 6 hours after the ingestion of meat and reported fewer or no episodes when following an avoidance diet. SPTs to mammalian meat produced wheals of usually less than 4 mm, whereas intradermal or fresh-food SPTs provided larger and more consistent wheal responses. CAP-RAST testing revealed specific IgE antibodies to beef, pork, lamb, cow\u2019s milk, cat, and dog but not turkey, chicken, or fish. Absorption experiments indicated that this pattern of sensitivity was explained by an IgE antibody specific for \u03b1-gal. Conclusion We report a novel and severe food allergy related to IgE antibodies to the carbohydrate epitope \u03b1-gal. These patients experience delayed symptoms of anaphylaxis, angioedema, or urticaria associated with eating beef, pork, or lamb.", "Anaphylaxis to pork kidney is related to IgE antibodies specific for galactose-alpha-1,3-galactose. BACKGROUND: Carbohydrate-specific IgE antibodies present on nonprimate mammalian proteins were incriminated recently in delayed meat anaphylaxis. The aim of this study was to explore whether anaphylaxis to mammalian kidney is also associated with galactose-\u03b1-1,3-galactose (\u03b1Gal)-specific IgE. METHODS: Fourteen patients with anaphylaxis to pork or beef kidney underwent prick tests to meat and kidney. Some patients also underwent skin tests to Erbitux(\u00ae) (cetuximab). IgE antibodies to \u03b1Gal, swine urine proteins, beef and pork meat, serum albumin proteins, cat, and rFel d 1 were measured by ImmunoCAP(\u00ae). The \u03b1Gal levels were estimated in meats and kidney by ELISA inhibition assay. Cross-reactivity between \u03b1Gal and pork kidney was studied with the ImmunoCAP(\u00ae) inhibition assay. RESULTS: Among the 14 patients, 12 presented with anaphylactic shock. Reactions occurred within 2 h from exposure in 67% of patients. Associated risk factors were observed in 10 cases, and alcohol was the main cofactor. Three patients underwent an oral challenge to pork kidney, and anaphylaxis occurred after ingestion of small quantities (1-2 g). Prick tests to kidney were positive in 54% of patients. All tested patients showed positive skin tests to Erbitux(\u00ae). All patients tested positive for IgE to \u03b1Gal, with levels ranging from 0.4 to 294 kU/l. IgE binding to \u03b1Gal was inhibited by raw pork kidney extract (mean, 77%; range, 55-87%), which showed a high amount of \u03b1Gal determinants. CONCLUSIONS: Pork or beef kidney anaphylaxis is related to \u03b1Gal IgE. Its peculiar severity could be due to an elevated content of \u03b1Gal epitopes in kidney. \u00a9 2012 John Wiley & Sons A/S.", "A unique natural human IgG antibody with anti-alpha-galactosyl specificity A new natural anti-alpha-galactosyl IgG antibody (anti-Gal) was found to be present in high titer in the serum of every normal individual studied. The antibody was isolated by affinity chromatography on a melibiose-Sepharose column. The reactivity of the antibody was assessed by its interaction with alpha-galactosyl residues on rabbit erythrocytes (RabRBC). The specificity was determined by inhibition experiments with various carbohydrates. The anti-Gal interacts with alpha-galactosyl residues, possibly on glycolipids of human RBC (HuRBC), after removal of membrane proteins by treatment with pronase. In addition, the anti-Gal bind specifically to normal and pathologically senescent HuRBC, suggesting a physiological role for this natural antibody in the aging of RBC. The ubiquitous presence of anti-Gal in high titers throughout life implies a constant antigenic stimulation. In addition to the theoretical interest in the antibody, the study of the anti-Gal reactivity seems to bear immunodiagnostic significance. Decrease in the antibody titer was found to reflect humoral immunodeficiency disorders."], ["Property rights and genetic engineering: developing nations at risk. Eighty percent of (commercial) genetically engineered seeds (GES) are designed only to resist herbicides. Letting farmers use more chemicals, they cut labor costs. But developing nations say GES cause food shortages, unemployment, resistant weeds, and extinction of native cultivars when \\\"volunteers\\\" drift nearby. While GES patents are reasonable, this paper argues many patent policies are not. The paper surveys GE technology, outlines John Locke's classic account of property rights, and argues that current patent policies must be revised to take account of Lockean ethical constraints. After answering a key objection, it provides concrete suggestions for implementing its ethical conclusions.", "The Restriction of Zoonotic PERV Transmission by Human APOBEC3G The human APOBEC3G protein is an innate anti-viral factor that can dominantly inhibit the replication of some endogenous and exogenous retroviruses. The prospects of purposefully harnessing such an anti-viral defense are under investigation. Here, long-term co-culture experiments were used to show that porcine endogenous retrovirus (PERV) transmission from pig to human cells is reduced to nearly undetectable levels by expressing human APOBEC3G in virus-producing pig kidney cells. Inhibition occurred by a deamination-independent mechanism, likely after particle production but before the virus could immortalize by integration into human genomic DNA. PERV inhibition did not require the DNA cytosine deaminase activity of APOBEC3G and, correspondingly, APOBEC3G-attributable hypermutations were not detected. In contrast, over-expression of the sole endogenous APOBEC3 protein of pigs failed to interfere significantly with PERV transmission. Together, these data constitute the first proof-of-principle demonstration that APOBEC3 proteins can be used to fortify the innate anti-viral defenses of cells to prevent the zoonotic transmission of an endogenous retrovirus. These studies suggest that human APOBEC3G-transgenic pigs will provide safer, PERV-less xenotransplantation resources and that analogous cross-species APOBEC3-dependent restriction strategies may be useful for thwarting other endogenous as well as exogenous retrovirus infections.", "The Restriction of Zoonotic PERV Transmission by Human APOBEC3G The human APOBEC3G protein is an innate anti-viral factor that can dominantly inhibit the replication of some endogenous and exogenous retroviruses. The prospects of purposefully harnessing such an anti-viral defense are under investigation. Here, long-term co-culture experiments were used to show that porcine endogenous retrovirus (PERV) transmission from pig to human cells is reduced to nearly undetectable levels by expressing human APOBEC3G in virus-producing pig kidney cells. Inhibition occurred by a deamination-independent mechanism, likely after particle production but before the virus could immortalize by integration into human genomic DNA. PERV inhibition did not require the DNA cytosine deaminase activity of APOBEC3G and, correspondingly, APOBEC3G-attributable hypermutations were not detected. In contrast, over-expression of the sole endogenous APOBEC3 protein of pigs failed to interfere significantly with PERV transmission. Together, these data constitute the first proof-of-principle demonstration that APOBEC3 proteins can be used to fortify the innate anti-viral defenses of cells to prevent the zoonotic transmission of an endogenous retrovirus. These studies suggest that human APOBEC3G-transgenic pigs will provide safer, PERV-less xenotransplantation resources and that analogous cross-species APOBEC3-dependent restriction strategies may be useful for thwarting other endogenous as well as exogenous retrovirus infections.", "Regulation of skeletal muscle mass in mice by a new TGF-beta superfamily member. The transforming growth factor-beta (TGF-beta) superfamily encompasses a large group of growth and differentiation factors playing important roles in regulating embryonic development and in maintaining tissue homeostasis in adult animals. Using degenerate polymerase chain reaction, we have identified a new murine TGF-beta family member, growth/differentiation factor-8 (GDF-8), which is expressed specifically in developing and adult skeletal muscle. During early stages of embryogenesis, GDF-8 expression is restricted to the myotome compartment of developing somites. At later stages and in adult animals, GDF-8 is expressed in many different muscles throughout the body. To determine the biological function of GDF-8, we disrupted the GDF-8 gene by gene targeting in mice. GDF-8 null animals are significantly larger than wild-type animals and show a large and widespread increase in skeletal muscle mass. Individual muscles of mutant animals weigh 2-3 times more than those of wild-type animals, and the increase in mass appears to result from a combination of muscle cell hyperplasia and hypertrophy. These results suggest that GDF-8 functions specifically as a negative regulator of skeletal muscle growth.", "Treating aging: progress toward dietary restriction mimetics During the last decade, biogerontologists have labored to understand the biological basis of the aging process by studying the genes and signaling pathways that regulate it. But the last year has seen a breakthrough in a different direction: toward treatments that might slow aging by mimicking the effects of dietary restriction."], ["A comparative risk assessment of burden of disease and injury attributable to 67 risk factors and risk factor clusters in 21 regions, 1990\u20132010: a systematic analysis for the Global Burden of Disease Study 2010 Summary Background Quantification of the disease burden caused by different risks informs prevention by providing an account of health loss different to that provided by a disease-by-disease analysis. No complete revision of global disease burden caused by risk factors has been done since a comparative risk assessment in 2000, and no previous analysis has assessed changes in burden attributable to risk factors over time. Methods We estimated deaths and disability-adjusted life years (DALYs; sum of years lived with disability [YLD] and years of life lost [YLL]) attributable to the independent effects of 67 risk factors and clusters of risk factors for 21 regions in 1990 and 2010. We estimated exposure distributions for each year, region, sex, and age group, and relative risks per unit of exposure by systematically reviewing and synthesising published and unpublished data. We used these estimates, together with estimates of cause-specific deaths and DALYs from the Global Burden of Disease Study 2010, to calculate the burden attributable to each risk factor exposure compared with the theoretical-minimum-risk exposure. We incorporated uncertainty in disease burden, relative risks, and exposures into our estimates of attributable burden. Findings In 2010, the three leading risk factors for global disease burden were high blood pressure (7\u00b70% [95% uncertainty interval 6\u00b72\u20137\u00b77] of global DALYs), tobacco smoking including second-hand smoke (6\u00b73% [5\u00b75\u20137\u00b70]), and alcohol use (5\u00b75% [5\u00b70\u20135\u00b79]). In 1990, the leading risks were childhood underweight (7\u00b79% [6\u00b78\u20139\u00b74]), household air pollution from solid fuels (HAP; 7\u00b70% [5\u00b76\u20138\u00b73]), and tobacco smoking including second-hand smoke (6\u00b71% [5\u00b74\u20136\u00b78]). Dietary risk factors and physical inactivity collectively accounted for 10\u00b70% (95% UI 9\u00b72\u201310\u00b78) of global DALYs in 2010, with the most prominent dietary risks being diets low in fruits and those high in sodium. Several risks that primarily affect childhood communicable diseases, including unimproved water and sanitation and childhood micronutrient deficiencies, fell in rank between 1990 and 2010, with unimproved water we and sanitation accounting for 0\u00b79% (0\u00b74\u20131\u00b76) of global DALYs in 2010. However, in most of sub-Saharan Africa childhood underweight, HAP, and non-exclusive and discontinued breastfeeding were the leading risks in 2010, while HAP was the leading risk in south Asia. The leading risk factor in Eastern Europe, most of Latin America, and southern sub-Saharan Africa in 2010 was alcohol use; in most of Asia, North Africa and Middle East, and central Europe it was high blood pressure. Despite declines, tobacco smoking including second-hand smoke remained the leading risk in high-income north America and western Europe. High body-mass index has increased globally and it is the leading risk in Australasia and southern Latin America, and also ranks high in other high-income regions, North Africa and Middle East, and Oceania. Interpretation Worldwide, the contribution of different risk factors to disease burden has changed substantially, with a shift away from risks for communicable diseases in children towards those for non-communicable diseases in adults. These changes are related to the ageing population, decreased mortality among children younger than 5 years, changes in cause-of-death composition, and changes in risk factor exposures. New evidence has led to changes in the magnitude of key risks including unimproved water and sanitation, vitamin A and zinc deficiencies, and ambient particulate matter pollution. The extent to which the epidemiological shift has occurred and what the leading risks currently are varies greatly across regions. In much of sub-Saharan Africa, the leading risks are still those associated with poverty and those that affect children. Funding Bill & Melinda Gates Foundation.", "Global and regional mortality from 235 causes of death for 20 age groups in 1990 and 2010: a systematic analysis for the Global Burden of Disease S... BACKGROUND: Reliable and timely information on the leading causes of death in populations, and how these are changing, is a crucial input into health policy debates. In the Global Burden of Diseases, Injuries, and Risk Factors Study 2010 (GBD 2010), we aimed to estimate annual deaths for the world and 21 regions between 1980 and 2010 for 235 causes, with uncertainty intervals (UIs), separately by age and sex. METHODS: We attempted to identify all available data on causes of death for 187 countries from 1980 to 2010 from vital registration, verbal autopsy, mortality surveillance, censuses, surveys, hospitals, police records, and mortuaries. We assessed data quality for completeness, diagnostic accuracy, missing data, stochastic variations, and probable causes of death. We applied six different modelling strategies to estimate cause-specific mortality trends depending on the strength of the data. For 133 causes and three special aggregates we used the Cause of Death Ensemble model (CODEm) approach, which uses four families of statistical models testing a large set of different models using different permutations of covariates. Model ensembles were developed from these component models. We assessed model performance with rigorous out-of-sample testing of prediction error and the validity of 95% UIs. For 13 causes with low observed numbers of deaths, we developed negative binomial models with plausible covariates. For 27 causes for which death is rare, we modelled the higher level cause in the cause hierarchy of the GBD 2010 and then allocated deaths across component causes proportionately, estimated from all available data in the database. For selected causes (African trypanosomiasis, congenital syphilis, whooping cough, measles, typhoid and parathyroid, leishmaniasis, acute hepatitis E, and HIV/AIDS), we used natural history models based on information on incidence, prevalence, and case-fatality. We separately estimated cause fractions by aetiology for diarrhoea, lower respiratory infections, and meningitis, as well as disaggregations by subcause for chronic kidney disease, maternal disorders, cirrhosis, and liver cancer. For deaths due to collective violence and natural disasters, we used mortality shock regressions. For every cause, we estimated 95% UIs that captured both parameter estimation uncertainty and uncertainty due to model specification where CODEm was used. We constrained cause-specific fractions within every age-sex group to sum to total mortality based on draws from the uncertainty distributions. FINDINGS: In 2010, there were 52\u00b78 million deaths globally. At the most aggregate level, communicable, maternal, neonatal, and nutritional causes were 24\u00b79% of deaths worldwide in 2010, down from 15\u00b79 million (34\u00b71%) of 46\u00b75 million in 1990. This decrease was largely due to decreases in mortality from diarrhoeal disease (from 2\u00b75 to 1\u00b74 million), lower respiratory infections (from 3\u00b74 to 2\u00b78 million), neonatal disorders (from 3\u00b71 to 2\u00b72 million), measles (from 0\u00b763 to 0\u00b713 million), and tetanus (from 0\u00b727 to 0\u00b706 million). Deaths from HIV/AIDS increased from 0\u00b730 million in 1990 to 1\u00b75 million in 2010, reaching a peak of 1\u00b77 million in 2006. Malaria mortality also rose by an estimated 19\u00b79% since 1990 to 1\u00b717 million deaths in 2010. Tuberculosis killed 1\u00b72 million people in 2010. Deaths from non-communicable diseases rose by just under 8 million between 1990 and 2010, accounting for two of every three deaths (34\u00b75 million) worldwide by 2010. 8 million people died from cancer in 2010, 38% more than two decades ago; of these, 1\u00b75 million (19%) were from trachea, bronchus, and lung cancer. Ischaemic heart disease and stroke collectively killed 12\u00b79 million people in 2010, or one in four deaths worldwide, compared with one in five in 1990; 1\u00b73 million deaths were due to diabetes, twice as many as in 1990. The fraction of global deaths due to injuries (5\u00b71 million deaths) was marginally higher in 2010 (9\u00b76%) compared with two decades earlier (8\u00b78%). This was driven by a 46% rise in deaths worldwide due to road traffic accidents (1\u00b73 million in 2010) and a rise in deaths from falls. Ischaemic heart disease, stroke, chronic obstructive pulmonary disease (COPD), lower respiratory infections, lung cancer, and HIV/AIDS were the leading causes of death in 2010. Ischaemic heart disease, lower respiratory infections, stroke, diarrhoeal disease, malaria, and HIV/AIDS were the leading causes of years of life lost due to premature mortality (YLLs) in 2010, similar to what was estimated for 1990, except for HIV/AIDS and preterm birth complications. YLLs from lower respiratory infections and diarrhoea decreased by 45-54% since 1990; ischaemic heart disease and stroke YLLs increased by 17-28%. Regional variations in leading causes of death were substantial. Communicable, maternal, neonatal, and nutritional causes still accounted for 76% of premature mortality in sub-Saharan Africa in 2010. Age standardised death rates from some key disorders rose (HIV/AIDS, Alzheimer's disease, diabetes mellitus, and chronic kidney disease in particular), but for most diseases, death rates fell in the past two decades; including major vascular diseases, COPD, most forms of cancer, liver cirrhosis, and maternal disorders. For other conditions, notably malaria, prostate cancer, and injuries, little change was noted. INTERPRETATION: Population growth, increased average age of the world's population, and largely decreasing age-specific, sex-specific, and cause-specific death rates combine to drive a broad shift from communicable, maternal, neonatal, and nutritional causes towards non-communicable diseases. Nevertheless, communicable, maternal, neonatal, and nutritional causes remain the dominant causes of YLLs in sub-Saharan Africa. Overlaid on this general pattern of the epidemiological transition, marked regional variation exists in many causes, such as interpersonal violence, suicide, liver cancer, diabetes, cirrhosis, Chagas disease, African trypanosomiasis, melanoma, and others. Regional heterogeneity highlights the importance of sound epidemiological assessments of the causes of death on a regular basis. FUNDING: Bill & Melinda Gates Foundation. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Forecasting the global burden of Alzheimer's disease. BACKGROUND: Our goal was to forecast the global burden of Alzheimer's disease and evaluate the potential impact of interventions that delay disease onset or progression. METHODS: A stochastic, multistate model was used in conjunction with United Nations worldwide population forecasts and data from epidemiological studies of the risks of Alzheimer's disease. RESULTS: In 2006, the worldwide prevalence of Alzheimer's disease was 26.6 million. By 2050, the prevalence will quadruple, by which time 1 in 85 persons worldwide will be living with the disease. We estimate about 43% of prevalent cases need a high level of care, equivalent to that of a nursing home. If interventions could delay both disease onset and progression by a modest 1 year, there would be nearly 9.2 million fewer cases of the disease in 2050, with nearly the entire decline attributable to decreases in persons needing a high level of care. CONCLUSIONS: We face a looming global epidemic of Alzheimer's disease as the world's population ages. Modest advances in therapeutic and preventive strategies that lead to even small delays in the onset and progression of Alzheimer's disease can significantly reduce the global burden of this disease.", "Risk factors for ischaemic and intracerebral haemorrhagic stroke in 22 countries (the INTERSTROKE study): a case-control study. BACKGROUND: The contribution of various risk factors to the burden of stroke worldwide is unknown, particularly in countries of low and middle income. We aimed to establish the association of known and emerging risk factors with stroke and its primary subtypes, assess the contribution of these risk factors to the burden of stroke, and explore the differences between risk factors for stroke and myocardial infarction. METHODS: We undertook a standardised case-control study in 22 countries worldwide between March 1, 2007, and April 23, 2010. Cases were patients with acute first stroke (within 5 days of symptoms onset and 72 h of hospital admission). Controls had no history of stroke, and were matched with cases for age and sex. All participants completed a structured questionnaire and a physical examination, and most provided blood and urine samples. We calculated odds ratios (ORs) and population-attributable risks (PARs) for the association of all stroke, ischaemic stroke, and intracerebral haemorrhagic stroke with selected risk factors. FINDINGS: In the first 3000 cases (n=2337, 78%, with ischaemic stroke; n=663, 22%, with intracerebral haemorrhagic stroke) and 3000 controls, significant risk factors for all stroke were: history of hypertension (OR 2.64, 99% CI 2.26-3.08; PAR 34.6%, 99% CI 30.4-39.1); current smoking (2.09, 1.75-2.51; 18.9%, 15.3-23.1); waist-to-hip ratio (1.65, 1.36-1.99 for highest vs lowest tertile; 26.5%, 18.8-36.0); diet risk score (1.35, 1.11-1.64 for highest vs lowest tertile; 18.8%, 11.2-29.7); regular physical activity (0.69, 0.53-0.90; 28.5%, 14.5-48.5); diabetes mellitus (1.36, 1.10-1.68; 5.0%, 2.6-9.5); alcohol intake (1.51, 1.18-1.92 for more than 30 drinks per month or binge drinking; 3.8%, 0.9-14.4); psychosocial stress (1.30, 1.06-1.60; 4.6%, 2.1-9.6) and depression (1.35, 1.10-1.66; 5.2%, 2.7-9.8); cardiac causes (2.38, 1.77-3.20; 6.7%, 4.8-9.1); and ratio of apolipoproteins B to A1 (1.89, 1.49-2.40 for highest vs lowest tertile; 24.9%, 15.7-37.1). Collectively, these risk factors accounted for 88.1% (99% CI 82.3-92.2) of the PAR for all stroke. When an alternate definition of hypertension was used (history of hypertension or blood pressure >160/90 mm Hg), the combined PAR was 90.3% (85.3-93.7) for all stroke. These risk factors were all significant for ischaemic stroke, whereas hypertension, smoking, waist-to-hip ratio, diet, and alcohol intake were significant risk factors for intracerebral haemorrhagic stroke. INTERPRETATION: Our findings suggest that ten risk factors are associated with 90% of the risk of stroke. Targeted interventions that reduce blood pressure and smoking, and promote physical activity and a healthy diet, could substantially reduce the burden of stroke. FUNDING: Canadian Institutes of Health Research, Heart and Stroke Foundation of Canada, Canadian Stroke Network, Pfizer Cardiovascular Award, Merck, AstraZeneca, and Boehringer Ingelheim. Copyright 2010 Elsevier Ltd. All rights reserved.", "A global view on the development of non communicable diseases. For a long time non communicable diseases (NCDs) were discussed as burden of the developed world. Recent alarming data show a reverse trend and a dramatic increase of NCDs in the developing world, in particular in highly populated transition countries. This is true for the main mortality triggering diseases such as CVD, cancer or diabetes. Almost 4 out of 5 NCD based deaths happen in low- and middle income countries. This development is multi-factorial and is based on some main trends such as globalization, supermarket growth, rapid urbanization and increasingly sedentary lifestyles. The latter leads to overweight or obesity, which again promotes NCDs similar as high blood pressure, high cholesterol and elevated blood glucose. A high quality diet including functional food or functional ingredients, accompanied by physical activity and a non-smoking policy, is one of the most promising factors in primary and secondary prevention of NCDs. Copyright \u00a9 2011 Elsevier Inc. All rights reserved."], ["Goji (Lycium barbarum and L. chinense): Phytochemistry, pharmacology and safety in the perspective of traditional uses and recent popularity. Since the beginning of this century, Goji berries and juice are being sold as health food products in western countries and praised in advertisements and in the media for well-being and as an anti-aging remedy. The popularity of Goji products has rapidly grown over the last years thanks to efficient marketing strategies. Goji is a relatively new name given to Lycium barbarum and L. chinense, two close species with a long tradition of use as medicinal and food plants in East Asia, in particular in China. While only L. barbarum is officinal, the fruit (fructus Lycii) and the root bark (cortex Lycii radicis) of both species are used in the folk medicine. We review here the constituents, pharmacology, safety, and uses of L. barbarum and L. chinense with consideration to the different parts of the plant. Investigations of the fruit have focused on proteoglycans, known as \\\" Lycium barbarum polysaccharides\\\", which showed antioxidative properties and some interesting pharmacological activities in the context of age related diseases such as atherosclerosis and diabetes. As to the root bark, several compounds have demonstrated a hepatoprotective action as well as inhibitory effects on the rennin/angiotensin system which may support the traditional use for the treatment of hypertension. While there are no signs of toxicity of this plant, two cases of possible interaction with warfarin point to a potential risk of drug interaction. In view of the available pharmacological data and the long tradition of use in the traditional Chinese medicine, L. barbarum and L. chinense certainly deserve further investigation. However, clinical evidences and rigorous procedures for quality control are indispensable before any recommendation of use can be made for Goji products. Copyright Georg Thieme Verlag KG Stuttgart . New York.", "Goji berry effects on macular characteristics and plasma antioxidant levels. PURPOSE: Goji berry (Lycium barbarum L.) is purported to benefit vision because of its high antioxidant (especially zeaxanthin) content, although this effect has not been demonstrated in high-quality human studies. The purpose of this study was to evaluate the effects of daily supplementation with a proprietary milk-based formulation of goji berry, Lacto-Wolfberry (LWB), on macular characteristics and plasma zeaxanthin and antioxidant capacity levels in elderly subjects. METHODS: This was a double-masked, randomized, placebo-controlled trial in healthy elderly subjects (range, 65 to 70 years) receiving 13.7 g/d of LWB (n = 75) or placebo (n = 75) for 90 days. Subjects underwent direct ophthalmic examination to assess pigmentation and soft drusen count in the macula and a blood draw to measure plasma zeaxanthin level and total antioxidant capacity. RESULTS: The placebo group demonstrated hypopigmentation and soft drusen accumulation in the macula, whereas the LWB group remained stable. Both plasma zeaxanthin level and antioxidant capacity increased significantly in the LWB group, by 26% and 57%, respectively, but did not change in the placebo group. No product-related adverse events were reported in either group. CONCLUSIONS: Overall, daily dietary supplementation with goji berry for 90 days increases plasma zeaxanthin and antioxidant levels as well as protects from hypopigmentation and soft drusen accumulation in the macula of elderly subjects. However, the mechanism of action is unclear, given the lack of relationship between change in plasma zeaxanthin and change in macular characteristics.", "Fasting plasma zeaxanthin response to Fructus barbarum L. (wolfberry; Kei Tze) in a food-based human supplementation trial. Age-related macular degeneration (AMD) is a common disorder that causes irreversible loss of central vision. Increased intake of foods containing zeaxanthin may be effective in preventing AMD because the macula accumulates zeaxanthin and lutein, oxygenated carotenoids with antioxidant and blue light-absorbing properties. Lycium barbarum L. is a small red berry known as Fructus lycii and wolfberry in the West, and Kei Tze and Gou Qi Zi in Asia. Wolfberry is rich in zeaxanthin dipalmitate, and is valued in Chinese culture for being good for vision. The aim of this study, which was a single-blinded, placebo-controlled, human intervention trial of parallel design, was to provide data on how fasting plasma zeaxanthin concentration changes as a result of dietary supplementation with whole wolfberries. Fasting blood was collected from healthy, consenting subjects; fourteen subjects took 15 g/d wolfberry (estimated to contain almost 3 mg zeaxanthin) for 28 d. Repeat fasting blood was collected on day 29. Age- and sex-matched controls (n 13) took no wolfberry. Responses in the two groups were compared using the Mann-Whitney test. After supplementation, plasma zeaxanthin increased 2.5-fold: mean values on day 1 and 29 were 0.038 (sem 0.003) and 0.096 (sem 0.009) micromol/l (P<0.01), respectively, for the supplementation group; and 0.038 (sem 0.003) and 0.043 (sem 0.003) micromol/l (P>0.05), respectively, for the control group. This human supplementation trial shows that zeaxanthin in whole wolfberries is bioavailable and that intake of a modest daily amount markedly increases fasting plasma zeaxanthin levels. These new data will support further study of dietary strategies to maintain macular pigment density.", "Recent trends and advances in berry health benefits research. Recent advances have been made in our scientific understanding of how berries promote human health and prevent chronic illnesses such as some cancers, heart disease, and neurodegenerative diseases. Cancer is rapidly overtaking heart disease as the number one killer disease in developed countries, and this phenomenon is coupled with a growing aging population and concomitant age-related diseases. Therefore, it is not surprising that consumers are turning toward foods with medicinal properties as promising dietary interventions for disease prevention and health maintenance. Among fruits, berries of all colors have emerged as champions with substantial research data supporting their abilities to positively affect multiple disease states. Apart from several essential dietary components found in berries, such as vitamins, minerals, and fiber, berries also contain numerous bioactives that provide health benefits that extend beyond basic nutrition. Berry bioactives encompass a wide diversity of phytochemicals (phytonutrients) ranging from fat-soluble/lipophilic to water-soluble/hydrophilic compounds. Recent research from laboratories across the globe has provided useful insights into the biological effects and underlying mechanisms of actions resulting from eating berries. The cluster of papers included here represents a cross section of topics discussed at the 2009 International Berry Health Benefits Symposium. Together, these papers provide valuable insight into recent research trends and advances made into evaluating the various health benefits that may result from the consumption of berries and their derived products.", "Cyclooxygenase inhibitory and antioxidant cyanidin glycosides in cherries and berries. Anthocyanins from tart cherries, Prunus cerasus L. (Rosaceae) cv. Balaton and Montmorency; sweet cherries, Prunus avium L. (Rosaceae); bilberries, Vaccinum myrtillus L. (Ericaceae); blackberries, Rubus sp. (Rosaceae); blueberries var. Jersey, Vaccinium corymbosum L. (Ericaceae); cranberries var. Early Black, Vaccinium macrocarpon Ait. (Ericaceae); elderberries, Sambucus canadensis (Caprifoliaceae); raspberries, Rubus idaeus (Rosaceae); and strawberries var. Honeoye, Fragaria x ananassa Duch. (Rosaceae), were investigated for cyclooxygenase inhibitory and antioxidant activities. The presence and levels of cyanidin-3-glucosylrutinoside 1 and cyanidin-3-rutinoside 2 were determined in the fruits using HPLC. The antioxidant activity of anthocyanins from cherries was comparable to the commercial antioxidants, tert-butylhydroquinone, butylated hydroxytoluene and butylated hydroxyanisole, and superior to vitamin E, at a test concentration of 125 microg/ml. Anthocyanins from raspberries and sweet cherries demonstrated 45% and 47% cyclooxygenase-I and cyclooxygenase-II inhibitory activities, respectively, when assayed at 125 microg/ml. The cyclooxygenase inhibitory activities of anthocyanins from these fruits were comparable to those of ibuprofen and naproxen at 10 microM concentrations. Anthocyanins 1 and 2 are present in both cherries and raspberry. The yields of pure anthocyanins 1 and 2 in 100 g Balaton and Montmorency tart cherries, sweet cherries and raspberries were 21, 16.5; 11, 5; 4.95, 21; and 4.65, 13.5 mg, respectively. Fresh blackberries and strawberries contained only anthocyanin 2 in yields of 24 and 22.5 mg/100 g, respectively. Anthocyanins 1 and 2 were not found in bilberries, blueberries, cranberries or elderberries."], ["Anthocyanin-rich grape extract blocks breast cell DNA damage. Anthocyanins, belonging to the flavonoid family of phytochemicals, have received attention as agents that may have potential in preventing chronic diseases such as cardiovascular diseases and certain cancers. In the present study, an anthocyanin-rich extract from Concord grapes [referred to as Concord grape extract (CGE)] and the anthocyanin delphinidin were evaluated for their capacity to inhibit DNA adduct formation due to the environmental carcinogen benzo[a]pyrene (BP) in MCF-10F cells, a noncancerous, immortalized human breast epithelial cell line. CGE at 10 and 20 microg/mL and delphinidin at 0.6 microM concentrations significantly inhibited BP-DNA adduct formation. This was associated with a significant increase in activities of the phase II detoxification enzymes glutathione S-transferase and NAD(P)H:quinone reductase 1. In addition, these grape components also suppressed reactive oxygen species (ROS) formation, but did not induce antioxidant response element-dependent transcription. Taken together, these data suggest that CGE and a component grape anthocyanin have breast cancer chemopreventive potential due in part to their capacity to block carcinogen-DNA adduct formation, modulate activities of carcinogen-metabolizing enzymes, and suppress ROS in these noncancerous human breast cells.", "Strawberry fields forever? On the basis of copious preclinical data supporting the preventive efficacy of small fruits such as berries and grapes, Chen and colleagues conducted a randomized (noncomparative) phase II trial evaluating two doses of strawberry powder (60 g/d or 30 g/d for six months) to prevent esophageal cancer in China (reported in this issue of the journal, beginning on page 41); 60 g/d reduced the histologic grade of dysplastic lesions and reduced localized biomarkers, whereas 30 g/d was not effective. Fundamental questions remain such as the best formulation of strawberry powder, the active components associated with powder, and the actual mechanism of action, and standardized preparations will be required to permit the widespread use of strawberry powder with a predicable outcome. Clearly, however, this work is a good example of proof-of-principle and highlights the important role of diet, nutrition, and natural products in cancer prevention. \u00a92012 AACR.", "The grapefruit: an old wine in a new glass? Metabolic and cardiovascular perspectives Summary Grapefruit is a popular, tasty and nutritive fruit enjoyed globally. Biomedical evidence in the last 10 years has, however, shown that consumption of grapefruit or its juice is associated with drug interactions, which, in some cases, have been fatal. Grapefruit-induced drug interactions are unique in that the cytochrome P450 enzyme CYP3A4, which metabolises over 60% of commonly prescribed drugs as well as other drug transporter proteins such as P-glycoprotein and organic cation transporter proteins, which are all expressed in the intestines, are involved. However, the extent to which grapefruit\u2013drug interactions impact on clinical settings has not been fully determined, probably because many cases are not reported. It has recently emerged that grapefruit, by virtue of its rich flavonoid content, is beneficial in the management of degenerative diseases such as diabetes and cardiovascular disorders. This potentially explosive subject is reviewed here.", "The grapefruit: an old wine in a new glass? Metabolic and cardiovascular perspectives Summary Grapefruit is a popular, tasty and nutritive fruit enjoyed globally. Biomedical evidence in the last 10 years has, however, shown that consumption of grapefruit or its juice is associated with drug interactions, which, in some cases, have been fatal. Grapefruit-induced drug interactions are unique in that the cytochrome P450 enzyme CYP3A4, which metabolises over 60% of commonly prescribed drugs as well as other drug transporter proteins such as P-glycoprotein and organic cation transporter proteins, which are all expressed in the intestines, are involved. However, the extent to which grapefruit\u2013drug interactions impact on clinical settings has not been fully determined, probably because many cases are not reported. It has recently emerged that grapefruit, by virtue of its rich flavonoid content, is beneficial in the management of degenerative diseases such as diabetes and cardiovascular disorders. This potentially explosive subject is reviewed here.", "Biological Clues to Potent DNA-Damaging Activities in Food and Flavoring Population differences in age-related diseases and cancer could stem from differences in diet. To characterize DNA strand-breaking activities in selected foods/beverages, flavorings, and some of their constituent chemicals, we used p53R cells, a cellular assay sensitive to such breaks. Substances testing positive included reference chemicals: quinacrine (peak response, 51X) and etoposide (33X); flavonoids: EGCG (19X), curcumin (12X), apigenin (9X), and quercetin (7X); beverages: chamomile (11X), green (21X), and black tea (26X) and coffee (3 to 29X); and liquid smoke (4 to 28X). Damage occurred at dietary concentrations: etoposide near 5 \u03bcg/ml produced responses similar to a 1:1000 dilution of liquid smoke, a 1:20 dilution of coffee, and a 1:5 dilution of tea. Pyrogallol-related chemicals and tannins are present in dietary sources and individually produced strong activity: pyrogallol (30X), 3-methoxycatechol (25X), gallic acid (21X), and 1,2,4-benzenetriol (21X). From structure-activity relationships, high activities depended on specific orientations of hydroxyls on the benzene ring. Responses accompanied cellular signals characteristic of DNA breaks such as H2AX phosphorylation. Breaks were also directly detected by comet assay. Cellular toxicological effects of foods and flavorings could guide epidemiologic and experimental studies of potential disease risks from DNA strand-breaking chemicals in diets.", "Cancer chemopreventive potential of apples, apple juice, and apple components. Apples ( MALUS sp., Rosaceae) are a rich source of nutrient as well as non-nutrient components and contain high levels of polyphenols and other phytochemicals. Main structural classes of apple constituents include hydroxycinnamic acids, dihydrochalcones, flavonols (quercetin glycosides), catechins and oligomeric procyanidins, as well as triterpenoids in apple peel and anthocyanins in red apples. Several lines of evidence suggest that apples and apple products possess a wide range of biological activities which may contribute to health beneficial effects against cardiovascular disease, asthma and pulmonary dysfunction, diabetes, obesity, and cancer (reviewed by Boyer and Liu, Nutr J 2004). The present review will summarize the current knowledge on potential cancer preventive effects of apples, apple juice and apple extracts (jointly designated as apple products). In brief, apple extracts and components, especially oligomeric procyanidins, have been shown to influence multiple mechanisms relevant for cancer prevention in IN VITRO studies. These include antimutagenic activity, modulation of carcinogen metabolism, antioxidant activity, anti-inflammatory mechanisms, modulation of signal transduction pathways, antiproliferative and apoptosis-inducing activity, as well as novel mechanisms on epigenetic events and innate immunity. Apple products have been shown to prevent skin, mammary and colon carcinogenesis in animal models. Epidemiological observations indicate that regular consumption of one or more apples a day may reduce the risk for lung and colon cancer."], ["Hormonal growth promoting agents in food producing animals. In contrast to the use of hormonal doping agents in sports to enhance the performance of athletes, in the livestock industry hormonal growth promoters (\\\"anabolics\\\") are used to increase the production of muscle meat. This leads to international disputes about the safety of meat originating from animals treated with such anabolics.As a consequence of the total ban in the EU of all hormonal active growth promoters (\\\"hormones\\\") in livestock production, in contrast to their legal use [e.g. of five such hormones (17beta-estradiol, testosterone, progesterone, trenbolone and zeranol) as small solid ear implants and two hormones as feed additives for feedlot heifers (melengestrol acetate) and for swine (ractopamine) in the USA], the regulatory controls also differ sharply between the EU and the USA.In the EU the treatment of slaughter animals is the regulatory offence that has to be controlled in inspection programs. In the USA testing for compliance of a regulatory maximum residue level in the edible product (muscle, fat, liver or kidney) is the purpose of the inspection program (if any).The EU inspection programs focus on sample materials that are more suitable for testing for banned substances, especially if the animals are still on the farm, such as urine and feces or hair. In the case of slaughtered animals, the more favored sample materials are bile, blood, eyes and sometimes liver. Only in rare occasions is muscle meat sampled. This happens only in the case of import controls or in monitoring programs of meat sampled in butcher shops or supermarkets.As a result, data on hormone concentrations in muscle meat samples from the EU market are very rare and are obtained in most cases from small programs on an ad hoc basis. EU data for natural hormones in meat are even rarer because of the absence of \\\"legal natural levels\\\" for these hormones in compliance testing. With the exception of samples from the application sites - in the EU the site of injection of liquid hormone preparations or the site of application of \\\"pour on\\\" preparations - the hormone concentrations observed in meat samples of illegally treated animals are typically in the range of a few micrograms per kilogram (ppb) down to a few tenths of a microgram per kilogram. In the EU dozens of illegal hormones are used and the number of active compounds is still expanding. Besides estrogenic, androgenic and progestagenic compounds also thyreostatic, corticosteroidal and beta-adrenergic compounds are used alone or in \\\"smart\\\" combinations.An overview is given of the compounds identified on the EU black market. An estimate is also given of the probability of consumption in the EU of \\\"highly\\\" contaminated meat from the application sites in cattle. Finally some data are presented on the concentration of estradiol in bovine meat from animals treated and not treated with hormone implants. These data are compared with the recent findings for estradiol concentrations in hen's eggs. From this comparison, the preliminary conclusion is that hen's eggs are the major source of 17alpha- and 17beta-estradiol in the consumer's daily \\\"normal\\\" diet.", "Nutrient Signaling to mTOR and Cell Growth The mammalian target of rapamycin (mTOR) is a conserved protein kinase involved in a multitude of cellular processes including cell growth. Increased mTOR activation is observed in multiple human cancers and inhibition of mTOR has proven efficacious in numerous clinical trials. mTOR comprises two complexes, termed mTORC1 and mTORC2. Both complexes respond to growth factors, whereas only mTORC1 is controlled by nutrients, such as glucose and amino acids. Since the discovery of mTOR, extensive studies have intricately detailed the molecular mechanisms by which mTORC1 is regulated. Somewhat paradoxically, amino acid induced mTORC1 activation\u2014arguably the most essential stimulus leading to mTORC1 activation\u2014is the least understood. Here we review the current knowledge of nutrient dependent regulation of mTORC1.", "Mechanisms of twinning: VII. Effect of diet and heredity on the human twinning rate. OBJECTIVE: To evaluate the possible biochemical effect of diet and heredity on the rates of monozygotic and dizygotic twinning. STUDY DESIGN: In that insulin-like growth factor (IGF) has been found to be elevated in cows selected for their demonstrated increased twinning rate, the effect of agents that influence the level of IGF in women was examined. This was correlated with their prior history of singleton versus twin birthing. In particular, the effect of diets consisting of or excluding animal products that have elevated IGF content (e.g., milk) was considered. RESULTS: Vegan women, who exclude dairy products from their diets, have a twinning rate which is one-fifth that of vegetarians and omnivores. CONCLUSION: The results reported here support the proposed IGF model of dizygotic twinning. Genotypes favoring elevated IGF and diets including dairy products, especially in areas where growth hormone is given to cattle, appear to enhance the chances of multiple pregnancies due to ovarian stimulation.", "Antiproliferative activity of lignans against the breast carcinoma cell lines MCF 7 and BT 20. PURPOSE: Phytoestrogens are plant-derived, non-steroidal phytochemicals with anticarcinogenic potential. The major structural classes are the isoflavones and lignans. The aim of this study was to compare the effect of the plant-derived lignans secoisolariciresinol and matairesinol with the human lignans enterodiol and enterolactone as well as with 17\u03b2 estradiol and tamoxifen on cell proliferation of breast carcinoma cell lines. METHODS: The influence of the lignans, 17\u03b2 estradiol and tamoxifen on cell proliferation was determined using the BrdU test in MCF 7 and BT 20 cell lines. RESULTS: Enterodiol and enterolactone induced a stronger inhibition of cell growth in MCF 7 and BT 20 cells than secoisolariciresinol and matairesinol. The inhibition effects were less expressed in the BT 20 than in the MCF 7 cells. CONCLUSIONS: The human lignans enterodiol and enterolactone are more biologically active than their precursors secoisolariciresinol and matairesinol, and may be defined as the real drugs in cancer prevention.", "Mechanistic examination of walnuts in prevention of breast cancer. Walnuts contain bioactive molecules that may contribute to their beneficial effects, including alpha-linolenic acid (ALA) and phytosterols. In these studies, extracts of walnut, purified compounds, or postprandial serum were examined for effects on breast cancer cell proliferation and gene expression. Extracts derived from walnut oil decreased proliferation of MCF-7 cells, as did ALA and \u03b2-sitosterol. The gene expression response of ALA in the mouse breast cancer cell line TM2H indicates this molecule has multiple cellular targets with peroxisome proliferator-activated receptor (PPAR) target genes, liver X receptor (LXR), and farnesoid X receptor (FXR) target genes being affected. In transactivation assays, walnut oil extracts increased activity of FXR to a greater extent than the other tested nuclear receptors. When examined separately, walnut components ALA and \u03b2-sitosterol were the most efficacious activators of FXR. When serum from individuals fed walnut components were applied to MCF-7 cells, there was a correlation between body mass index and breast cancer cell proliferation in vitro. Taken together, these data support an effect of walnut and its bioactive constituents on mammary epithelial cells and that multiple molecular targets may be involved."], ["Haff disease after eating salmon. While fish consumption is considered a component of a heart-healthy diet, many illnesses have been associated with eating contaminated fish. The authors describe two cases of muscle weakness and rhabdomyolysis that occurred after eating salmon. Cases of rhabdomyolysis and muscle weakness after consumption of fresh water fish have rarely been reported in the United States but have been frequently reported from the Baltic region. This illness is known as Haff disease. While the etiology is unknown, it is felt to be a toxin. Palytoxin, found in marine fish, has been associated with rhabdomyolysis, and may serve as a model for further study of the suspected toxin responsible for rhabdomyolysis after consumption of fresh water fish. If a case of Haff disease is suspected, contact the Centers for Disease Control and Prevention and collect any uneaten fish, which may be sent for laboratory analysis.", "Ciguatera: recent advances but the risk remains. Ciguatera is an important form of human poisoning caused by the consumption of seafood. The disease is characterised by gastrointestinal, neurological and cardiovascular disturbances. In cases of severe toxicity, paralysis, coma and death may occur. There is no immunity, and the toxins are cumulative. Symptoms may persist for months or years, or recur periodically. The epidemiology of ciguatera is complex and of central importance to the management and future use of marine resources. Ciguatera is an important medical entity in tropical and subtropical Pacific and Indian Ocean regions, and in the tropical Caribbean. As reef fish are increasingly exported to other areas, it has become a world health problem. The disease is under-reported and often misdiagnosed. Lipid-soluble, polyether toxins known as ciguatoxins accumulated in the muscles of certain subtropical and tropical marine finfish cause ciguatera. Ciguatoxins arise from biotransformation in the fish of less polar ciguatoxins (gambiertoxins) produced by Gambierdiscus toxicus, a marine dinoflagellate that lives on macroalgae, usually attached to dead coral. The toxins and their metabolites are concentrated in the food chain when carnivorous fish prey on smaller herbivorous fish. Humans are exposed at the end of the food chain. More than 400 species of fish can be vectors of ciguatoxins, but generally only a relatively small number of species are regularly incriminated in ciguatera. Ciguateric fish look, taste and smell normal, and detection of toxins in fish remains a problem. More than 20 precursor gambiertoxins and ciguatoxins have been identified in G. toxicus and in herbivorous and carnivorous fish. The toxins become more polar as they undergo oxidative metabolism and pass up the food chain. The main Pacific ciguatoxin (P-CTX-1) causes ciguatera at levels=0.1 microg/kg in the flesh of carnivorous fish. The main Caribbean ciguatoxin (C-CTX-1) is less polar and 10-fold less toxic than P-CTX-1. Ciguatoxins activate sodium ion (Na ) channels, causing cell membrane excitability and instability. Worldwide coral bleaching is now well documented, and there is a strong association between global warming and the bleaching and death of coral. This, together with natural environmental factors such as earthquakes and hurricanes, and man-made factors such as tourism, dock construction, sewage and eutrophication, may create more favourable environments for G. toxicus. While low levels of G. toxicus are found throughout tropical and subtropical waters, the presence of bloom numbers is unpredictable and patchy. Only certain genetic strains produce ciguatoxins, and environmental triggers for increasing toxin production are unknown.", "Migrating fish bone presenting as acute onset of neck lump. We encountered a 62-year-old woman with a progressively worsening sore throat and a sharp lump located in her left upper neck, which appeared several hours before admission. After questioning, she underwent rigid esophagoscopy at a local hospital for suspected fish bone impaction but this gave a negative result. Unusual signs caused us to arrange a computed tomography scan, which showed that a foreign body had penetrated the left sternocleidomastoid muscle to the subcutaneous layer, with extensive emphysema in the neck. We extracted the foreign body with a 1-cm horizontal incision of the neck under general anesthesia. The patient returned to a normal diet and was discharged on day 5 of hospitalization without further morbidity. This is another rare case of a migrating foreign body presenting as a neck lump. On reviewing the literature, most cases involving subcutaneously migrating fish bones show development of a neck lump several weeks to months after ingestion, with relatively stable conditions. However, our case showed a neck lump 1 day after ingestion with acute toxic symptoms.", "Iodine toxicity from soy milk and seaweed ingestion is associated with serious thyroid dysfunction. We report a series of cases of thyroid dysfunction in adults associated with ingestion of a brand of soy milk manufactured with kombu (seaweed), and a case of hypothyroidism in a neonate whose mother had been drinking this milk. We also report two cases of neonatal hypothyroidism linked to maternal ingestion of seaweed made into soup. These products were found to contain high levels of iodine. Despite increasing awareness of iodine deficiency, the potential for iodine toxicity, particularly from sources such as seaweed, is less well recognised.", "Effect of spearmint (Mentha spicata Labiatae) teas on androgen levels in women with hirsutism. Mentha spicata Labiatae, known as spearmint and Mentha piperita Labiatae, known as peppermint can be used for various kinds of illnesses in herbal medicine and flavoring in industry. M. spicata Labiatae grows on the Anamas plateau of Yenithornarbademli town of Isparta, located in southwest part of Turkey. In this town, clinicians thought that consumption of tea steeped with M. spicata or M. piperita caused a diminished libido. Because antiandrogenic effects of spearmint and peppermint were found previously in rats, it was decided to observe the effect of this herbal tea on the androgen levels in hirsute women.Twenty-one female hirsute patients, 12 with polycystic ovary syndrome and 9 with idiopathic hirsutism were included to the study. They were took a cup of herbal tea which was steeped with M. spicata for 5 days twice a day in the follicular phase of their menstrual cycles. After treatment with spearmint teas, there was a significant decrease in free testosterone and increase in luteinizing hormone, follicle-stimulating hormone and estradiol. There were no significant decreases in total testosterone or dehydroepiandrostenedione sulphate levels. Spearmint can be an alternative to antiandrogenic treatment for mild hirsutism. Further studies are needed to test the reliability of these results and the availability of spearmint as a drug for hirsutism. Copyright 2007 John Wiley & Sons, Ltd."], ["Vitamins E and C in the Prevention of Cardiovascular Disease in Men: The Physicians\u2019 Health Study II Randomized Trial Context Basic and observational studies suggest vitamins E or C may reduce risk of cardiovascular disease (CVD). However, few long-term trials have evaluated men at initially low risk of CVD, and no previous trial in men has examined vitamin C alone in the prevention of CVD. Objective To test whether long-term vitamin E or C supplementation decreases risk of major cardiovascular events among men. Design, Setting, and Participants The Physicians\u2019 Health Study II (PHS II) is a randomized, double-blind, placebo-controlled factorial trial of vitamins E and C that began in 1997 and continued until its scheduled completion on August 31, 2007. We enrolled 14,641 U.S. male physicians initially aged \u226550 years, including 754 (5.1%) men with prevalent CVD at randomization. Intervention Individual supplements of 400 IU vitamin E every other day and 500 mg vitamin C daily. Main Outcome Measures A composite endpoint of major cardiovascular events (nonfatal myocardial infarction (MI), nonfatal stroke, and CVD death). Results During a mean follow-up of 8.0 years, there were 1,245 confirmed major cardiovascular events. Compared with placebo, vitamin E had no effect on the incidence of major cardiovascular events (both active and placebo vitamin E groups, 10.9 events per 1,000 person-years; hazard ratio [HR], 1.01; 95% confidence interval [CI], 0.90\u20131.13; P=0.86), as well as total MI (HR, 0.90; 95% CI, 0.75\u20131.07; P=0.22), total stroke (HR, 1.07; 95% CI, 0.89\u20131.29; P=0.45), and cardiovascular mortality (HR, 1.07; 95% CI, 0.90\u20131.29; P=0.43). There was also no significant effect of vitamin C on major cardiovascular events (active and placebo vitamin E groups, 10.8 and 10.9 events per 1,000 person-years, respectively; HR, 0.99; 95% CI, 0.89\u20131.11; P=0.91), as well as total MI (HR, 1.04; 95% CI, 0.87\u20131.24; P=0.65), total stroke (HR, 0.89; 95% CI, 0.74\u20131.07; P=0.21), and cardiovascular mortality (HR, 1.02; 95% CI, 0.85\u20131.21; P=0.86). Neither vitamin E (HR, 1.07; 95% CI, 0.97\u20131.18; P=0.15) nor vitamin C (HR, 1.07; 95% CI, 0.97\u20131.18; P=0.16) had a significant effect on total mortality, but vitamin E was associated with an increased risk of hemorrhagic stroke (HR, 1.74; 95% CI, 1.04\u20132.91; P=0.036). Conclusions In this large, long-term trial of male physicians, neither vitamin E nor C supplementation reduced the risk of major cardiovascular events. These data provide no support for the use of these supplements for the prevention of CVD in middle-aged and older men.", "Multivitamins in the Prevention of Cardiovascular Disease in Men: The Physicians' Health Study II Randomized Controlled Trial Context Though multivitamins aim to prevent vitamin and mineral deficiency, there is a perception that multivitamins may prevent cardiovascular disease (CVD). Observational studies examining regular multivitamin use have been inconsistently associated with CVD, with no long-term clinical trials of multivitamin use. Objective To determine whether long-term multivitamin supplementation decreases the risk of major cardiovascular events among men. Design The Physicians' Health Study II is a randomized, double-blind, placebo-controlled trial of a common daily multivitamin, that began in 1997 with continued treatment and follow-up through June 1, 2011. Setting and Participants A total of 14,641 male U.S. physicians initially aged \u226550 years (mean [\u00b1 SD] age; 64.3 [\u00b1 9.2] years), including 754 men with a history of CVD at randomization, were enrolled. Intervention Daily multivitamin, as Centrum Silver. Main Outcome Measures The primary cardiovascular outcome was a composite endpoint of major cardiovascular events, including nonfatal myocardial infarction (MI), nonfatal stroke, and fatal CVD. Secondary outcomes included MI and stroke individually. Results During a median (interquartile range) follow-up of 11.2 (10.7 to 13.3) years, there were 1,732 confirmed major cardiovascular events. Compared with placebo, there was no significant effect of a daily multivitamin on major cardiovascular events (active and placebo multivitamin groups, 11.0 and 10.8 events per 1,000 person-years; hazard ratio [HR], 1.01; 95% confidence interval [CI], 0.91\u20131.10; P=0.91). Further, a daily multivitamin had no effect on total MI (active and placebo multivitamin groups, 3.9 and 4.2 events per 1,000 person-years; HR, 0.93; 95% CI, 0.80\u20131.09; P=0.39), total stroke (active and placebo multivitamin groups, 4.1 and 3.9 events per 1,000 person-years; HR, 1.06; 95% CI, 0.91\u20131.23; P=0.48), or cardiovascular mortality (active and placebo multivitamin groups, 5.0 and 5.1 events per 1,000 person-years; HR, 0.95; 95% CI, 0.83\u20131.09; P=0.47). A daily multivitamin was also not significantly associated with total mortality (HR, 0.94; 95% CI, 0.88\u20131.02; P=0.13). The effect of a daily multivitamin on major cardiovascular events did not differ between men with or without a baseline history of CVD (P, interaction = 0.62). Conclusions A daily multivitamin did not reduce major cardiovascular events, MI, stroke, and CVD mortality after more than a decade of treatment and follow-up.", "Who uses multivitamins? A cross-sectional study in the Physicians' Health Study. PURPOSE: The aim of this study was to examine the prevalence of self-reported multivitamin use in the Physicians' Health Study (PHS) cohort and its association with various lifestyle, clinical, and dietary factors to improve our understanding of who tends to use multivitamins. METHODS: Among 18,040 middle-aged and older men, information on lifestyle and clinical factors was collected from a baseline enrollment questionnaire, and supplement use and dietary factors were assessed through a food-frequency questionnaire. Four categories of multivitamin use were considered: (1) no supplement use, (2) use of multivitamins only, (3) use of multivitamins with other individual vitamin/mineral supplements, and (4) use of other supplements only. We used logistic regression to calculate multivariate odds ratios and 95% confidence intervals of taking multivitamin supplements for various lifestyle, clinical and dietary factors. RESULTS: Overall, 36% of men reported current multivitamin use. Men who were older, current smokers, and currently using aspirin were 143, 43, and 74% more likely to use multivitamins only. Men having a history of hypercholesterolemia were 16% more likely to use multivitamins only. A 14, 24, and 26% greater likelihood of using multivitamins was also observed among men consuming more fruits and vegetables, whole grains, and tea, respectively. Similar associations were observed for the likelihood of using multivitamins with other supplements; however, men with higher physical activity, history of cancer, hypertension, higher consumption of nuts, and lower consumption of red meat and coffee were also more likely to use multivitamins with other supplements (all P < 0.05). CONCLUSION: Self-reported multivitamin use associated with lifestyle, clinical and dietary factors may be an indicator of healthy behaviors. These results provide important information for the interpretation of the recent findings from the PHS II trial and consideration of results from observational studies of multivitamin use and chronic disease.", "Physicians' health habits are associated with lifestyle counseling for hypertensive patients. BACKGROUND: The Seventh Report of the Joint National Committee on Prevention, Detection, Evaluation, and Treatment of High Blood Pressure (JNC VII) recommended lifestyle interventions, either with or without pharmacologic treatment, for all patients with high blood pressure. The objective of this study is to determine the association of physicians' personal habits with their attitudes and behaviors regarding JNC VII lifestyle modification guidelines. METHODS: One thousand primary care physicians completed DocStyles 2010, a voluntary web-based survey designed to provide insight into physician attitudes and behaviors regarding various health issues. RESULTS: The respondents' average age was 45.3 years, and 68% were male. In regards to physician behavior, 4.0% smoked at least once a week, 38.6% ate \u22655 cups of fruits and/or vegetables \u22655 days/week, and 27.4% exercised \u22655 days/week. When asked about specific types of advice offered to their hypertensive patients, physicians reported recommending that their patients eat a healthy diet (92.2%), or cut down on salt (96.1%), or attain or maintain a healthy weight (94.8%), or limit the use of alcohol (75.4%), or be physically active (94.4%). Collectively, 66.5% made all 5 lifestyle modification recommendations. Nonsmoking physicians were more likely to recommend each lifestyle intervention to their hypertensive patients. Those who exercised at least 1 day per week were more likely to recommend limiting alcohol use. CONCLUSIONS: The probability of recommending all 5 JNC VII interventions was greater for physicians who were nonsmoking and who exercised at least 1 day a week.", "US medical researchers, the Nuremberg Doctors Trial, and the Nuremberg Code. A review of findings of the Advisory Committee on Human Radiation Expe... The Advisory Committee on Human Radiation Experiments (ACHRE), established to review allegations of abuses of human subjects in federally sponsored radiation research, was charged with identifying appropriate standards to evaluate the ethics of cold war radiation experiments. One central question for ACHRE was to determine what role, if any, the Nuremberg Code played in the norms and practices of US medical researchers. Based on the evidence from ACHRE's Ethics Oral History Project and extensive archival research, we conclude that the Code, at the time it was promulgated, had little effect on mainstream medical researchers engaged in human subjects research. Although some clinical investigators raised questions about the conduct of research involving human beings, the medical profession did not pursue this issue until the 1960s."], ["Olfactory detection of human bladder cancer by dogs: proof of principle study Objective To determine whether dogs can be trained to identify people with bladder cancer on the basis of urine odour more successfully than would be expected by chance alone. Design Experimental, \u201cproof of principle\u201d study in which six dogs were trained to discriminate between urine from patients with bladder cancer and urine from diseased and healthy controls and then evaluated in tests requiring the selection of one bladder cancer urine sample from six controls. Participants 36 male and female patients (age range 48-90 years) presenting with new or recurrent transitional cell carcinoma of the bladder (27 samples used for training; 9 used for formal testing); 108 male and female controls (diseased and healthy, age range 18-85 years\u201454 samples used in training; 54 used for testing). Main outcome measure Mean proportion of successes per dog achieved during evaluation, compared with an expected value of 1 in 7 (14%). Results Taken as a group, the dogs correctly selected urine from patients with bladder cancer on 22 out of 54 occasions. This gave a mean success rate of 41% (95% confidence intervals 23% to 58% under assumptions of normality, 26% to 52% using bootstrap methods), compared with 14% expected by chance alone. Multivariate analysis suggested that the dogs' capacity to recognise a characteristic bladder cancer odour was independent of other chemical aspects of the urine detectable by urinalysis. Conclusions Dogs can be trained to distinguish patients with bladder cancer on the basis of urine odour more successfully than would be expected by chance alone. This suggests that tumour related volatile compounds are present in urine, imparting a characteristic odour signature distinct from those associated with secondary effects of the tumour, such as bleeding, inflammation, and infection.", "Anisakiasis, an underestimated infection: effect on intestinal permeability of Anisakis simplex-sensitized patients. Anisakis simplex is a parasite that, if present in uncooked and contaminated saltwater fish, can invade the human gut. Two different clinical situations are recognized: the first, known as a gastrointestinal disease, varying from an asymptomatic episode to vomiting and diarrhea, and the second, classified as an adverse reaction to food, characterized by a wide spectrum of allergic reactions like rhinitis, conjunctivitis, or even anaphylaxis causing hypotension and/or shock. The intestinal epithelium, the major defense system against external molecules, represents an open gate for toxins and allergens if its protective function is compromised. Previous data have demonstrated a strict relationship between an altered intestinal permeability (I.P.) and worsening of the clinical manifestations in patients with adverse reactions to the food. In this article we evaluated the sensitization to A. simplex among patients who referred clinical symptoms of allergy. All subjects underwent commonly used alimentary skin prick test for food allergens, to which Ani s1, an A. simplex allergen, was added. In addition, in A. simplex-sensitized subjects, I.P. was determined upon their enrolment to the study (time 0) and after 6 months of consuming a raw fish-free diet (time 6). Five hundred and forty subjects were screened, and 170 had a positive skin prick test, 87 (51.2%) of whom were positive to Ani s1. Increased I.P. was evidenced in A. simplex-sensitized subjects with worse clinical symptoms, which receded after 6 months' elimination of raw seafood. With our data we demonstrated that the alimentary habit to eat raw fish represents a high risk for the integrity of the intestinal mucosa, and we suggest that this pathological situation may constitute an ideal, under-estimated, open gate for molecules that predispose to other, more important pathologies.", "Fish odour syndrome Fish odour syndrome (trimethylaminuria) is a metabolic syndrome caused by abnormal excretion of trimethylamine in the breath, urine, sweat, saliva and vaginal secretions. Trimethylamine is derived from the intestinal bacterial degradation of foods rich in choline and carnitine and is normally oxidised by the liver to odourless trimethylamine N-oxide which is then excreted in the urine. Impaired oxidation of trimethylamine is thought to be the cause of the fish odour syndrome and is responsible for the smell of rotting fish. Certain foods rich in choline exacerbate the condition and the patients have a variety of psychological problems. Recognition of the condition is important as dietary adjustments reduce the excretion of trimethylamine and may reduce the odour. Occasionally, a short course of metronidazole, neomycin and lactulose may suppress production of trimethylamine by reducing the activity of gut microflora. Keywords: fish odour syndrome; trimethylaminuria", "Biology and function of the aryl hydrocarbon receptor: report of an international and interdisciplinary conference. The aryl hydrocarbon receptor (AhR) is a ligand-activated transcription factor present in many cells. The AhR links environmental chemical stimuli with adaptive responses, such as detoxification, cellular homoeostasis or immune responses. Furthermore, novel roles of AhR in physiological and genetic functions are being discovered. This is a report of a recent meeting in D\u00fcsseldorf. The meeting highlighted that AhR research has moved from its focus on toxic effects of dioxins and other environmental pollutants to its biological roles. For instance, it was recently discovered that AhR-responsive elements in retrotransposons contribute to the functional structure of the genome. Other exciting new reports concerned the way plant-derived compounds in our diet are necessary for a fully functioning immune system of the gut. Also, human brain tumours use the AhR system to gain growth advantages. Other aspects covered were neurotoxicology, the circadian rhythm, or the breadth of the adaptive and innate immune system (hematopoietic stem cells, dendritic cells, T cells, mast cells). Finally, the meeting dealt with the discovery of new xenobiotic and natural ligands and their use in translational medicine, or cancer biology and AhR.", "Biological Clues to Potent DNA-Damaging Activities in Food and Flavoring Population differences in age-related diseases and cancer could stem from differences in diet. To characterize DNA strand-breaking activities in selected foods/beverages, flavorings, and some of their constituent chemicals, we used p53R cells, a cellular assay sensitive to such breaks. Substances testing positive included reference chemicals: quinacrine (peak response, 51X) and etoposide (33X); flavonoids: EGCG (19X), curcumin (12X), apigenin (9X), and quercetin (7X); beverages: chamomile (11X), green (21X), and black tea (26X) and coffee (3 to 29X); and liquid smoke (4 to 28X). Damage occurred at dietary concentrations: etoposide near 5 \u03bcg/ml produced responses similar to a 1:1000 dilution of liquid smoke, a 1:20 dilution of coffee, and a 1:5 dilution of tea. Pyrogallol-related chemicals and tannins are present in dietary sources and individually produced strong activity: pyrogallol (30X), 3-methoxycatechol (25X), gallic acid (21X), and 1,2,4-benzenetriol (21X). From structure-activity relationships, high activities depended on specific orientations of hydroxyls on the benzene ring. Responses accompanied cellular signals characteristic of DNA breaks such as H2AX phosphorylation. Breaks were also directly detected by comet assay. Cellular toxicological effects of foods and flavorings could guide epidemiologic and experimental studies of potential disease risks from DNA strand-breaking chemicals in diets."], ["Intestinal iron absorption: regulation by dietary & systemic factors. Iron is an essential trace metal in human metabolism. However, imbalances in iron homeostasis are prevalent worldwide and have detrimental effects on human health. Humans do not have the ability to remove excess iron and therefore iron homeostasis is maintained by regulating the amount of iron entering the body from the diet. Iron is present in the human diet in number of different forms, including heme (from meat) and a variety of non-heme iron compounds. While heme is absorbed intact, the bioavailability of non-heme iron varies greatly depending on dietary composition. A number of dietary components are capable of interacting with iron to regulate its solubility and oxidation state. Interestingly, there is an emerging body of evidence suggesting that some nutrients also have direct effects on the expression and function of enterocyte iron transporters. In addition to dietary factors, body iron status is a major determinant of iron absorption. The roles of these important dietary and systemic factors in regulating iron absorption will be discussed in this review.", "First trimester curtailment of iron absorption: innate suppression of a teratogen? In human pregnancies, maternal absorption of iron is markedly curtailed in the first trimester. In a murine model, iron was teratogenic in the analogous embryonic period. Although iron is a weak mutagen, it is a powerful oxidant and a catalyst of formation of hydroxyl radicals. Studies are needed to determine if there might be an association of first trimester iron supplementation with miscarriage/fetal abnormalities.", "Non-anaemic pregnant women should not take iron supplements. (1) Iron-deficiency anaemia during pregnancy increases the risk of low birth weight and preterm birth; (2) In a randomised double-blind placebo-controlled trial, iron supplementation in pregnant women with haemoglobin levels of at least 13.2 g/100 ml at the beginning of the 2nd trimester was associated with low birth weight and maternal hypertension; (3) In a trial in women with haemoglobin levels of at least 11.5 g/100 ml who took supplemental iron, haemoglobin levels above 14.5 g/100 ml at 28 weeks of gestation were associated with an 8-fold increase in the risk of preterm birth and a 6-fold increase in the risk of low birth weight; (4) An epidemiological study showed a link between high maternal haemoglobin levels and low birth weight; (5) In practice, iron supplements should not be taken by pregnant women whose haemoglobin levels exceed 11 g/100 ml during the 1st and 3rd trimesters and 10.5 g/100 ml during the 2nd trimester.", "Effect of diet on serum albumin and hemoglobin adducts of 2-amino-1-methyl-6-phenylimidazo[4,5-b]pyridine (PhIP) in humans. 2-Amino-1-methyl-6-phenylimidazo[4,5-b]pyridine (PhIP) is the most abundant heterocyclic amine formed in meat and fish during cooking and can be used as a model compound for this class of chemicals possibly involved in human carcinogenesis. Knowing the exposure to heterocyclic amines is important for establishing their role in human diseases. Serum albumin (SA) and globin (Gb) adducts were first tested as biomarkers of exposure to PhIP in male Fischer 344 rats given oral doses of 0.1, 0.5, 1 and 10 mg/kg. Blood samples were collected 24 hr after treatment and PhIP released from SA and Gb after acidic hydrolysis was analyzed by gas chromatography-mass spectrometry or liquid chromatography-tandem mass spectrometry. PhIP-SA and Gb adducts increased linearly with the dose. Studies on 35 volunteers with different dietary habits exhibited that diet was a major determinant in the formation of both adducts. PhIP-SA adducts were significantly higher in meat consumers than in vegetarians (6.7 +/- 1.6 and 0.7 +/- 0.3 fmol/mg SA; respectively, mean +/- SE; p = 0.04, Mann-Whitney U test). The Gb adduct pattern was quantitatively lower but paralleled SA (3 +/- 0.8 in meat consumers and 0.3 +/- 0.1 in vegetarians). PhIP-SA adducts were no different in smokers and in non-smokers. The results show for the first time that PhIP-blood protein adducts are present in humans not given the synthetic compound. Both biomarkers appear to be suitable for assessing dietary exposure and internal PhIP dose and may be promising tools for studying the role of heterocyclic amines in the etiology of colon cancer and other diseases. Copyright 2000 Wiley-Liss, Inc.", "Quantification of the neurotoxic beta-carboline harmane in barbecued/grilled meat samples and correlation with level of doneness. Harmane, one of the heterocyclic amines (HCAs), is a potent neurotoxin linked to human diseases. Dietary exposure, especially in cooked meats, is the major source of exogenous exposure for humans. However, knowledge of harmane concentrations in cooked meat samples is limited. Our goals were to (1) quantify the concentration of harmane in different types of cooked meat samples, (2) compare its concentration to that of other more well-understood HCAs, and (3) examine the relationship between harmane concentration and level of doneness. Thirty barbecued/grilled meat samples (8 beef steak, 12 hamburger, 10 chicken) were analyzed for harmane and four other HCAs (2-amino-1-methyl-6-phenylimidazo [4,5-b]pyridine [PhIP], amino-3,8-dimethylimidazo[4,5-f]quinoxaline [MeIQx], 2-amino-3,4,8-trimethylimidazo[4,5-f]quinoxaline [DiMeIQx], and 2-amino-1,6-dimethylfuro[3,2-e]imidazo[4,5-b]pyridine [IFP]). Mean (+/- SD) harmane concentration was 5.63 (+/- 6.63) ng/g; harmane concentration was highest in chicken (8.48 +/- 9.86 ng/g) and lowest in beef steak (3.80 +/- 3.6 ng/g). Harmane concentration was higher than that of the other HCAs and significantly correlated with PhIP concentration. Harmane concentration was associated with meat doneness in samples of cooked beef steak and hamburger, although the correlation between meat doneness and concentration was greater for PhIP than for harmane. Evidence indicates that harmane was detectable in nanograms per gram quantities in cooked meat (especially chicken) and, moreover, was more abundant than other HCAs. There was some correlation between meat doneness and harmane concentration, although this correlation was less robust than that observed for PhIP. Data such as these may be used to improve estimation of human dietary exposure to this neurotoxin."], ["Prevalence of diverticular disease, hiatus hernia, and pelvic phleboliths in black and white Americans. Phleboliths, and especially diverticular disease and hiatus hernia, are rarer in developing countries than in economically more developed communities, but all three conditions were as common in Black as in White Americans. This finding suggests that they are due to environmental rather than to genetic causes. A deficient intake of dietary fibre may be the common factor predisposing to these three conditions.", "Diverticular disease: eat your fiber! In industrialized nations, diverticular disease affects up to 70% of individuals by 60 years of age, with symptoms that can range from mild gastrointestinal disturbance to incapacitating pain. Diverticular disease appears to be related to increasing affluence and changed diet: Current theory holds that diverticular disease's origin is low-fiber diet. This explains why its incidence is highest and accelerating in the more prosperous countries where intake of fiber has decreased and intake of milled grains and refined sugars has increased over time. Not all patients develop symptoms, but if they do, the most frequent complaints associated with diverticulosis are cramping in the left-lower quadrant, bloating, constipation, and soiling. If diverticula perforate the gut's wall into the pericolic tissue, small and large abscesses, accompanied by bleeding, can form. Fistulization, when it occurs, most often penetrates to the bladder. Treatment addresses symptoms and may require hospitalization. During symptomatic periods, patients do best on low-fiber, bland diets. Once the acute episode or highly symptomatic period resolves or chronic disease is managed, patients should gradually increase dietary fiber to 20 to 30 grams daily or take dietary fiber in the form of bulk stimulants like psyllium.", "Neurocysticercosis in pregnancy: not just another headache. Infection with pork tapeworm, or Taenia solium, affects approximately 50 million people worldwide. The most important and potentially devastating form of the infestation, neurocysticercosis, occurs when the parasite invades the central nervous system. There has been a significant increase in the number of cases in the United States due to immigration from endemic areas. This case study of a pregnant woman in the 35th week of gestation exemplifies the serious consequences of this infection in pregnancy, and discusses an evidence-based approach to the diagnosis, treatment and eradication of this preventable disease. \u00a9 2012 AWHONN.", "The development of the concept of dietary fiber in human nutrition. Fundamental studies of the laxative action of wheat bran were undertaken in the United States in the early decades of the 20th century. Walker in South Africa extended these studies among African blacks and later suggested that cereal fiber protected them against certain metabolic disorders. Trowell in Uganda elaborated this concept with regard to the rarity of common noninfective diseases of the colon. Another stream of inquiry stemmed from the hypothesis of Cleave who postulated that the presence of refined sugar, and to a lesser extent white flour, caused many metabolic diseases, while the loss of fiber caused certain colonic disorders. Meanwhile Burkitt had collected massive evidence of the rarity of appendicitis and many venous disorders in rural Africa and parts of Asia. In 1972 Trowell proposed a new physiological definition of fiber in terms of the residue of plant foods that resisted digestion by alimentary enzymes of man. Southgate has proposed chemical methods to analyze the components of dietary fiber: cellulose, hemicellulose, and lignin.", "Bowel movement: the sixth vital sign. Bowel movements provide vital information on how the body is functioning, and constipation among older adults is especially problematic. Although we do not like hearing the details of someone else's bowel movement, it is a function that nurses need to assess, support, and treat with the same attitude as when caring for patients with pain."], ["Radiation and chest CT scan examinations: what do we know? In the past 3 decades, the total number of CT scans performed has grown exponentially. In 2007, > 70 million CT scans were performed in the United States. CT scan studies of the chest comprise a large portion of the CT scans performed today because the technology has transformed the management of common chest diseases, including pulmonary embolism and coronary artery disease. As the number of studies performed yearly increases, a growing fraction of the population is exposed to low-dose ionizing radiation from CT scan. Data extrapolated from atomic bomb survivors and other populations exposed to low-dose ionizing radiation suggest that CT scan-associated radiation may increase an individual's lifetime risk of developing cancer. This finding, however, is not incontrovertible. Because this topic has recently attracted the attention of both the scientific community and the general public, it has become increasingly important for physicians to understand the cancer risk associated with CT scan and be capable of engaging in productive dialogue with patients. This article reviews the current literature on the public health debate surrounding CT scan and cancer risk, quantifies radiation doses associated with specific studies, and describes efforts to reduce population-wide CT scan-associated radiation exposure. CT scan examinations of the chest, including CT scan pulmonary and coronary angiography, high-resolution CT scan, low-dose lung cancer screening, and triple rule-out CT scan, are specifically considered.", "An unexpected mortality increase in the United States follows arrival of the radioactive plume from Fukushima: is there a correlation? The multiple nuclear meltdowns at the Fukushima plants beginning on March 11, 2011, are releasing large amounts of airborne radioactivity that has spread throughout Japan and to other nations; thus, studies of contamination and health hazards are merited. In the United States, Fukushima fallout arrived just six days after the earthquake, tsunami, and meltdowns. Some samples of radioactivity in precipitation, air, water, and milk, taken by the U.S. government, showed levels hundreds of times above normal; however, the small number of samples prohibits any credible analysis of temporal trends and spatial comparisons. U.S. health officials report weekly deaths by age in 122 cities, about 25 to 35 percent of the national total. Deaths rose 4.46 percent from 2010 to 2011 in the 14 weeks after the arrival of Japanese fallout, compared with a 2.34 percent increase in the prior 14 weeks. The number of infant deaths after Fukushima rose 1.80 percent, compared with a previous 8.37 percent decrease. Projecting these figures for the entire United States yields 13,983 total deaths and 822 infant deaths in excess of the expected. These preliminary data need to be followed up, especially in the light of similar preliminary U.S. mortality findings for the four months after Chernobyl fallout arrived in 1986, which approximated final figures.", "Radioactive fallout in the United States due to the Fukushima nuclear plant accident. The release of radioactivity into the atmosphere from the damaged Fukushima Daiichi nuclear power plant started on March 12th, 2011. Among the various radionuclides released, iodine -131 ((131)I) and cesium isotopes ((137)Cs and (134)Cs) were transported across the Pacific Ocean and reached the United States on 17-18 March 2011. Consequently, an elevated level of fission products (131)I, (132)I, (132)Te, (134)Cs and (137)Cs were detected in air, water, and milk samples collected across the United States between March 17 and April 4, 2011. The continuous monitoring of activities over a period of 25 days and spatial variations across more than 100 sampling locations in the United States made it possible to characterize the contaminated air masses. For the entire period, the highest detected activity values ranged from less than 1 m Bq m(-3) to 31 m Bq m(-3) for the particulate (131)I, and up to 96 m Bq m(-3) for the gaseous (131)I fraction.", "Radioprotection by plant products: present status and future prospects. The development of radioprotective agents has been the subject of intense research in view of their potential for use within a radiation environment, such as space exploration, radiotherapy and even nuclear war. However, no ideal, safe synthetic radioprotectors are available to date, so the search for alternative sources, including plants, has been on going for several decades. In Ayurveda, the traditional Indian system of medicine, several plants have been used to treat free radical-mediated ailments and, therefore, it is logical to expect that such plants may also render some protection against radiation damage. A systematic screening approach can provide leads to identifying potential new candidate drugs from plant sources, for mitigation of radiation injury. This article reviews some of the most promising plants, and their bioactive principles, that are widely used in traditional systems of medicine, and which have rendered significant radioprotection in both in vitro and in vivo model systems. Plants and their constituents with pharmacological activities that may be relevant to amelioration of radiation-mediated damage, including antiemetic, antiinflammatory, antioxidant, cell proliferative, wound healing and haemopoietic stimulatories are also discussed. Copyright (c) 2005 John Wiley & Sons, Ltd.", "Wet deposition of fission-product isotopes to North America from the Fukushima Dai-ichi incident, March 2011. Using the infrastructure of the National Atmospheric Deposition Program (NADP), numerous measurements of radionuclide wet deposition over North America were made for 167 NADP sites before and after the Fukushima Dai-ichi Nuclear Power Station incident of March 12, 2011. For the period from March 8 through April 5, 2011, wet-only precipitation samples were collected by NADP and analyzed for fission-product isotopes within whole-water and filterable solid samples by the United States Geological Survey using gamma spectrometry. Variable amounts of (131)I, (134)Cs, or (137)Cs were measured at approximately 21% of sampled NADP sites distributed widely across the contiguous United States and Alaska. Calculated 1- to 2-week individual radionuclide deposition fluxes ranged from 0.47 to 5100 Becquerels per square meter during the sampling period. Wet deposition activity was small compared to measured activity already present in U.S. soil. NADP networks responded to this complex disaster, and provided scientifically valid measurements that are comparable and complementary to other networks in North America and Europe."], ["Endocrine-Disrupting Chemicals: Associated Disorders and Mechanisms of Action The incidence and/or prevalence of health problems associated with endocrine-disruption have increased. Many chemicals have endocrine-disrupting properties, including bisphenol A, some organochlorines, polybrominated flame retardants, perfluorinated substances, alkylphenols, phthalates, pesticides, polycyclic aromatic hydrocarbons, alkylphenols, solvents, and some household products including some cleaning products, air fresheners, hair dyes, cosmetics, and sunscreens. Even some metals were shown to have endocrine-disrupting properties. Many observations suggesting that endocrine disruptors do contribute to cancer, diabetes, obesity, the metabolic syndrome, and infertility are listed in this paper. An overview is presented of mechanisms contributing to endocrine disruption. Endocrine disruptors can act through classical nuclear receptors, but also through estrogen-related receptors, membrane-bound estrogen-receptors, and interaction with targets in the cytosol resulting in activation of the Src/Ras/Erk pathway or modulation of nitric oxide. In addition, changes in metabolism of endogenous hormones, cross-talk between genomic and nongenomic pathways, cross talk with estrogen receptors after binding on other receptors, interference with feedback regulation and neuroendocrine cells, changes in DNA methylation or histone modifications, and genomic instability by interference with the spindle figure can play a role. Also it was found that effects of receptor activation can differ in function of the ligand.", "Evidence of effects of environmental chemicals on the endocrine system in children. Pollutant chemicals that are widespread in the environment can affect endocrine signaling, as evidenced in laboratory experiments and in wildlife with relatively high exposures. Although humans are commonly exposed to such pollutant chemicals, the exposures are generally low, and clear effects on endocrine function from such exposures have been difficult to demonstrate. Several instances in which there are data from humans on exposure to the chemical agent and the endocrine outcome are reviewed, including age at weaning, age at puberty, and sex ratio at birth, and the strength of the evidence is discussed. Although endocrine disruption in humans by pollutant chemicals remains largely undemonstrated, the underlying science is sound and the potential for such effects is real.", "Spearmint herbal tea has significant anti-androgen effects in polycystic ovarian syndrome. A randomized controlled trial. Hirsutism in polycystic ovarian syndrome (PCOS), consequent to elevated androgen levels leads to significant cosmetic and psychological problems. Recent research in Turkey has shown that spearmint tea has antiandrogenic properties in females with hirsutism. No research has yet been undertaken to assess whether a reduction in androgen levels brought about by spearmint tea, translates to a clinical improvement in the degree of hirsutism. This study was a two centre, 30 day randomized controlled trial. Forty two volunteers were randomized to take spearmint tea twice a day for a 1 month period and compared with a placebo herbal tea. At 0, 15 and 30 days of the study serum androgen hormone levels and gonadotrophins were checked, the degree of hirsutism was clinically rated using the Ferriman-Galwey score and a questionnaire (the modified DQLI = Dermatology Quality of Life Index) was used to assess improvements in the level of self-reported hirsutism. Forty one of 42 patients completed the study. Free and total testosterone levels were significantly reduced over the 30 day period in the spearmint tea group (p < 0.05). LH and FSH also increased (p < 0.05). Patient's subjective assessments of their degree of hirsutism scored by the modified DQLI were significantly reduced in the spearmint tea group (p < 0.05). There was, however, no significant reduction in the objective Ferriman-Galwey ratings of hirsutism between the two trial groups over the trial duration (p = 0.12). There was a clear and significant alteration in the relevant hormone levels. This is associated clinically with a reduction in the self-reported degree of hirsutism but unfortunately not with the objectively rated score. It was demonstrated and confirmed that spearmint has antiandrogen properties, the simple fact that this does not clearly translate into clinical practice is due to the relationship between androgen hormones and follicular hair growth and cell turnover time. Simply put, the study duration was not long enough. The original studies from Turkey were in fact only 5 days long. The time taken for hirsutism to resolve is significant and a much longer future study is proposed as the preliminary findings are encouraging that spearmint has the potential for use as a helpful and natural treatment for hirsutism in PCOS. (c) 2009 John Wiley & Sons, Ltd.", "The sensitivity of the child to sex steroids: possible impact of exogenous estrogens. The current trends of increasing incidences of testis, breast and prostate cancers are poorly understood, although it is assumed that sex hormones play a role. Disrupted sex hormone action is also believed to be involved in the increased occurrence of genital abnormalities among newborn boys and precocious puberty in girls. In this article, recent literature on sex steroid levels and their physiological roles during childhood is reviewed. It is concluded that (i) circulating levels of estradiol in prepubertal children are lower than originally claimed; (ii) children are extremely sensitive to estradiol and may respond with increased growth and/or breast development even at serum levels below the current detection limits; (iii) no threshold has been established, below which no hormonal effects can be seen in children exposed to exogenous steroids or endocrine disruptors; (iv) changes in hormone levels during fetal and prepubertal development may have severe effects in adult life and (v) the daily production rates of sex steroids in children estimated by the Food and Drug Administration in 1999 and still used in risk assessments are highly overestimated and should be revised. Because no lower threshold for estrogenic action has been established, caution should be taken to avoid unnecessary exposure of fetuses and children to exogenous sex steroids and endocrine disruptors, even at very low levels.", "DHEA therapy in postmenopausal women: the need to move forward beyond the lack of evidence. The marked age-related decline in serum dehydroepiandrosterone (DHEA) and dehydroepiandrosterone sulfate (DHEAS) has suggested that a deficiency of these steroids may be causally related to the development of a series of diseases that are generally associated with aging. Postulated consequences of low DHEA levels include insulin resistance, obesity, cardiovascular disease, cancer, reduction of the immune defence system as well as psychosocial problems such as depression and a general deterioration in the sensation of well-being and cognitive function. Clinically, the spectrum of women that would benefit from DHEA therapy is not clearly defined and nor is the dosage of hormone treatment. Whether DHEA therapy could be prescribed as a general anti-aging therapy or could be an alternative treatment for women suffering from androgen deficiency syndrome remains uncertain across studies. The lack of definitive evidence for biological mechanisms and the presence of only a few studies that address these emerging issues of DHEA therapy in postmenopausal women might encourage a new critical analysis of the available literature, evidencing current limits and incongruities."], ["Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "Phthalates exposure and attention-deficit/hyperactivity disorder in school-age children. BACKGROUND: Very few studies have examined the association between attention-deficit/hyperactivity disorder (ADHD) and phthalate exposure in humans. The aim of this study was to investigate the impact of phthalates on symptoms of ADHD in school-age children. METHODS: A cross-sectional examination of urine phthalate concentrations was performed, and scores on measures of ADHD symptoms and neuropsychological dysfunction with regard to attention and impulsivity were obtained from 261 Korean children, age 8-11 years. RESULTS: Mono-2-ethylheyl phthalate (MEHP) and mono-2-ethyl-5-oxohexylphthalate (MEOP) for metabolites of Di-2-ethylhexylphthalate (DEHP) and mono-n-butyl phthalate (MNBP) for metabolites of dibutyl phthalate (DBP) were measured in urine samples. The mean concentrations of MEHP, MEOP, and MNBP were 34.0 microg/dL (SD = 36.3; range: 2.1-386.7), 23.4 microg/dL (SD = 23.0; range: .75-244.8), and 46.7 microg/L (SD = 21.4; range: 13.2-159.3), respectively. After adjustment for covariates, teacher-rated ADHD scores were significantly associated with DEHP metabolites but not with DBP metabolites. We also found significant relationships between the urine concentrations of metabolites for DBP and the number of omission and commission errors in continuous performance tests (CPT) after adjustment for covariates. CONCLUSION: The present study showed a strong positive association between phthalate metabolites in urine and symptoms of ADHD among school-age children.", "Artificial food dyes and attention deficit hyperactivity disorder. Attention deficit hyperactivity disorder (ADHD) is one of the most common behavioral disorders in children. Symptoms of ADHD include hyperactivity, low frustration tolerance, impulsivity, and inattention. While the biological pathways leading to ADHD are not clearly delineated, a number of genetic and environmental risk factors for the disorder are recognized. In the early 1970s, research conducted by Dr. Benjamin Feingold found that when hyperactive children were given a diet free of artificial food additives and dyes, symptoms of hyperactivity were reduced. While some clinical studies supported these findings, more rigorous empirical studies conducted over the next 20 years were less positive. As a result, research on the role of food additives in contributing to ADHD waned. In recent years, however, interest in this area has revived. In response to more recent research and public petitions, in December 2009 the British government requested that food manufacturers remove most artificial food dyes from their products. While these strictures could have positive effects on behavior, the removal of food dyes is not a panacea for ADHD, which is a multifaceted disorder with both biological and environmental underpinnings. \u00a9 2011 International Life Sciences Institute.", "Synthetic Food Colors and Neurobehavioral Hazards: The View from Environmental Health Research Background: The proposition that synthetic food colors can induce adverse behavioral effects in children was first enunciated in 1975 by Feingold [Why Your Child Is Hyperactive. New York:Random House (1975)], who asserted that elevated sensitivity to food additives underlies the signs of hyperactivity observed in some children. Although the evidence suggested that some unknown proportion of children did respond to synthetic food colors, the U.S. Food and Drug Administration (FDA) interpreted the evidence as inconclusive. A study published in 2007 [McCann et al. Food additives and hyperactive behaviour in 3-year-old and 8/9-year-old children in the community: a randomised, double-blinded, placebo-controlled trial. Lancet 370:1560\u20131567 (2007)] drew renewed attention to the hypothesis because of the study\u2019s size and scope. It led the FDA to review the evidence, hold a public hearing, and seek the advice of its Food Advisory Committee. In preparation for the hearing, the FDA reviewed the available evidence and concluded that it did not warrant further agency action. Objectives: In this commentary I examine the basis of the FDA\u2019s position, the elements of the review that led to its decision and that of the Food Advisory Committee, and the reasons that this is an environmental health issue. Discussion: The FDA review confined itself, in essence, to the clinical diagnosis of hyperactivity, as did the charge to the committee, rather than asking the broader environmental question of behavioral effects in the general population; it failed to recognize the significance of vulnerable subpopulations; and it misinterpreted the meaning of effect size as a criterion of risk. The FDA\u2019s response would have benefited from adopting the viewpoints and perspectives common to environmental health research. At the same time, the food color debate offers a lesson to environmental health researchers; namely, too narrow a focus on a single outcome or criterion can be misleading.", "Dietary sensitivities and ADHD symptoms: thirty-five years of research. Artificial food colors (AFCs) have not been established as the main cause of attention-deficit hyperactivity disorder (ADHD), but accumulated evidence suggests that a subgroup shows significant symptom improvement when consuming an AFC-free diet and reacts with ADHD-type symptoms on challenge with AFCs. Of children with suspected sensitivities, 65% to 89% reacted when challenged with at least 100 mg of AFC. Oligoantigenic diet studies suggested that some children in addition to being sensitive to AFCs are also sensitive to common nonsalicylate foods (milk, chocolate, soy, eggs, wheat, corn, legumes) as well as salicylate-containing grapes, tomatoes, and orange. Some studies found \\\"cosensitivity\\\" to be more the rule than the exception. Recently, 2 large studies demonstrated behavioral sensitivity to AFCs and benzoate in children both with and without ADHD. A trial elimination diet is appropriate for children who have not responded satisfactorily to conventional treatment or whose parents wish to pursue a dietary investigation."], ["Insulin-like growth factor-1 and childhood cancer risk Overexpression of growth factors and/or their receptors is a common event in malignancy and provides the underlying mechanisms for one of the hallmarks of cancer, uncontrolled proliferation. Mounting evidence suggests that IGF-1 is involved in the pathogenesis and progression of different types of human cancer such as colon, breast, prostate and lung. However, only a few studies have investigated the association between IGF-1 levels and childhood cancer risk. We aimed to compare the IGF-1 serum level in children with de novo malignancies to healthy children, and to assess its relationship with cancer type, stage, metastasis and different disease characteristics. The study was carried out on 100 children; 50 children with de novo malignancies and 50 healthy children of matched age and gender as a control group. The patients were subjected to a routine work-up for their cancers according to our local standards. Estimation of the serum level of IGF-1 was carried out in the two groups using ELISA. Our results showed that children with cancer had significantly higher levels of IGF-1 than healthy controls of the same age and gender. No association was found between IGF-1 and tumor type, stage, metastasis and other disease characteristics. In conclusion, the IGF-1 serum level is an important indicator of risk for the most prevalent forms of childhood cancer. It may be used to identify children at the highest risk for these cancers and aid in determing who may benefit most from preventive strategies. Given the small number of children in our study, studies with larger populations are required to confirm these results.", "Insulin-like growth factor 1 (IGF1), IGF binding protein 3 (IGFBP3), and breast cancer risk: pooled individual data analysis of 17 prospective studies Summary Background Insulin-like growth factor 1 (IGF1) stimulates mitosis and inhibits apoptosis. Some published results have shown an association between circulating IGF1 and breast-cancer risk, but it has been unclear whether this relationship is consistent or whether it is modified by IGF binding protein 3 (IGFBP3), menopausal status, oestrogen receptor status or other factors. The relationship of IGF1 (and IGFBP3) with breast-cancer risk factors is also unclear. The Endogenous Hormones and Breast Cancer Collaborative Group was established to analyse pooled individual data from prospective studies to increase the precision of the estimated associations of endogenous hormones with breast-cancer risk. Methods Individual data on prediagnostic IGF1 and IGFBP3 concentrations were obtained from 17 prospective studies in 12 countries. The associations of IGF1 with risk factors for breast cancer in controls were examined by calculating geometric mean concentrations in categories of these factors. The odds ratios (ORs) with 95% CIs of breast cancer associated with increasing IGF1 concentrations were estimated by conditional logistic regression in 4790 cases and 9428 matched controls, with stratification by study, age at baseline, and date of baseline. All statistical tests were two-sided, and a p value of less than 0\u00b705 was considered significant. Findings IGF1 concentrations, adjusted for age, were positively associated with height and age at first pregnancy, inversely associated with age at menarche and years since menopause, and were higher in moderately overweight women and moderate alcohol consumers than in other women. The OR for breast cancer for women in the highest versus the lowest fifth of IGF1 concentration was 1\u00b728 (95% CI 1\u00b714\u20131\u00b744; p<0\u00b70001). This association was not altered by adjusting for IGFBP3, and did not vary significantly by menopausal status at blood collection. The ORs for a difference in IGF1 concentration between the highest and lowest fifth were 1\u00b738 (95% CI 1\u00b714\u20131\u00b768) for oestrogen-receptor-positive tumours and 0\u00b780 (0\u00b757\u20131\u00b713) for oestrogen-receptor-negative tumours (p for heterogeneity=0\u00b7007). Interpretation Circulating IGF1 is positively associated with breast-cancer risk. The association is not substantially modified by IGFBP3, and does not differ markedly by menopausal status, but seems to be confined to oestrogen-receptor-positive tumours. Funding Cancer Research UK.", "Dietary restriction reduces insulin-like growth factor I levels, which modulates apoptosis, cell proliferation, and tumor progression in p53-defici... Diet contributes to over one-third of cancer deaths in the Western world, yet the factors in the diet that influence cancer are not elucidated. A reduction in caloric intake dramatically slows cancer progression in rodents, and this may be a major contribution to dietary effects on cancer. Insulin-like growth factor I (IGF-I) is lowered during dietary restriction (DR) in both humans and rats. Because IGF-I modulates cell proliferation, apoptosis, and tumorigenesis, the mechanisms behind the protective effects of DR may depend on the reduction of this multifaceted growth factor. To test this hypothesis, IGF-I was restored during DR to ascertain if lowering of IGF-I was central to slowing bladder cancer progression during DR. Heterozygous p53-deficient mice received a bladder carcinogen, p-cresidine, to induce preneoplasia. After confirmation of bladder urothelial preneoplasia, the mice were divided into three groups: (a) ad libitum; (b) 20% DR; and (c) 20% DR plus IGF-I (IGF-I/DR). Serum IGF-I was lowered 24% by DR but was completely restored in the IGF-I/DR-treated mice using recombinant IGF-I administered via osmotic minipumps. Although tumor progression was decreased by DR, restoration of IGF-I serum levels in DR-treated mice increased the stage of the cancers. Furthermore, IGF-I modulated tumor progression independent of changes in body weight. Rates of apoptosis in the preneoplastic lesions were 10 times higher in DR-treated mice compared to those in IGF/DR- and ad libitum-treated mice. Administration of IGF-I to DR-treated mice also stimulated cell proliferation 6-fold in hyperplastic foci. In conclusion, DR lowered IGF-I levels, thereby favoring apoptosis over cell proliferation and ultimately slowing tumor progression. This is the first mechanistic study demonstrating that IGF-I supplementation abrogates the protective effect of DR on neoplastic progression.", "Long-term effects of calorie or protein restriction on serum IGF-1 and IGFBP-3 concentration in humans Summary Reduced function mutations in the insulin/IGF-I signaling pathway increase maximal lifespan and health span in many species. Calorie restriction (CR) decreases serum IGF-1 concentration by ~40%, protects against cancer and slows aging in rodents. However, the long-term effects of CR with adequate nutrition on circulating IGF-1 levels in humans are unknown. Here we report data from two long-term CR studies (1 and 6 years) showing that severe CR without malnutrition did not change IGF-1 and IGF-1 : IGFBP-3 ratio levels in humans. In contrast, total and free IGF-1 concentrations were significantly lower in moderately protein-restricted individuals. Reducing protein intake from an average of 1.67 g kg \u22121 of body weight per day to 0.95 g kg \u22121 of body weight per day for 3 weeks in six volunteers practicing CR resulted in a reduction in serum IGF-1 from 194 ng mL \u22121 to 152 ng mL \u22121 . These findings demonstrate that, unlike in rodents, long-term severe CR does not reduce serum IGF-1 concentration and IGF-1 : IGFBP-3 ratio in humans. In addition, our data provide evidence that protein intake is a key determinant of circulating IGF-1 levels in humans, and suggest that reduced protein intake may become an important component of anticancer and anti-aging dietary interventions.", "Figitumumab combined with carboplatin and paclitaxel in treatment-na\u00efve Japanese patients with advanced non-small cell lung cancer Summary Objectives The insulin-like growth factor (IGF) signaling pathway has been implicated in the pathogenesis of numerous tumor types, including non-small cell lung cancer (NSCLC). Figitumumab is a fully human IgG2 monoclonal antibody against IGF-1 receptor (IGF-1R). Methods This phase I, open-label, dose-escalation study (ClinicalTrials.gov: NCT00603538) assessed the safety and tolerability of figitumumab (6, 10 and 20\u00a0mg/kg) in combination with carboplatin (area under the curve: 6\u00a0mg\u00b7min/mL) and paclitaxel (200\u00a0mg/m2) in Japanese patients (N\u2009=\u200919) with chemotherapy-na\u00efve, advanced NSCLC. Treatments were administered intravenously on day 1 of a 21-day cycle for four to six cycles. Pharmacokinetics, biomarkers, and antitumor activity were also evaluated. Results Figitumumab in combination with carboplatin and paclitaxel was well tolerated at doses up to 20\u00a0mg/kg; no dose-limiting toxicities were observed at this dose level. When given in combination, figitumumab plasma exposure increased in an approximately dose-proportional manner. The approximate 2-fold accumulation following repeated administration supported the 21-day regimen as appropriate for figitumumab administration. Serum total IGF-1 and IGF binding protein-3 concentrations increased following figitumumab dosing, but a clear dose-dependent relationship was not demonstrated. Seven of 18 evaluable patients experienced a partial response. Conclusions Figitumumab 20\u00a0mg/kg in combination with carboplatin and paclitaxel was well tolerated in chemotherapy-na\u00efve Japanese patients with NSCLC. Further analysis of biomarker data is necessary for the development of figitumumab therapy."], ["MPTP: an industrial chemical and contaminant of illicit narcotics stimulates a new era in research on Parkinson's disease. MPTP (1-methyl-4-phenyl-1,2,3,6-tetrahydropyridine) causes selective destruction of dopaminergic neurons of the nigrostriatal pathway in humans and other primates. It is less specific and much less potent in mice and has only slight effects in rats. Differences in rates and sites of metabolism of MPTP to its active, toxic, highly polar metabolite, MPP+ (1-methyl-4-phenylpyridine), appear to influence species specificity. In rats, type B monoamine oxidase (MAO-B), which mediates the conversion of MPTP to MPP+, may act as an enzymatic barrier at brain microvessels, whereas in primates the enzyme, present mainly in astrocytes, appears important for bioactivation of MPTP into the toxic metabolite. MPP+ is a substrate for catecholamine uptake sites and is concentrated in these neurons. The molecular mechanism of MPP+ toxicity has not been established definitively, but conversion to a free radical or uptake by mitochondria and inhibition of mitochondrial respiratory enzymes, leading to calcium release and cell death have been suggested. The discovery of toxin which causes an animal model of Parkinson's disease has stimulated new research on environmental factors that might contribute to this progressive degenerative disorder and provides a means for assessing new approaches to therapy.", "Dieldrin-induced neurotoxicity: relevance to Parkinson's disease pathogenesis. Parkinson's disease (PD) is increasingly recognized as a neurodegenerative disorder strongly associated with environmental chemical exposures. Recent epidemiological data demonstrate that environmental risk factors may play a dominant role as compared to genetic factors in the etiopathogenesis of idiopathic Parkinson's disease. Identification of key genetic defects such as alpha-synuclein and parkin mutations in PD also underscores the important role of genetic factors in the disease. Thus, understanding the interplay between genes and environment in PD may be critical to unlocking the mysteries of this 200-year-old neurodegenerative disease. Pesticides and metals are the most common classes of environmental chemicals that promote dopaminergic degeneration. The organochlorine pesticide dieldrin has been found in human PD postmortem brain tissues, suggesting that this pesticide has potential to promote nigral cell death. Though dieldrin has been banned, humans continue to be exposed to the pesticide through contaminated dairy products and meats due to the persistent accumulation of the pesticide in the environment. This review summarizes various neurotoxic studies conducted in both cell culture and animals models following dieldrin exposure and discusses their relevance to key pathological mechanisms associated with nigral dopaminergic degeneration including oxidative stress, mitochondrial dysfunction, protein aggregation, and apoptosis.", "Hydrogen peroxide poisoning. Hydrogen peroxide is an oxidising agent that is used in a number of household products, including general-purpose disinfectants, chlorine-free bleaches, fabric stain removers, contact lens disinfectants and hair dyes, and it is a component of some tooth whitening products. In industry, the principal use of hydrogen peroxide is as a bleaching agent in the manufacture of paper and pulp. Hydrogen peroxide has been employed medicinally for wound irrigation and for the sterilisation of ophthalmic and endoscopic instruments. Hydrogen peroxide causes toxicity via three main mechanisms: corrosive damage, oxygen gas formation and lipid peroxidation. Concentrated hydrogen peroxide is caustic and exposure may result in local tissue damage. Ingestion of concentrated (>35%) hydrogen peroxide can also result in the generation of substantial volumes of oxygen. Where the amount of oxygen evolved exceeds its maximum solubility in blood, venous or arterial gas embolism may occur. The mechanism of CNS damage is thought to be arterial gas embolisation with subsequent brain infarction. Rapid generation of oxygen in closed body cavities can also cause mechanical distension and there is potential for the rupture of the hollow viscus secondary to oxygen liberation. In addition, intravascular foaming following absorption can seriously impede right ventricular output and produce complete loss of cardiac output. Hydrogen peroxide can also exert a direct cytotoxic effect via lipid peroxidation. Ingestion of hydrogen peroxide may cause irritation of the gastrointestinal tract with nausea, vomiting, haematemesis and foaming at the mouth; the foam may obstruct the respiratory tract or result in pulmonary aspiration. Painful gastric distension and belching may be caused by the liberation of large volumes of oxygen in the stomach. Blistering of the mucosae and oropharyngeal burns are common following ingestion of concentrated solutions, and laryngospasm and haemorrhagic gastritis have been reported. Sinus tachycardia, lethargy, confusion, coma, convulsions, stridor, sub-epiglottic narrowing, apnoea, cyanosis and cardiorespiratory arrest may ensue within minutes of ingestion. Oxygen gas embolism may produce multiple cerebral infarctions. Although most inhalational exposures cause little more than coughing and transient dyspnoea, inhalation of highly concentrated solutions of hydrogen peroxide can cause severe irritation and inflammation of mucous membranes, with coughing and dyspnoea. Shock, coma and convulsions may ensue and pulmonary oedema may occur up to 24-72 hours post exposure. Severe toxicity has resulted from the use of hydrogen peroxide solutions to irrigate wounds within closed body cavities or under pressure as oxygen gas embolism has resulted. Inflammation, blistering and severe skin damage may follow dermal contact. Ocular exposure to 3% solutions may cause immediate stinging, irritation, lacrimation and blurred vision, but severe injury is unlikely. Exposure to more concentrated hydrogen peroxide solutions (>10%) may result in ulceration or perforation of the cornea. Gut decontamination is not indicated following ingestion, due to the rapid decomposition of hydrogen peroxide by catalase to oxygen and water. If gastric distension is painful, a gastric tube should be passed to release gas. Early aggressive airway management is critical in patients who have ingested concentrated hydrogen peroxide, as respiratory failure and arrest appear to be the proximate cause of death. Endoscopy should be considered if there is persistent vomiting, haematemesis, significant oral burns, severe abdominal pain, dysphagia or stridor. Corticosteroids in high dosage have been recommended if laryngeal and pulmonary oedema supervene, but their value is unproven. Endotracheal intubation, or rarely, tracheostomy may be required for life-threatening laryngeal oedema. Contaminated skin should be washed with copious amounts of water. Skin lesions should be treated as thermal burns; surgery may be required for deep burns. In the case of eye exposure, the affected eye(s) shod eye(s) should be irrigated immediately and thoroughly with water or 0.9% saline for at least 10-15 minutes. Instillation of a local anaesthetic may reduce discomfort and assist more thorough decontamination.", "Cigarette Smoke Toxins Deposited on Surfaces: Implications for Human Health Cigarette smoking remains a significant health threat for smokers and nonsmokers alike. Secondhand smoke (SHS) is intrinsically more toxic than directly inhaled smoke. Recently, a new threat has been discovered \u2013 Thirdhand smoke (THS) \u2013 the accumulation of SHS on surfaces that ages with time, becoming progressively more toxic. THS is a potential health threat to children, spouses of smokers and workers in environments where smoking is or has been allowed. The goal of this study is to investigate the effects of THS on liver, lung, skin healing, and behavior, using an animal model exposed to THS under conditions that mimic exposure of humans. THS-exposed mice show alterations in multiple organ systems and excrete levels of NNAL (a tobacco-specific carcinogen biomarker) similar to those found in children exposed to SHS (and consequently to THS). In liver, THS leads to increased lipid levels and non-alcoholic fatty liver disease, a precursor to cirrhosis and cancer and a potential contributor to cardiovascular disease. In lung, THS stimulates excess collagen production and high levels of inflammatory cytokines, suggesting propensity for fibrosis with implications for inflammation-induced diseases such as chronic obstructive pulmonary disease and asthma. In wounded skin, healing in THS-exposed mice has many characteristics of the poor healing of surgical incisions observed in human smokers. Lastly, behavioral tests show that THS-exposed mice become hyperactive. The latter data, combined with emerging associated behavioral problems in children exposed to SHS/THS, suggest that, with prolonged exposure, they may be at significant risk for developing more severe neurological disorders. These results provide a basis for studies on the toxic effects of THS in humans and inform potential regulatory policies to prevent involuntary exposure to THS.", "Ciguatera: recent advances but the risk remains. Ciguatera is an important form of human poisoning caused by the consumption of seafood. The disease is characterised by gastrointestinal, neurological and cardiovascular disturbances. In cases of severe toxicity, paralysis, coma and death may occur. There is no immunity, and the toxins are cumulative. Symptoms may persist for months or years, or recur periodically. The epidemiology of ciguatera is complex and of central importance to the management and future use of marine resources. Ciguatera is an important medical entity in tropical and subtropical Pacific and Indian Ocean regions, and in the tropical Caribbean. As reef fish are increasingly exported to other areas, it has become a world health problem. The disease is under-reported and often misdiagnosed. Lipid-soluble, polyether toxins known as ciguatoxins accumulated in the muscles of certain subtropical and tropical marine finfish cause ciguatera. Ciguatoxins arise from biotransformation in the fish of less polar ciguatoxins (gambiertoxins) produced by Gambierdiscus toxicus, a marine dinoflagellate that lives on macroalgae, usually attached to dead coral. The toxins and their metabolites are concentrated in the food chain when carnivorous fish prey on smaller herbivorous fish. Humans are exposed at the end of the food chain. More than 400 species of fish can be vectors of ciguatoxins, but generally only a relatively small number of species are regularly incriminated in ciguatera. Ciguateric fish look, taste and smell normal, and detection of toxins in fish remains a problem. More than 20 precursor gambiertoxins and ciguatoxins have been identified in G. toxicus and in herbivorous and carnivorous fish. The toxins become more polar as they undergo oxidative metabolism and pass up the food chain. The main Pacific ciguatoxin (P-CTX-1) causes ciguatera at levels=0.1 microg/kg in the flesh of carnivorous fish. The main Caribbean ciguatoxin (C-CTX-1) is less polar and 10-fold less toxic than P-CTX-1. Ciguatoxins activate sodium ion (Na ) channels, causing cell membrane excitability and instability. Worldwide coral bleaching is now well documented, and there is a strong association between global warming and the bleaching and death of coral. This, together with natural environmental factors such as earthquakes and hurricanes, and man-made factors such as tourism, dock construction, sewage and eutrophication, may create more favourable environments for G. toxicus. While low levels of G. toxicus are found throughout tropical and subtropical waters, the presence of bloom numbers is unpredictable and patchy. Only certain genetic strains produce ciguatoxins, and environmental triggers for increasing toxin production are unknown."], ["Insect food for astronauts: gas exchange in silkworms fed on mulberry and lettuce and the nutritional value of these insects for human consumption ... In this study, silkworm moth (Bombyx mori L.) larvae were regarded as an animal protein source for astronauts in the bioregenerative life support system during long-term deep space exploration in the future. They were fed with mulberry and stem lettuce leaves during the first three instars and the last two instars, respectively. In addition, this kind of environmental approach, which utilised inedible biomass of plants to produce animal protein of high quality, can likewise be applied terrestrially to provide food for people living in extreme environments and/or impoverished agro-ecosystems, such as in polar regions, isolated military bases, ships, submarines, etc. Respiration characteristics of the larvae during development under two main physiological conditions, namely eating and not-eating of leaves, were studied. Nutrient compositions of silkworm powder (SP), ground and freeze-dried silkworms on the 3rd day of the 5th instar larvae, including protein, fat, vitamins, minerals and fatty acids, were measured using international standard methods. Silkworms' respiration rates, measured when larvae were eating mulberry leaves, were higher than those of similar larvae that hadn't eaten such leaves. There was a significant difference between silkworms fed on mulberry leaves and those fed on stem lettuce in the 4th and 5th instars (P<0.01). Amounts of CO2 exhaled by the silkworms under the two physiological regimes differed from each other (P<0.01). There was also a significant difference between the amount of O2 inhaled when the insects were under the two physiological statuses (P<0.01). Moreover, silkworms' respiration quotient under the eating regime was larger than when under the not-eating regime. The SP was found to be rich in protein and amino acids in total; 12 essential vitamins, nine minerals and twelve fatty acids were detected. Moreover, 359\u200akcal could be generated per 100\u200agram of SP (dry weight).", "Identification of cheese mite species inoculated on Mimolette and Milbenkase cheese through cryogenic scanning electron microscopy. Samples of Mimolette (France) and Milbenkase (Germany) cheeses traditionally ripened by mites were analyzed to determine the mite species present on each sample. Scientific literature was reviewed to understand which mite species most commonly infest cheese. Morphological features possessed by mites were then studied to understand what unique characteristics are required to ensure accurate identification. After identification and compilation of a detailed key of stored food mites (subclass Acari, order Astigmata) and their delineating features, the mites were viewed through a cryogenic scanning electron microscope. It was determined that Mimolette cheese is inoculated with Acarus siro L. The features studied to identify this mite species included idiosomal length and shape, setae length and arrangement, leg size, placement of anus and genitals, and solenidia shape. The Milbenkase cheese is inoculated with Tyrolichus casei Oudemans, which was evident after viewing the same features used to identify A. siro and the supracoxal seta shape. With this knowledge, further research can be conducted on the 2 cheese varieties to understand what chemical, physical, and microbial changes occur within the cheeses because of mites. It is important to identify the mite species present on each cheese variety to improve our understanding of their role in creating the distinctive characteristics that set these cheeses apart from others. Copyright (c) 2010 American Dairy Science Association. Published by Elsevier Inc. All rights reserved.", "Organically Grown Food Provides Health Benefits to Drosophila melanogaster The \u201corganic food\u201d market is the fastest growing food sector, yet it is unclear whether organically raised food is nutritionally superior to conventionally grown food and whether consuming organic food bestows health benefits. In order to evaluate potential health benefits of organic foods, we used the well-characterized fruit fly Drosophila melanogaster as a model system. Fruit flies were raised on a diets consisting of extracts of either conventionally or organically raised produce (bananas, potatoes, raisins, soy beans). Flies were then subjected to a variety of tests designed to assess overall fly health. Flies raised on diets made from organically grown produce had greater fertility and longevity. On certain food sources, greater activity and greater stress resistance was additionally observed, suggesting that organic food bestows positive effects on fly health. Our data show that Drosophila can be used as a convenient model system to experimentally test potential health effects of dietary components. Using this system, we provide evidence that organically raised food may provide animals with tangible benefits to overall health.", "Pesticides and human chronic diseases: evidences, mechanisms, and perspectives. Along with the wide use of pesticides in the world, the concerns over their health impacts are rapidly growing. There is a huge body of evidence on the relation between exposure to pesticides and elevated rate of chronic diseases such as different types of cancers, diabetes, neurodegenerative disorders like Parkinson, Alzheimer, and amyotrophic lateral sclerosis (ALS), birth defects, and reproductive disorders. There is also circumstantial evidence on the association of exposure to pesticides with some other chronic diseases like respiratory problems, particularly asthma and chronic obstructive pulmonary disease (COPD), cardiovascular disease such as atherosclerosis and coronary artery disease, chronic nephropathies, autoimmune diseases like systemic lupus erythematous and rheumatoid arthritis, chronic fatigue syndrome, and aging. The common feature of chronic disorders is a disturbance in cellular homeostasis, which can be induced via pesticides' primary action like perturbation of ion channels, enzymes, receptors, etc., or can as well be mediated via pathways other than the main mechanism. In this review, we present the highlighted evidence on the association of pesticide's exposure with the incidence of chronic diseases and introduce genetic damages, epigenetic modifications, endocrine disruption, mitochondrial dysfunction, oxidative stress, endoplasmic reticulum stress and unfolded protein response (UPR), impairment of ubiquitin proteasome system, and defective autophagy as the effective mechanisms of action. Copyright \u00a9 2013 Elsevier Inc. All rights reserved.", "Shared signals and the potential for phylogenetic espionage between plants and animals. Until recently, the study and understanding of plant and animal signalling and response mechanisms have developed independently. Recent biochemical and molecular work is producing a growing list of elements involved in responses to biotic and abiotic stimuli that are very similar across kingdoms. Some of the more interesting examples of these include prostaglandin/octadecanoid-mediated responses to wounding, steroid-based signalling systems, and pathogen-recognition mechanisms. Some of these similarities probably represent evolutionary convergence; others may be ancestral to plants and animals. Ecological and evolutionary implications of such overlaps include the existence of pathogens that can cause disease in plants and animals, the ability of herbivores to manipulate plant responses, usurpation of microbial mechanisms and genes by herbivorous animals and plants, evolution of plant defenses exploiting shared signals in animals, and the medicinal use of plants by humans. Comparative study of the signalling and response mechanisms used by plants, animals, and microbes provides novel and useful insights to the ecology and evolution of interactions across kingdoms."], ["Nut consumption, vegetarian diets, ischemic heart disease risk, and all-cause mortality: evidence from epidemiologic studies. Perhaps one of the most unexpected and novel findings in nutritional epidemiology in the past 5 y has been that nut consumption seems to protect against ischemic heart disease (IHD). Frequency and quantity of nut consumption have been documented to be higher in vegetarian than in nonvegetarian populations. Nuts also constitute an important part of other plant-based diets, such as Mediterranean and Asian diets. In a large, prospective epidemiologic study of Seventh-day Adventists in California, we found that frequency of nut consumption had a substantial and highly significant inverse association with risk of myocardial infarction and death from IHD. The Iowa Women's Health Study also documented an association between nut consumption and decreased risk of IHD. The protective effect of nuts on IHD has been found in men and women and in the elderly. Importantly, nuts have similar associations in both vegetarians and nonvegetarians. The protective effect of nut consumption on IHD is not offset by increased mortality from other causes. Moreover, frequency of nut consumption has been found to be inversely related to all-cause mortality in several population groups such as whites, blacks, and the elderly. Thus, nut consumption may not only offer protection against IHD, but also increase longevity.", "Reduction in Ki-67 in Benign Breast Tissue of High Risk Women with the Lignan Secoisolariciresinol Diglycoside (SDG) Preclinical and correlative studies suggest reduced breast cancer with higher lignan intake or blood levels. We conducted a pilot study of modulation of risk biomarkers for breast cancer in premenopausal women after administration of the plant lignan secoisolariciresinol given as the diglycoside (SDG). Eligibility criteria included regular menstrual cycles, no oral contraceptives, a greater than 3-fold increase in 5 year risk, and baseline Ki-67 \u22652% in areas of hyperplasia in breast tissue sampled by random periareolar fine needle aspiration (RPFNA) during the follicular phase of the menstrual cycle. SDG 50 mg daily was given for 12 months, followed by repeat RPFNA. The primary endpoint was change in Ki-67. Secondary endpoints included change in cytomorphology, mammographic breast density, serum bioavailable estradiol, and testosterone IGF-I and IGFBP-3, and plasma lignan levels. Forty-five of 49 eligible women completed the study with excellent compliance (median = 96%) and few serious side effects (4% grade 3). Median plasma enterolactone increased ~ 9-fold, and total lignans 16 fold. Thirty-six (80%) of the 45 evaluable subjects demonstrated a decrease in Ki-67, from a median of 4% (range 2\u201316.8 %) to 2% (range 0\u201315.2%) (p<0.001 by Wilcoxon signed rank test). A decrease from baseline in the proportion of women with atypical cytology (p=0.035) was also observed. Based on favorable risk biomarker modulation and lack of adverse events, we are initiating a randomized trial of SDG vs. placebo in premenopausal women.", "Reduction in Ki-67 in Benign Breast Tissue of High Risk Women with the Lignan Secoisolariciresinol Diglycoside (SDG) Preclinical and correlative studies suggest reduced breast cancer with higher lignan intake or blood levels. We conducted a pilot study of modulation of risk biomarkers for breast cancer in premenopausal women after administration of the plant lignan secoisolariciresinol given as the diglycoside (SDG). Eligibility criteria included regular menstrual cycles, no oral contraceptives, a greater than 3-fold increase in 5 year risk, and baseline Ki-67 \u22652% in areas of hyperplasia in breast tissue sampled by random periareolar fine needle aspiration (RPFNA) during the follicular phase of the menstrual cycle. SDG 50 mg daily was given for 12 months, followed by repeat RPFNA. The primary endpoint was change in Ki-67. Secondary endpoints included change in cytomorphology, mammographic breast density, serum bioavailable estradiol, and testosterone IGF-I and IGFBP-3, and plasma lignan levels. Forty-five of 49 eligible women completed the study with excellent compliance (median = 96%) and few serious side effects (4% grade 3). Median plasma enterolactone increased ~ 9-fold, and total lignans 16 fold. Thirty-six (80%) of the 45 evaluable subjects demonstrated a decrease in Ki-67, from a median of 4% (range 2\u201316.8 %) to 2% (range 0\u201315.2%) (p<0.001 by Wilcoxon signed rank test). A decrease from baseline in the proportion of women with atypical cytology (p=0.035) was also observed. Based on favorable risk biomarker modulation and lack of adverse events, we are initiating a randomized trial of SDG vs. placebo in premenopausal women.", "Declines in breast cancer after the WHI: apparent impact of hormone therapy. Large numbers of US women stopped taking hormone therapies (HT), especially estrogen/progestin (EP) formulations, after the Women's Health Initiative trial detected elevated risks of breast cancer in EP users and was halted in July 2002. Recent reports have indicated substantial and significant declines in population-based breast cancer incidence, particularly hormone-sensitive forms, for 2003 and 2004. Are these events linked? This commentary considers the available evidence linking the mass cessation of HT in 2002 to the breast cancer incidence declines of 2003/2004 and quantifies the potential impact of the cessation on the overall burden of breast cancer in the US.", "Determination of urinary lignans and phytoestrogen metabolites, potential antiestrogens and anticarcinogens, in urine of women on various habitual ... Recently two groups of compounds with diphenolic structure, the lignans and the isoflavonic phytoestrogens, were detected and identified in human urine and other biological fluids. These compounds are of great biological interest because they exhibit both in vitro and in vivo weak estrogenic and sometimes also antiestrogenic activities and many plant lignans have been shown to have anticarcinogenic, antiviral, antifungal and other interesting biological effects. The compounds found in relatively large amounts (10-1000 times more than estrogens) in urine are modified by intestinal bacteria from plant lignans and phytoestrogens, which are present in fiber-rich food such as grain and beans. They bind with low affinity to estrogen receptors and preliminary results suggest that they may induce production of sex hormone binding globulin (SHBG) in the liver and in this way may influence sex hormone metabolism and biological effects. Five compounds, the lignans enterolactone (Enl), enterodiol (End) and the isoflavonic phytoestrogen metabolites daidzein (Da), equol (Eq) and O-desmethylangolensin (O-Dma) were measured in urine by gas chromatography-mass spectrometry (selected ion monitoring) using deuterated internal standards in 5 groups of women (total number 53). The members of three dietary groups (omnivores, lactovegetarians and macrobiotics) were living in Boston and of two groups in Helsinki (omnivores and lactovegetarians). Until now measurements have been carried out in 94 72-h samples. The highest mean excretion of the most abundant compound, enterolactone, was found in the macrobiotic group and the lowest in the omnivoric groups. Total mean 24-h excretion of enterolactone was 17,680 nmol in the macrobiotics, 4,170 nmol in the Boston lactovegetarians, 3,650 nmol in the Helsinki lactovegetarians, 2,460 nmol in the Helsinki omnivores and 2,050 nmol in the Boston omnivores. The other diphenols followed approximately the same pattern. In an earlier study the lowest excretion of enterolactone (1,040 nmol/24 h) was found in a group of postmenopausal apparently healthy breast cancer patients living in Boston. It is concluded that further studies are necessary to elucidate the possible role of these compounds in cancer and other diseases. However, the evidence obtained until now seems to justify the conclusion that these compounds may be among the dietary factors affording protection against hormone-dependent cancers in vegetarians and semivegetarians."], ["Sushi delights and parasites: the risk of fishborne and foodborne parasitic zoonoses in Asia. Because of the worldwide popularization of Japanese cuisine, the traditional Japanese fish dishes sushi and sashimi that are served in Japanese restaurants and sushi bars have been suspected of causing fishborne parasitic zoonoses, especially anisakiasis. In addition, an array of freshwater and brackish-water fish and wild animal meats, which are important sources of infection with zoonotic parasites, are served as sushi and sashimi in rural areas of Japan. Such fishborne and foodborne parasitic zoonoses are also endemic in many Asian countries that have related traditional cooking styles. Despite the recent increase in the number of travelers to areas where these zoonoses are endemic, travelers and even infectious disease specialists are unaware of the risk of infection associated with eating exotic ethnic dishes. The aim of this review is to provide practical background information regarding representative fishborne and foodborne parasitic zoonoses endemic in Asian countries.", "An unexpected mortality increase in the United States follows arrival of the radioactive plume from Fukushima: is there a correlation? The multiple nuclear meltdowns at the Fukushima plants beginning on March 11, 2011, are releasing large amounts of airborne radioactivity that has spread throughout Japan and to other nations; thus, studies of contamination and health hazards are merited. In the United States, Fukushima fallout arrived just six days after the earthquake, tsunami, and meltdowns. Some samples of radioactivity in precipitation, air, water, and milk, taken by the U.S. government, showed levels hundreds of times above normal; however, the small number of samples prohibits any credible analysis of temporal trends and spatial comparisons. U.S. health officials report weekly deaths by age in 122 cities, about 25 to 35 percent of the national total. Deaths rose 4.46 percent from 2010 to 2011 in the 14 weeks after the arrival of Japanese fallout, compared with a 2.34 percent increase in the prior 14 weeks. The number of infant deaths after Fukushima rose 1.80 percent, compared with a previous 8.37 percent decrease. Projecting these figures for the entire United States yields 13,983 total deaths and 822 infant deaths in excess of the expected. These preliminary data need to be followed up, especially in the light of similar preliminary U.S. mortality findings for the four months after Chernobyl fallout arrived in 1986, which approximated final figures.", "Marine edible algae as disease preventers. As modern lifestyles and new feeding habits settle in the world, noncommunicable diseases (NCDs) have evolved to be major causes of disability in developing as well as developed countries. As a concomitant effect, there is a growing interest in natural, healthy food and an increasing awareness of risk factors and determinants of disease. This chapter describes some nutritional facts about seaweeds, which have been used as food since ancient times in China, Japan, Egypt, and India and comments on the potential utilization of marine algae as functional foods. This concept and the description of metabolic syndrome are used as a basis to comprehension of seaweeds against two dreadful illnesses of our times: high blood pressure and cancer. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Microbiological quality of sushi from sushi bars and retailers. Sushi is a traditional Japanese food, mostly consisting of rice and raw fish. Fish is considered a healthy food, but as with other animal products, consumption of raw muscle incurs potential health risks such as ingestion of pathogenic bacteria or parasites. In this study, 250 sushi samples were analyzed for their microbiological status and the prevalence of pathogenic bacteria. A comparison was made between frozen sushi from supermarkets and fresh sushi from sushi bars. Aerobic mesophilic bacteria counts differed for sushi from these two sources, with means of 2.7 log CFU/g for frozen sushi and 6.3 log CFU/g for fresh sushi. The prevalence of Escherichia coli and Staphylococcus aureus was higher in the fresh samples. Salmonella was found in four (1.6%) of the sushi samples, and Listeria monocytogenes was found in three (1.2%) of the samples. These results indicate that the microbiological quality of industrially processed sushi is higher than that of freshly prepared sushi. The quality of freshly prepared sushi strongly depends on the skills and habits of the preparation cooks, which may vary.", "Wet deposition of fission-product isotopes to North America from the Fukushima Dai-ichi incident, March 2011. Using the infrastructure of the National Atmospheric Deposition Program (NADP), numerous measurements of radionuclide wet deposition over North America were made for 167 NADP sites before and after the Fukushima Dai-ichi Nuclear Power Station incident of March 12, 2011. For the period from March 8 through April 5, 2011, wet-only precipitation samples were collected by NADP and analyzed for fission-product isotopes within whole-water and filterable solid samples by the United States Geological Survey using gamma spectrometry. Variable amounts of (131)I, (134)Cs, or (137)Cs were measured at approximately 21% of sampled NADP sites distributed widely across the contiguous United States and Alaska. Calculated 1- to 2-week individual radionuclide deposition fluxes ranged from 0.47 to 5100 Becquerels per square meter during the sampling period. Wet deposition activity was small compared to measured activity already present in U.S. soil. NADP networks responded to this complex disaster, and provided scientifically valid measurements that are comparable and complementary to other networks in North America and Europe."], ["The Perils of Ignoring History: Big Tobacco Played Dirty and Millions Died. How Similar Is Big Food? Context: In 1954 the tobacco industry paid to publish the \u201cFrank Statement to Cigarette Smokers\u201d in hundreds of U.S. newspapers. It stated that the public's health was the industry's concern above all others and promised a variety of good-faith changes. What followed were decades of deceit and actions that cost millions of lives. In the hope that the food history will be written differently, this article both highlights important lessons that can be learned from the tobacco experience and recommends actions for the food industry. Methods: A review and analysis of empirical and historical evidence pertaining to tobacco and food industry practices, messages, and strategies to influence public opinion, legislation and regulation, litigation, and the conduct of science. Findings: The tobacco industry had a playbook, a script, that emphasized personal responsibility, paying scientists who delivered research that instilled doubt, criticizing the \u201cjunk\u201d science that found harms associated with smoking, making self-regulatory pledges, lobbying with massive resources to stifle government action, introducing \u201csafer\u201d products, and simultaneously manipulating and denying both the addictive nature of their products and their marketing to children. The script of the food industry is both similar to and different from the tobacco industry script. Conclusions: Food is obviously different from tobacco, and the food industry differs from tobacco companies in important ways, but there also are significant similarities in the actions that these industries have taken in response to concern that their products cause harm. Because obesity is now a major global problem, the world cannot afford a repeat of the tobacco history, in which industry talks about the moral high ground but does not occupy it.", "Tobacco and obesity epidemics: not so different after all? Short abstract Campaigns to promote healthy eating are undermined by the ubiquity of processed, energy dense foods. A global strategy is now needed to tackle the rising prevalence of obesity", "Frequent ice cream consumption is associated with reduced striatal response to receipt of an ice cream\u2013based milkshake Background: Weight gain leads to reduced reward-region responsivity to energy-dense food receipt, and consumption of an energy-dense diet compared with an isocaloric, low-energy-density diet leads to reduced dopamine receptors. Furthermore, phasic dopamine signaling to palatable food receipt decreases after repeated intake of that food, which collectively suggests that frequent intake of an energy-dense food may reduce striatal response to receipt of that food. Objective: We tested the hypothesis that frequent ice cream consumption would be associated with reduced activation in reward-related brain regions (eg, striatum) in response to receipt of an ice cream\u2013based milkshake and examined the influence of adipose tissue and the specificity of this relation. Design: Healthy-weight adolescents (n = 151) underwent fMRI during receipt of a milkshake and during receipt of a tasteless solution. Percentage body fat, reported food intake, and food craving and liking were assessed. Results: Milkshake receipt robustly activated the striatal regions, yet frequent ice cream consumption was associated with a reduced response to milkshake receipt in these reward-related brain regions. Percentage body fat, total energy intake, percentage of energy from fat and sugar, and intake of other energy-dense foods were not related to the neural response to milkshake receipt. Conclusions: Our results provide novel evidence that frequent consumption of ice cream, independent of body fat, is related to a reduction in reward-region responsivity in humans, paralleling the tolerance observed in drug addiction. Data also imply that intake of a particular energy-dense food results in attenuated reward-region responsivity specifically to that food, which suggests that sensory aspects of eating and reward learning may drive the specificity.", "Brain PET imaging in obesity and food addiction: current evidence and hypothesis. The ongoing epidemics of obesity is one main health concern of the present time. Overeating in some obese individuals shares similarities with the loss of control and compulsive behavior observed in drug-addicted subjects, suggesting that obesity may involve food addiction. Here, we review the contributions provided by the use of positron emission tomography to the current understanding of the cerebral control of obesity and food intake in humans. The available studies have shown that multiple areas in the brain are involved with the reward properties of food, such as prefrontal, orbitofrontal, somatosensory cortices, insula, thalamus, hypothalamus, amygdala, and others. This review summarizes the current evidence, supporting the concepts that i) regions involved in the somatosensory response to food sight, taste, and smell are activated by palatable foods and may be hyperresponsive in obese individuals, ii) areas controlling executive drive seem to overreact to the anticipation of pleasure during cue exposure, and iii) those involved in cognitive control and inhibitory behavior may be resistant to the perception of reward after food exposure in obese subjects. All of these features may stimulate, for different reasons, ingestion of highly palatable and energy-rich foods. Though these same regions are similarly involved in drug abusers and game-addicted individuals, any direct resemblance may be an oversimplification, especially as the heterogeneities between studies and the prevalent exclusion of sensitive groups still limit a coherent interpretation of the findings. Further work is required to comprehensively tackle the multifaceted phenotype of obesity and identify the role of food dependency in its pathophysiology. Copyright \u00a9 2012 S. Karger GmbH, Freiburg.", "Ageing and eating. Epidemiological studies propose that extension of the human lifespan or the reduction of age associated diseases may be achieved by physical exercise, caloric restriction, and by consumption of certain substances such as resveratrol, selenium, flavonoids, zinc, omega 3 unsaturated fatty acids, vitamins E and C, Ginkgobiloba extracts, aspirin, green tea catechins, antioxidants in general, and even by light caffeine or alcohol consumption. Though intriguing, these studies only show correlative (not causative) effects between the application of the particular substance and longevity. On the other hand, obesity is yet a strong menace to the western society and it will emerge even more so throughout the next decades according to the prediction of the WHO. Although obesity is considered a severe problem, very little is known about the molecular mechanisms causing the associated degeneration of organs and finally death. Nutrient related adverse consequences for health and thus ageing may be due to a high sugar or high fat diet, excessive alcohol consumption and cigarette smoke amongst others. In this article we examine the interdependencies of eating and ageing and suggest yeast, one of the most successful ageing models, as an easy tool to elucidate the molecular pathways from eating to ageing. The conservation of most ageing pathways in yeast and their easy genetic tractability may provide a chance to discriminate between the correlative and causative effects of nutrition on ageing. 2010 Elsevier B.V. All rights reserved."], ["Phaseolus beans: impact on glycaemic response and chronic disease risk in human subjects. Consumption of Phaseolus vulgaris bean species such as pinto, black, navy or kidney may be beneficial in the prevention and treatment of chronic diseases. In particular, conditions that are promoted by increased glycaemic stress (hyperglycaemia and hyperinsulinaemia) including diabetes, CVD and cancer seem to be reduced in individuals who eat more of these beans. The present paper discusses the influence of P. vulgaris species on glycaemic response and the impact that relationship may have on the risk of developing diabetes, CVD and cancer.", "Influence of frequent and long-term bean consumption on colonic function and fermentation. The objective of this study was to determine the influence of frequent and long-term consumption of legume seeds on colonic function. Two groups of subjects were studied--one group habitually consumed legume seeds as part of their normal diet, a second group only infrequently consumed legumes. No differences between these groups could be detected for fecal output and frequency, intestinal transit time, VFA excretion or fecal pH during 23-day study periods in which subjects consumed either their usual diet or 100 g red kidney beans, daily. However, the addition of beans to the diets of both groups provided significantly more dietary fiber, and produced greater fecal output and a higher concentration of VFA in feces. Fecal output appeared to be determined by two independent parameters--dietary fiber intake and VFA excretion. Beans provided a physiologically useful source of dietary fiber and favorably influenced colonic function.", "Beans and diabetes: Phaseolus vulgaris preparations as antihyperglycemic agents. Bean pods (Phaseolus vulgaris) are among the most widely used traditional remedies against diabetes mellitus. Historical knowledge is summarized and compared to recent study results. Reports dating from the first half of the 20(th) century as well as recent publications show contradictory results. It seems that Phaseolus preparations should not be considered the first choice in phytopharmaceutical treatment of diabetes or lead structure research. To be effective, fairly high doses of aqueous extracts need to be given. Because of their fiber content and an alpha-amylase inhibitory effect, beans might be more useful as food components in preventing or ameliorating type 2 diabetes.", "Nutritional quality of legumes, and their role in cardiometabolic risk prevention: a review. Legumes (including alfalfa, clover, lupins, green beans and peas, peanuts, soybeans, dry beans, broad beans, dry peas, chickpeas, and lentils) represent an important component of the human diet in several areas of the world, especially in the developing countries, where they complement the lack of proteins from cereals, roots, and tubers. In some regions of the world, legume seeds are the only protein supply in the diet. The health benefits of legume consumption have received rising interest from researchers, and their consumption and production extends worldwide. Among European countries, higher legume consumption is observed around the Mediterranean, with per capita daily consumption between 8 and 23 g, while in Northern Europe, the daily consumption is less than 5 g per capita. The physiological effects of different legumes vary significantly. These differences may result from the polysaccharides composition, in particular, the quantity and variety of dietary fibers and starch, protein make-up, and variability in phytochemical content. The majority of legumes contain phytochemicals: bioactive compounds, including enzyme inhibitors, phytohemagglutinins (lectins), phytoestrogens, oligosaccharides, saponins, and phenolic compounds, which play metabolic roles in humans who frequently consume these foods. Dietary intake of phytochemicals may provide health benefits, protecting against numerous diseases or disorders, such as coronary heart disease, diabetes, high blood pressure and inflammation. The synergistic or antagonistic effects of these phytochemical mixtures from food legumes, their interaction with other components of the diet, and the mechanism of their action have remained a challenge with regard to understanding the role of phytochemicals in health and diseases. Their mitigating effects and the mechanism of their action need to be further addressed if we are to understand the role of phytochemicals in health and diseases. This review provides an overview of the nutritional quality of legumes and their potential contribution in cardiometabolic risk prevention.", "Lifestyle recommendations to reduce the risk of kidney stones. Kidney stones are increasingly common in wealthy industrialized countries. The most frequent form (80%) is idiopathic calcium stone disease. Eating habits and lifestyle have a direct effect on the lithogenic urinary risk factors and the pathogenesis of this condition. A diet characterized by a high intake of fluids, fruits, and vegetables; a low consumption of salt and protein; and a balanced intake of calcium, fats, and carbohydrates constitutes an efficacious approach to the prevention and treatment of this illness. A correct body weight, regular exercise, and a reduction in stressful life events are also useful preventive actions. Copyright \u00a9 2011 Elsevier Inc. All rights reserved."], ["A case of Kombucha tea toxicity. INTRODUCTION: Kombucha \\\"mushroom'' tea is touted to have medicinal properties. Here, we present a case of hyperthermia, lactic acidosis, and acute renal failure within 15 hours of Kombucha tea ingestion. CASE PRESENTATION: A 22 year old male, newly diagnosed with HIV, became short of breath and febrile to 103.0F, within twelve hours of Kombucha tea ingestion. He subsequently became combative and confused, requiring sedation and intubation for airway control. Laboratories revealed a lactate of 12.9 mmol/L, and serum creatinine of 2.1 mg/dL. DISCUSSION: Kombucha tea is black tea fermented in a yeast-bacteria medium. Several case reports exist of serious, and sometimes fatal, hepatic dysfunction and lactic acidosis within close proximity to ingestion. CONCLUSION: While Kombucha tea is considered a healthy elixir, the limited evidence currently available raises considerable concern that it may pose serious health risks. Consumption of this tea should be discouraged, as it may be associated with life-threatening lactic acidosis.", "The beriberi analogy to myocardial infarction. Two pandemics of heart attack deaths have plagued the world's population during the past 130 years. The first pandemic, induced by beriberi, was caused by the industrial revolution altering the nutritional composition of rice. By 1892 a simple working knowledge, then at hand, could have terminated the beriberi plague; however, orthodox medicine being then enchanted with the false concept that all disease was caused by germs, permitted millions of Asians to die needlessly of beriberi by refusing to tell them to eat rice bran or to drink rice bran tea. A second pandemic of heart attack deaths, called myocardial infarction (MI), struck the developed nations of the Western World in full force after 1930. As a hypothesis, it is suggested that this MI pandemic, still raging today, was caused by a change in food processing that occurred after 1920, when the new oil seed industry introduced into our food three greatly harmful lipid substances. The unnatural trans-trans isomer of linoleic acid, which had never been in human food prior to 1920 and which entered our food in margarines and refined oils, blocked the conversion of natural cis-cis linoleic acid to prostaglandin E1, which tends to prevent MI, both by acting as a vasodilator and by minimizing platelet aggregation. Harmful lactones were also introduced into our food, increasing the risk of MI by decreasing the fibrinolytic activity of our blood. The oil seed industry also introduced into our diet free radical lipid peroxides that make the myocardium more vulnerable to infarction. It is suggested that except for the one in 500 of us who is afflicted by familial hypercholesterolemia, the cholesterol concept of MI is as false today as was the concept in 1900 that germs caused beriberi. It is further suggested that a working knowledge is at hand today that can make death from MI just as rare as death is now from a beriberi-induced heart attack.", "Synthesis and stability study of a new major metabolite of \u03b3-hydroxybutyric acid Summary \u03b3-Hydroxybutanoic acid (GHB) is used as a date-rape drug, which renders the victims unconscious and defenceless. Intoxications are very difficult to detect for forensic scientists due to rapid metabolism to endogenous levels of GHB. We recently discovered a new major metabolite, 2, of GHB (1) that could potentially extend the analytical detection window for GHB intoxications. Herein we disclose synthetic procedures based on a Koenigs\u2013Knorr glucuronidation approach that provides GHB glucuronide 2 and a deuterium-labelled analogue d 4-2 of high purity suitable for analytical chemistry. In addition, we have assessed the stability of GHB glucuronide 2 by mimicking the natural pH range for urine, which is of importance in the development of new analytical methods. Using NMR we show that GHB glucuronide 2 is highly stable towards aqueous hydrolysis within the pH range normally observed for urine even at elevated temperature.", "Effects of Melissa officinalis L. on oxidative status and DNA damage in subjects exposed to long-term low-dose ionizing radiation. The aim of this study was to determine the capability of Melissa officinalis L. (Lemon balm) infusion on improvement of oxidative stress status in radiology staff that were exposed to persistent low-dose radiation during work. The study was a before-after clinical trial performed on 55 radiology staff. They were asked to drink Lemon balm infusion which was prepared like a tea bag twice daily (1.5 g/100 mL) for 30 days. In the plasma, lipid peroxidation, DNA damage, catalase, superoxide dismutase, myeloperoxidase, and glutathione peroxidase activity were measured before and after using Lemon balm infusion.Use of Lemon balm infusion in radiology unit workers resulted in a significant improvement in plasma levels of catalase, superoxide dismutase, and glutathione peroxidase and a marked reduction in plasma DNA damage, myeloperoxidase, and lipid peroxidation. It is concluded that infusion of Lemon balm markedly improve oxidative stress condition and DNA damage in radiology staff when used as a dietary supplement for radiation protection.", "Ancestral antibiotic resistance in Mycobacterium tuberculosis Chemotherapeutic options to treat tuberculosis are severely restricted by the intrinsic resistance of Mycobacterium tuberculosis to the majority of clinically applied antibiotics. Such resistance is partially provided by the low permeability of their unique cell envelope. Here we describe a complementary system that coordinates resistance to drugs that have penetrated the envelope, allowing mycobacteria to tolerate diverse classes of antibiotics that inhibit cytoplasmic targets. This system depends on whiB7, a gene that pathogenic Mycobacterium shares with Streptomyces, a phylogenetically related genus known as the source of diverse antibiotics. In M. tuberculosis, whiB7 is induced by subinhibitory concentrations of antibiotics (erythromycin, tetracycline, and streptomycin) and whiB7 null mutants (Streptomyces and Mycobacterium) are hypersusceptible to antibiotics in vitro. M. tuberculosis is also antibiotic sensitive within a monocyte model system. In addition to antibiotics, whiB7 is induced by exposure to fatty acids that pathogenic Mycobacterium species may accumulate internally or encounter within eukaryotic hosts during infection. Gene expression profiling analyses demonstrate that whiB7 transcription determines drug resistance by activating expression of a regulon including genes involved in ribosomal protection and antibiotic efflux. Components of the whiB7 system may serve as attractive targets for the identification of inhibitors that render M. tuberculosis or multidrug-resistant derivatives more antibiotic-sensitive."], ["Applying morphologic techniques to evaluate hotdogs: what is in the hotdogs we eat? Americans consume billions of hotdogs per year resulting in more than a billion dollars in retail sales. Package labels typically list some type of meat as the primary ingredient. The purpose of this study is to assess the meat and water content of several hotdog brands to determine if the package labels are accurate. Eight brands of hotdogs were evaluated for water content by weight. A variety of routine techniques in surgical pathology including routine light microscopy with hematoxylin-eosin-stained sections, special staining, immunohistochemistry, and electron microscopy were used to assess for meat content and for other recognizable components. Package labels indicated that the top-listed ingredient in all 8 brands was meat; the second listed ingredient was water (n = 6) and another type of meat (n = 2). Water comprised 44% to 69% (median, 57%) of the total weight. Meat content determined by microscopic cross-section analysis ranged from 2.9% to 21.2% (median, 5.7%). The cost per hotdog ($0.12-$0.42) roughly correlated with meat content. A variety of tissues were observed besides skeletal muscle including bone (n = 8), collagen (n = 8), blood vessels (n = 8), plant material (n = 8), peripheral nerve (n = 7), adipose (n = 5), cartilage (n = 4), and skin (n = 1). Glial fibrillary acidic protein immunostaining was not observed in any of the hotdogs. Lipid content on oil red O staining was graded as moderate in 3 hotdogs and marked in 5 hotdogs. Electron microscopy showed recognizable skeletal muscle with evidence of degenerative changes. In conclusion, hotdog ingredient labels are misleading; most brands are more than 50% water by weight. The amount of meat (skeletal muscle) in most brands comprised less than 10% of the cross-sectional surface area. More expensive brands generally had more meat. All hotdogs contained other tissue types (bone and cartilage) not related to skeletal muscle; brain tissue was not present.", "Reducing the fat content in ground beef without sacrificing quality: a review. Americans are becoming more health conscious in their food choices and many are interested in reducing dietary fat intake. Fat replacers can affect meat flavor both by adding flavors of their own, by reducing the original aroma-generating substrate (fat) and by altering release of aroma compounds. When fat is removed from meat, water is generally added to replace it. Water-binding compounds can be added to prevent the added water from cooking out or evaporating and to prevent patty shrinkage. Fat replacers are generally classified by their composition: protein-based replacers including whey, soy and collagen, lipid-based substances such as soy lecithin which function as emulsifiers maintaining the fat that is retained distributed in the product, and carbohydrate-based substances including flours (wheat, soy, oat), starches (potato, modified corn starch, tapioca) and gums (carrageenan, xanthin). Duplication of the characteristics contributed by fat often requires a combination of replacers to address juiciness and texture (firmness) without negatively impacting flavor. Published by Elsevier Ltd.", "A statistical regression model for the estimation of acrylamide concentrations in French fries for excess lifetime cancer risk assessment. Human exposure to acrylamide (AA) through consumption of French fries and other foods has been recognized as a potential health concern. Here, we used a statistical non-linear regression model, based on the two most influential factors, cooking temperature and time, to estimate AA concentrations in French fries. The R(2) of the predictive model is 0.83, suggesting the developed model was significant and valid. Based on French fry intake survey data conducted in this study and eight frying temperature-time schemes which can produce tasty and visually appealing French fries, the Monte Carlo simulation results showed that if AA concentration is higher than 168 ppb, the estimated cancer risk for adolescents aged 13-18 years in Taichung City would be already higher than the target excess lifetime cancer risk (ELCR), and that by taking into account this limited life span only. In order to reduce the cancer risk associated with AA intake, the AA levels in French fries might have to be reduced even further if the epidemiological observations are valid. Our mathematical model can serve as basis for further investigations on ELCR including different life stages and behavior and population groups. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Influence of diet on tear function. The effect of diet on tear function is illustrated clearly by malnutrition-induced xerophthalmia. Dietary habits in well nourished North American society have been implicated as a cause of some tear dysfunction. A review of the ocular literature suggests that sufficient dietary protein, vitamins A, B6 and C, potassium, and zinc may be necessary for normal tear function. Excesses of dietary fats, salt, cholesterol, alcohol, protein, and sucrose have been associated with or suggested as causes of tear dysfunction. No unequivocal link has been established between diet and remission of dry eye states in a well nourished population.", "The development of the concept of dietary fiber in human nutrition. Fundamental studies of the laxative action of wheat bran were undertaken in the United States in the early decades of the 20th century. Walker in South Africa extended these studies among African blacks and later suggested that cereal fiber protected them against certain metabolic disorders. Trowell in Uganda elaborated this concept with regard to the rarity of common noninfective diseases of the colon. Another stream of inquiry stemmed from the hypothesis of Cleave who postulated that the presence of refined sugar, and to a lesser extent white flour, caused many metabolic diseases, while the loss of fiber caused certain colonic disorders. Meanwhile Burkitt had collected massive evidence of the rarity of appendicitis and many venous disorders in rural Africa and parts of Asia. In 1972 Trowell proposed a new physiological definition of fiber in terms of the residue of plant foods that resisted digestion by alimentary enzymes of man. Southgate has proposed chemical methods to analyze the components of dietary fiber: cellulose, hemicellulose, and lignin."], ["Flatulence--causes, relation to diet and remedies. In addition to causing embarrassment and unease, flatulence is linked to a variety of symptoms, some of which may be distressing. This review describes the origins of intestinal gas, its composition and methods which have been developed for its analysis. Emphasis is placed upon the effects of legumes in the diet in producing excessive intestinal gas and, particularly, on the role of raffinose-type oligosaccharides, containing alpha-galactosidic groupings. Suggestions for overcoming the problem are presented, including drug treatment, enzyme treatment, food processing and plant breeding. It is emphasised that removal of all raffinose-oligosaccharides from beans does not remove the problem of flatulence in animals and man; the compounds responsible--though assumed to be polysaccharides (or polysaccharide-derived oligomers formed by processing or cooking)--have yet to be characterised.", "Aluminium and other elements in selected herbal tea plant species and their infusions. The determination of Al, B, Cu, Fe, Mn, Ni, P, Zn and Ca, K, Mg by inductively coupled plasma optical emission spectrometry (ICP-OES) and flame atomic absorption spectroscopy (FAAS), respectively, in digests and infusions of Hibiscus sabdariffa (petals), Rosa canina (receptacles), Ginkgo biloba (leaves), Cymbopogon citratus (leaves), Aloe vera (leaves) and Panax ginseng (roots) was carried out in this study. Particular attention has been given to Al and heavy metals for the identification of possible raw material contaminants, their transformation into the infusion and for predicting their eventual role in the human diet during daily consumption. Additionally, Ion Chromatography (IC) speciation of Al in the leachates was carried out. In dry herbs, hibiscus and ginkgo appeared to contain the greatest contents of Al, Fe, K, Mn, Ni, Zn and B, Mg, P, respectively. A. vera contained the highest amount of Ca and highest values of Cu and P were observed in ginseng. In infusions, the topmost concentrations of Al, B, Cu, Fe, P, K, Mn, Ni, Zn were detected in those prepared from hibiscus petals, Ca from aloe leaves and Mg from leaves of ginkgo. According to a possible daily consumption exceeding 1 L, hibiscus decoction was identified as potentially dietetically significant in the content of certain elements. It seems to be possibly one of the top contributors of B from food (up to 5.5\u00b10.2 mg/L). The Mg contained in the infusion (up to 106\u00b15 mg/L) may be a contributor in the attenuation of blood pressure. A high amount of accessible Mn (up to 17.4\u00b11.1 mg/L) can probably have an adverse effect in humans. The total Al allowance (up to 1.2\u00b10.1 mg/L) suggests that no more than 1 L of the hibiscus infusion should be consumed per day by sensitive individuals including pregnant women and should be completely excluded from the diet of children under 6 months of age and children with chronic renal failure. Copyright \u00a9 2013 Elsevier Ltd. All rights reserved.", "Determination of total aluminum, chromium, copper, iron, manganese, and nickel and their fractions leached to the infusions of black tea, green tea... Total aluminum, chromium, copper, iron, manganese, and nickel were determined in black tea, green tea, Hibiscus sabdariffa, and Ilex paraguariensis (mate) by electrothermal atomic absorption spectrometry after nitric/perchloric acid digestion. In each case, one ground sample of commercially available leafy material was prepared and three 0.5-g subsamples were run in parallel. The infusions were also analyzed and the percentage of each element leached into the liquor was evaluated. The obtained results indicated that hibiscus and mate contained lower levels of aluminum (272+/-19 microg/g and 369+/-22 microg/g, respectively) as referred to black tea (759+/-31 microg/g) or green tea (919micro29 microg/g) and suggested that mate drinking could be a good dietary source of essential micronutrient manganese (total content 2223+/-110 microg/g, 48.1% leached to the infusion). It was also found that the infusion of hibiscus could supply greater amounts of iron (111+/-5 microg/g total, 40.5% leached) and copper (5.9+/-0.3 microg/g total, 93.4% leached) as compared to other infusions. Moreover, it was found that the percentage of element leached to the infusion was strongly related to the tannins content in the beverage (correlation coefficients > 0.82 with the exception for nickel); for lower tannins level, better leaching was observed.", "Recent advances on Ilex paraguariensis research: minireview. Ilex paraguariensis dried and minced leaves are made into a brewed tea, prepared in a sui generis manner by large populations in South America, having evolved from a tea drunk by the Guarani ethnic group to a beverage that has a social and almost ritualistic role in some South American modern societies. It is used both as a source of caffeine, in lieu or in parallel with tea and coffee, but also as a therapeutic agent for its alleged pharmacological properties. Although with some exceptions, research on biomedical properties of this herb has had a late start and strongly lags behind the impressive amount of literature on green tea and coffee. However, in the past 15 years, there was a several-fold increase in the literature studying Ilex paraguariensis properties showing effects such as antioxidant properties in chemical models and ex vivo lipoprotein studies, vaso-dilating and lipid reduction properties, antimutagenic effects, controversial association with oropharyngeal cancer, anti-glycation effects and weight reduction properties. Lately, promising results from human intervention studies have surfaced and the literature offers several developments on this area. The aim of this review is to provide a concise summary of the research published in the past three years, with an emphasis on translational studies, inflammation and lipid metabolism. Ilex paraguariensis reduces LDL-cholesterol levels in humans with Ilex paraguariensis dyslipoproteinemia and the effect is synergic with that of statins. Plasma antioxidant capacity as well as expression of antioxidant enzymes is positively modulated by intervention with Ilex paraguariensis in human cohorts. A review on the evidence implicating Ilex paraguariensis heavy consumption with some neoplasias show data that are inconclusive but indicate that contamination with alkylating agents during the drying process of the leaves should be avoided. On the other hand, several new studies confirm the antimutagenic effects of Ilex paraguariensis in different models, from DNA double breaks in cell culture models to mice studies. Novel interesting work has emerged showing significant effect on weight reduction both in mice and in rat models. Some mechanisms involved are inhibition of pancreatic lipase, activation of AMPK and uncoupling of electron transport. Intervention studies in animals have provided strong evidence of anti-inflammatory effects of Ilex paraguariensis, notably protecting cigarette-induced lung inflammation acting on macrophage migration and inactivating matrix-metalloproteinase. Research on the effects of Ilex paraguariensis in health and disease has confirmed its antioxidant, anti-inflammatory, antimutagenic and lipid-lowering activities. Although we are still waiting for the double-blind, randomized prospective clinical trial, the evidence seems to provide support for beneficial effects of mate drinking on chronic diseases with inflammatory component and lipid metabolism disorders. Copyright \u00a9 2010 Elsevier Ireland Ltd. All rights reserved.", "A survey of feeding N-nitrosodimethylamine (NDMA) to domestic animals over an 18 year period. Sodium nitrite and formalin have been used as preservatives in the fish meal industry in Norway since 1953. In 1957, fur farms suffered losses of mink due to a new, malignant liver disease. Experimental feeding of herring meal to cows and sheep resulted in the death of some of the animals. Further studies showed that amines (TMAO) normally present in fish, can react with sodium nitrite used as preservative, or nitrogen oxides from the combustion of fuel oils used during processing, to produce the toxic agent, NDMA. Mink and fox may consume considerable amounts of fish meal in their diets. If the fish meal contains sufficient NDMA, the incidence of liver failure or tumours can be quite high. Long-term exposure to as little as 0.1 mg NDMA/kg b.w./day in the diet of mink, cows and sheep can produce fibro-occlusive changes in the hepatic vessels. These lesions can later cause capillary ectasies-like changes in cows, which are similar in appearance to hemangiomas seen in mink. The mink liver hemangiomas develop into hemangiosarcomas. We currently consider capillary ectasies-like changes in cows exposed to NDMA to represent pre-cancerous lesions."], ["Leucine signaling in the pathogenesis of type 2 diabetes and obesity Epidemiological evidence points to increased dairy and meat consumption, staples of the Western diet, as major risk factors for the development of type 2 diabetes (T2D). This paper presents a new concept and comprehensive review of leucine-mediated cell signaling explaining the pathogenesis of T2D and obesity by leucine-induced over-stimulation of mammalian target of rapamycin complex 1 (mTORC1). mTORC1, a pivotal nutrient-sensitive kinase, promotes growth and cell proliferation in response to glucose, energy, growth factors and amino acids. Dairy proteins and meat stimulate insulin/insulin-like growth factor 1 signaling and provide high amounts of leucine, a primary and independent stimulator for mTORC1 activation. The downstream target of mTORC1, the kinase S6K1, induces insulin resistance by phosphorylation of insulin receptor substrate-1, thereby increasing the metabolic burden of \u03b2-cells. Moreover, leucine-mediated mTORC1-S6K1-signaling plays an important role in adipogenesis, thus increasing the risk of obesity-mediated insulin resistance. High consumption of leucine-rich proteins explains exaggerated mTORC1-dependent insulin secretion, increased \u03b2-cell growth and \u03b2-cell proliferation promoting an early onset of replicative \u03b2-cell senescence with subsequent \u03b2-cell apoptosis. Disturbances of \u03b2-cell mass regulation with increased \u03b2-cell proliferation and apoptosis as well as insulin resistance are hallmarks of T2D, which are all associated with hyperactivation of mTORC1. In contrast, the anti-diabetic drug metformin antagonizes leucine-mediated mTORC1 signaling. Plant-derived polyphenols and flavonoids are identified as natural inhibitors of mTORC1 and exert anti-diabetic and anti-obesity effects. Furthermore, bariatric surgery in obesity reduces increased plasma levels of leucine and other branched-chain amino acids. Attenuation of leucine-mediated mTORC1 signaling by defining appropriate upper limits of the daily intake of leucine-rich animal and dairy proteins may offer a great chance for the prevention of T2D and obesity, as well as other epidemic diseases of civilization with increased mTORC1 signaling, especially cancer and neurodegenerative diseases, which are frequently associated with T2D.", "Excessive Leucine-mTORC1-Signalling of Cow Milk-Based Infant Formula: The Missing Link to Understand Early Childhood Obesity Increased protein supply by feeding cow-milk-based infant formula in comparison to lower protein content of human milk is a well-recognized major risk factor of childhood obesity. However, there is yet no conclusive biochemical concept explaining the mechanisms of formula-induced childhood obesity. It is the intention of this article to provide the biochemical link between leucine-mediated signalling of mammalian milk proteins and adipogenesis as well as early adipogenic programming. Leucine has been identified as the predominant signal transducer of mammalian milk, which stimulates the nutrient-sensitive kinase mammalian target of rapamycin complex 1 (mTORC1). Leucine thus functions as a maternal-neonatal relay for mTORC1-dependent neonatal \u03b2-cell proliferation and insulin secretion. The mTORC1 target S6K1 plays a pivotal role in stimulation of mesenchymal stem cells to differentiate into adipocytes and to induce insulin resistance. It is of most critical concern that infant formulas provide higher amounts of leucine in comparison to human milk. Exaggerated leucine-mediated mTORC1-S6K1 signalling induced by infant formulas may thus explain increased adipogenesis and generation of lifelong elevated adipocyte numbers. Attenuation of mTORC1 signalling of infant formula by leucine restriction to physiologic lower levels of human milk offers a great chance for the prevention of childhood obesity and obesity-related metabolic diseases.", "Amino acid sensing in dietary-restriction-mediated longevity: roles of signal-transducing kinases GCN2 and TOR DR (dietary restriction), or reduced food intake without malnutrition, is associated with extended longevity, improved metabolic fitness and increased stress resistance in a wide range of organisms. DR is often referred to as calorie restriction, implying that reduced energy intake is responsible for its widespread and evolutionarily conserved benefits. However, recent data indicate dietary amino acid restriction as a key mediator of DR benefits. In fruitflies, an imbalance in essential amino acid intake is thought to underlie longevity benefits of DR. In mammals, reduced dietary protein or essential amino acid intake can extend longevity, improve metabolic fitness and increase stress resistance. In the present paper we review two evolutionarily conserved signal transduction pathways responsible for sensing amino acid levels. The eIF2\u03b1 (eukaryotic initiation factor 2\u03b1) kinase GCN2 (general amino acid control non-derepressible 2) senses the absence of one or more amino acids by virtue of direct binding to uncharged cognate tRNAs. The presence of certain amino acids, such as leucine, permits activation of the master growth regulating kinase TOR (target of rapamycin). These two signal transduction pathways react to amino acid deprivation by inhibiting general protein translation while at the same time increasing translation of specific mRNAs involved in restoring homoeostasis. Together, these pathways may contribute to the regulation of longevity, metabolic fitness and stress resistance.", "Protein-source tryptophan as an efficacious treatment for social anxiety disorder: a pilot study. Until recently, intact protein that is rich in tryptophan was not seen as an alternative to pharmaceutical-grade tryptophan because protein also contains large neutral amino acids (LNAAs) that compete for transport sites across the blood-brain barrier. Recent evidence indicates that when deoiled gourd seed (a rich source of tryptophan with approximately 22 mg/g protein) is combined with glucose (a carbohydrate that reduces serum levels of competing LNAAs) a clinical effect similar to that of pharmaceutical-grade tryptophan is achieved. Objective and subjective measures of anxiety in those suffering from social phobia (also known as social anxiety disorder) were employed to measure changes in anxiety in response to a stimulus as part of a double-blind, placebo-controlled, crossover study with a wash-out period of 1 week between study sessions. Subjects were randomly assigned to start with either (i) protein-source tryptophan (deoiled gourd seed) in combination with carbohydrate or (ii) carbohydrate alone. One week after the initial session, subjects returned for a follow-up session and received the opposite treatment of that received at the first session. All 7 subjects who began the study completed the 2-week protocol. Protein-source tryptophan with carbohydrate, but not carbohydrate alone, resulted in significant improvement on an objective measure of anxiety. Protein-source tryptophan combined with a high glycemic carbohydrate is a potential anxiolytic to those suffering from social phobia.", "In vitro and in vivo efficacy of sulfo-carrabiose, a sugar-based cosmetic ingredient with anti-cellulite properties. Most of adult women exhibit cellulite on the hips, buttock and thighs. Although extracellular matrix and lymphatic system disorders can increase its appearance, cellulite basically results from an excessive fat storage in the adipose tissue which exerts considerable pressure on the surrounding skin tissue and creates a dimpled irregular appearance. Caffeine, the most widely used anti-cellulite ingredient, favours fat break-down by inhibiting the phosphodiesterase enzyme and encouraging a high intracellular level of cAMP. A series of studies has shown that spermine and spermidine, two ubiquitous polyamines, encouraged fat storage and slowed fat break-down in the adipose tissue. Besides, it was shown that heparan sulfate glycosaminoglycans had a strong affinity for polyamines. To design a new cosmetic ingredient with anti-cellulite properties, we used molecular modelling to screen several ingredients with a structure similar to that of heparan sulfate glycosaminoglycans. This way, we identified sulfo-carrabiose as a potent molecule for trapping spermine and spermidine. These virtual results were first confirmed in tubo where sulfo-carrabiose was shown to dose-dependently inactivate spermine and spermidine. In vitro, adipocytes cultured with sulfo-carrabiose exhibited a significant reduction of lipogenesis and a significant increase of lipolysis. When sulfo-carrabiose was incorporated in a cosmetic formula, significant improvements were observed in thigh circumference, with better results than those obtained with caffeine after 28 days of use. Furthermore, a combination of caffeine and sulfo-carrabiose led to results significantly better than those obtained with caffeine alone. As measured by fringe projection, thigh volume was also significantly reduced after sulfo-carrabiose treatment. Finally, the appearance of cellulite assessed by clinical evaluation was also significantly reduced within 28 days. \u00a9 2010 BASF Beauty Care Solutions. ICS \u00a9 2010 Society of Cosmetic Scientists and the Soci\u00e9t\u00e9 Fran\u00e7aise de Cosm\u00e9tologie."], ["Organochlorine pesticide air-water exchange and bioconcentration in krill in the Ross Sea. Mean hexachlorobenzene (HCB) and hexachlorocyclohexane (HCH) concentrations, measured in seawater and air samples, confirmed the decline in levels of these compounds in Antarctic air and water. However, low alpha/gamma-HCH ratios in air at the beginning of the sampling period suggest a predominance of fresh lindane entering the Antarctic atmosphere during the Austral spring probably due to current use in the Southern Hemisphere. Water-air fugacity ratios demonstrate the potential for HCH gas deposition to coastal Antarctic seas, while the water-air fugacity ratios for HCB imply that volatilization does not account for the observed decrease of HCB in surface seawater. HCH concentrations found in krill samples were correlated with seawater concentrations indicative of bioconcentration of HCHs from seawater.", "Chlorhexidine (CHX) in dentistry: state of the art. Chlorhexidine (CHX) is one of the most commonly prescribed antiseptic agents in the dental field. It has a long-lasting antibacterial activity with a broad-spectrum of action and it has been shown to reduce plaque, gingival inflammation and bleeding. Its use is considered a powerful adjuvant to mechanical oral hygiene (brushing and flossing), especially in those cases in which it cannot be performed correctly. Available as mouthwash, gel, aerosol, spray and disks, CHX is considered a safe compound, with minimal and transitory local and systemic side effects. Data support its periodic use as an adjuvant to normal brushing and flossing in subjects unable to maintain proper oral hygiene due to physical and/or mental impairment, or lack of motivation, or decreased salivary rate. CHX is also a useful alternative to mechanical oral hygiene procedures in those cases in which they are contraindicated, e.g. after a surgical procedure, or as a preoperative rinse before procedures in which use of a dental dam is not possible. The aim of this article is to offer a complete review of literature regarding the characteristics, the applications and the problems associated with the use of chlorhexidine in the dental field.", "In vitro and in vivo efficacy of sulfo-carrabiose, a sugar-based cosmetic ingredient with anti-cellulite properties. Most of adult women exhibit cellulite on the hips, buttock and thighs. Although extracellular matrix and lymphatic system disorders can increase its appearance, cellulite basically results from an excessive fat storage in the adipose tissue which exerts considerable pressure on the surrounding skin tissue and creates a dimpled irregular appearance. Caffeine, the most widely used anti-cellulite ingredient, favours fat break-down by inhibiting the phosphodiesterase enzyme and encouraging a high intracellular level of cAMP. A series of studies has shown that spermine and spermidine, two ubiquitous polyamines, encouraged fat storage and slowed fat break-down in the adipose tissue. Besides, it was shown that heparan sulfate glycosaminoglycans had a strong affinity for polyamines. To design a new cosmetic ingredient with anti-cellulite properties, we used molecular modelling to screen several ingredients with a structure similar to that of heparan sulfate glycosaminoglycans. This way, we identified sulfo-carrabiose as a potent molecule for trapping spermine and spermidine. These virtual results were first confirmed in tubo where sulfo-carrabiose was shown to dose-dependently inactivate spermine and spermidine. In vitro, adipocytes cultured with sulfo-carrabiose exhibited a significant reduction of lipogenesis and a significant increase of lipolysis. When sulfo-carrabiose was incorporated in a cosmetic formula, significant improvements were observed in thigh circumference, with better results than those obtained with caffeine after 28 days of use. Furthermore, a combination of caffeine and sulfo-carrabiose led to results significantly better than those obtained with caffeine alone. As measured by fringe projection, thigh volume was also significantly reduced after sulfo-carrabiose treatment. Finally, the appearance of cellulite assessed by clinical evaluation was also significantly reduced within 28 days. \u00a9 2010 BASF Beauty Care Solutions. ICS \u00a9 2010 Society of Cosmetic Scientists and the Soci\u00e9t\u00e9 Fran\u00e7aise de Cosm\u00e9tologie.", "Excretion, isolation and structure of a new phenolic constituent of female urine. The regular occurrence of a peak due to an unidentified substance (X) in the gas chromatographic traces obtained from phenolic extracts of urine from human pregnant and non-pregnant females has been reported. The biphasic excretion of X with maxima in the luteal phase of the ovulatory cycle and relatively high levels in the first trimester of pregnancy were noteworthy and suggested that the substance may have a biological significance. Close similarities between the excretory pattern, the chemical and chromatographic properties of X and of those of the known phenolic steroids suggested initially that this compound was steroidal in nature. The same, or a similar, substance seems to be excreted in the vervet monkey (Cercopithecus aethiops pygerythrus). We now report the excretory pattern of X in more detail, the isolation of the pure compound from pooled pregnancy urine and the chemical structure. The structure determined by mass spectrometry, IR spectroscopy and NMR spectrometry is: trans-(+/-)-3,4-bis[(3-hydroxyphenyl)methyl]dihydro-2-(3H)-furanone (HPMF) and was confirmed by synthesis.", "Omega-3 fatty acids and antioxidants in edible wild plants. Human beings evolved on a diet that was balanced in the omega-6 and omega-3 polyunsaturated fatty acids (PUFA), and was high in antioxidants. Edible wild plants provide alpha-linolenic acid (ALA) and higher amounts of vitamin E and vitamin C than cultivated plants. In addition to the antioxidant vitamins, edible wild plants are rich in phenols and other compounds that increase their antioxidant capacity. It is therefore important to systematically analyze the total antioxidant capacity of wild plants and promote their commercialization in both developed and developing countries. The diets of Western countries have contained increasingly larger amounts of linoleic acid (LA), which has been promoted for its cholesterol-lowering effect. It is now recognized that dietary LA favors oxidative modification of low density lipoprotein (LDL) cholesterol and increases platelet response to aggregation. In contrast, ALA intake is associated with inhibitory effects on the clotting activity of platelets, on their response to thrombin, and on the regulation of arachidonic acid (AA) metabolism. In clinical studies, ALA contributed to lowering of blood pressure, and a prospective epidemiological study showed that ALA is inversely related to the risk of coronary heart disease in men. Dietary amounts of LA as well as the ratio of LA to ALA appear to be important for the metabolism of ALA to longer-chain omega-3 PUFAs. Relatively large reserves of LA in body fat. as are found in vegans or in the diet of omnivores in Western societies, would tend to slow down the formation of long-chain omega-3 fatty acids from ALA. Therefore, the role of ALA in human nutrition becomes important in terms of long-term dietary intake. One advantage of the consumption of ALA over omega-3 fatty acids from fish is that the problem of insufficient vitamin E intake does not exist with high intake of ALA from plant sources."], ["Hepatitis induced by Noni juice from Morinda citrifolia: a rare cause of hepatotoxicity or the tip of the iceberg? A 24-year-old female patient presented to her community hospital with mild elevations of serum transaminase and bilirubin levels. Because of multiple sclerosis, she was treated with interferon beta-1a for 6 weeks. After exclusion of viral hepatitis due to hepatitis A-E, interferon beta-1a was withdrawn under the suspicion of drug-induced hepatitis. One week later, she was admitted again to her community hospital with severe icterus. The transaminase and bilirubin levels were highly elevated, and a beginning impairment of the liver synthesis was expressed by a reduced prothrombin time. The confinement to our department occurred with a fulminant hepatitis and the suspicion of beginning acute liver failure. There was no evidence for hepatitis due to potentially hepatotoxic viruses, alcoholic hepatitis, Budd-Chiari syndrome, hemochromatosis, and Wilson's disease. In her serum there were high titers of liver-kidney microsomal type 1 autoantibody; the serum gamma globulin levels were in the normal range. Fine-needle aspiration biopsy of the liver ruled out an autoimmune hepatitis but showed signs of drug-induced toxicity. During the interview, she admitted that for 'general immune system stimulation' she had been drinking Noni juice, a Polynesian herbal remedy made from a tropical fruit (Morinda citrifolia), during the past 4 weeks. After cessation of the Noni juice ingestion, her transaminase levels normalized quickly and were in the normal range within 1 month. Copyright 2006 S. Karger AG, Basel.", "Report: prunes and liver function: a clinical trial. Prunes are used by folks as a remedy of various diseases including hepatitis. A clinical trial was designed to see the effects of prunes (Prunus domestica) on liver function. 166 healthy volunteers were divided into three groups randomly. Either three (about 11.43g) or six (23g approx.) prunes were soaked in a glass of water (250ml) overnight. Each subject from two test groups was asked to drink prune juice & eat whole fruit(single or double dose of prunes) as well, early in the morning, daily for 8 weeks; whereas each subject from control group was given a glass of water to drink. Blood samples were taken at week 0 and week 8 for chemical analysis. There was significant reduction of serum alanine transaminase (p 0.048) and serum alkaline phosphatase (p 0.017) by the lower dose of prunes. There was no change in serum aspartate transaminase and bilirubin. Alteration in liver function by use of prunes may have clinical relevance in appropriate cases and prunes might prove beneficial in hepatic disease.", "Obesity-associated mechanisms of hepatocarcinogenesis. Obesity has been recognized as a key component of the metabolic syndrome, a cluster of risk factors associated with diabetes and cardiovascular morbidity. In addition, obesity has been linked to higher frequency of cancers in a variety of tissues including the liver. Liver cancer most often occurs as hepatocellular carcinoma (HCC) complicating cirrhosis due to chronic viral infection or toxic injury and remains the third leading cause of cancer death in the world. However, HCC is increasingly diagnosed among individuals with obesity and related disorders. As these metabolic conditions have become globally prevalent, they coexist with well-established risk factors of HCC and create a unique challenge for the liver as a chronically diseased organ. Obesity-associated HCC has recently been attributed to molecular mechanisms such as chronic inflammation due to adipose tissue remodeling and pro-inflammatory adipokine secretion, ectopic lipid accumulation and lipotoxicity, altered gut microbiota, and disrupted senescence in stellate cells, as well as insulin resistance leading to increased levels of insulin and insulin-like growth factors. These mechanisms synergize with those occurring in chronic liver disease resulting from other etiologies and accelerate the development of HCC before or after the onset of cirrhosis. Increasingly common interactions between oncogenic pathways linked to obesity and chronic liver disease may explain why HCC is one of the few malignancies with rising incidence in developed countries. Better understanding of this complex process will improve our strategies of cancer prevention, prediction, and surveillance. Published by Elsevier Inc.", "Hepatocellular carcinoma and other liver lesions. Patients with cirrhosis are at greatest risk for development of hepatocellular carcinoma (HCC) and should undergo semiannual surveillance using ultrasound, with or without alpha fetoprotein. Patients with positive surveillance testing should undergo contrast-enhanced MRI or 4-phase CT for diagnostic evaluation. There are therapeutic options for most patients with any tumor stage; however, treatment decisions must be individualized after accounting for degree of liver dysfunction and patient performance status. A multidisciplinary approach to care is recommended for optimal communication and treatment delivery. The aim of this review is to provide an up-to-date summary of the diagnosis and management of HCC. Copyright \u00a9 2014 Elsevier Inc. All rights reserved.", "Epidemiology of the metabolic syndrome in the USA. The metabolic syndrome is a common complex entity that has emerged as a worldwide epidemic and major public health care concern with a prevalence of approximately 25% in the United States. There have been a number of different definitions of the metabolic syndrome but all center around the metabolic abnormalities of central obesity, hypertension, decreased high-density lipoproteins and elevated triglycerides with insulin resistance as the uniting physiologic factor. The importance of the metabolic syndrome is not just related to its high prevalence rate but also because it predicts the development of diabetes and cardiovascular disease. Nonalcoholic fatty liver disease is now recognized to be the hepatic component of the metabolic syndrome, which along with its individual components - particularly diabetes and elevated triglycerides, are the major risk factors for the development of nonalcoholic steatohepatitis (NASH); the most severe form of nonalcoholic fatty liver disease. NASH may progress to cirrhosis, hepatocellular carcinoma, and liver failure. It is currently the third most common cause for liver transplantation and is projected to be the leading cause for liver transplantation in 2020. Weight loss (via diet or bariatric surgery) and vitamin E have recently been demonstrated to be effective treatments of NASH. Although these and other agents may prove to be effective treatments for NASH, the most effective therapeutic strategy would be early screening and intervention to prevent the development of insulin resistance and oxidative stress at a societal level. \u00a9 2011 The Author. Journal of Digestive Diseases \u00a9 2011 Chinese Medical Association Shanghai Branch, Chinese Society of Gastroenterology, Renji Hospital Affiliated to Shanghai Jiaotong University School of Medicine and Blackwell Publishing Asia Pty Ltd."], ["Systematic review and meta-analysis of clinical trials of the effects of low carbohydrate diets on cardiovascular risk factors. A systematic review and meta-analysis were carried out to study the effects of low-carbohydrate diet (LCD) on weight loss and cardiovascular risk factors (search performed on PubMed, Cochrane Central Register of Controlled Trials and Scopus databases). A total of 23 reports, corresponding to 17 clinical investigations, were identified as meeting the pre-specified criteria. Meta-analysis carried out on data obtained in 1,141 obese patients, showed the LCD to be associated with significant decreases in body weight (-7.04 kg [95% CI -7.20/-6.88]), body mass index (-2.09 kg m(-2) [95% CI -2.15/-2.04]), abdominal circumference (-5.74 cm [95% CI -6.07/-5.41]), systolic blood pressure (-4.81 mm Hg [95% CI -5.33/-4.29]), diastolic blood pressure (-3.10 mm Hg [95% CI -3.45/-2.74]), plasma triglycerides (-29.71 mg dL(-1) [95% CI -31.99/-27.44]), fasting plasma glucose (-1.05 mg dL(-1) [95% CI -1.67/-0.44]), glycated haemoglobin (-0.21% [95% CI -0.24/-0.18]), plasma insulin (-2.24 micro IU mL(-1) [95% CI -2.65/-1.82]) and plasma C-reactive protein, as well as an increase in high-density lipoprotein cholesterol (1.73 mg dL(-1) [95%CI 1.44/2.01]). Low-density lipoprotein cholesterol and creatinine did not change significantly, whereas limited data exist concerning plasma uric acid. LCD was shown to have favourable effects on body weight and major cardiovascular risk factors; however the effects on long-term health are unknown. \u00a9 2012 The Authors. obesity reviews \u00a9 2012 International Association for the Study of Obesity.", "Very-low-carbohydrate ketogenic diet v. low-fat diet for long-term weight loss: a meta-analysis of randomised controlled trials. The role of very-low-carbohydrate ketogenic diets (VLCKD) in the long-term management of obesity is not well established. The present meta-analysis aimed to investigate whether individuals assigned to a VLCKD (i.e. a diet with no more than 50 g carbohydrates/d) achieve better long-term body weight and cardiovascular risk factor management when compared with individuals assigned to a conventional low-fat diet (LFD; i.e. a restricted-energy diet with less than 30% of energy from fat). Through August 2012, MEDLINE, CENTRAL, ScienceDirect,Scopus, LILACS, SciELO, ClinicalTrials.gov and grey literature databases were searched, using no date or language restrictions, for randomised controlled trials that assigned adults to a VLCKD or a LFD, with 12 months or more of follow-up. The primary outcome was bodyweight. The secondary outcomes were TAG, HDL-cholesterol (HDL-C), LDL-cholesterol (LDL-C), systolic and diastolic blood pressure,glucose, insulin, HbA1c and C-reactive protein levels. A total of thirteen studies met the inclusion/exclusion criteria. In the overall analysis,five outcomes revealed significant results. Individuals assigned to a VLCKD showed decreased body weight (weighted mean difference 20\u00b791 (95% CI 21\u00b765, 20\u00b717) kg, 1415 patients), TAG (weighted mean difference 20\u00b718 (95% CI 20\u00b727, 20\u00b708) mmol/l, 1258 patients)and diastolic blood pressure (weighted mean difference 21\u00b743 (95% CI 22\u00b749, 20\u00b737) mmHg, 1298 patients) while increased HDL-C(weighted mean difference 0\u00b709 (95% CI 0\u00b706, 0\u00b712) mmol/l, 1257 patients) and LDL-C (weighted mean difference 0\u00b712 (95% CI 0\u00b704,0\u00b72) mmol/l, 1255 patients). Individuals assigned to a VLCKD achieve a greater weight loss than those assigned to a LFD in the longterm; hence, a VLCKD may be an alternative tool against obesity.", "Effects of very-low-carbohydrate (horsemeat- or beef-based) diets and restricted feeding on weight gain, feed and energy efficiency, as well as ser... BACKGROUND/AIMS: The beneficial or harmful effect of the low-carbohydrate (low-carb), high-protein, high-fat diet (Atkins diet) has not been clearly demonstrated. We determined the effect of a low-carb diet and restricted feeding (70% ad libitum intake) on serum levels of cholesterol, triacylglycerol, glucose, ketone bodies and insulin in rats. METHODS: In experiment 1, each of 4 groups with 10 adult rats was assigned to a high-carb diet (AIN-93G) + ad libitum intake or restricted feeding, or a low-carb diet (53% horsemeat) + ad libitum intake or restricted feeding (2 x 2 factorial). In experiment 2, each of 3 groups with 10 adult rats was assigned to a control (AIN-93G) or low-carb diets (53% beef or horsemeat). RESULTS: Restricted feeding and the low-carb diet reduced (p<0.01) serum triacylglycerol compared with ad libitum intake and the AIN-93G diet, respectively (experiment 1). The dietary effect on serum total cholesterol, high-density or low-density lipid cholesterol appeared to be inconsistent, but restricted feeding increased the low-density lipoprotein cholesterol level. The serum ketone body level was increased by the low-carb diet compared with AIN-93G (experiment 2). CONCLUSION: Restricted feeding and a low-carb diet are beneficial for alleviating cardiovascular disease risk factors, and their effects are additive, restricted feeding being more pronounced. Copyright 2009 S. Karger AG, Basel.", "The effect of a plant-based low-carbohydrate (\\\"Eco-Atkins\\\") diet on body weight and blood lipid concentrations in hyperlipidemic subjects. BACKGROUND: Low-carbohydrate, high-animal protein diets, which are advocated for weight loss, may not promote the desired reduction in low-density lipoprotein cholesterol (LDL-C) concentration. The effect of exchanging the animal proteins and fats for those of vegetable origin has not been tested. Our objective was to determine the effect on weight loss and LDL-C concentration of a low-carbohydrate diet high in vegetable proteins from gluten, soy, nuts, fruits, vegetables, cereals, and vegetable oils compared with a high-carbohydrate diet based on low-fat dairy and whole grain products. METHODS: A total of 47 overweight hyperlipidemic men and women consumed either (1) a low-carbohydrate (26% of total calories), high-vegetable protein (31% from gluten, soy, nuts, fruit, vegetables, and cereals), and vegetable oil (43%) plant-based diet or (2) a high-carbohydrate lacto-ovo vegetarian diet (58% carbohydrate, 16% protein, and 25% fat) for 4 weeks each in a parallel study design. The study food was provided at 60% of calorie requirements. RESULTS: Of the 47 subjects, 44 (94%) (test, n = 22 [92%]; control, n = 22 [96%]) completed the study. Weight loss was similar for both diets (approximately 4.0 kg). However, reductions in LDL-C concentration and total cholesterol-HDL-C and apolipoprotein B-apolipoprotein AI ratios were greater for the low-carbohydrate compared with the high-carbohydrate diet (-8.1% [P = .002], -8.7% [P = .004], and -9.6% [P = .001], respectively). Reductions in systolic and diastolic blood pressure were also seen (-1.9% [P = .052] and -2.4% [P = .02], respectively). CONCLUSION: A low-carbohydrate plant-based diet has lipid-lowering advantages over a high-carbohydrate, low-fat weight-loss diet in improving heart disease risk factors not seen with conventional low-fat diets with animal products.", "Slow release dietary carbohydrate improves second meal tolerance. Breakfasts of lentils or wholemeal bread of identical carbohydrate content were taken by seven healthy volunteers. The lentils produced a significant 71% (p less than 0.001) reduction in the blood glucose area and flattened the plasma insulin and gastric inhibitory polypeptide responses by comparison with the bread. In addition, the lentil breakfast was followed by a significantly flatter blood glucose response to the standard bread lunch which followed 4 h later (by 38%, p less than 0.01). The blood glucose pattern was mimicked by feeding the bread breakfast slowly over the 4 h before lunch. Giving a bread breakfast containing a quarter of the carbohydrate reduced the breakfast glucose profile but resulted in a significantly impaired blood glucose response to lunch (168% of control, p less than 0.01). These results, together with breath hydrogen studies, performed on a separate group of four volunteers, indicate that the flattened response to lentils is not due to carbohydrate malabsorption. Slow release or \\\"lente\\\" carbohydrate foods such as lentils may form a useful part of the diets of those with impaired carbohydrate tolerance."], ["STARI, or Masters disease: Lone Star tick-vectored Lyme-like illness. Lyme-like illness (also known as southern tick-associated rash illness [STARI] or Masters disease) is vectored by the Lone Star tick (Amblyomma americanum). Lyme-like illness lesions, which are similar to the erythema migrans rash of Lyme disease, tend to have lymphocytic dermal infiltrates. With the exception of Borrelia lonestari, the possible causative agent or agents of Lyme-like illness have not been cultured. More research is needed to fully understand this newly recognized zoonosis. Clinicians are encouraged to increase their knowledge and awareness of this Lyme disease mimic.", "Southern Tick-Associated Rash Illness (STARI) in the North: STARI following a tick bite in Long Island, New York. The most common clinical manifestation of Lyme disease is the characteristic rash, erythema migrans (EM). In the 1980s EM-like eruptions were reported in Missouri and other southeastern states. The EM-like eruptions, which were of unknown etiology, often followed the bite of the Lone Star tick (Amblyomma americanum) and the rash is called STARI (southern tick-associated rash illness). Although the Lone Star tick is found in the Lyme disease-endemic areas of New England and Mid-Atlantic regions of the United States, STARI has been reported only once from the Northeast and Mid-Atlantic regions. We report a child from Connecticut who visited Long Island, New York, and developed a rash that was thought to be EM. Because the patient failed to respond to antibiotics used to treat Lyme disease, an investigation ensued, and the diagnosis of STARI was established.", "An association between tick bite reactions and red meat allergy in humans. Twenty-five patients living in a tick-endemic region of Sydney, New South Wales developed red meat allergy after experiencing large local reactions to tick bites. This represents a potentially novel cross-reaction between an arthropod and a food protein. (MJA 2009; 190: 510-511).", "The relevance of tick bites to the production of IgE antibodies to the mammalian oligosaccharide galactose-\u03b1-1,3-galactose Background In 2009, we reported a novel form of delayed anaphylaxis to red meat, which is related to serum IgE antibodies to the oligosaccharide galactose-alpha-1,3-galactose (alpha-gal). Most of these patients had tolerated meat for many years previously. The implication is that some exposure in adult life had stimulated the production of these IgE antibodies. Objectives To investigate possible causes of this IgE antibody response, focusing on evidence related to tick bites, which are common in the region where these reactions occur. Methods Serum assays were carried out using biotinylated proteins and extracts bound to a streptavidin ImmunoCAP. Results Prospective studies on IgE antibodies in three subjects following tick bites showed an increase in IgE to alpha-gal of twenty-fold or greater. Other evidence included i) a strong correlation between histories of tick bites and IgE to alpha-gal (\u03c72=26.8, p<0.001), ii) evidence that these IgE antibodies are common in areas where the tick Amblyomma americanum is common, and iii) a significant correlation between IgE antibodies to alpha-gal and IgE antibodies to proteins derived from A. americanum (rs=0.75, p<0.001). Conclusion The results presented here provide evidence that tick bites are a cause, or possibly the only cause, of IgE specific for alpha-gal in this area of the United States. Both the number of subjects becoming sensitized and the titer of IgE antibodies to alpha-gal are striking. Here we report the first example of a response to an ectoparasite giving rise to an important form of food allergy.", "Diverticular disease: eat your fiber! In industrialized nations, diverticular disease affects up to 70% of individuals by 60 years of age, with symptoms that can range from mild gastrointestinal disturbance to incapacitating pain. Diverticular disease appears to be related to increasing affluence and changed diet: Current theory holds that diverticular disease's origin is low-fiber diet. This explains why its incidence is highest and accelerating in the more prosperous countries where intake of fiber has decreased and intake of milled grains and refined sugars has increased over time. Not all patients develop symptoms, but if they do, the most frequent complaints associated with diverticulosis are cramping in the left-lower quadrant, bloating, constipation, and soiling. If diverticula perforate the gut's wall into the pericolic tissue, small and large abscesses, accompanied by bleeding, can form. Fistulization, when it occurs, most often penetrates to the bladder. Treatment addresses symptoms and may require hospitalization. During symptomatic periods, patients do best on low-fiber, bland diets. Once the acute episode or highly symptomatic period resolves or chronic disease is managed, patients should gradually increase dietary fiber to 20 to 30 grams daily or take dietary fiber in the form of bulk stimulants like psyllium."], ["Aluminium and other elements in selected herbal tea plant species and their infusions. The determination of Al, B, Cu, Fe, Mn, Ni, P, Zn and Ca, K, Mg by inductively coupled plasma optical emission spectrometry (ICP-OES) and flame atomic absorption spectroscopy (FAAS), respectively, in digests and infusions of Hibiscus sabdariffa (petals), Rosa canina (receptacles), Ginkgo biloba (leaves), Cymbopogon citratus (leaves), Aloe vera (leaves) and Panax ginseng (roots) was carried out in this study. Particular attention has been given to Al and heavy metals for the identification of possible raw material contaminants, their transformation into the infusion and for predicting their eventual role in the human diet during daily consumption. Additionally, Ion Chromatography (IC) speciation of Al in the leachates was carried out. In dry herbs, hibiscus and ginkgo appeared to contain the greatest contents of Al, Fe, K, Mn, Ni, Zn and B, Mg, P, respectively. A. vera contained the highest amount of Ca and highest values of Cu and P were observed in ginseng. In infusions, the topmost concentrations of Al, B, Cu, Fe, P, K, Mn, Ni, Zn were detected in those prepared from hibiscus petals, Ca from aloe leaves and Mg from leaves of ginkgo. According to a possible daily consumption exceeding 1 L, hibiscus decoction was identified as potentially dietetically significant in the content of certain elements. It seems to be possibly one of the top contributors of B from food (up to 5.5\u00b10.2 mg/L). The Mg contained in the infusion (up to 106\u00b15 mg/L) may be a contributor in the attenuation of blood pressure. A high amount of accessible Mn (up to 17.4\u00b11.1 mg/L) can probably have an adverse effect in humans. The total Al allowance (up to 1.2\u00b10.1 mg/L) suggests that no more than 1 L of the hibiscus infusion should be consumed per day by sensitive individuals including pregnant women and should be completely excluded from the diet of children under 6 months of age and children with chronic renal failure. Copyright \u00a9 2013 Elsevier Ltd. All rights reserved.", "Herbal infusions as a source of calcium, magnesium, iron, zinc and copper in human nutrition. The study material consisted of five herbs: chamomile (flowers), mint (leaves), St John's wort (flowers and leaves), sage (leaves) and nettle (leaves), sourced from three producers. The calcium, magnesium, iron, zinc and copper contents were determined for both dried herb samples and prepared infusions, and the extraction rates were calculated. Mineral components were determined using atomic absorption spectrometry. Analysis showed that the contents of individual elements in herbs and infusions depended on the type of raw material, as well as on its origin. Moreover, it was found that iron penetrated the herbal infusions to the lowest degree (4.4-12.4%), while copper did so to the highest (26.7-50.7%). It is felt that in average consumption the herbal infusions are not important as calcium, magnesium, iron, zinc and copper sources in human nutrition.", "Zinc and multi-mineral supplementation should mitigate the pathogenic impact of cadmium exposure. High-level cadmium (Cd) exposure has long been known to induce nephropathy, severe osteoporosis, and fractures in humans. More recent epidemiology, however, reveals that, in populations not known to have important industrial exposure to this heavy metal, high-normal blood or urine Cd levels correlate with increased risk for vascular disorders, cancers, diabetes, and total mortality, as well as osteoporosis and nephropathy. Since these disorders appear unlikely to expedite Cd absorption, and since Cd has promoted these pathologies in rodent studies, it seems reasonable to conclude that Cd is an important mediating risk factor for these disorders in humans. Avoiding tobacco smoke or frequent ingestion of shellfish or organ meats can lessen humans exposure to Cd, but the chief dietary sources of Cd are plant-derived foods - green leafy vegetables, whole grains, tubers, and root vegetables - typically recommended for their health-supportive properties; indeed, among non-smokers, vegans tend to have the highest Cd body burden. Fortunately, iron sufficiency and ample dietary intakes of calcium, magnesium, and zinc can impede absorption of dietary Cd, both by down-regulating intestinal expression of mineral transporters, and by directly competing with Cd for access to these transporters. Correction of iron deficiency appears to be of particular importance for controlling Cd absorption. Moreover, zinc supplementation can counteract the toxicity of Cd already in the body via induction of metallothionein, which binds Cd avidly via its sulfhydryl groups; so long as it remains sequestered in this form, Cd is innocuous. Zinc supplementation may in any case be recommendable, as optimal zinc status exerts protective anti-inflammatory, antioxidant, and immunosupportive effects. Inasmuch as the toxicity of Cd appears to be mediated in large part by oxidative stress, ingestion of spirulina, lipoic acid, melatonin, and N-acetylcysteine may also have potential for mitigating the risk associated with Cd exposure, as suggested by rodent studies. Hence, although Cd may prove to be a major risk factor for morbidity and mortality in humans, practical strategies for limiting its absorption and pathogenic impact are at hand. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Monoclonal gammopathy of undetermined significance, smoldering multiple myeloma, and curcumin: a randomized, double-blind placebo-controlled cross-... Monoclonal gammopathy of undetermined significance (MGUS) and smoldering multiple myeloma (SMM) represent useful models for studying multiple myeloma precursor disease, and for developing early intervention strategies. Administering a 4g dose of curcumin, we performed a randomised, double-blind placebo-controlled cross-over study, followed by an open-label extension study using an 8g dose to assess the effect of curcumin on FLC response and bone turnover in patients with MGUS and SMM. 36 patients (19 MGUS and 17 SMM) were randomised into two groups: one received 4g curcumin and the other 4g placebo, crossing over at 3 months. At completion of the 4g arm, all patients were given the option of entering an open-label, 8g dose extension study. Blood and urine samples were collected at specified intervals for specific marker analyses. Group values are expressed as mean \u00b1 1 SD. Data from different time intervals within groups were compared using Student's paired t-test. 25 patients completed the 4g cross-over study and 18 the 8g extension study. Curcumin therapy decreased the free light-chain ratio (rFLC), reduced the difference between clonal and nonclonal light-chain (dFLC) and involved free light-chain (iFLC). uDPYD, a marker of bone resorption, decreased in the curcumin arm and increased on the placebo arm. Serum creatinine levels tended to diminish on curcumin therapy. These findings suggest that curcumin might have the potential to slow the disease process in patients with MGUS and SMM. Copyright \u00a9 2012 Wiley Periodicals, Inc.", "The many faces of methylmercury poisoning. Methylmercury (MM) is a very potent neurotoxic agent. Its role in polluting the environment is well documented. A vast amount of study over the past several decades has finally provided insight into many aspects of its effect. Exposure to MM may be through ingestion of poisoned fish or inadvertent misuse of grain treated with the poison as a fungicide. Major epidemics have occurred in Japan (Fetal Minamata disease), Iraq, Pakistan, Guatemala, and Ghana. Sporadic incidences have occurred in the United States and Canada. There is no effective antidote to counteract the effect of MM on the central nervous system, although the information documented should provide hope for more effective therapy in acute cases."], ["Total antioxidant content of alternatives to refined sugar. BACKGROUND: Oxidative damage is implicated in the etiology of cancer, cardiovascular disease, and other degenerative disorders. Recent nutritional research has focused on the antioxidant potential of foods, while current dietary recommendations are to increase the intake of antioxidant-rich foods rather than supplement specific nutrients. Many alternatives to refined sugar are available, including raw cane sugar, plant saps/syrups (eg, maple syrup, agave nectar), molasses, honey, and fruit sugars (eg, date sugar). Unrefined sweeteners were hypothesized to contain higher levels of antioxidants, similar to the contrast between whole and refined grain products. OBJECTIVE: To compare the total antioxidant content of natural sweeteners as alternatives to refined sugar. DESIGN: The ferric-reducing ability of plasma (FRAP) assay was used to estimate total antioxidant capacity. Major brands of 12 types of sweeteners as well as refined white sugar and corn syrup were sampled from retail outlets in the United States. RESULTS: Substantial differences in total antioxidant content of different sweeteners were found. Refined sugar, corn syrup, and agave nectar contained minimal antioxidant activity (<0.01 mmol FRAP/100 g); raw cane sugar had a higher FRAP (0.1 mmol/100 g). Dark and blackstrap molasses had the highest FRAP (4.6 to 4.9 mmol/100 g), while maple syrup, brown sugar, and honey showed intermediate antioxidant capacity (0.2 to 0.7 mmol FRAP/100 g). Based on an average intake of 130 g/day refined sugars and the antioxidant activity measured in typical diets, substituting alternative sweeteners could increase antioxidant intake an average of 2.6 mmol/day, similar to the amount found in a serving of berries or nuts. CONCLUSION: Many readily available alternatives to refined sugar offer the potential benefit of antioxidant activity.", "Pseudo-maple syrup urine disease due to maternal prenatal ingestion of fenugreek. Fenugreek, maple syrup and the urine of maple syrup urine disease (MSUD) patients all share a characteristic odour originating from a common component, sotolone. Ingestion of fenugreek by mothers during labour resulted in a maple syrup-like odour in their newborn infants, leading to a false suspicion of MSUD.", "The effects of high fructose syrup. High fructose corn syrup (HFCS) has become an increasingly common food ingredient in the last 40 years. However, there is concern that HFCS consumption increases the risk for obesity and other adverse health outcomes compared to other caloric sweeteners. The most commonly used types of HFCS (HFCS-42 and HFCS-55) are similar in composition to sucrose (table sugar), consisting of roughly equal amounts of fructose and glucose. The primary difference is that these monosaccharides exist free in solution in HFCS, but in disaccharide form in sucrose. The disaccharide sucrose is easily cleaved in the small intestine, so free fructose and glucose are absorbed from both sucrose and HFCS. The advantage to food manufacturers is that the free monosaccharides in HFCS provide better flavor enhancement, stability, freshness, texture, color, pourability, and consistency in foods in comparison to sucrose. Because the composition of HFCS and sucrose is so similar, particularly on absorption by the body, it appears unlikely that HFCS contributes more to obesity or other conditions than sucrose does. Nevertheless, few studies have evaluated the potentially differential effect of various sweeteners, particularly as they relate to health conditions such as obesity, which develop over relatively long periods of time. Improved nutrient databases are needed to analyze food consumption in epidemiologic studies, as are more strongly designed experimental studies, including those on the mechanism of action and relationship between fructose dose and response. At the present time, there is insufficient evidence to ban or otherwise restrict use of HFCS or other fructose-containing sweeteners in the food supply or to require the use of warning labels on products containing HFCS. Nevertheless, dietary advice to limit consumption of all added caloric sweeteners, including HFCS, is warranted.", "Fructose: It\u2019s \u201cAlcohol Without the Buzz\u201d What do the Atkins Diet and the traditional Japanese diet have in common? The Atkins Diet is low in carbohydrate and usually high in fat; the Japanese diet is high in carbohydrate and usually low in fat. Yet both work to promote weight loss. One commonality of both diets is that they both eliminate the monosaccharide fructose. Sucrose (table sugar) and its synthetic sister high fructose corn syrup consist of 2 molecules, glucose and fructose. Glucose is the molecule that when polymerized forms starch, which has a high glycemic index, generates an insulin response, and is not particularly sweet. Fructose is found in fruit, does not generate an insulin response, and is very sweet. Fructose consumption has increased worldwide, paralleling the obesity and chronic metabolic disease pandemic. Sugar (i.e., fructose-containing mixtures) has been vilified by nutritionists for ages as a source of \u201cempty calories,\u201d no different from any other empty calorie. However, fructose is unlike glucose. In the hypercaloric glycogen-replete state, intermediary metabolites from fructose metabolism overwhelm hepatic mitochondrial capacity, which promotes de novo lipogenesis and leads to hepatic insulin resistance, which drives chronic metabolic disease. Fructose also promotes reactive oxygen species formation, which leads to cellular dysfunction and aging, and promotes changes in the brain\u2019s reward system, which drives excessive consumption. Thus, fructose can exert detrimental health effects beyond its calories and in ways that mimic those of ethanol, its metabolic cousin. Indeed, the only distinction is that because fructose is not metabolized in the central nervous system, it does not exert the acute neuronal depression experienced by those imbibing ethanol. These metabolic and hedonic analogies argue that fructose should be thought of as \u201calcohol without the buzz.\u201d", "Science in Liquid Dietary Supplement Promotion: The Misleading Case of Mangosteen Juice Liquid dietary supplements represent a fast growing market segment, including botanically-based beverages containing mangosteen, acai, and noni. These products often resemble fruit juice in packaging and appearance, but may contain pharmacologically active ingredients. While little is known about the human health effects or safety of consuming such products, manufacturers make extensive use of low-quality published research to promote their products. This report analyzes the science-based marketing claims of two of the most widely consumed mangosteen liquid dietary supplements, and compares them to the findings of the research being cited. The reviewer found that analyzed marketing claims overstate the significance of findings, and fail to disclose severe methodological weaknesses of the research they cite. If this trend extends to other related products that are similarly widely consumed, it may pose a public health threat by misleading consumers into assuming that product safety and effectiveness are backed by rigorous scientific data."], ["Association between isolation of Staphylococcus aureus one week after calving and milk yield, somatic cell count, clinical mastitis, and culling th... Cows with isolation of Staphylococcus aureus approximately 1 week after calving and milk yield, somatic cell count (SCC), clinical mastitis (CM), and culling risk through the remaining lactation were assessed in 178 Norwegian dairy herds. Mixed models with repeated measures were used to compare milk yield and SCC, and survival analyses were used to estimate the hazard ratio for CM and culling. On average, cows with an isolate of Staph. aureus had a significantly higher SCC than culture-negative cows. If no post-milking teat disinfection (PMTD) was used, the mean values of SCC were 42,000, 61,000, 68,000 and 77,000 cells/ml for cows with no Staph. aureus isolate, with Staph. aureus isolated in 1 quarter, in 2 quarters and more than 2 quarters respectively. If iodine PMTD was used, SCC means were 36,000; 63,000; 70,000 and 122,000, respectively. Primiparous cows testing positive for Staph. aureus had the same milk yield curve as culture-negative cows, except for those with Staph. aureus isolated in more than 2 quarters. They produced 229 kg less during a 305-d lactation. Multiparous cows with isolation of Staph. aureus in at least 1 quarter produced 94-161 kg less milk in 2nd and >3rd parity, respectively, and those with isolation in more than 2 quarters produced 303-390 kg less than multiparous culture-negative animals during a 305-d lactation. Compared with culture-negative cows, the hazard ratio for CM and culling in cows with isolation of Staph. aureus in at least 1 quarter was 2.0 (1.6-2.4) and 1.7 (1.5-1.9), respectively. There was a decrease in the SCC and in the CM risk in culture-negative cows where iodine PMTD had been used, indicating that iodine PMTD has a preventive effect on already healthy cows. For cows testing positive for Staph. aureus in more than 2 quarters at calving, iodine PMTD had a negative effect on the CM risk and on the SCC through the remaining lactation.", "Mastalgia: a review of management. Mastalgia affects up to two-thirds of women at some time during their reproductive lives. It is usually benign, but thefear of underlying breast cancer is why many women present for evaluation. Mastalgia can be associated with premenstrual syndrome, fibrocystic breast disease, psychologic disturbance and, rarely, breast cancer. Occasionally, extramammary conditions, like Tietzie syndrome, present as mastalgia. A thorough clinical evaluation is required to assess the cause. The majority of women can be reassured after a clinical evaluation. Approximately 15% require pain-relieving therapy. Mechanical breast support; a low-fat, high-carbohydrate diet; and topical nonsteroidal antiinflammatory agents are reasonable first-line treatments. Hormonal agents, such as bromocriptine, tamoxifen and danazol, have all demonstrated efficacy in the treatment of mastalgia. Side effects, however, limit their extensive use. Danazol is the only FDA-approved hormonal treatment and is best used in cyclic form to limit the adverse effects. Lisuride maleate is a new agent recently studied for the treatment of mastalgia. Initial data on this medication are encouraging. Sixty percent of cyclic mastalgia recurs after treatment. Noncyclic mastalgia responds poorly to treatment but resolves spontaneously in up to 50% of cases.", "Hypothesis: is antibiotic use associated with breast cancer? The hypothesis that antibiotic use may increase cancer risk was first proposed several decades ago and some research suggests an increased risk of breast cancer among women with conditions likely to require long-term antibiotic use (e.g., acne, recurrent urinary-tract infections, UTI). However, this hypothesis has not been verified and the possible biological mechanisms are not entirely clear. A recent cohort study in Finland reported an increased risk of breast-cancer associated with antibiotic use for UTI. The effect of antibiotics on the ability of intestinal microflora to metabolise phytochemicals from edible plants into compounds that may protect against cancer was proposed as a potential mechanism. We extend this hypothesis by proposing that antibiotic use may be associated with breast-cancer risk through effects on immune and inflammatory factors, such as cytokines, T lymphocytes, prostaglandins, and matrix metalloproteinases, as well as disruption of phytochemical and oestrogen metabolism by intestinal microflora. We suggest that some mechanisms may increase breast-cancer risk, while others may decrease risk, depending on the antibiotic classification.", "Cytological abnormalities in nipple aspirates of breast fluid from women with severe constipation. The relation between epithelial dysplasia in nipple aspirates of breast fluid and frequency of bowel movements was studied in 1481 white women. There was a significant positive association with dysplasia (risk ratio 4.5; 95% confidence interval 1.9-11.9) in women reporting severe constipation, i.e., two or fewer bowel movements weekly, which was not seen in women reporting more than one bowel movement daily. Women who had one bowel movement daily or one every other day had increased risk ratios. Cytological abnormalities in breast epithelium associated with severe constipation may be relevant to studies of diet and breast disease since the intestinal flora has been reported to metabolism bile salts and oestrogens secreted by the liver into the gastrointestinal tract-a process which may be enhanced by severe constipation.", "Cytological abnormalities in nipple aspirates of breast fluid from women with severe constipation. The relation between epithelial dysplasia in nipple aspirates of breast fluid and frequency of bowel movements was studied in 1481 white women. There was a significant positive association with dysplasia (risk ratio 4.5; 95% confidence interval 1.9-11.9) in women reporting severe constipation, i.e., two or fewer bowel movements weekly, which was not seen in women reporting more than one bowel movement daily. Women who had one bowel movement daily or one every other day had increased risk ratios. Cytological abnormalities in breast epithelium associated with severe constipation may be relevant to studies of diet and breast disease since the intestinal flora has been reported to metabolism bile salts and oestrogens secreted by the liver into the gastrointestinal tract-a process which may be enhanced by severe constipation."], ["Medical practice and social authority. Questions of medical ethics are often treated as especially difficult casuistical problems or as difficult cases illustrative of paradoxes or advantages in global moral theories. I argue here, in opposition to such approaches, for the inseparability of questions of social history and social theory from any normative assessment of medical practices. The focus of the discussion is the question of the legitimacy of the social authority exercised by physicians, and the insufficiency of traditional defences of such authority in liberal societies (voluntarist, informed consent approaches), as well as traditional attacks on such strategies (ideology critique). Seeing such authority as institution bound and role based, it is argued, can help reframe, more broadly and more adequately, what is an \\\"ethical problem\\\" in medical practice and why.", "Can deceiving patients be morally acceptable? Daniel K Sokol argues that on rare occasions benignly deceiving patients can be morally acceptable, and he has devised a decision checklist to help doctors facing such a dilemma", "A duty to deceive: placebos in clinical practice. Among medical researchers and clinicians the dominant view is that it is unethical to deceive patients by prescribing a placebo. This opinion is formalized in a recent policy issued by the American Medical Association (AMA [Chicago, IL]). Although placebos can be shown to be always safe, often effective, and sometimes necessary, doctors are now effectively prohibited from using them in clinical practice. I argue that the deceptive administration of placebos is not subject to the same moral objections that face other forms of deception in clinical practice and medical research. Although deception is normally objectionable on the grounds that it limits autonomy and breaches trust, these grounds do not apply to placebos when they are prescribed within appropriate ethical limits. Patients have reason to prefer that doctors can prescribe placebos in ethically responsible ways. Hence, the AMA has an obligation to endorse and to promote the responsible use of deceptive placebos in clinical practice.", "US medical researchers, the Nuremberg Doctors Trial, and the Nuremberg Code. A review of findings of the Advisory Committee on Human Radiation Expe... The Advisory Committee on Human Radiation Experiments (ACHRE), established to review allegations of abuses of human subjects in federally sponsored radiation research, was charged with identifying appropriate standards to evaluate the ethics of cold war radiation experiments. One central question for ACHRE was to determine what role, if any, the Nuremberg Code played in the norms and practices of US medical researchers. Based on the evidence from ACHRE's Ethics Oral History Project and extensive archival research, we conclude that the Code, at the time it was promulgated, had little effect on mainstream medical researchers engaged in human subjects research. Although some clinical investigators raised questions about the conduct of research involving human beings, the medical profession did not pursue this issue until the 1960s.", "Justification of diagnostic medical exposures: some practical issues. Report of an International Atomic Energy Agency Consultation Objectives The Radiation Protection of Patients Unit of the International Atomic Energy Agency (IAEA) is concerned about the effectiveness of justification of diagnostic medical exposures. Recent published work and the report of an initial IAEA consultation in the area gave grounds for such concerns. There is a significant level of inappropriate usage, and, in some cases, a poor level of awareness of dose and risk among some key groups involved. This article aims to address this. Methods The IAEA convened a second group of experts in November 2008 to review practical and achievable actions that might lead to more effective justification. Results This report summarises the matters that this group considered and the outcome of their deliberations. There is a need for improved communication, both within professions and between professionals on one hand, and between professionals and the patients/public on the other. Coupled with this, the issue of consent to imaging procedures was revisited. The need for good evidence-based referral guidelines or criteria of acceptability was emphasised, as was the need for their global adaptation and dissemination. Conclusion Clinical audit was regarded as a key tool in ensuring that justification becomes an effective, transparent and accountable part of normal radiological practice. In summary, justification would be facilitated by the \u201c3 As\u201d: awareness, appropriateness and audit."], ["Short or Long Sleep Duration Is Associated with Memory Impairment in Older Chinese: the Guangzhou Biobank Cohort Study Study Objectives: To examine the association between sleep-related factors and memory impairment. Design: Cross-sectional study Setting: Community-based study in Guangzhou, China. Participants: 28,670 older Chinese (20,776 women and 7,894 men) aged 50 to 85 years. Measurements and Results: Demographic and socioeconomic data, sleep-related factors, and cognitive function were collected by face-to-face interview. Potential confounders, such as employment and occupational status, smoking, alcohol and tea use, physical activity, self-rated health, anthropometry, blood pressure, and fasting plasma glucose and lipids were measured. After adjusting for multiple potential confounders, an inverted U-shaped association between sleep duration and delayed word recall test (DWRT) score, a validated measure of memory impairment, was found, with 7 to 8 h of habitual sleep duration showing the highest score (P-values for trend from 3 to 7 h and from 7 to \u2265 10 h were all \u2264 0.001). Compared to sleep duration of 7 h, the adjusted odds ratio for memory impairment from the sleep duration of 3 to 4 or \u2265 10 h was 1.29 (95% confidence interval 1.07-1.56) and 1.52 (1.25-1.86), respectively. Subjects with daily napping, morning tiredness, or insomnia had significantly lower DWRT scores than those without (P ranged from < 0.001 to 0.01). Conclusions: Short or long sleep duration was an important sleep-related factor independently associated with memory impairment and may be a useful marker for increased risk of cognitive impairment in older people. Citation: Xu L; Jiang CQ; Lam TH; Liu B; Jin YL; Zhu T; Zhang WS; Cheng KK; Thomas GN. Short or long sleep duration is associated with memory impairment in older Chinese: the Guangzhou Biobank Cohort Study. SLEEP 2011;34(5):575-580.", "High tofu intake is associated with worse memory in elderly Indonesian men and women. BACKGROUND/AIMS: Cell culture studies suggest that phytoestrogens, abundant in soy products such as tempe and tofu, could protect against cognitive decline. Paradoxically, the Honolulu Asia Aging Study reported an increased risk for cognitive impairment and other dementia markers with high tofu (soybean curd) intake. METHODS: A cross-sectional study was carried out in 2 rural sites (Borobudur and Sumedang) and 1 urban site (Jakarta) among mainly Javanese and Sundanese elderly (n = 719, 52-98 years of age). Memory was measured using a word learning test sensitive to dementia and soy consumption was assessed using Food Frequency Questionnaire items. RESULTS: High tofu consumption was associated with worse memory (beta = -0.18, p < 0.01, 95% CI = -0.34 to -0.06), while high tempe consumption (a fermented whole soybean product) was independently related to better memory (beta = 0.12, p < 0.05, 95% CI = 0.00-0.28), particularly in participants over 68 years of age. Fruit consumption also had an independent positive association. The analyses were controlled for age, sex, education, site and intake of other foods. CONCLUSION: The results for tofu consumption as a risk factor for low memory function may tie in with the Honolulu Asia Aging Study data. It is unclear whether these negative associations could be attributed to potential toxins or to its phytoestrogen levels. Estrogen (through which receptors phytoestrogens can exert effects) was found to increase dementia risk in women over 65 years of age. Tempe contains high levels of phytoestrogens, but (due to fermentation) also exhibits high folate levels which may exert protective effects. Future studies should validate these findings and investigate potential mechanisms. Copyright 2008 S. Karger AG, Basel.", "Concord grape juice supplementation improves memory function in older adults with mild cognitive impairment. Concord grape juice contains polyphenol compounds, which have antioxidant and anti-inflammatory properties and influence neuronal signalling. Concord grape juice supplementation has been shown to reduce inflammation, blood pressure and vascular pathology in individuals with CVD, and consumption of such flavonoid-containing foods is associated with a reduced risk for dementia. In addition, preliminary animal data have indicated improvement in memory and motor function with grape juice supplementation, suggesting potential for cognitive benefit in ageing humans. In this initial investigation of neurocognitive effects, we enrolled twelve older adults with memory decline but not dementia in a randomised, placebo-controlled, double-blind trial with Concord grape juice supplementation for 12 weeks. We observed significant improvement in a measure of verbal learning and non-significant enhancement of verbal and spatial recall. There was no appreciable effect of the intervention on depressive symptoms and no effect on weight or waist circumference. A small increase in fasting insulin was observed for those consuming grape juice. These preliminary findings suggest that supplementation with Concord grape juice may enhance cognitive function for older adults with early memory decline and establish a basis for more comprehensive investigations to evaluate potential benefit and assess mechanisms of action.", "Hydration and cognitive performance. A clinical link exists between severe dehydration and cognitive performance. Using rapid and severe water loss induced either by intense exercise and/or heat stress, initial studies suggested there were alterations in short-term memory and cognitive function related to vision, but more recent studies have not all confirmed these data. Some studies argue that water loss is not responsible for the observations made, and studies compensating water losses have failed to prevent the symptoms. Studies in children have suggested that drinking extra water helps cognitive performance, but these data rely on a small number of children. In older adults (mean age around 60) the data are not strong enough to support a relationship between mild dehydration and cognitive function. Data on frail elderly and demented people are lacking. Methodological heterogeneity in these studies are such that the relationship between mild dehydration and cognitive performance cannot be supported.", "A possible role for lutein and zeaxanthin in cognitive function in the elderly. Epidemiologic studies suggest that dietary lutein and zeaxanthin may be of benefit in maintaining cognitive health. Among the carotenoids, lutein and zeaxanthin are the only two that cross the blood-retina barrier to form macular pigment (MP) in the eye. They also preferentially accumulate in the human brain. Lutein and zeaxanthin in macula from nonhuman primates were found to be significantly correlated with their concentrations in matched brain tissue. Therefore, MP can be used as a biomarker of lutein and zeaxanthin in primate brain tissue. This is of interest given that a significant correlation was found between MP density and global cognitive function in healthy older adults. An examination of a relation between cognition and lutein and zeaxanthin concentrations in the brain tissue of decedents from a population-based study in centenarians found that zeaxanthin concentrations in brain tissue were significantly related to antemortem measures of global cognitive function, memory retention, verbal fluency, and dementia severity after adjustment for age, sex, education, hypertension, and diabetes. In univariate analyses, lutein was related to recall and verbal fluency, but the strength of the associations was attenuated with adjustment for covariates. However, lutein concentrations in the brain were significantly lower in individuals with mild cognitive impairment than in those with normal cognitive function. Last, in a 4-mo, double-blinded, placebo-controlled trial in older women that involved lutein supplementation (12 mg/d), alone or in combination with DHA (800 mg/d), verbal fluency scores improved significantly in the DHA, lutein, and combined-treatment groups. Memory scores and rate of learning improved significantly in the combined-treatment group, who also showed a trend toward more efficient learning. When all of these observations are taken into consideration, the idea that lutein and zeaxanthin can influence cognitive function in older adults warrants further study."], ["Chemical, microbial and physical evaluation of commercial bottled waters in greater Houston area of Texas. Due to the increased demand and consumption of bottled water in the United States, there has been a growing concern about the quality of this product. Retail outlets sell local as well as imported bottled water to consumers. Three bottles for each of 35 different brands of bottled water were randomly collected from local grocery stores in the greater Houston area. Out of the 35 different brands, 16 were designated as spring water, 11 were purified and/or fortified tap water, 5 were carbonated water and 3 were distilled water. Chemical, microbial and physical properties of all samples were evaluated including pH, conductivity, bacteria counts, anion concentration, trace metal concentration, heavy metal and volatile organics concentration were determined in all samples. Inductively coupled plasma/mass spectrometry (ICPMS) was used for elemental analysis, gas chromatography with electron capture detector (GCECD) as well as gas chromatography mass spectrometry (GCMS) were used for analysis of volatile organics, ion chromatography (IC) and selective ion electrodes were used for the analysis of anions. Bacterial identification was performed using the Biolog software (Biolog, Inc., Hayward, Ca, USA). The results obtained were compared with guidelines of drinking water recommended by the International Bottled Water Association (IBWA), United States Food and Drug Administration (FDA), United States Environmental Protection Agency (EPA) and the World Health Organization (WHO) drinking water standard. The majority of the analyzed chemicals were below their respective drinking water standards for maximum admissible concentrations (MAC). Volatile organic chemicals were found to be below detection limits. Four of the 35 brands of the bottled water samples analyzed were found to be contaminated with bacteria.", "International multidimensional authenticity specification (IMAS) algorithm for detection of commercial pomegranate juice adulteration. The pomegranate fruit ( Punica granatum ) has become an international high-value crop for the production of commercial pomegranate juice (PJ). The perceived consumer value of PJ is due in large part to its potential health benefits based on a significant body of medical research conducted with authentic PJ. To establish criteria for authenticating PJ, a new International Multidimensional Authenticity Specifications (IMAS) algorithm was developed through consideration of existing databases and comprehensive chemical characterization of 45 commercial juice samples from 23 different manufacturers in the United States. In addition to analysis of commercial juice samples obtained in the United States, data from other analyses of pomegranate juice and fruits including samples from Iran, Turkey, Azerbaijan, Syria, India, and China were considered in developing this protocol. There is universal agreement that the presence of a highly constant group of six anthocyanins together with punicalagins characterizes polyphenols in PJ. At a total sugar concentration of 16 degrees Brix, PJ contains characteristic sugars including mannitol at >0.3 g/100 mL. Ratios of glucose to mannitol of 4-15 and of glucose to fructose of 0.8-1.0 are also characteristic of PJ. In addition, no sucrose should be present because of isomerase activity during commercial processing. Stable isotope ratio mass spectrometry as > -25 per thousand assures that there is no added corn or cane sugar added to PJ. Sorbitol was present at <0.025 g/100 mL; maltose and tartaric acid were not detected. The presence of the amino acid proline at >25 mg/L is indicative of added grape products. Malic acid at >0.1 g/100 mL indicates adulteration with apple, pear, grape, cherry, plum, or aronia juice. Other adulteration methods include the addition of highly concentrated aronia, blueberry, or blackberry juices or natural grape pigments to poor-quality juices to imitate the color of pomegranate juice, which results in abnormal anthocyanin profiles. To adjust the astringent taste of poor-quality juice or peel extract, addition of nonpomegranate sugars is a commonly detected adulteration method. The profile generated from these analyses combined with information from existing databases and published literature has been integrated into a validated IMAS for PJ, which can be utilized to detect PJ adulteration. In this survey of commercial pomegranate juices, only 6 of 23 strictly met all of the IMAS criteria.", "Severe lactic acidosis associated with juice of the mangosteen fruit Garcinia mangostana. The tropical mangosteen fruit has long been prized in Southeast Asia for its traditional healing properties. Mangosteen fruit juice is now available in the United States and marketed for its purported health benefits. We describe a case of severe lactic acidosis associated with the use of mangosteen juice as a dietary supplement.", "Detection of fecal residue on poultry carcasses by laser-induced fluorescence imaging. Feasibility of fluorescence imaging technique for the detection of diluted fecal matters from various parts of the digestive tract, including colon, ceca, small intestine, and duodenum, on poultry carcasses was investigated. One of the challenges for using fluorescence imaging for inspection of agricultural material is the low fluorescence yield in that fluorescence can be masked by ambient light. A laser-induced fluorescence imaging system (LIFIS) developed by our group allowed acquisition of fluorescence from feces-contaminated poultry carcasses in ambient light. Fluorescence emission images at 630 nm were captured with 415-nm laser excitation. Image processing algorithms including threshold and image erosion were used to identify fecal spots diluted up to 1: 10 by weight with double distilled water. Feces spots on the carcasses, without dilution and up to 1: 5 dilutions, could be detected with 100% accuracy regardless of feces type. Detection accuracy for fecal matters diluted up to 1: 10 was 96.6%. The results demonstrated good potential of the LIFIS for detection of diluted poultry fecal matter, which can harbor pathogens, on poultry carcasses.", "L-theanine intervention enhances human gammadeltaT lymphocyte function. Human gammadeltaT lymphocytes are a subset of T cells and are a first line of defense against microbes and tumors. These gammadeltaT cells can be primed by nitrogen-containing bisphosphonates, and certain short-chain alkylamines. These primed gammadeltaT cells have an enhanced capacity to proliferate and to secrete cytokines upon ex vivo exposure to a wide variety of microbes and tumor cells. The largest dietary source of alkylamines is L-theanine, an amino acid unique to tea beverages that is catabolized to ethylamine. Supplementation of subjects with capsules containing L-theanine and catechins has recently been shown to decrease the incidence of cold and flu symptoms, while enhancing gammadeltaT cell function."], ["A wholly nutritional 'multifocal angiostatic therapy' for control of disseminated cancer. A great deal of effort is now being devoted to the development of new drugs that hopefully will control the spread of inoperable cancer by safely inhibiting tumor-evoked angiogenesis. However, there is growing evidence that certain practical nutritional measures have the potential to slow tumor angiogenesis, and it is reasonable to anticipate that, by combining several measures that work in distinct but complementary ways to impede the angiogenic process, a clinically useful 'multifocal angiostatic therapy' (MAT) might be devised. Several measures which might reasonably be included in such a protocol are discussed below, and include: a low-fat, low-glycemic index vegan diet, which may down-regulate the systemic IGF-I activity that supports angiogenesis; supplemental omega-3-rich fish oil, which has been shown to inhibit endothelial expression of Flk-1, a functionally crucial receptor for VEGF, and also can suppress tumor production of pro-angiogenic eicosanoids; high-dose selenium, which has recently been shown to inhibit tumor production of VEGF; green tea polyphenols, which can suppress endothelial responsiveness to both VEGF and fibroblast growth factor; and high-dose glycine, whose recently reported angiostatic activity may reflect inhibition of endothelial cell mitosis, possibly mediated by activation of glycine-gated chloride channels. In light of evidence that tumor-evoked angiogenesis has a high requirement for copper, copper depletion may have exceptional potential as an angiostatic measure, and is most efficiently achieved with the copper-chelating drug tetrathiomolybdate. If logistical difficulties make it difficult to acquire this experimental drug, high-dose zinc supplementation can achieve a slower depletion of the body's copper pool, and in any case can be used as maintenance therapy to maintain an adequate level of copper depletion. A provisional protocol is offered for a nutritionally based MAT entailing a vegan diet and supplemental intakes of fish oil, selenium, green tea polyphenols, glycine, and zinc. Inasmuch as cox-2 is overexpressed in many cancers, and cAMP can boost tumor production of various angiogenic factors as well as autogenous growth factors, adjunctive use of cox-2-specific NSAIDS may be warranted in some cases.", "mTOR and cancer therapy. Proteins regulating the mammalian target of rapamycin (mTOR), as well as some of the targets of the mTOR kinase, are overexpressed or mutated in cancer. Rapamycin, the naturally occurring inhibitor of mTOR, along with a number of recently developed rapamycin analogs (rapalogs) consisting of synthetically derived compounds containing minor chemical modifications to the parent structure, inhibit the growth of cell lines derived from multiple tumor types in vitro, and tumor models in vivo. Results from clinical trials indicate that the rapalogs may be useful for the treatment of subsets of certain types of cancer. The sporadic responses from the initial clinical trials, based on the hypothesis of general translation inhibition of cancer cells are now beginning to be understood owing to a more complete understanding of the dynamics of mTOR regulation and the function of mTOR in the tumor microenvironment. This review will summarize the preclinical and clinical data and recent discoveries of the function of mTOR in cancer and growth regulation.", "TOR-driven aging: speeding car without brakes. This article discusses that the traditional analogy of an aging organism with a rusting (albeit self-repairing) car is misleading. The true analogy is a speeding car that enters a low-speed zone and damages itself because it does not and cannot slow down. For such a car without brakes (and actually without a driver), aging from rusting never occurs. Using simple analogies (although turning gerontology upside down), this article discusses the origin of aging, how overactivation of the mTOR (Target of Rapamycin) pathway causes aging, why aging causes damage (organ damage) not damage causes aging, the link between aging and age-related diseases, slow aging versus aging tolerance and suppression of aging with rapamycin.", "Dioxin May Promote Inflammation-Related Development of Endometriosis Laboratory and population-based studies suggest that exposure to environmental toxicants may be one of several triggers for the development of endometriosis. We discuss evidence that modulation of the endometrial endocrine-immune interface could mechanistically link toxicant exposure to the development of this disease. Capsule Summary: Environmental toxicant exposure induces an inflammatory-like endometrial response that may promote the development of endometriosis.", "Deconvoluting mTOR biology In metazoans, TOR is an essential protein that functions as a master regulator of cellular growth and proliferation. Over the past decade, there has been an explosion of information about this critical master kinase, ranging from the composition of the TOR protein complex to its ability to act as an integrator of numerous extracellular signals. Unfortunately, this plethora of information has also raised numerous questions regarding TOR function. Currently, the prevailing view is that mammalian TOR (mTOR) exists in at least two molecular complexes, mTORC1 and mTORC2, which are largely defined by the presence of either RAPTOR or RICTOR. However, additional co-factors have been identified for each complex, and their importance in mediating mTOR signals has been incompletely elucidated. Similarly, there are differences in mTOR function that reflect the tissue of origin. In this review, we present an alternative view to mTOR complex formation and function, which envisions mTOR regulation and signal propagation as a reflection of cell type- and basal state-dependent conditions. The re-interpretation of mTOR biology in this framework may facilitate the design of therapies most likely to effectively inhibit this central regulator of cell behavior."], ["Milk consumption: aggravating factor of acne and promoter of chronic diseases of Western societies. Consumption of cow's milk and cow's milk protein result in changes of the hormonal axis of insulin, growth hormone and insulin-like growth factor-1(IGF-1) in humans. Milk consumption raises IGF-1 serum levels in the perinatal period, adolescence and adulthood. During puberty with the physiological onset of increased secretion of growth hormone, IGF-1 serum levels increase and are further enhanced by milk consumption. IGF-1 is a potent mitogen; after binding to its receptor in various tissues, it induces cell proliferation and inhibits apoptosis. Keratinocytes and sebocytes, as well as the androgen-synthesizing adrenals and gonads, are stimulated by IGF-1. The epidemic incidence of adolescent acne in Western milk-consuming societies can be explained by the increased insulin- and IGF-1-stimulation of sebaceous glands mediated by milk consumption. Acne can be regarded as a model for chronic Western diseases with pathologically increased IGF-1-stimulation. Many other organs, such as the thymus, bones, all glands, and vascular smooth muscle cells as well as neurons are subject to this abnormally increased hormonal stimulation. The milk-induced change of the IGF-1-axis most likely contributes to the development of fetal macrosomia, induction of atopy, accelerated linear growth, atherosclerosis, carcinogenesis and neurodegenerative diseases. Observations of molecular biology are supported by epidemiologic data and unmask milk consumption as a promoter of chronic diseases of Western societies.", "Is milk responsible for male reproductive disorders? The role of environmental compounds with estrogenic activity in the development of male reproductive disorders has been a source of great concern. Among the routes of human exposure to estrogens, we are particularly concerned about cows' milk, which contains considerable amounts of estrogens. The major sources of animal-derived estrogens in the human diet are milk and dairy products, which account for 60-70% of the estrogens consumed. Humans consume milk obtained from heifers in the latter half of pregnancy, when the estrogen levels in cows are markedly elevated. The milk that we now consume may be quite unlike that consumed 100 years ago. Modern genetically-improved dairy cows, such as the Holstein, are usually fed a combination of grass and concentrates (grain/protein mixes and various by-products), allowing them to lactate during the latter half of pregnancy, even at 220 days of gestation. We hypothesize that milk is responsible, at least in part, for some male reproductive disorders. Copyright 2001 Harcourt Publishers Ltd.", "Does milk increase mucus production? Excessive milk consumption has a long association with increased respiratory tract mucus production and asthma. Such an association cannot be explained using a conventional allergic paradigm and there is limited medical evidence showing causality. In the human colon, beta-casomorphin-7 (beta-CM-7), an exorphin derived from the breakdown of A1 milk, stimulates mucus production from gut MUC5AC glands. In the presence of inflammation similar mucus overproduction from respiratory tract MUC5AC glands characterises many respiratory tract diseases. beta-CM-7 from the blood stream could stimulate the production and secretion of mucus production from these respiratory glands. Such a hypothesis could be tested in vitro using quantitative RT-PCR to show that the addition of beta-CM-7 into an incubation medium of respiratory goblet cells elicits an increase in MUC5AC mRNA and by identifying beta-CM-7 in the blood of asthmatic patients. This association may not necessarily be simply cause and effect as the person has to be consuming A1 milk, beta-CM-7 must pass into the systemic circulation and the tissues have to be actively inflamed. These prerequisites could explain why only a subgroup of the population, who have increased respiratory tract mucus production, find that many of their symptoms, including asthma, improve on a dairy elimination diet. (c) 2009 Elsevier Ltd. All rights reserved.", "Milk consumption and acne in adolescent girls. There has been a remarkable paucity of evidence for an association between diet and acne. Our previous studies suggest that there is an association between milk intake and teenage acne. This is a prospective cohort study to evaluate that relationship. We studied 6,094 girls, aged 9-15 years in 1996, who reported dietary intake on up to three food frequency questionnaires from 1996 to 1998. Presence and severity of acne was assessed by questionnaire in 1999. We computed multivariate prevalence ratios (PR) and 95 percent confidence intervals for acne. After accounting for age at baseline, height and energy intake, the multivariate PRs (95 % CI; p-value for test of trend) for acne comparing highest (2 or more servings per day) to lowest (<1 per week) intake categories in 1996, were 1.20 (1.09, 1.31; <0.001) for total milk, 1.19 (1.06, 1.32; <0.001) for whole milk, 1.17 (1.04, 1.31; 0.002) for low fat milk and 1.19 (1.08, 1.31; <0.001) for skim milk. This result did not change appreciably when we excluded girls who reported use of contraceptives and when we restricted our analysis to those younger than 11 years of age at baseline. We found a positive association between intake of milk and acne. This finding supports earlier studies and suggests that the metabolic effects of milk are sufficient to elicit biological responses in consumers.", "Milk consumption and acne in teenaged boys Objective We sought to examine the association between dietary dairy intake and teenaged acne among boys. Methods This was a prospective cohort study. We studied 4273 boys, members of a prospective cohort study of youths and of lifestyle factors, who reported dietary intake on up to 3 food frequency questionnaires from 1996 to 1998 and teenaged acne in 1999. We computed multivariate prevalence ratios and 95% confidence intervals for acne. Results After adjusting for age at baseline, height, and energy intake, the multivariate prevalence ratios (95% confidence interval; P value for test of trend) for acne comparing highest (>2 servings/d) with lowest (<1/wk) intake categories in 1996 were 1.16 (1.01, 1.34; 0.77) for total milk, 1.10 (0.94, 1.28; 0.83) for whole/2% milk, 1.17 (0.99, 1.39; 0.08) for low-fat (1%) milk, and 1.19 (1.01, 1.40; 0.02) for skim milk. Limitations Not all members of the cohort responded to the questionnaire. Acne assessment was by self-report and boys whose symptoms might have been part of an underlying disorder were not excluded. We did not adjust for steroid use and other lifestyle factors that may affect occurrence of acne. Conclusion We found a positive association between intake of skim milk and acne. This finding suggests that skim milk contains hormonal constituents, or factors that influence endogenous hormones, in sufficient quantities to have biological effects in consumers."], ["Total antioxidant content of alternatives to refined sugar. BACKGROUND: Oxidative damage is implicated in the etiology of cancer, cardiovascular disease, and other degenerative disorders. Recent nutritional research has focused on the antioxidant potential of foods, while current dietary recommendations are to increase the intake of antioxidant-rich foods rather than supplement specific nutrients. Many alternatives to refined sugar are available, including raw cane sugar, plant saps/syrups (eg, maple syrup, agave nectar), molasses, honey, and fruit sugars (eg, date sugar). Unrefined sweeteners were hypothesized to contain higher levels of antioxidants, similar to the contrast between whole and refined grain products. OBJECTIVE: To compare the total antioxidant content of natural sweeteners as alternatives to refined sugar. DESIGN: The ferric-reducing ability of plasma (FRAP) assay was used to estimate total antioxidant capacity. Major brands of 12 types of sweeteners as well as refined white sugar and corn syrup were sampled from retail outlets in the United States. RESULTS: Substantial differences in total antioxidant content of different sweeteners were found. Refined sugar, corn syrup, and agave nectar contained minimal antioxidant activity (<0.01 mmol FRAP/100 g); raw cane sugar had a higher FRAP (0.1 mmol/100 g). Dark and blackstrap molasses had the highest FRAP (4.6 to 4.9 mmol/100 g), while maple syrup, brown sugar, and honey showed intermediate antioxidant capacity (0.2 to 0.7 mmol FRAP/100 g). Based on an average intake of 130 g/day refined sugars and the antioxidant activity measured in typical diets, substituting alternative sweeteners could increase antioxidant intake an average of 2.6 mmol/day, similar to the amount found in a serving of berries or nuts. CONCLUSION: Many readily available alternatives to refined sugar offer the potential benefit of antioxidant activity.", "The effects of high fructose syrup. High fructose corn syrup (HFCS) has become an increasingly common food ingredient in the last 40 years. However, there is concern that HFCS consumption increases the risk for obesity and other adverse health outcomes compared to other caloric sweeteners. The most commonly used types of HFCS (HFCS-42 and HFCS-55) are similar in composition to sucrose (table sugar), consisting of roughly equal amounts of fructose and glucose. The primary difference is that these monosaccharides exist free in solution in HFCS, but in disaccharide form in sucrose. The disaccharide sucrose is easily cleaved in the small intestine, so free fructose and glucose are absorbed from both sucrose and HFCS. The advantage to food manufacturers is that the free monosaccharides in HFCS provide better flavor enhancement, stability, freshness, texture, color, pourability, and consistency in foods in comparison to sucrose. Because the composition of HFCS and sucrose is so similar, particularly on absorption by the body, it appears unlikely that HFCS contributes more to obesity or other conditions than sucrose does. Nevertheless, few studies have evaluated the potentially differential effect of various sweeteners, particularly as they relate to health conditions such as obesity, which develop over relatively long periods of time. Improved nutrient databases are needed to analyze food consumption in epidemiologic studies, as are more strongly designed experimental studies, including those on the mechanism of action and relationship between fructose dose and response. At the present time, there is insufficient evidence to ban or otherwise restrict use of HFCS or other fructose-containing sweeteners in the food supply or to require the use of warning labels on products containing HFCS. Nevertheless, dietary advice to limit consumption of all added caloric sweeteners, including HFCS, is warranted.", "The fruit of the date palm: its possible use as the best food for the future? The fruits (dates) of the date palm (Phoenix dactylifera L.) contain a high percentage of carbohydrate (total sugars, 44-88%), fat (0.2-0.5%), 15 salts and minerals, protein (2.3-5.6%), vitamins and a high percentage of dietary fibre (6.4-11.5%). The flesh of dates contains 0.2-0.5% oil, whereas the seed contains 7.7-9.7% oil. The weight of the seed is 5.6-14.2% of the date. The fatty acids occur in both flesh and seed as a range of saturated and unsaturated acids, the seeds containing 14 types of fatty acids, but only eight of these fatty acids occur in very low concentration in the flesh. Unsaturated fatty acids include palmitoleic, oleic, linoleic and linolenic acids. The oleic acid content of the seeds varies from 41.1 to 58.8%, which suggests that the seeds of date could be used as a source of oleic acid. There are at least 15 minerals in dates. The percentage of each mineral in dried dates varies from 0.1 to 916 mg/100 g date depending on the type of mineral. In many varieties, potassium can be found at a concentration as high as 0.9% in the flesh while it is as high as 0.5% in some seeds. Other minerals and salts that are found in various proportions include boron, calcium, cobalt, copper, fluorine, iron, magnesium, manganese, potassium, phosphorous, sodium and zinc. Additionally, the seeds contain aluminum, cadmium, chloride, lead and sulphur in various proportions. Dates contain elemental fluorine that is useful in protecting teeth against decay. Selenium, another element believed to help prevent cancer and important in immune function, is also found in dates. The protein in dates contains 23 types of amino acids, some of which are not present in the most popular fruits such as oranges, apples and bananas. Dates contain at least six vitamins including a small amount of vitamin C, and vitamins B(1) thiamine, B(2) riboflavin, nicotinic acid (niacin) and vitamin A. The dietary fibre of 14 varieties of dates has been shown to be as high as 6.4-11.5% depending on variety and degree of ripeness. Dates contain 0.5-3.9% pectin, which may have important health benefits. The world production of dates has increased 2.9 times over 40 years, whereas the world population has doubled. The total world export of dates increased by 1.71% over 40 years. In many ways, dates may be considered as an almost ideal food, providing a wide range of essential nutrients and potential health benefits.", "Generation of gaseous sulfur-containing compounds in tumour tissue and suppression of gas diffusion as an antitumour treatment. BACKGROUND AND AIMS: The mechanisms of cancer cell growth and metastasis are still not entirely understood, especially from the viewpoint of chemical reactions in tumours. Glycolytic metabolism is markedly accelerated in cancer cells, causing the accumulation of glucose (a reducing sugar) and methionine (an amino acid), which can non-enzymatically react and form carcinogenic substances. There is speculation that this reaction produces gaseous sulfur-containing compounds in tumour tissue. The aims of this study were to clarify the products in tumour and to investigate their effect on tumour proliferation. METHODS: Products formed in the reaction between glucose and methionine or its metabolites were analysed in vitro using gas chromatography. Flatus samples from patients with colon cancer and exhaled air samples from patients with lung cancer were analysed using near-edge x-ray fine adsorption structure spectroscopy and compared with those from healthy individuals. The tumour proliferation rates of mice into which HT29 human colon cancer cells had been implanted were compared with those of mice in which the cancer cells were surrounded by sodium hyaluronate gel to prevent diffusion of gaseous material into the healthy cells. RESULTS: Gaseous sulfur-containing compounds such as methanethiol and hydrogen sulfide were produced when glucose was allowed to react with methionine or its metabolites homocysteine or cysteine. Near-edge x-ray fine adsorption structure spectroscopy showed that the concentrations of sulfur-containing compounds in the samples of flatus from patients with colon cancer and in the samples of exhaled air from patients with lung cancer were significantly higher than in those from healthy individuals. Animal experiments showed that preventing the diffusion of sulfur-containing compounds had a pronounced antitumour effect. CONCLUSIONS: Gaseous sulfur-containing compounds are the main products in tumours and preventing the diffusion of these compounds reduces the tumour proliferation rate, which suggests the possibility of a new approach to cancer treatment.", "Marine edible algae as disease preventers. As modern lifestyles and new feeding habits settle in the world, noncommunicable diseases (NCDs) have evolved to be major causes of disability in developing as well as developed countries. As a concomitant effect, there is a growing interest in natural, healthy food and an increasing awareness of risk factors and determinants of disease. This chapter describes some nutritional facts about seaweeds, which have been used as food since ancient times in China, Japan, Egypt, and India and comments on the potential utilization of marine algae as functional foods. This concept and the description of metabolic syndrome are used as a basis to comprehension of seaweeds against two dreadful illnesses of our times: high blood pressure and cancer. Copyright \u00a9 2011 Elsevier Inc. All rights reserved."], ["Diet and prevention of oral cancer: strategies for clinical practice. BACKGROUND: Oral health care professionals can play an important role in preventing oral cancer by performing oral mucosal examinations to detect pre-cancerous changes and by educating patients about oral cancer prevention strategies, including dietary approaches. CONCLUSIONS: Current evidence supports a diet high in fruits, vegetables and plant-based foods for prevention of oral cancer. Dietary supplements-including vitamins and minerals-have not been shown to be effective as substitutes for a diet high in fruits and vegetables. CLINICAL IMPLICATIONS: In addition to discussing tobacco and alcohol use with patients (and, if relevant, betel nut and gutka consumption), as well as the risk of sexual transmission of human papillo-mavirus, clinicians should provide dietary advice for the prevention of oral cancer as part of routine patient education practices.", "Salivary acetaldehyde increase due to alcohol-containing mouthwash use: a risk factor for oral cancer. Increasing evidence suggests that acetaldehyde, the first and genotoxic metabolite of ethanol, mediates the carcinogenicity of alcoholic beverages. Ethanol is also contained in a number of ready-to-use mouthwashes typically between 5 and 27% vol. An increased risk of oral cancer has been discussed for users of such mouthwashes; however, epidemiological evidence had remained inconclusive. This study is the first to investigate acetaldehyde levels in saliva after use of alcohol-containing mouthwashes. Ready-to-use mouthwashes and mouthrinses (n = 13) were rinsed in the mouth by healthy, nonsmoking volunteers (n = 4) as intended by the manufacturers (20 ml for 30 sec). Saliva was collected at 0.5, 2, 5 and 10 min after mouthwash use and analyzed using headspace gas chromatography. The acetaldehyde content in the saliva was 41 +/- 15 microM, range 9-85 microM (0.5 min), 52 +/- 14 microM, range 11-105 microM (2 min), 32 +/- 7 microM, range 9-67 microM (5 min) and 15 +/- 7 microM, range 0-37 microM (10 min). The contents were significantly above endogenous levels and corresponding to concentrations normally found after alcoholic beverage consumption. A twice-daily use of alcohol-containing mouthwashes leads to a systemic acetaldehyde exposure of 0.26 microg/kg bodyweight/day on average, which corresponds to a lifetime cancer risk of 3E-6. The margin of exposure was calculated to be 217,604, which would be seen as a low public health concern. However, the local acetaldehyde contents in the saliva are reaching concentrations associated with DNA adduct formation and sister chromatid exchange in vitro, so that concerns for local carcinogenic effects in the oral cavity remain.", "Is oral sex really a dangerous carcinogen? Let's take a closer look. INTRODUCTION: Questions have recently arisen in the popular press about the association between specific sexual behaviors, namely, fellatio and cunnilingus, with head and neck cancers. Although there has been an overall decline in the incidence of head and neck cancers over the past 25 years, there has been a shift in the distribution of these cancers toward a particular type known as oral squamous cell carcinomas (OSCCs), and a younger demographic. These particular cancers, OSCCs, have been shown to be associated with the human papillomavirus (HPV). Several researchers have suggested that this shift in the epidemiology of head and neck cancers might be attributable to changing sexual practices. While this speculation has caught on in the popular press, there are several interesting contradictions in the existing evidence that suggest this conclusion might be premature and overreached. AIM: The intent of this article is to help clarify the issues so that sexual medicine professionals can give accurate and up-to-date information to their patients. MAIN OUTCOME MEASURES: This is a review article; no outcome data are reported. This is a review article; no measures were collected. METHODS: Pubmed search on HPV, oral sex, oral cancers, and OSCCs. RESULTS: One hundred ninety-six articles on HPV were found; 63 articles on oral sex, 55 on oral cancer, and 5 articles on OSCCs were identified as relevant. CONCLUSIONS: HPV infections occur commonly and are usually cleared within 18 months, thus HPV infection should not be a cause for concern among monogamous couples with a rich and varied sex life as long as the sexual system remains closed and other immune compromising factors are not present. HPV becomes a concern in the context of immune system compromise and infection persistence. Factors contributing to immune system compromise, HPV persistence, and oncogenesis are reviewed. \u00a9 2012 International Society for Sexual Medicine.", "Dietary factors and oral and pharyngeal cancer risk. We reviewed data from six cohort studies and approximately 40 case-control studies on the relation between selected aspects of diet and the risk of oral and pharyngeal cancer. Fruit and vegetables were inversely related to the risk: the pooled relative risk (RR) for high vegetable consumption was 0.65 from three cohort studies on upper aerodigestive tract cancers and 0.52 from 18 case-control studies of oral and pharyngeal cancer; corresponding RRs for high fruit consumption were 0.78 and 0.55. beta-carotene, vitamin C and selected flavonoids have been inversely related to the risk, but it is difficult to disentangle their potential effect from that of fruit and vegetables. Whole grain, but not refined grain, intake was also favorably related to oral cancer risk. The results were not consistent with reference to other foods beverages, and nutrients, but it is now possible to exclude a strong relation between these foods and oral and pharyngeal cancer risk. In western countries, selected aspects of diet may account for 20-25% of oral and pharyngeal cancer, and the population attributable risk increases to 85-95% when tobacco and alcohol consumption are also considered.", "Oral sex, cancer and death: sexually transmitted cancers We briefly highlight the growing body of recent evidence linking unprotected oral sex with the development of some types of head and neck cancer in younger patients. These tumours appear to be increasing in incidence although the development of more sensitive methods of HPV detection may be a confounding factor."], ["The Alkaline Diet: Is There Evidence That an Alkaline pH Diet Benefits Health? This review looks at the role of an alkaline diet in health. Pubmed was searched looking for articles on pH, potential renal acid loads, bone health, muscle, growth hormone, back pain, vitamin D and chemotherapy. Many books written in the lay literature on the alkaline diet were also reviewed and evaluated in light of the published medical literature. There may be some value in considering an alkaline diet in reducing morbidity and mortality from chronic diseases and further studies are warranted in this area of medicine.", "Exercise and longevity. Aging is a natural and complex physiological process influenced by many factors, some of which are modifiable. As the number of older individuals continues to increase, it is important to develop interventions that can be easily implemented and contribute to \\\"successful aging\\\". In addition to a healthy diet and psychosocial well-being, the benefits of regular exercise on mortality, and the prevention and control of chronic disease affecting both life expectancy and quality of life are well established. We summarize the benefits of regular exercise on longevity, present the current knowledge regarding potential mechanisms, and outline the main recommendations. Exercise can partially reverse the effects of the aging process on physiological functions and preserve functional reserve in the elderly. Numerous studies have shown that maintaining a minimum quantity and quality of exercise decreases the risk of death, prevents the development of certain cancers, lowers the risk of osteoporosis and increases longevity. Training programs should include exercises aimed at improving cardiorespiratory fitness and muscle function, as well as flexibility and balance. Though the benefits of physical activity appear to be directly linked to the notion of training volume and intensity, further research is required in the elderly, in order to develop more precise recommendations, bearing in mind that the main aim is to foster long-term adherence to physical activity in this growing population. Copyright \u00a9 2012 Elsevier Ireland Ltd. All rights reserved.", "Creatine: are the benefits worth the risk? Creatine monohydrate is a popular sports supplement used to maintain levels of high-energy phosphates during exercise. As a supplement, varying amounts are consumed per person corresponding to parameters such as body mass and level of training (i.e. maintenance versus loading doses). Numerous studies have reported beneficial effects including increased muscle mass during training and neural protection. However, negative reports have also been made of possible side effects, such as muscle cramping during exercise, and potential impurities. The present paper introduces the positive and negative aspects of creatine supplementation and focuses on the toxicological data of creatine, its metabolites and associated mutagenicity or carcinogenicity, genomeceutical effect(s), and any potential 'contaminants.' Additionally, the novel applications of creatine to the areas of neurology, cardiology, and diabetes are presented and discussed along with the representative data for sports nutrition.", "Haff disease after eating salmon. While fish consumption is considered a component of a heart-healthy diet, many illnesses have been associated with eating contaminated fish. The authors describe two cases of muscle weakness and rhabdomyolysis that occurred after eating salmon. Cases of rhabdomyolysis and muscle weakness after consumption of fresh water fish have rarely been reported in the United States but have been frequently reported from the Baltic region. This illness is known as Haff disease. While the etiology is unknown, it is felt to be a toxin. Palytoxin, found in marine fish, has been associated with rhabdomyolysis, and may serve as a model for further study of the suspected toxin responsible for rhabdomyolysis after consumption of fresh water fish. If a case of Haff disease is suspected, contact the Centers for Disease Control and Prevention and collect any uneaten fish, which may be sent for laboratory analysis.", "A guide to exercise prescription. Exercise is a fundamental component of good health. The American College of Sports Medicine and \\\"Exercise is Medicine\\\" recommend treating exercise as a vital sign, and assessing and prescribing physical activity at every medical visit. Meeting the recommended goals of physical activity results in a significant reduction in all-cause mortality. Physicians can improve health by prescribing exercise. Copyright \u00a9 2013 Elsevier Inc. All rights reserved."], ["Irreversible subacute sclerotic combined degeneration of the spinal cord in a vegan subject. OBJECTIVE: We describe a case of irreversible subacute sclerotic combined degeneration of the spinal cord in a Western vegan subject. METHODS: A 57-y-old man, member of a vegan cult for 13 y, developed weakness, paraplegia, hyper-reflexia, distal symmetric muscular hypotrophy, impairment of superficial sensation in the hands and feet, loss of deep sensation in the lower limbs, and neurogenic bladder and bowel. Magnetic resonance imaging of the cervical and dorsal spine disclosed abnormally increased signal intensity on T(2)-weighted sections in the posterior and lateral columns. Subacute sclerotic combined degeneration of the spinal cord was diagnosed and treatment with cobalamin was started. RESULTS: Despite rehabilitative treatment, the patient developed spastic hypertonia with mild improvement of paresthesias. Six months later, vitamin B12 plasma levels and hematological analysis were normal. One year later, spastic paraplegia was still present and the patient was unable to walk despite improvement on magnetic resonance imaging. CONCLUSION: Irreversible subacute sclerotic combined degeneration of the spinal cord is a rare but possible effect of a strict vegetarian diet.", "Lumbar disc degeneration: correlation with age, sex, and spine level in 600 autopsy specimens. Using data from 16 published reports, the authors correlated macroscopic disc degeneration grades with age, sex, and spine level in 600 lumbar intervertebral discs from 273 cadavers (ages: 0-96 years). Male discs were more degenerated than female discs at most ages; significantly so in the second, fifth, sixth, and seventh decades. On average, L4-L5 and L3-L4 level discs showed more degeneration than discs at other lumbar levels. These macroscopic findings corroborate radiographic data from epidemiologic studies. The calculations suggest that higher mechanical stress, perhaps combined with longer nutritional pathways, may be responsible for the earlier degeneration of male discs.", "MR aortography and serum cholesterol levels in patients with long-term nonspecific lower back pain. STUDY DESIGN: A cross-sectional analysis of the feeding arteries of the lumbar spine and cholesterol levels on patients with long-term nonspecific lower back pain. OBJECTIVES: To evaluate whether occlusion of lumbar and middle sacral arteries or serum cholesterol levels are associated with lower back pain and/or with disc degeneration. SUMMARY OF BACKGROUND DATA: Atherosclerosis in the wall of the abdominal aorta usually develops at the ostia of branching arteries and the bifurcation, and may obliterate orifices of lumbar and middle sacral arteries. Obstruction of these arteries causes ischemia in the lumbar spine and may result in back symptoms and disc degeneration. METHODS: MR aortography and cholesterol blood tests were performed on 51 patients with long-term lower back pain without specific findings (i.e., spinal or nerve root compression) in regular lumbar MR images. The patients ranged from 35 to 70 years of age (mean age, 56 years). Serum cholesterol and low-density lipoprotein (LDL) cholesterol levels were measured. To assess symptoms and disability NASS low back Outcome Instrument was used. RESULTS: Twenty-nine (78%) of 37 men and 11 (77%) of 14 women showed occluded lumbar and/or middle sacral arteries. The prevalence of occluded arteries was 2.5 times more than in subjects of corresponding age group in a Finnish necropsy material. Twenty-three (62%) men and seven (50%) women had significant disc degeneration. Disc degeneration was associated with occluded lumbar/middle sacral arteries (P = 0.035). Patients with occluded arteries or significant disc degeneration did not complain more severe symptoms than those without, whereas patients with above normal serum LDL cholesterol scored higher in neurogenic symptoms (P = 0.031) and complained more often severe pain (P = 0.049) than those with normal LDL cholesterol. CONCLUSIONS: The study indicates that lumbar and middle sacral arteries are often occluded in patients with nonspecific long-term lower back pain. Occlusion of these arteries may also be associated with disc degeneration.", "Degeneration of the intervertebral disc The intervertebral disc is a cartilaginous structure that resembles articular cartilage in its biochemistry, but morphologically it is clearly different. It shows degenerative and ageing changes earlier than does any other connective tissue in the body. It is believed to be important clinically because there is an association of disc degeneration with back pain. Current treatments are predominantly conservative or, less commonly, surgical; in many cases there is no clear diagnosis and therapy is considered inadequate. New developments, such as genetic and biological approaches, may allow better diagnosis and treatments in the future.", "Cretinism revisited. Endemic cretinism includes two syndromes: a more common neurological disorder with brain damage, deaf mutism, squint and spastic paresis of the legs and a less common syndrome of severe hypothyroidism, growth retardation and less severe mental defect. Both conditions are due to dietary iodine deficiency and can be prevented by correction of iodine deficiency before pregnancy. Endemic cretinism is now included in the spectrum of the effects of iodine deficiency in a population termed the 'iodine deficiency disorders (IDDs)', which also includes a wide range of lesser degrees of cognitive defect that can be prevented by the correction of iodine deficiency. Iodine deficiency is now recognised by the World Health Organization (WHO) as the most common preventable cause of brain damage with in excess of 2 billion at risk from 130 countries. A global United Nations (UN) programme of prevention has achieved 68% household usage of iodised salt by the year 2000 compared with less than 20% prior to 1990. Copyright 2009 Elsevier Ltd. All rights reserved."], ["Wet deposition of fission-product isotopes to North America from the Fukushima Dai-ichi incident, March 2011. Using the infrastructure of the National Atmospheric Deposition Program (NADP), numerous measurements of radionuclide wet deposition over North America were made for 167 NADP sites before and after the Fukushima Dai-ichi Nuclear Power Station incident of March 12, 2011. For the period from March 8 through April 5, 2011, wet-only precipitation samples were collected by NADP and analyzed for fission-product isotopes within whole-water and filterable solid samples by the United States Geological Survey using gamma spectrometry. Variable amounts of (131)I, (134)Cs, or (137)Cs were measured at approximately 21% of sampled NADP sites distributed widely across the contiguous United States and Alaska. Calculated 1- to 2-week individual radionuclide deposition fluxes ranged from 0.47 to 5100 Becquerels per square meter during the sampling period. Wet deposition activity was small compared to measured activity already present in U.S. soil. NADP networks responded to this complex disaster, and provided scientifically valid measurements that are comparable and complementary to other networks in North America and Europe.", "Nanomaterials in consumer products: a challenging analytical problem. Many products used in everyday life are made with the assistance of nanotechnologies. Cosmetic, pharmaceuticals, sunscreen, powdered food are only few examples of end products containing nano-sized particles (NPs), generally added to improve the product quality. To evaluate correctly benefits vs. risks of engineered nanomaterials and consequently to legislate in favor of consumer's protection, it is necessary to know the hazards connected with the exposure levels. This information implies transversal studies and a number of different competences. On analytical point of view the identification, quantification and characterization of NPs in food matrices and in cosmetic or personal care products pose significant challenges, because NPs are usually present at low concentration levels and the matrices, in which they are dispersed, are complexes and often incompatible with analytical instruments that would be required for their detection and characterization. This paper focused on some analytical techniques suitable for the detection, characterization and quantification of NPs in food and cosmetics products, reports their recent application in characterizing specific metal and metal-oxide NPs in these two important industrial and market sectors. The need of a characterization of the NPs as much as possible complete, matching complementary information about different metrics, possible achieved through validate procedures, is what clearly emerges from this research. More work should be done to produce standardized materials and to set-up methodologies to determine number-based size distributions and to get quantitative date about the NPs in such a complex matrices.", "Does Flavanol Intake Influence Mortality from Nitric Oxide-Dependent Processes? Ischemic Heart Disease, Stroke, Diabetes Mellitus, and Cancer in Panama Substantial data suggest that flavonoid-rich food could help prevent cardiovascular disease and cancer. Cocoa is the richest source of flavonoids, but current processing reduces the content substantially. The Kuna living in the San Blas drink a flavanol-rich cocoa as their main beverage, contributing more than 900 mg/day and thus probably have the most flavonoid-rich diet of any population. We used diagnosis on death certificates to compare cause-specific death rates from year 2000 to 2004 in mainland and the San Blas islands where only Kuna live. Our hypothesis was that if the high flavanoid intake and consequent nitric oxide system activation were important the result would be a reduction in the frequency of ischemic heart disease, stroke, diabetes mellitus, and cancer \u2013 all nitric oxide sensitive processes. There were 77,375 deaths in mainland Panama and 558 deaths in the San Blas. In mainland Panama, as anticipated, cardiovascular disease was the leading cause of death (83.4 \u00b1 0.70 age adjusted deaths/100,000) and cancer was second (68.4 \u00b1 1.6). In contrast, the rate of CVD and cancer among island-dwelling Kuna was much lower (9.2 \u00b1 3.1) and (4.4 \u00b1 4.4) respectively. Similarly deaths due to diabetes mellitus were much more common in the mainland (24.1 \u00b1 0.74) than in the San Blas (6.6 \u00b1 1.94). This comparatively lower risk among Kuna in the San Blas from the most common causes of morbidity and mortality in much of the world, possibly reflects a very high flavanol intake and sustained nitric oxide synthesis activation. However, there are many risk factors and an observational study cannot provide definitive evidence.", "Inorganic arsenic in rice bran and its products are an order of magnitude higher than in bulk grain. Rice is more elevated in arsenic than all other grain crops tested to date, with whole grain (brown) rice having higher arsenic levels than polished (white). It is reported here that rice bran, both commercially purchased and specifically milled for this study, have levels of inorganic arsenic, a nonthreshold, class 1 carcinogen, reaching concentrations of approximately 1 mg/kg dry weight, around 10-20 fold higher than concentrations found in bulk grain. Although pure rice bran is used as a health food supplement, perhaps of more concern is rice bran solubles, which are marketed as a superfood and as a supplement to malnourished children in international aid programs. Five rice bran solubles products were tested, sourced from the United States and Japan, and were found to have 0.61-1.9 mg/kg inorganic arsenic. Manufactures recommend approximately 20 g servings of the rice bran solubles per day, which equates to a 0.012-0.038 mg intake of inorganic arsenic. There are no maximum concentration levels (MCLs) set for arsenic or its species in food stuffs. EU and U.S. water regulations, set at 0.01 mg/L total or inorganic arsenic, respectively, are based on the assumption that 1 L of water per day is consumed, i.e., 0.01 mg of arsenic/ day. At the manufacturers recommended rice bran solubles consumption rate, inorganic arsenic intake exceeds 0.01 mg/ day, remembering that rice bran solubles are targeted at malnourished children and that actual risk is based on mg kg(-1) day(-1) intake.", "Marine edible algae as disease preventers. As modern lifestyles and new feeding habits settle in the world, noncommunicable diseases (NCDs) have evolved to be major causes of disability in developing as well as developed countries. As a concomitant effect, there is a growing interest in natural, healthy food and an increasing awareness of risk factors and determinants of disease. This chapter describes some nutritional facts about seaweeds, which have been used as food since ancient times in China, Japan, Egypt, and India and comments on the potential utilization of marine algae as functional foods. This concept and the description of metabolic syndrome are used as a basis to comprehension of seaweeds against two dreadful illnesses of our times: high blood pressure and cancer. Copyright \u00a9 2011 Elsevier Inc. All rights reserved."], ["Traditional non-Western diets. In traditional cultures, balancing health with a balanced lifestyle was a core belief. The diseases of modern civilization were rare. Indigenous people have patterns of illness very different from Western civilization; yet, they rapidly develop diseases once exposed to Western foods and lifestyles. Food and medicine were interwoven. All cultures used special or functional foods to prevent disease. Food could be used at different times either as food or medicine. Foods, cultivation, and cooking methods maximized community health and well-being. With methods passed down through generations, cooking processes were utilized that enhanced mineral and nutrient bioavailability. This article focuses on what researchers observed about the food traditions of indigenous people, their disease patterns, the use of specific foods, and the environmental factors that affect people who still eat traditional foods.", "The Yanomami Indians in the INTERSALT Study. OBJECTIVE: To study the distribution and interrelationship among constitutional and biochemical variables with blood pressure (BP) in an population of Yanomami indians. To compare these findings with those of other populations. METHODS: The Yanomami indians were part of the INTERSALT, a study comprising 10,079 males and females, aged from 20 to 59 years, belonging to 52 populations in 32 countries in Africa, the Americas, Asia, and Europe. Each of the 52 centers was required to accrue 200 individuals, 25 participants in each age group. The variables analyzed were as follows: age, sex, arterial BP, urinary sodium and potassium excretion (24-hour urine), body mass index, and alcohol ingestion. RESULTS: The findings in the Yanomami population were as follows: a very low urinary sodium excretion (0.9 mmol/24 h); mean systolic and diastolic BP levels of 95.4 mmHg and 61.4 mmHg, respectively; no cases of hypertension or obesity; and they have no knowledge of alcoholic beverages. Their BP levels do not elevate with age. The urinary sodium excretion relates positively and the urinary potassium excretion relates negatively to systolic BP. This correlation was maintained even when controlled for age and body mass index. CONCLUSION: A positive relation between salt intake and blood pressure was detected in the analysis of a set of diverse populations participating in the INTERSALT Study, including populations such as the Yanomami Indians. The qualitative observation of their lifestyle provided additional information.", "Blood pressure, sodium intake, and sodium related hormones in the Yanomamo Indians, a \\\"no-salt\\\" culture. The Yanomamo Indians are an unacculturated tribe inhabiting the tropical equatorial rain forest of northern Brazil and southern Venezuela who do not use salt in their diet. The group therefore presented an unusual opportunity to study the hormonal regulation of sodium metabolism in a culture with life-long extreme restriction of dietary sodium, with parallel observations on blood pressure. Blood pressures increased from the first to second decade but, in constrast to civilized populations, do not systematically increase during subsequent years of life. In twenty-four hour urine collections on adult male Indians, excretion of sodium averaged only 1 plus or minus 1.5 (SD) mEq. Simultaneous plasma renin activities were elevated and comparable to those of civilized subjects placed for brief periods on 10 mEq sodium diets. Similarly, excretion rates of aldosterone equaled those of acculturated subjects on low sodium diets. The findings suggest that the hormonal adjustments to life-long low sodium intakes are similar to those achieved in acute sodium restriction of civilized man. Parenthetically, these elevated levels of aldosterone and renin were probably the norm for man during much of human evolution and suggest that the values observed in civilized controls are depressed by an excessive salt intake in contemporary diets.", "Acne vulgaris: a disease of Western civilization. BACKGROUND: In westernized societies, acne vulgaris is a nearly universal skin disease afflicting 79% to 95% of the adolescent population. In men and women older than 25 years, 40% to 54% have some degree of facial acne, and clinical facial acne persists into middle age in 12% of women and 3% of men. Epidemiological evidence suggests that acne incidence rates are considerably lower in nonwesternized societies. Herein we report the prevalence of acne in 2 nonwesternized populations: the Kitavan Islanders of Papua New Guinea and the Ach\u00e9 hunter-gatherers of Paraguay. Additionally, we analyze how elements in nonwesternized environments may influence the development of acne. OBSERVATIONS: Of 1200 Kitavan subjects examined (including 300 aged 15-25 years), no case of acne (grade 1 with multiple comedones or grades 2-4) was observed. Of 115 Ach\u00e9 subjects examined (including 15 aged 15-25 years) over 843 days, no case of active acne (grades 1-4) was observed. CONCLUSIONS: The astonishing difference in acne incidence rates between nonwesternized and fully modernized societies cannot be solely attributed to genetic differences among populations but likely results from differing environmental factors. Identification of these factors may be useful in the treatment of acne in Western populations.", "Physical activity energy expenditure has not declined since the 1980s and matches energy expenditures of wild mammals. OBJECTIVE: Obesity results from protracted energy imbalance. Whether this comprises excessive energy intake, lowered physical activity or both, remains disputed. DESIGN: Physical activity energy expenditure, evaluated in three different ways from daily energy expenditure (DEE) measured using doubly labelled water, was examined for trends over time. Data included subjects in Europe (Maastricht, the Netherlands) and North America extending back to the 1980s. These data were compared with measures from the third world, and measures made on wild terrestrial mammals. RESULTS: Physical activity expenditure in Europe (residual of the regression of DEE on basal energy expenditure (BEE)) has slightly but significantly increased since the 1980s. There was no trend over time in physical activity level (PAL=DEE/BEE), or in the residual variance in DEE once mass, sex and age were accounted for. This latter index of physical activity expenditure also significantly increased over time in North America. DEE of individuals in Europe and North America was not significantly different from individuals measured in the third world. In wild terrestrial mammals, DEE mostly depended on body mass and ambient temperature. Predicted DEE for a 78 kg mammal living at 20 degrees C was 9.2 MJ per day (95% CI: 7.9-12.9 MJ per day), not significantly different from the measured DEE of modern humans (around 10.2-12.6 MJ per day). CONCLUSION: As physical activity expenditure has not declined over the same period that obesity rates have increased dramatically, and daily energy expenditure of modern man is in line with energy expenditure in wild mammals, it is unlikely that decreased expenditure has fuelled the obesity epidemic."], ["Neurocysticercosis: the enigmatic disease. Neurocysticercosis (NCC) is an infection of the central nervous system (CNS) caused by the metacestode larval form of the parasite Taenia sp. Many factors can contribute to the endemic nature of cysticercosis. The inflammatory process that occurs in the tissue surrounding the parasite and/or distal from it can result from several associated mechanisms and may be disproportionate with the number of cysts. This discrepancy may lead to difficulty with the proper diagnosis in people from low endemic regions or regions that lack laboratory resources. In the CNS, the cysticerci have two basic forms, isolated cysts (Cysticercus cellulosae=CC) and racemose cysts (Cysticercus racemosus=CR), and may be meningeal, parenchymal, or ventricular or have a mixed location. The clinical manifestations are based on two fundamental syndromes that may occur in isolation or be associated: epilepsy and intracranial hypertension. They may be asymptomatic, symptomatic or fatal; have an acute, sub-acute or chronic picture; or may be in remission or exacerbated. The cerebrospinal fluid (CSF) may be normal, even in patients with viable cysticerci, until the patients begin to exhibit the classical syndrome of NCC in the CSF, or show changes in one or more routine analysed parameters. Computed tomography (CT) and magnetic resonance imaging (MRI) have allowed non-invasive diagnoses, but can lead to false negatives. Treatment is a highly controversial issue and is characterised by individualised therapy sessions. Two drugs are commonly used, praziquantel (PZQ) and albendazole (ABZ). The choice of anti-inflammatory drugs includes steroids and dextrochlorpheniramine (DCP). Hydrocephalus is a common secondary effect of NCC. Surgical cases of hydrocephalus must be submitted to ventricle-peritoneal shunt (VPS) immediately before cysticidal treatment, and surgical extirpation of the cyst may lead to an absence of the surrounding inflammatory process. The progression of NCC may be simple or complicated, have remission with or without treatment and may exhibit symptoms that can disappear for long periods of time or persist until death. Unknown, neglected and controversial aspects of NCC, such as the impaired fourth ventricle syndrome, the presence of chronic brain oedema and psychic complaints, in addition to the lack of detectable glucose in the CSF and re-infection are discussed.", "Clinical manifestations, diagnosis, and treatment of neurocysticercosis. Neurocysticercosis (NCC) is the most frequent parasitic disease of the human brain. Modern imaging studies, CT and MRI, have defined the diagnosis and characterization of the disease. Through these studies the therapeutic approach for each case may be individualized with the aid of antihelmintics, steroids, symptomatic medicines, or surgery. The use of one or various therapeutic measures largely depends on the peculiar combination of number, location, and biological stage of lesions as well as the degree of inflammatory response to the parasites. Although there is not a typical clinical picture of NCC, epilepsy is the most frequent manifestation of parenchymal NCC, whereas hydrocephalus is the most frequent manifestation of meningeal NCC. Eradication of cysticercosis is an attainable goal by public education and sanitary improvement in endemic areas.", "Neurocysticercosis in pregnancy: not just another headache. Infection with pork tapeworm, or Taenia solium, affects approximately 50 million people worldwide. The most important and potentially devastating form of the infestation, neurocysticercosis, occurs when the parasite invades the central nervous system. There has been a significant increase in the number of cases in the United States due to immigration from endemic areas. This case study of a pregnant woman in the 35th week of gestation exemplifies the serious consequences of this infection in pregnancy, and discusses an evidence-based approach to the diagnosis, treatment and eradication of this preventable disease. \u00a9 2012 AWHONN.", "Cognitive impairment and dementia in neurocysticercosis: a cross-sectional controlled study. OBJECTIVES: Neurocysticercosis (NCYST) is the most frequent CNS parasitic disease worldwide, affecting more than 50 million people. However, some of its clinical findings, such as cognitive impairment and dementia, remain poorly characterized, with no controlled studies conducted so far. We investigated the frequency and the clinical profile of cognitive impairment and dementia in a sample of patients with NCYST in comparison with cognitively healthy controls (HC) and patients with cryptogenic epilepsy (CE). METHODS: Forty treatment-naive patients with NCYST, aged 39.25 +/- 10.50 years and fulfilling absolute criteria for definitive active NCYST on MRI, were submitted to a comprehensive cognitive and functional evaluation and were compared with 49 HC and 28 patients with CE of similar age, educational level, and seizure frequency. RESULTS: Patients with NCYST displayed significant impairment in executive functions, verbal and nonverbal memory, constructive praxis, and verbal fluency when compared with HC (p < 0.05). Dementia was diagnosed in 12.5% patients with NCYST according to DSM-IV criteria. When compared with patients with CE, patients with NCYST presented altered working and episodic verbal memory, executive functions, naming, verbal fluency, constructive praxis, and visual-spatial orientation. No correlation emerged between cognitive scores and number, localization, or type of NCYST lesions on MRI. CONCLUSIONS: Cognitive impairment was ubiquitous in this sample of patients with active neurocysticercosis (NCYST). Antiepileptic drug use and seizure frequency could not account for these features. Dementia was present in a significant proportion of patients. These data broaden our knowledge on the clinical presentations of NCYST and its impact in world public health.", "The Impact of Neurocysticercosis in California: A Review of Hospitalized Cases To assess the burden of neurocysticercosis (NCC) in California we examined statewide hospital discharge data for 2009. There were 304 cases hospitalized with NCC identified (incidence\u200a=\u200a0.8 per 100,000). Cases were mostly Latino (84.9%), slightly more likely to be male than female (men 57.6%, women 42.4%) with an average age of 43.5 years. A majority of cases were hospitalized in Southern California (72.1%) and many were hospitalized in Los Angeles County (44.7%). Men were more likely than women to have severe disease including hydrocephalus (29.7% vs. 18.6%, p\u200a=\u200a0.027), resulting in longer hospitalizations (>4 days, 48.0% vs. 32.6%, p\u200a=\u200a0.007) that were more costly (charge>$40 thousand men\u200a=\u200a46.9% vs. woman\u200a=\u200a4.1%, p\u200a=\u200a0.026). Six deaths were recorded (2.0%). The total of NCC-related hospital charges exceeded $17 million; estimated hospital costs exceeded $5 million. Neurocysticercosis causes appreciable disease and exacts a considerable economic burden in California. Author Summary Neurocysticercosis (NCC) is considered one of the major neglected infections of poverty in the United States, with mortality studies indicating that California bears the highest burden of this disease. Although NCC is a reportable disease in California, studies indicate that this disease goes largely under-reported, contributing to the lack of information about the disease distribution and burden. In this manuscript, we reviewed the distribution of NCC hospitalizations in California, demographics of those hospitalized and total hospital-related charges for 2009. This study revealed that a majority of persons hospitalized with NCC in California receive their medical service in Southern California hospitals, primarily in the County of Los Angeles. As compared to women hospitalized for this disease, men had a longer and more costly hospitalization with more severe symptoms such as hydrocephalus, a diagnosis suggestive of extraparenchymal infection. The reasons for this difference in NCC severity by gender are not clear, but do not appear to be due to delay in seeking medical care or a language barrier. The intensity of hospital care needed to manage these cases and the sizable NCC hospitalization charge underscores the considerable economic burden this disease presents in California."], ["Healthy lifestyle behaviors and all-cause mortality among adults in the United States. OBJECTIVE: To examine the links between three fundamental healthy lifestyle behaviors (not smoking, healthy diet, and adequate physical activity) and all-cause mortality in a national sample of adults in the United States. METHOD: We used data from 8375 U.S. participants aged \u2265 20 years of the National Health and Nutrition Examination Survey 1999-2002 who were followed through 2006. RESULTS: During a mean follow-up of 5.7 years, 745 deaths occurred. Compared with their counterparts, the risk for all-cause mortality was reduced by 56% (95% confidence interval [CI]: 35%-70%) among adults who were nonsmokers, 47% (95% CI: 36%, 57%) among adults who were physically active, and 26% (95% CI: 4%, 42%) among adults who consumed a healthy diet. Compared with participants who had no healthy behaviors, the risk decreased progressively as the number of healthy behaviors increased. Adjusted hazard ratios and 95% confidence interval were 0.60 (0.38, 0.95), 0.45 (0.30, 0.67), and 0.18 (0.11, 0.29) for 1, 2, and 3 healthy behaviors, respectively. CONCLUSION: Adults who do not smoke, consume a healthy diet, and engage in sufficient physical activity can substantially reduce their risk for early death. Published by Elsevier Inc.", "Surveillance for morbidity and mortality among older adults--United States, 1995-1996. PROBLEM/CONDITION: During the twenty first century, growth in the number of older adults (persons aged > or =65 years) in the United States will produce an unprecedented increase in the number of persons at risk for costly age-associated chronic diseases and other health conditions and injuries. REPORTING PERIOD: 1995-1996. DESCRIPTION OF SYSTEMS: This report uses data from CDC's National Center for Health Statistics (NCHS) to report on leading causes of death in 1996 (from the National Vital Statistics System), major causes of hospitalization (1996 National Hospital Discharge Survey [NHDSI), and major chronic conditions (1995 National Health Interview Survey [NHIS]). The National Vital Statistics System compiles information regarding all death certificates filed in the United States. NHDS is an annual probability sample of discharges from nonfederal, short-stay hospitals. NHIS is an ongoing annual cross-sectional household survey of the U.S. civilian, noninstitutionalized population. In addition, health-care expenditures for older adults are examined by using information obtained from published reports from the U.S. Health Care Financing Administration (HCFA) and health-services literature. RESULTS: The leading causes of death among adults aged > or =65 years were heart disease (1,808 deaths/100,000 population), malignant neoplasms (1,131/100,000), and cerebrovascular disease (415/100,000). Several leading causes of mortality among older adults differed by race, with deaths caused by Alzheimer's disease more frequent among whites and deaths caused by diabetes, kidney diseases, septicemia, and hypertension more frequent among blacks. Rates of hospitalization and length of hospital stays increased with age. Hospitalizations for heart disease represented the highest proportion of all discharges among older adults (23%). Discharge rates for malignant neoplasms, stroke, and pneumonia were similar for adults aged > or =65 years and, as with heart disease, were higher for men than for women. However, the rate of hospitalization for fractures among women exceeded the rate among men. Arthritis was the most prevalent chronic condition among adults aged > or =65 years (48.9/100 adults), followed by hypertension (40.3/100) and heart disease (28.6/100). In 1995, adults aged > or =65 years comprised 13% of the population but accounted for 35% of total personal health care dollars spent ($310 billion), and real per capita personal health-care expenditure for this age group increased at an average annual rate of 5.8% during 1985-1995. Projections for future medical expenditures for older adults vary; however, all project substantial increases after the year 2000. Hip fracture, dementia, and urinary incontinence are discussed as examples of prevalent and costly health conditions among older adults that differ in potential for prevention. These conditions were selected because they result in substantial medical and social costs and they differ in potential for prevention. INTERPRETATION: The higher prevalence of serious and costly health conditions among adults aged > or =65 years highlights the importance of implementing preventive health measures in this population. PUBLIC HEALTH ACTIONS: Data regarding causes of morbidity, mortality, and health-care expenditures among older adults provide information for measuring the effectiveness of public health efforts to reduce modifiable risk factors for morbidity and mortality in this population.", "Prevalence of Alzheimer's disease and other dementias in rural India: the Indo-US study. OBJECTIVE: To determine the prevalence of AD and other dementias in a rural elderly Hindi-speaking population in Ballabgarh in northern India. DESIGN: The authors performed a community survey of a cohort of 5,126 individuals aged 55 years and older, 73.3% of whom were illiterate. Hindi cognitive and functional screening instruments, developed for and validated in this population, were used to screen the cohort. A total of 536 subjects (10.5%) who met operational criteria for cognitive and functional impairment and a random sample of 270 unimpaired control subjects (5.3%) underwent standardized clinical assessment for dementia using the Diagnostic and Statistical Manual of Mental Disorders-fourth edition diagnostic criteria, the Clinical Dementia Rating Scale (CDR), and National Institute of Neurological and Communicative Disorders and Stroke-Alzheimer's Disease and Related Disorders Association (NINCDS-ADRDA) criteria for probable and possible AD. RESULTS: We found an overall prevalence rate of 0.84% (95% CI, 0.61 to 1.13) for all dementias with a CDR score of at least 0.5 in the population aged 55 years and older, and an overall prevalence rate of 1.36% (95% CI, 0.96 to 1.88) in the population aged 65 years and older. The overall prevalence rate for AD was 0.62% (95% CI, 0.43 to 0.88) in the population aged 55+ and 1.07% (95% CI, 0.72 to 1.53) in the population aged 65+. Greater age was associated significantly with higher prevalence of both AD and all dementias, but neither gender nor literacy was associated with prevalence. CONCLUSIONS: In this population, the prevalence of AD and other dementias was low, increased with age, and was not associated with gender or literacy. Possible explanations include low overall life expectancy, short survival with the disease, and low age-specific incidence potentially due to differences in the underlying distribution of risk and protective factors compared with populations with higher prevalence.", "Incidence of Alzheimer's disease in a rural community in India: the Indo-US study. OBJECTIVE: To determine overall and age-specific incidence rates of AD in a rural, population-based cohort in Ballabgarh, India, and to compare them with those of a reference US population in the Monongahela Valley of Pennsylvania. METHODS: A 2-year, prospective, epidemiologic study of subjects aged > or =55 years utilizing repeated cognitive and functional ability screening, followed by standardized clinical evaluation using the Diagnostic and Statistical Manual of Mental Disorders, 4th edition, and the National Institute of Neurological and Communicative Disorders and Stroke-Alzheimer's Disease and Related Disorders Association criteria for the diagnosis, and the Clinical Dementia Rating scale for the staging, of dementia and AD. RESULTS: Incidence rates per 1000 person-years for AD with CDR > or =0.5 were 3.24 (95% CI: 1.48-6.14) for those aged > or =65 years and 1.74 (95% CI: 0.84-3.20) for those aged > or =55 years. Standardized against the age distribution of the 1990 US Census, the overall incidence rate in those aged > or =65 years was 4.7 per 1000 person-years, substantially lower than the corresponding rate of 17.5 per 1000 person-years in the Monongahela Valley. CONCLUSION: These are the first AD incidence rates to be reported from the Indian subcontinent, and they appear to be among the lowest ever reported. However, the relatively short duration of follow-up, cultural factors, and other potential confounders suggest caution in interpreting this finding.", "Increased telomerase activity and comprehensive lifestyle changes: a pilot study. BACKGROUND: Telomeres are protective DNA-protein complexes at the end of linear chromosomes that promote chromosomal stability. Telomere shortness in human beings is emerging as a prognostic marker of disease risk, progression, and premature mortality in many types of cancer, including breast, prostate, colorectal, bladder, head and neck, lung, and renal cell. Telomere shortening is counteracted by the cellular enzyme telomerase. Lifestyle factors known to promote cancer and cardiovascular disease might also adversely affect telomerase function. However, previous studies have not addressed whether improvements in nutrition and lifestyle are associated with increases in telomerase activity. We aimed to assess whether 3 months of intensive lifestyle changes increased telomerase activity in peripheral blood mononuclear cells (PBMC). METHODS: 30 men with biopsy-diagnosed low-risk prostate cancer were asked to make comprehensive lifestyle changes. The primary endpoint was telomerase enzymatic activity per viable cell, measured at baseline and after 3 months. 24 patients had sufficient PBMCs needed for longitudinal analysis. This study is registered on the ClinicalTrials.gov website, number NCT00739791. FINDINGS: PBMC telomerase activity expressed as natural logarithms increased from 2.00 (SD 0.44) to 2.22 (SD 0.49; p=0.031). Raw values of telomerase increased from 8.05 (SD 3.50) standard arbitrary units to 10.38 (SD 6.01) standard arbitrary units. The increases in telomerase activity were significantly associated with decreases in low-density lipoprotein (LDL) cholesterol (r=-0.36, p=0.041) and decreases in psychological distress (r=-0.35, p=0.047). INTERPRETATION: Comprehensive lifestyle changes significantly increase telomerase activity and consequently telomere maintenance capacity in human immune-system cells. Given this finding and the pilot nature of this study, we report these increases in telomerase activity as a significant association rather than inferring causation. Larger randomised controlled trials are warranted to confirm the findings of this study."], ["Epidemiology of Foodborne Norovirus Outbreaks, United States, 2001\u20132008 Noroviruses are the leading cause of foodborne illness in the United States. To better guide interventions, we analyzed 2,922 foodborne disease outbreaks for which norovirus was the suspected or confirmed cause, which had been reported to the Foodborne Disease Outbreak Surveillance System of the Centers for Disease Control and Prevention during 2001\u20132008. On average, 365 foodborne norovirus outbreaks were reported annually, resulting in an estimated 10,324 illnesses, 1,247 health care provider visits, 156 hospitalizations, and 1 death. In 364 outbreaks attributed to a single commodity, leafy vegetables (33%), fruits/nuts (16%), and mollusks (13%) were implicated most commonly. Infected food handlers were the source of 53% of outbreaks and may have contributed to 82% of outbreaks. Most foods were likely contaminated during preparation and service, except for mollusks, and occasionally, produce was contaminated during production and processing. Interventions to reduce the frequency of foodborne norovirus outbreaks should focus on food workers and production of produce and shellfish.", "Editorial: From the acute infection to the chronic disorder \\\"Don't worry it's just a viral gastroenteritis\\\". Postinfectious functional gastrointestinal disorders (PI-FGID) have become a category in the general FGID classification. Bacterial PI-FGID has been well documented in several studies and meta-analysis. Increased risk does not appear to be confined to bacterial gastroenteritis (GE), also protozoan and helminth infections are sometimes followed by PI-FGID. In this issue of the journal, Zanini et al. provides evidence that Norovirus GE also leads to the development of PI-irritable bowel syndrome in a substantial proportion of patients.", "Ranking the disease burden of 14 pathogens in food sources in the United States using attribution data from outbreak investigations and expert elic... Understanding the relative public health impact of major microbiological hazards across the food supply is critical for a risk-based national food safety system. This study was conducted to estimate the U.S. health burden of 14 major pathogens in 12 broad categories of food and to then rank the resulting 168 pathogen-food combinations. These pathogens examined were Campylobacter, Clostridium perfringens, Escherichia coli O157:H7, Listeria monocytogenes, norovirus, Salmonella enterica, Toxoplasma gondii, and all other FoodNet pathogens. The health burden associated with each pathogen was measured using new estimates of the cost of illness and loss of quality-adjusted life years (QALYs) from acute and chronic illness and mortality. A new method for attributing illness to foods was developed that relies on both outbreak data and expert elicitation. This method assumes that empirical data are generally preferable to expert judgment; thus, outbreak data were used for attribution except where evidence suggests that these data are considered not representative of food attribution. Based on evaluation of outbreak data, expert elicitation, and published scientific literature, outbreak-based attribution estimates for Campylobacter, Toxoplasma, Cryptosporidium, and Yersinia were determined not representative; therefore, expert-based attribution were included for these four pathogens. Sensitivity analyses were conducted to assess the effect of attribution data assumptions on rankings. Disease burden was concentrated among a relatively small number of pathogen-food combinations. The top 10 pairs were responsible for losses of over $8 billion and 36,000 QALYs, or more than 50 % of the total across all pairs. Across all 14 pathogens, poultry, pork, produce, and complex foods were responsible for nearly 60 % of the total cost of illness and loss of QALYs.", "From Barnyard to Food Table: the Omnipresence of Hepatitis E virus and Risk for Zoonotic Infection and Food Safety Hepatitis E virus (HEV) is an important but extremely understudied pathogen. The mechanisms of HEV replication and pathogenesis are poorly understood, and a vaccine against HEV is not yet available. HEV is classified in the family Hepeviridae consisting of at least four recognized major genotypes. Genotypes 1 and 2 HEV are restricted to humans and associated with epidemics in developing countries, whereas genotypes 3 and 4 HEV are zoonotic and responsible for sporadic cases worldwide. The identification and characterization of a number of animal strains of HEV from pigs, chickens, rabbits, rats, mongoose, deer, and possibly cattle and sheep have significantly broadened the host range and diversity of HEV. The demonstrated ability of cross-species infection by some animal strains of HEV raises public health concerns for zoonotic HEV infection. Pigs are a recognized reservoir for HEV, and pig handlers are at increased risk of zoonotic HEV infection. Sporadic cases of hepatitis E have been definitively linked to the consumption of raw or undercooked animal meats such as pig livers, sausages, and deer meats. In addition, since large amounts of viruses excreted in feces, animal manure land application and runoffs can contaminate irrigation and drinking water with concomitant contamination of produce or shellfish. HEV RNA of swine origin has been detected in swine manure, sewage water and oysters, and consumption of contaminated shellfish has also been implicated in sporadic cases of hepatitis E. Therefore, the animal strains of HEV pose not only a zoonotic risk but also food and environmental safety concerns.", "Hepatitis induced by Noni juice from Morinda citrifolia: a rare cause of hepatotoxicity or the tip of the iceberg? A 24-year-old female patient presented to her community hospital with mild elevations of serum transaminase and bilirubin levels. Because of multiple sclerosis, she was treated with interferon beta-1a for 6 weeks. After exclusion of viral hepatitis due to hepatitis A-E, interferon beta-1a was withdrawn under the suspicion of drug-induced hepatitis. One week later, she was admitted again to her community hospital with severe icterus. The transaminase and bilirubin levels were highly elevated, and a beginning impairment of the liver synthesis was expressed by a reduced prothrombin time. The confinement to our department occurred with a fulminant hepatitis and the suspicion of beginning acute liver failure. There was no evidence for hepatitis due to potentially hepatotoxic viruses, alcoholic hepatitis, Budd-Chiari syndrome, hemochromatosis, and Wilson's disease. In her serum there were high titers of liver-kidney microsomal type 1 autoantibody; the serum gamma globulin levels were in the normal range. Fine-needle aspiration biopsy of the liver ruled out an autoimmune hepatitis but showed signs of drug-induced toxicity. During the interview, she admitted that for 'general immune system stimulation' she had been drinking Noni juice, a Polynesian herbal remedy made from a tropical fruit (Morinda citrifolia), during the past 4 weeks. After cessation of the Noni juice ingestion, her transaminase levels normalized quickly and were in the normal range within 1 month. Copyright 2006 S. Karger AG, Basel."], ["Nuts and healthy body weight maintenance mechanisms. Nuts are rich sources of multiple nutrients and phytochemicals associated with health benefits, including reduced cardiovascular disease risk. This has prompted recommendations to increase their consumption. However, they are also high in fat and are energy dense. The associations between these properties, positive energy balance and body weight raise questions about such recommendations. Numerous epidemiological and clinical studies show that nuts are not associated with weight gain. Mechanistic studies indicate this is largely attributable to the high satiety and low metabolizable energy (poor bioaccessibility leading to inefficient energy absorption) properties of nuts. Compensatory dietary responses account for 55-75% of the energy provided by nuts. Limited data suggest that routine nut consumption is associated with elevated resting energy expenditure and the thermogenic effect of feeding, resulting in dissipation of another portion of the energy they provide. Additionally, trials contrasting weight loss through regimens that include or exclude nuts indicate improved compliance and greater weight loss when nuts are permitted. Nuts may be included in the diet, in moderation, to enhance palatability, nutrient quality, and chronic disease risk reduction without compromising weight loss or maintenance.", "The role of nuts in the optimal diet: time for a critical appraisal? During the last decades, nuts have attracted the attention of researchers for their potential benefits in cardiovascular prevention. We discuss here some aspects of the assumed beneficial effects of nuts, weighing them against potential harm. Epidemiological observations and controlled intervention trials consistently suggest that nuts consumption is associated with improved serum lipid profile, thus helping decrease cardiovascular risk. Being nuts an energy dense food, their impact on energy balance and body weight should be considered. In particular, the claim that adding nuts to the habitual diet, thus increasing calorie intake, does not cause body fat accumulation still needs evidence and biological plausibility. The potential risk associated with the relatively frequent occurrence of allergic reactions following the consumption of nuts is also discussed. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Regular Consumption of Nuts Is Associated with a Lower Risk of Cardiovascular Disease in Women with Type 2 Diabetes Higher nut consumption has been associated with lower risk of coronary heart disease (CHD) events in several epidemiologic studies. The study examined the association between intake of nuts and incident cardiovascular disease (CVD) in a cohort of women with type 2 diabetes. For the primary analysis, there were 6309 women with type 2 diabetes who completed a validated FFQ every 2\u20134 y between 1980 and 2002 and were without CVD or cancer at study entry. Major CVD events included incident myocardial infarction (MI), revascularization, and stroke. During 54,656 person-years of follow-up, there were 452 CHD events (including MI and revascularization) and 182 incident stroke cases. Frequent nut and peanut butter consumption was inversely associated with total CVD risk in age-adjusted analyses. After adjustment for conventional CVD risk factors, consumption of at least 5 servings/wk of nuts or peanut butter [serving size, 28 g (1 ounce) for nuts and 16 g (1 tablespoon) for peanut butter] was significantly associated with a lower risk of CVD (relative risk = 0.56; 95% CI: 0.36\u20130.89). Furthermore, when we evaluated plasma lipid and inflammatory biomarkers, we observed that increasing nut consumption was significantly associated with a more favorable plasma lipid profile, including lower LDL cholesterol, non-HDL cholesterol, total cholesterol, and apolipoprotein-B-100 concentrations. However, we did not observe significant associations for HDL cholesterol or inflammatory markers. These data suggest that frequent nut and peanut butter consumption is associated with a significantly lower CVD risk in women with type 2 diabetes.", "Nuts: anti-atherogenic food? The prevalence of cardiovascular disease as the leading cause of morbidity and mortality is increasing worldwide. This fact is mainly attributed to the modern lifestyle with predominant characteristics the change of dietary habits and the reduced physical activity which lead to metabolic disorders such as obesity and diabetes. Therefore, drastic dietary interventions are considered necessary in order to reduce cardiovascular risk. Nuts, as a nutritional component have drawn particular attention, due to their beneficial cardiovascular properties derived from their nutrient composition. This is a comprehensive review concerning the potential general effects of nuts. It includes data from older large epidemiologic studies as well as recent significant information from clinical trials regarding this topic. All studies conclude that nuts can play an important role as part of a healthy diet in order to minimize cardiovascular risk and obtain multiple health benefits. Copyright \u00a9 2010 European Federation of Internal Medicine. Published by Elsevier B.V. All rights reserved.", "Cultural and historical aspects of Mediterranean nuts with emphasis on their attributed healthy and nutritional properties. BACKGROUND AND AIMS: Nuts have been part of the human diet since prehistoric times. The aim of the present article is to describe the most important historical and cultural aspects of nut consumption throughout history. DATA SYNTHESIS: We discuss the following historical aspects of nuts originating in the Mediterranean: prehistory, the Egyptian civilization, their spread through the Mediterranean region by the Greek, Phoenician and Roman civilizations, and their reintroduction into Europe by means of the Al-Andalus culture. Particular emphasis is placed on the healthy and nutritional attributes that nuts have had throughout history. We also consider the role of the first globalization of food--the exchange of nuts between continents--and discuss the symbolism that nuts have had for humans throughout history in the context of cultural aspects of the Mediterranean region. CONCLUSIONS: Nuts and fruits are probably the earliest foods consumed by humans and are considered to be important because of their nutritional properties. Nuts have also been used in the past by different civilizations as drugs to prevent or treat several diseases. Copyright \u00a9 2010 Elsevier B.V. All rights reserved."], ["From beans to berries and beyond: teamwork between plant chemicals for protection of optimal human health. It is now well known to consumers around the world that certain fruits and vegetables can help prevent or treat chronic human diseases. But, what many people don't fully appreciate is that it is not a single component in these plant-derived foods, but rather complex mixtures of interacting natural chemicals, that produce such powerful health-protective effects. These natural components accumulate simultaneously together in a plant, and provide a multifaceted defensive strategy for both the plant, and the human consumer. In order to investigate the strength of natural chemical cooperation in highly-pigmented, flavonoid-rich functional foods, our lab has relied on analysis of both whole fruits, and continuous, reliable plant cell culture production systems which accumulate anthocyanins and proanthocyanidins in high concentrations. Successive rounds of relatively gentle, rapid, and large-volume fractionations are linked to bioassay of complex to simple mixtures and semi-purified compounds. By means of this strategy, additive interactions or synergies between related compounds in health maintenance can be sorted out. Interestingly, phytochemical interactions between the same classes of compounds intensify the efficacy of flavonoid-rich fruits against multiple, not necessarily discrete, human disease conditions including CVD, cancer, metabolic syndrome, and others.", "Effect of treatment with a colloidal oatmeal lotion on the acneform eruption induced by epidermal growth factor receptor and multiple tyrosine-kina... Current treatment modalities for epidermal growth factor (EGFR)-positive cancers have recently included the use of antibodies and small-molecule tyrosine-kinase inhibitors (TKI). A significant limiting step in the use of these agents is dermatological toxicity, frequently in the form of an acneiform eruption. Present management modalities for this toxicity are largely ineffective. Colloidal oatmeal lotion demonstrates multiple anti-inflammatory properties with known effects on arachidonic acid, cytosolic phospholipase A2 and tumour necrosis factor-alpha pathways, along with an excellent side-effect profile. Treatment with colloidal oatmeal was applied to 11 patients with a rash induced by cetuximab, erlotinib, panitumumab and sorafenib. Of the 10 assessable patients, 6 had complete response and 4 partial response, giving a response rate of 100% with no associated toxicities. Treatment with colloidal oatmeal lotion is efficient in controlling the rash associated with EGFR and multiple TKI, and allows continuation of the antineoplastic treatment.", "Black rice anthocyanins inhibit cancer cells invasion via repressions of MMPs and u-PA expression. Tumor metastasis is the most important cause of cancer death and various treatment strategies have targeted on preventing the occurrence of metastasis. Anthocyanins are natural colorants belonging to the flavonoid family, and are wildly used for their antioxidant properties. Here, we provided molecular evidence associated with the anti-metastatic effects of peonidin 3-glucoside and cyanidin 3-glucoside, major anthocyanins extracted from black rice (Oryza sativa L. indica), by showing a marked inhibition on the invasion and motility of SKHep-1 cells. This effect was associated with a reduced expression of matrix metalloproteinase (MMP)-9 and urokinase-type plasminogen activator (u-PA). Peonidin 3-glucoside and cyanidin 3-glucoside also exerted an inhibitory effect on the DNA binding activity and the nuclear translocation of AP-1. Furthermore, these compounds also exerted an inhibitory effect of cell invasion on various cancer cells (SCC-4, Huh-7, and HeLa). Finally, anthocyanins from O. sativa L. indica (OAs) were evidenced by its inhibition on the growth of SKHep-1 cells in vivo.", "Avena sativa (Oat), a potential neutraceutical and therapeutic agent: an overview. The aim of the present review article is to summarize the available information related to the availability, production, chemical composition, pharmacological activity, and traditional uses of Avena sativa to highlight its potential to contribute to human health. Oats are now cultivated worldwide and form an important dietary staple for the people in number of countries. Several varieties of oats are available. It is a rich source of protein, contains a number of important minerals, lipids, \u03b2-glucan, a mixed-linkage polysaccharide, which forms an important part of oat dietary fiber, and also contains various other phytoconstituents like avenanthramides, an indole alkaloid-gramine, flavonoids, flavonolignans, triterpenoid saponins, sterols, and tocols. Traditionally oats have been in use since long and are considered as stimulant, antispasmodic, antitumor, diuretic, and neurotonic. Oat possesses different pharmacological activities like antioxidant, anti-inflammatory, wound healing, immunomodulatory, antidiabetic, anticholesterolaemic, etc. A wide spectrum of biological activities indicates that oat is a potential therapeutic agent.", "International multidimensional authenticity specification (IMAS) algorithm for detection of commercial pomegranate juice adulteration. The pomegranate fruit ( Punica granatum ) has become an international high-value crop for the production of commercial pomegranate juice (PJ). The perceived consumer value of PJ is due in large part to its potential health benefits based on a significant body of medical research conducted with authentic PJ. To establish criteria for authenticating PJ, a new International Multidimensional Authenticity Specifications (IMAS) algorithm was developed through consideration of existing databases and comprehensive chemical characterization of 45 commercial juice samples from 23 different manufacturers in the United States. In addition to analysis of commercial juice samples obtained in the United States, data from other analyses of pomegranate juice and fruits including samples from Iran, Turkey, Azerbaijan, Syria, India, and China were considered in developing this protocol. There is universal agreement that the presence of a highly constant group of six anthocyanins together with punicalagins characterizes polyphenols in PJ. At a total sugar concentration of 16 degrees Brix, PJ contains characteristic sugars including mannitol at >0.3 g/100 mL. Ratios of glucose to mannitol of 4-15 and of glucose to fructose of 0.8-1.0 are also characteristic of PJ. In addition, no sucrose should be present because of isomerase activity during commercial processing. Stable isotope ratio mass spectrometry as > -25 per thousand assures that there is no added corn or cane sugar added to PJ. Sorbitol was present at <0.025 g/100 mL; maltose and tartaric acid were not detected. The presence of the amino acid proline at >25 mg/L is indicative of added grape products. Malic acid at >0.1 g/100 mL indicates adulteration with apple, pear, grape, cherry, plum, or aronia juice. Other adulteration methods include the addition of highly concentrated aronia, blueberry, or blackberry juices or natural grape pigments to poor-quality juices to imitate the color of pomegranate juice, which results in abnormal anthocyanin profiles. To adjust the astringent taste of poor-quality juice or peel extract, addition of nonpomegranate sugars is a commonly detected adulteration method. The profile generated from these analyses combined with information from existing databases and published literature has been integrated into a validated IMAS for PJ, which can be utilized to detect PJ adulteration. In this survey of commercial pomegranate juices, only 6 of 23 strictly met all of the IMAS criteria."], ["Effects of a Topically Applied Bioadhesive Berry Gel on Loss of Heterozygosity Indices in Premalignant Oral Lesions Purpose The aim of this study was to assess the effects of topical application of a 10% (w/w) freeze-dried black raspberry (FBR) gel on oral intraepithelial neoplasia (IEN) variables that included histologic diagnoses and loss of heterozygosity (LOH) indices. Microsatellite instability and/or LOH at tumor suppressor gene \u2013 associated chromosomal loci have been associated with a higher risk for oral IEN progression to oral squamous cell carcinoma. Previously, our laboratories have shown that FBRs are well tolerated and possess potent antioxidant, apoptotic, and differentiation-inducing properties. Experimental Design Each participant with IEN served as their own internal control. Before treatment, all lesions were photographed, and lesional tissue was hemisected to obtain a pretreatment diagnosis and baseline biochemical and molecular variables. Gel dosing (0.5 g applied four times daily for 6 weeks) was initiated 1 week after the initial biopsy. Genomic DNA was isolated from laser-captured basilar and suprabasilar surface epithelial cells followed by PCR amplification using primer sets that targeted known and presumed tumor suppressor gene loci associated with INK4a/ARF, p53, and FHIT. Allelic imbalance was determined by sequence analysis using normal participant tissues to establish microsatellite marker peak patterns and allele sizes. Results Confirming earlier phase I data, none of the 27 participants developed FBR gel \u2013 associated toxicities. Furthermore, our results show histologic regression in a subset of patients as well as statistically significant reduction in LOH at tumor suppressor gene \u2013 associated loci. Conclusions These preliminary data suggest that further evaluation of berry gels for oral IEN chemoprevention is warranted.", "Topical Application of a Bioadhesive Black Raspberry Gel Modulates Gene Expression and Reduces Cyclooxygenase 2 Protein in Human Premalignant Oral Lesions Reduced expression of proapoptotic and terminal differentiation genes in conjunction with increased levels of the proinflammatory and angiogenesis-inducing enzymes, cyclooxygenase 2 (COX-2) and inducible nitric oxide synthase (iNOS), correlate with malignant transformation of oral intraepithelial neoplasia (IEN). Accordingly, this study investigated the effects of a 10% (w/w) freeze-dried black raspberry gel on oral IEN histopathology, gene expression profiles, intraepithelial COX-2 and iNOS proteins, and microvascular densities. Our laboratories have shown that freeze-dried black raspberries possess antioxidant properties and also induce keratinocyte apoptosis and terminal differentiation. Oral IEN tissues were hemisected to provide samples for pretreatment diagnoses and establish baseline biochemical and molecular variables. Treatment of the remaining lesional tissue (0.5 g gel applied four times daily for 6 weeks) began 1 week after the initial biopsy. RNA was isolated from snap-frozen IEN lesions for microarray analyses, followed by quantitative reverse transcription-PCR validation. Additional epithelial gene-specific quantitative reverse transcription-PCR analyses facilitated the assessment of target tissue treatment effects. Surface epithelial COX-2 and iNOS protein levels and microvascular densities were determined by image analysis quantified immunohistochemistry. Topical berry gel application uniformly suppressed genes associated with RNA processing, growth factor recycling, and inhibition of apoptosis. Although the majority of participants showed posttreatment decreases in epithelial iNOS and COX-2 proteins, only COX-2 reductions were statistically significant. These data show that berry gel application modulated oral IEN gene expression profiles, ultimately reducing epithelial COX-2 protein. In a patient subset, berry gel application also reduced vascular densities in the superficial connective tissues and induced genes associated with keratinocyte terminal differentiation.", "Is oral sex really a dangerous carcinogen? Let's take a closer look. INTRODUCTION: Questions have recently arisen in the popular press about the association between specific sexual behaviors, namely, fellatio and cunnilingus, with head and neck cancers. Although there has been an overall decline in the incidence of head and neck cancers over the past 25 years, there has been a shift in the distribution of these cancers toward a particular type known as oral squamous cell carcinomas (OSCCs), and a younger demographic. These particular cancers, OSCCs, have been shown to be associated with the human papillomavirus (HPV). Several researchers have suggested that this shift in the epidemiology of head and neck cancers might be attributable to changing sexual practices. While this speculation has caught on in the popular press, there are several interesting contradictions in the existing evidence that suggest this conclusion might be premature and overreached. AIM: The intent of this article is to help clarify the issues so that sexual medicine professionals can give accurate and up-to-date information to their patients. MAIN OUTCOME MEASURES: This is a review article; no outcome data are reported. This is a review article; no measures were collected. METHODS: Pubmed search on HPV, oral sex, oral cancers, and OSCCs. RESULTS: One hundred ninety-six articles on HPV were found; 63 articles on oral sex, 55 on oral cancer, and 5 articles on OSCCs were identified as relevant. CONCLUSIONS: HPV infections occur commonly and are usually cleared within 18 months, thus HPV infection should not be a cause for concern among monogamous couples with a rich and varied sex life as long as the sexual system remains closed and other immune compromising factors are not present. HPV becomes a concern in the context of immune system compromise and infection persistence. Factors contributing to immune system compromise, HPV persistence, and oncogenesis are reviewed. \u00a9 2012 International Society for Sexual Medicine.", "Diet and prevention of oral cancer: strategies for clinical practice. BACKGROUND: Oral health care professionals can play an important role in preventing oral cancer by performing oral mucosal examinations to detect pre-cancerous changes and by educating patients about oral cancer prevention strategies, including dietary approaches. CONCLUSIONS: Current evidence supports a diet high in fruits, vegetables and plant-based foods for prevention of oral cancer. Dietary supplements-including vitamins and minerals-have not been shown to be effective as substitutes for a diet high in fruits and vegetables. CLINICAL IMPLICATIONS: In addition to discussing tobacco and alcohol use with patients (and, if relevant, betel nut and gutka consumption), as well as the risk of sexual transmission of human papillo-mavirus, clinicians should provide dietary advice for the prevention of oral cancer as part of routine patient education practices.", "Oral sex, cancer and death: sexually transmitted cancers We briefly highlight the growing body of recent evidence linking unprotected oral sex with the development of some types of head and neck cancer in younger patients. These tumours appear to be increasing in incidence although the development of more sensitive methods of HPV detection may be a confounding factor."], ["Environmental obesogens: organotins and endocrine disruption via nuclear receptor signaling. Over the last two decades, the incidence of obesity and associated metabolic syndrome diseases has risen dramatically, becoming a global health crisis. Increased caloric intake and decreased physical activity are believed to represent the root causes of this dramatic rise. However, recent findings highlight the possible involvement of environmental obesogens, xenobiotic chemicals that can disrupt the normal developmental and homeostatic controls over adipogenesis and energy balance. Environmental estrogens, i.e. chemicals with estrogenic potential, have been reported to perturb adipogenic mechanisms using in vitro model systems, but other classes of endocrine-disrupting chemicals are now coming under scrutiny as well. Organotins represent one class of widespread persistent organic pollutants with potent endocrine-disrupting properties in both invertebrates and vertebrates. New data identify tributyltin chloride and triphenyltin chloride as nanomolar agonist ligands for retinoid X receptor (RXR alpha, RXR beta, and RXR gamma) and peroxisome proliferator-activated receptor gamma, nuclear receptors that play pivotal roles in lipid homeostasis and adipogenesis. The environmental obesogen hypothesis predicts that inappropriate receptor activation by organotins will lead directly to adipocyte differentiation and a predisposition to obesity and/or will sensitize exposed individuals to obesity and related metabolic disorders under the influence of the typical high-calorie, high-fat Western diet. The linking of organotin exposure to adipocyte differentiation and obesity opens an important new area of research into potential environmental influences on human health and disease.", "Dietary intake of organotin compounds in Finland: a market-basket study. The objective of this study was to estimate the intake of organic tin compounds from foodstuffs in a Finnish market basket. The study was conducted by collecting 13 market baskets from supermarkets and market places in the city of Kuopio, eastern Finland. Altogether 115 different food items were bought. In each basket, foodstuffs were mixed in proportion to their consumption and analysed by GC/MS for seven organic tin compounds (mono-, di-, and tributyltin, mono-, di-, and triphenyltin, and dioctyltin). Organotin compounds were detected in only four baskets, with the fish basket containing the largest number of different organotins. The European Food Safety Authority has established a tolerable daily intake of 250 ng kg(-1) body weight for the sum of dibutyltin, tributyltin, triphenyltin and dioctyltin. According to this study, the daily intake of these compounds was 2.47 ng kg(-1) body weight, of which 81% originated from the fish basket. This exposure is only 1% of the tolerable daily intake and poses negligible risk to the average consumer. However, for consumers eating large quantities of fish from contaminated areas, the intake may be much higher.", "Inadvertent exposure to xenoestrogens. Over the last 40 years there have been constant reports concerning environmental chemicals with hormone-like effects in wildlife. An endocrine disruptor is an exogenous substance that causes adverse health effects in an intact organism or its progeny, secondary to changes in endocrine function. Endocrine disruptors of widely diverse chemical structures that have oestrogenic properties are known as oestrogenic xenobiotics or xenoestrogens. Some of these substances, such as phytoestrogens and mycoestrogens, can come from diet or from the environment. Although the oestrogenic activity of these substances is weaker than that of oestradiol, new chemicals with endocrine disrupting potential continue to be discovered, inadvertent forms of exposure are constantly being identified, and there is increasing concern about cumulative effects. Studies in the 1960s and 1970s characterized the oestrogenicity of a number of industrial compounds and the pesticides o,p-DDT, kepone, methoxychlor, phenolic derivatives and polychlorinated biphenyls (PCBs). In the last 5 years, several environmental chemicals have been added to the list of xenoestrogens, including the pesticides toxaphene, dieldrin and endosulphan, and several different compounds used in the food industry, antioxidants such a t-butylhydroxyanisole; plasticizers such as benzylbutylphthalate and 4-OH-alkylphenols; and substances used in dental restorations, such as bisphenol-A. The relevance of these newly discovered endocrine disruptors to human health is now starting to emerge. The few studies that have investigated their effect in humans point in the same direction: if there is indeed an association between exposure to substances with hormone-disruptive activity and certain disorders of endocrine organs, the incidence of such disorders would be greater in areas where exposure to agents with this activity is high. A closer scrutiny is required to determine whether these newly discovered endocrine disrupting chemicals contribute, together with oestrogenic pesticides, to the exposure of humans to xenoestrogens.", "Chitin synthesis and degradation as targets for pesticide action. Various pesticides are being used to destabilize, perturb, or inhibit crucial biochemical and physiological targets related to metabolism, growth, development, nervous communication, or behavior in pestiferous organisms. Chitin is an eukaryotic extracellular aminosugar biopolymer, massively produced by most fungal systems and by invertebrates, notably arthropods. Being an integral supportive component in fungal cell wall, insect cuticle, and nematode egg shell, chitin has been considered as a selective target for pesticide action. Throughout the elaborate processes of chitin formation and deposition, only the polymerization events associated with the cell membrane compartment are so far available for chemical interference. Currently, the actinomycetes-derived nucleoside peptide fungicides such as the polyoxins and the insecticidal benzoylaryl ureas have reached commercial pesticide status. The polyoxins and other structurally-related antibiotics like nikkomycins are strong competitive inhibitors of the polymerizing enzyme chitin synthase. The exact biochemical lesion inflicted by the benzoylaryl ureas is still elusive, but a post-polymerization event, such as translocation of chitin chains across the cell membrane, is suggested. Hydrolytic degradation of the chitin polymer is essential for hyphal growth, branching, and septum formation in fungal systems as well as for the normal molting of arthropods. Recently, insect chitinase activity was strongly and specifically suppressed by allosamidin, an actimomycetes-derived metabolite. In part, the defense mechanism in plants against invasion of pathogens is associated with induced chitinases. Chitin, chitosan, and their oligomers are able to act as elicitors which induce enhanced levels of chitinases in various plants. Lectins which bind to N-acetyl-D-glucosamine strongly interfere with fungal and insect chitin synthases. Plant lectins with similar properties may be involved in plant-pathogen interaction inter alia by suppressing fungal invasion.", "Polybrominated diphenyl ethers (PBDEs), hydroxylated PBDEs (OH-PBDEs), and measures of thyroid function in second trimester pregnant women in California Prenatal exposure to polybrominated diphenyl ethers (PBDEs) may disrupt thyroid function and contribute to adverse neurodevelopmental outcomes. We conducted a pilot study to explore the relationship between serum concentrations of lower-brominated PBDEs (BDE-17 to -154), higher-brominated PBDEs (BDE-183 to -209), and hydroxylated PBDE metabolites (OH-PBDEs) with measures of thyroid function in pregnant women. Concentrations of PBDEs, OH-PBDEs, thyroid-stimulating hormone (TSH), total thyroxine (T4), and free T4 were measured in serum samples collected between 2008 and 2009 from 25 second trimester pregnant women in California. Median concentrations of lower-brominated PBDEs and OH-PBDEs were the highest reported to date in pregnant women. Median concentrations of BDE-47 and the sum of lower-brominated PBDEs (\u03a3PBDE5) were 43.1 ng/g lipid and 85.8 ng/g lipid; and 0.084 ng/mL for the sum of OH-PBDEs (\u03a3OH-PBDE4). We observed a positive association between the weighted sum of chemicals known to bind to transthyretin (\u03a3TTR binders) and TSH levels. We also found positive associations between TSH and \u03a3PBDE5, \u03a3OH-PBDE4, BDE-47, BDE-85, 5-OH-BDE47, and 4\u2032-OH-BDE49; and an inverse association with BDE-207. Relationships with free and total T4 were weak and inconsistent. Our results indicate that PBDE exposures are elevated in pregnant women in California, and suggest a relationship with thyroid function. Further investigation is warranted to characterize the risks of PBDE exposures during pregnancy."], ["Oxidative processes in meat and meat products: Quality implications. Lipid peroxidation is, in most instances, a free radical chain reaction that can be described in terms of initiation, propagation, branching and termination processes. With regard to lipid peroxidation, one of the most important questions concerns the source of the primary catalysts that initiate peroxidation in situ in muscle foods. When cells are injured, such as in muscle foods after slaughtering, lipid peroxidation is favored, and traces of O(2) and H(2)O(2), indicating lipid peroxides, are formed. The stability of a muscle food product will depend on the 'tone' of these peroxides and especially from the involvement of metal ions in the process. The cytosol contains not only prooxidants but also antioxidants and the tone of both affects the overall oxidation. Lipid peroxidation is one of the primary mechanisms of quality deterioration in foods and especially in meat products. The changes in quality can be manifested by deterioration in flavor, color, texture, nutritive value and the production of toxic compounds. Copyright \u00a9 1993. Published by Elsevier Ltd.", "Dissemination of central nervous system tissue during the slaughter of cattle in three Irish abattoirs. Sponge samples were taken from the carcases, meat, personnel and surfaces involved in stunning, slaughter and dressing/boning activities at three abattoirs, and from retail beef products. The samples were examined for the presence of central nervous system (CNS)-specific proteins (syntaxin 1B and/or glial fibrillary acidic protein (GFAP), as indicators of contamination with CNS tissue. Syntaxin 1B and GFAP were detected in many of the sponge samples taken along the slaughter line and in the chill rooms of all three abattoirs; GFAP was also detected in one sample of longissimus muscle (striploin) taken in the boning hall of one of the abattoirs but not in the other two abattoirs or in retail meats.", "Effects of added connective tissues on the sensory and mechanical properties of restructured beef steaks. To quantify objectionable levels of connective tissues, restructured beef products were made with 2\u00b75 and 5% added tendon; 5 and 10% added epimysium, gristle, or peri/endomysium; and a control. Initial tenderness (IT), residual connective tissue (CT), and overall texture (OT) were evaluated by a sensory panel. Panelists adversely scored IT, CT, and OT for 2\u00b75 and 5% tendon and CT and OT for 10% epimysium and gristle. CT and OT scores correlated with hydroxyproline content and Lee-Kramer peak shear force for uncooked steaks with added tendon, gristle and epimysium but not peri/endomysium. Acceptable products can be made when raw materials are free of tendons and contain only limited amounts of epimysium. Copyright \u00a9 1990. Published by Elsevier Ltd.", "Reducing the fat content in ground beef without sacrificing quality: a review. Americans are becoming more health conscious in their food choices and many are interested in reducing dietary fat intake. Fat replacers can affect meat flavor both by adding flavors of their own, by reducing the original aroma-generating substrate (fat) and by altering release of aroma compounds. When fat is removed from meat, water is generally added to replace it. Water-binding compounds can be added to prevent the added water from cooking out or evaporating and to prevent patty shrinkage. Fat replacers are generally classified by their composition: protein-based replacers including whey, soy and collagen, lipid-based substances such as soy lecithin which function as emulsifiers maintaining the fat that is retained distributed in the product, and carbohydrate-based substances including flours (wheat, soy, oat), starches (potato, modified corn starch, tapioca) and gums (carrageenan, xanthin). Duplication of the characteristics contributed by fat often requires a combination of replacers to address juiciness and texture (firmness) without negatively impacting flavor. Published by Elsevier Ltd.", "Carrageenans and their use in meat products. Carrageenans are sulfated linear polysaccharides of D-galactose and 3,6-anhydro-D-galactose extracted from red seaweeds. They have been used by the food industry for their gelling, thickening, and stabilizing properties, and more recently by the meat industry for reduced fat products. Meat is a complex system of muscle tissue, connective tissue, fat, and water; during processing, numerous interactions occur among all these components. These interactions are responsible for the functional properties of the meat system. In meat products, carrageenans contribute to gel formation and water retention. Their addition is of special interest in low-fat meat products because fat reduction often leads to unacceptable, tough textures. When carrageenans are incorporated in these formulations, they improve the textural characteristics of the product by decreasing toughness and increasing juiciness. Although carrageenan interactions with milk proteins have been studied extensively, the mechanism by which carrageenans interact with meat proteins and the other meat components is not fully understood."], ["Does Flavanol Intake Influence Mortality from Nitric Oxide-Dependent Processes? Ischemic Heart Disease, Stroke, Diabetes Mellitus, and Cancer in Panama Substantial data suggest that flavonoid-rich food could help prevent cardiovascular disease and cancer. Cocoa is the richest source of flavonoids, but current processing reduces the content substantially. The Kuna living in the San Blas drink a flavanol-rich cocoa as their main beverage, contributing more than 900 mg/day and thus probably have the most flavonoid-rich diet of any population. We used diagnosis on death certificates to compare cause-specific death rates from year 2000 to 2004 in mainland and the San Blas islands where only Kuna live. Our hypothesis was that if the high flavanoid intake and consequent nitric oxide system activation were important the result would be a reduction in the frequency of ischemic heart disease, stroke, diabetes mellitus, and cancer \u2013 all nitric oxide sensitive processes. There were 77,375 deaths in mainland Panama and 558 deaths in the San Blas. In mainland Panama, as anticipated, cardiovascular disease was the leading cause of death (83.4 \u00b1 0.70 age adjusted deaths/100,000) and cancer was second (68.4 \u00b1 1.6). In contrast, the rate of CVD and cancer among island-dwelling Kuna was much lower (9.2 \u00b1 3.1) and (4.4 \u00b1 4.4) respectively. Similarly deaths due to diabetes mellitus were much more common in the mainland (24.1 \u00b1 0.74) than in the San Blas (6.6 \u00b1 1.94). This comparatively lower risk among Kuna in the San Blas from the most common causes of morbidity and mortality in much of the world, possibly reflects a very high flavanol intake and sustained nitric oxide synthesis activation. However, there are many risk factors and an observational study cannot provide definitive evidence.", "Diverticular disease: eat your fiber! In industrialized nations, diverticular disease affects up to 70% of individuals by 60 years of age, with symptoms that can range from mild gastrointestinal disturbance to incapacitating pain. Diverticular disease appears to be related to increasing affluence and changed diet: Current theory holds that diverticular disease's origin is low-fiber diet. This explains why its incidence is highest and accelerating in the more prosperous countries where intake of fiber has decreased and intake of milled grains and refined sugars has increased over time. Not all patients develop symptoms, but if they do, the most frequent complaints associated with diverticulosis are cramping in the left-lower quadrant, bloating, constipation, and soiling. If diverticula perforate the gut's wall into the pericolic tissue, small and large abscesses, accompanied by bleeding, can form. Fistulization, when it occurs, most often penetrates to the bladder. Treatment addresses symptoms and may require hospitalization. During symptomatic periods, patients do best on low-fiber, bland diets. Once the acute episode or highly symptomatic period resolves or chronic disease is managed, patients should gradually increase dietary fiber to 20 to 30 grams daily or take dietary fiber in the form of bulk stimulants like psyllium.", "Globalization, diet, and health: an example from Tonga. The increased flow of goods, people, and ideas associated with globalization have contributed to an increase in noncommunicable diseases in much of the world. One response has been to encourage lifestyle changes with educational programmes, thus controlling the lifestyle-related disease. Key assumptions with this approach are that people's food preferences are linked to their consumption patterns, and that consumption patterns can be transformed through educational initiatives. To investigate these assumptions, and policies that derive from it, we undertook a broad-based survey of food-related issues in the Kingdom of Tonga using a questionnaire. Data on the relationships between food preferences, perception of nutritional value, and frequency of consumption were gathered for both traditional and imported foods. The results show that the consumption of health-compromising imported foods was unrelated either to food preferences or to perceptions of nutritional value, and suggests that diet-related diseases may not be amenable to interventions based on education campaigns. Given recent initiatives towards trade liberalization and the creation of the World Trade Organization, tariffs or import bans may not serve as alternative measures to control consumption. This presents significant challenges to health policy-makers serving economically marginal populations and suggests that some population health concerns cannot be adequately addressed without awareness of the effects of global trade.", "The development of the concept of dietary fiber in human nutrition. Fundamental studies of the laxative action of wheat bran were undertaken in the United States in the early decades of the 20th century. Walker in South Africa extended these studies among African blacks and later suggested that cereal fiber protected them against certain metabolic disorders. Trowell in Uganda elaborated this concept with regard to the rarity of common noninfective diseases of the colon. Another stream of inquiry stemmed from the hypothesis of Cleave who postulated that the presence of refined sugar, and to a lesser extent white flour, caused many metabolic diseases, while the loss of fiber caused certain colonic disorders. Meanwhile Burkitt had collected massive evidence of the rarity of appendicitis and many venous disorders in rural Africa and parts of Asia. In 1972 Trowell proposed a new physiological definition of fiber in terms of the residue of plant foods that resisted digestion by alimentary enzymes of man. Southgate has proposed chemical methods to analyze the components of dietary fiber: cellulose, hemicellulose, and lignin.", "Diverticular disease of the colon. The first of the Western diseases shown to be due to a deficiency of dietary fibre. Diverticular disease of the colon is a new disease that appeared at the beginning of this century. It is now the commonest disease of the colon in the Western world, being found in 1 in 3 people of over 60 years of age. The pathogenesis of the disease involves excessive segmentation, but this does not explain its aetiology. The historical appearance of the disease on the clinical scene and its geographical distribution suggest that it is due to the removal of fibre from carbohydrates. The author treated 70 patients with symptomatic diverticular disease with a high-fibre diet. The results of this and the effects of bran are discussed."], ["Dieldrin-induced neurotoxicity: relevance to Parkinson's disease pathogenesis. Parkinson's disease (PD) is increasingly recognized as a neurodegenerative disorder strongly associated with environmental chemical exposures. Recent epidemiological data demonstrate that environmental risk factors may play a dominant role as compared to genetic factors in the etiopathogenesis of idiopathic Parkinson's disease. Identification of key genetic defects such as alpha-synuclein and parkin mutations in PD also underscores the important role of genetic factors in the disease. Thus, understanding the interplay between genes and environment in PD may be critical to unlocking the mysteries of this 200-year-old neurodegenerative disease. Pesticides and metals are the most common classes of environmental chemicals that promote dopaminergic degeneration. The organochlorine pesticide dieldrin has been found in human PD postmortem brain tissues, suggesting that this pesticide has potential to promote nigral cell death. Though dieldrin has been banned, humans continue to be exposed to the pesticide through contaminated dairy products and meats due to the persistent accumulation of the pesticide in the environment. This review summarizes various neurotoxic studies conducted in both cell culture and animals models following dieldrin exposure and discusses their relevance to key pathological mechanisms associated with nigral dopaminergic degeneration including oxidative stress, mitochondrial dysfunction, protein aggregation, and apoptosis.", "Meeting Report: Consensus Statement\u2014Parkinson\u2019s Disease and the Environment: Collaborative on Health and the Environment and Parkinson\u2019s Action Network (CHE PAN) Conference 26\u201328 June 2007 Background Parkinson\u2019s disease (PD) is the second most common neurodegenerative disorder. People with PD, their families, scientists, health care providers, and the general public are increasingly interested in identifying environmental contributors to PD risk. Methods In June 2007, a multidisciplinary group of experts gathered in Sunnyvale, California, USA, to assess what is known about the contribution of environmental factors to PD. Results We describe the conclusions around which they came to consensus with respect to environmental contributors to PD risk. We conclude with a brief summary of research needs. Conclusions PD is a complex disorder, and multiple different pathogenic pathways and mechanisms can ultimately lead to PD. Within the individual there are many determinants of PD risk, and within populations, the causes of PD are heterogeneous. Although rare recognized genetic mutations are sufficient to cause PD, these account for < 10% of PD in the U.S. population, and incomplete penetrance suggests that environmental factors may be involved. Indeed, interplay among environmental factors and genetic makeup likely influences the risk of developing PD. There is a need for further understanding of how risk factors interact, and studying PD is likely to increase understanding of other neurodegenerative disorders.", "MPTP: an industrial chemical and contaminant of illicit narcotics stimulates a new era in research on Parkinson's disease. MPTP (1-methyl-4-phenyl-1,2,3,6-tetrahydropyridine) causes selective destruction of dopaminergic neurons of the nigrostriatal pathway in humans and other primates. It is less specific and much less potent in mice and has only slight effects in rats. Differences in rates and sites of metabolism of MPTP to its active, toxic, highly polar metabolite, MPP+ (1-methyl-4-phenylpyridine), appear to influence species specificity. In rats, type B monoamine oxidase (MAO-B), which mediates the conversion of MPTP to MPP+, may act as an enzymatic barrier at brain microvessels, whereas in primates the enzyme, present mainly in astrocytes, appears important for bioactivation of MPTP into the toxic metabolite. MPP+ is a substrate for catecholamine uptake sites and is concentrated in these neurons. The molecular mechanism of MPP+ toxicity has not been established definitively, but conversion to a free radical or uptake by mitochondria and inhibition of mitochondrial respiratory enzymes, leading to calcium release and cell death have been suggested. The discovery of toxin which causes an animal model of Parkinson's disease has stimulated new research on environmental factors that might contribute to this progressive degenerative disorder and provides a means for assessing new approaches to therapy.", "Lewy pathology is not the first sign of degeneration in vulnerable neurons in Parkinson disease Objective: To determine whether evidence of neuronal dysfunction or demise preceded deposition of Lewy pathology in vulnerable neurons in Parkinson disease (PD). Methods: We examined the extent of nigral dysfunction and degeneration among 63 normal, incidental Lewy body disease (ILBD), and PD cases based on tyrosine hydroxylase (TH) immunoreactivity and neuron densities, respectively. The relationship between these markers and Lewy pathology (LP) burden in the substantia nigra (SN) and Braak PD stage was assessed. Results: Compared with normal subjects, ILBD cases displayed a significantly higher percentage of TH-negative cells and lower neuronal densities in the SN as early as Braak PD stages 1 and 2, before LP deposition in the nigrostriatal system. ILBD nigral neuron densities were intermediate between normal subjects and PD cases, and TH-negative percentages were higher in ILBD than either normal or PD cases. Furthermore, neuron density and neuronal dysfunction levels remained relatively constant across Braak PD stages in ILBD. Conclusions: These results suggest that significant neurodegeneration and cellular dysfunction precede LP in the SN, challenging the pathogenic role of LP in PD and the assumption that ILBD always represents preclinical PD.", "Chronic Parkinsonism in humans due to a product of meperidine-analog synthesis. Four persons developed marked parkinsonism after using an illicit drug intravenously. Analysis of the substance injected by two of these patients revealed primarily 1-methyl-4-phenyl-1,2,5,6-tetrahydropyridine (MPTP) with trace amounts of 1-methyl-4-phenyl-4-propionoxy-piperidine (MPPP). On the basis of the striking parkinsonian features observed in our patients, and additional pathological data from one previously reported case, it is proposed that this chemical selectively damages cells in the substantia nigra."], ["The role of nuts in the optimal diet: time for a critical appraisal? During the last decades, nuts have attracted the attention of researchers for their potential benefits in cardiovascular prevention. We discuss here some aspects of the assumed beneficial effects of nuts, weighing them against potential harm. Epidemiological observations and controlled intervention trials consistently suggest that nuts consumption is associated with improved serum lipid profile, thus helping decrease cardiovascular risk. Being nuts an energy dense food, their impact on energy balance and body weight should be considered. In particular, the claim that adding nuts to the habitual diet, thus increasing calorie intake, does not cause body fat accumulation still needs evidence and biological plausibility. The potential risk associated with the relatively frequent occurrence of allergic reactions following the consumption of nuts is also discussed. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Reducing the fat content in ground beef without sacrificing quality: a review. Americans are becoming more health conscious in their food choices and many are interested in reducing dietary fat intake. Fat replacers can affect meat flavor both by adding flavors of their own, by reducing the original aroma-generating substrate (fat) and by altering release of aroma compounds. When fat is removed from meat, water is generally added to replace it. Water-binding compounds can be added to prevent the added water from cooking out or evaporating and to prevent patty shrinkage. Fat replacers are generally classified by their composition: protein-based replacers including whey, soy and collagen, lipid-based substances such as soy lecithin which function as emulsifiers maintaining the fat that is retained distributed in the product, and carbohydrate-based substances including flours (wheat, soy, oat), starches (potato, modified corn starch, tapioca) and gums (carrageenan, xanthin). Duplication of the characteristics contributed by fat often requires a combination of replacers to address juiciness and texture (firmness) without negatively impacting flavor. Published by Elsevier Ltd.", "Capsinoids and related food ingredients activating brown fat thermogenesis and reducing body fat in humans. PURPOSE OF REVIEW: Capsaicin and its nonpungent analog (capsinoids) are known to be food ingredients that increase energy expenditure and decrease body fat. This article reviews the role of brown adipose tissue (BAT) for the thermogenic effect of these compounds in humans and proposes the possibility of some other antiobesity food ingredients. RECENT FINDINGS: A single oral ingestion of capsinoids increases energy expenditure in human individuals with metabolically active BAT, but not those without it, indicating that capsinoids activate BAT and thereby increase energy expenditure. This finding gave a rational explanation for discrepant results of the effects of capsinoids in the previous studies. Human BAT may be largely composed of inducible 'beige' adipocytes more than typical brown adipocytes because its gene expression patterns are similar to beige cells isolated from murine white fat depots. In fact, preadipocytes isolated from supraclavicular fat deposits - where BAT is often detected - are capable of differentiating into brown-like adipocytes in vitro, providing evidence of inducible brown adipogenesis in adult humans. SUMMARY: As human BAT may be inducible, a prolonged ingestion of capsinoids would recruit active BAT and thereby increase energy expenditure and decrease body fat. In addition to capsinoids, there are numerous food ingredients that are expected to activate BAT and so be useful for the prevention of obesity in daily life.", "The potential toxicity of artificial sweeteners. Since their discovery, the safety of artificial sweeteners has been controversial. Artificial sweeteners provide the sweetness of sugar without the calories. As public health attention has turned to reversing the obesity epidemic in the United States, more individuals of all ages are choosing to use these products. These choices may be beneficial for those who cannot tolerate sugar in their diets (e.g., diabetics). However, scientists disagree about the relationships between sweeteners and lymphomas, leukemias, cancers of the bladder and brain, chronic fatigue syndrome, Parkinson's disease, Alzheimer's disease, multiple sclerosis, autism, and systemic lupus. Recently these substances have received increased attention due to their effects on glucose regulation. Occupational health nurses need accurate and timely information to counsel individuals regarding the use of these substances. This article provides an overview of types of artificial sweeteners, sweetener history, chemical structure, biological fate, physiological effects, published animal and human studies, and current standards and regulations.", "Children's daily exposure to polychlorinated biphenyls from dietary supplements containing fish oils. In children, omega-3 polyunsaturated fatty acids (PUFAs) may elicit a suite of health benefits including enhancement of cognitive development. Subsequently, dietary supplements containing omega-3 PUFAs have become increasingly popular. Often, the largest source of beneficial PUFAs in these supplements is fish oil, which may contain significant levels of contaminants such as polychlorinated biphenyls (PCBs). The objectives of this study were to evaluate congener-specific PCB concentrations in 13 over-the-counter children's dietary supplements containing fish oils/powders and assess potential PCB exposures through ingestion of these products on a daily basis. Every supplement analysed contained PCBs, with a mean concentration of 9 \u00b1 8 ng PCBs/g supplement. When following serving size suggestions, mean daily exposure values ranged from 2.5 to 50.3 ng PCBs/day. Daily exposures for children's supplements were significantly lower than those previously reported for adult supplements and may be explained, in part, by the variability in the amount of fish oil (and PUFA content) in a serving size. Based on this study, factors such as fish oil purification methods (e.g., molecular distillation) and the trophic level of the fish species used to make the fish oil cannot be used as indicators of PCB levels within children's supplements. Fish supplements may decrease or increase daily PCB exposure compared with ingestion of fresh fish. However, eating fish high in omega-3 PUFAs and low in PCBs may reduce PCB exposure compared with daily supplementation with fish oils for some products studied."], ["Arsenic, Organic Foods, and Brown Rice Syrup Background: Rice can be a major source of inorganic arsenic (Asi) for many sub-populations. Rice products are also used as ingredients in prepared foods, some of which may not be obviously rice based. Organic brown rice syrup (OBRS) is used as a sweetener in organic food products as an alternative to high-fructose corn syrup. We hypothesized that OBRS introduces As into these products. Objective: We determined the concentration and speciation of As in commercially available brown rice syrups and in products containing OBRS, including toddler formula, cereal/energy bars, and high-energy foods used by endurance athletes. Methods: We used inductively coupled plasma mass spectrometry (ICP-MS) and ion chromatography coupled to ICP-MS to determine total As (Astotal) concentrations and As speciation in products purchased via the Internet or in stores in the Hanover, New Hampshire, area. Discussion: We found that OBRS can contain high concentrations of Asi and dimethyl-arsenate (DMA). An \u201corganic\u201d toddler milk formula containing OBRS as the primary ingredient had Astotal concentrations up to six times the U.S. Environmental Protection Agency safe drinking water limit. Cereal bars and high-energy foods containing OBRS also had higher As concentrations than equivalent products that did not contain OBRS. Asi was the main As species in most food products tested in this study. Conclusions: There are currently no U.S. regulations applicable to As in food, but our findings suggest that the OBRS products we evaluated may introduce significant concentrations of Asi into an individual\u2019s diet. Thus, we conclude that there is an urgent need for regulatory limits on As in food.", "Therapeutic efficacy of once-daily oral administration of a Kunitz-type protease inhibitor, bikunin, in a mouse model and in human cancer. BACKGROUND: Bikunin, a Kunitz-type protease inhibitor, specifically inhibits tumor invasion and metastasis. METHODS: The authors initially evaluated the therapeutic efficacy of once-daily oral administration of different doses of bikunin against human ovarian carcinoma HRA cells growing in the peritonea of nude mice. For the in vivo studies, female 7-week-old nude mice were randomized to 1 of 4 groups: bikunin-treated groups (n = 9 in each group) received 3, 10, or 30 microg/g body weight per day bikunin for 7 days via gastrointestinal gavage, and a control group (n = 9) received the vehicle solution (phosphate-buffered saline) via gastrointestinal gavage. On Day 9, the abdominal cavity was examined by two observers who were blinded to treatment. RESULTS: After oral administration, intact bikunin was detectable in mouse serum specimens at 3 and 6 hours. This was followed by a decline at 12 hours. The mice given bikunin at the highest dose level had a 40% decrease in tumor load. The highest uptake in the tumor was obtained with [125I]bikunin 12 hours postadministration. No effect on either food intake or body weight was observed in the treated versus sham groups. The current study was the first to report the potent activity of once-daily oral administration of bikunin against ovarian carcinoma. Next, the authors performed a Phase I trial to determine the maximum-tolerated dose (MTD) and safety of a once-daily oral administration schedule. The indication was locally advanced uterine cervical carcinoma after definitive treatment. An escalating dose (3, 10, and 30 mg/kg per day) of bikunin was administered orally to nine patients for 7 days. There were no dose-limiting toxicities and the MTD of the bikunin schedule was not defined. The authors also obtained preliminary data on its effect on urokinase-type plasminogen activator expression at the highest dose level. CONCLUSIONS: Once-daily oral administration of bikunin was found to be safe in humans and exhibited signs of biologic activity. Copyright 2004 American Cancer Society.", "Black rice anthocyanins inhibit cancer cells invasion via repressions of MMPs and u-PA expression. Tumor metastasis is the most important cause of cancer death and various treatment strategies have targeted on preventing the occurrence of metastasis. Anthocyanins are natural colorants belonging to the flavonoid family, and are wildly used for their antioxidant properties. Here, we provided molecular evidence associated with the anti-metastatic effects of peonidin 3-glucoside and cyanidin 3-glucoside, major anthocyanins extracted from black rice (Oryza sativa L. indica), by showing a marked inhibition on the invasion and motility of SKHep-1 cells. This effect was associated with a reduced expression of matrix metalloproteinase (MMP)-9 and urokinase-type plasminogen activator (u-PA). Peonidin 3-glucoside and cyanidin 3-glucoside also exerted an inhibitory effect on the DNA binding activity and the nuclear translocation of AP-1. Furthermore, these compounds also exerted an inhibitory effect of cell invasion on various cancer cells (SCC-4, Huh-7, and HeLa). Finally, anthocyanins from O. sativa L. indica (OAs) were evidenced by its inhibition on the growth of SKHep-1 cells in vivo.", "Gastroenterology in ancient Egypt. Physicians in ancient Egypt devoted their care to disorders of individual organs. Notable among the specialties was gastroenterology, a subject matter that occupied a major portion of the surviving medical papyri. Although they did not name diseases as we know them, Pharaonic physicians described a host of gastroenterological symptoms for which an extensive array of therapeutics was prescribed. Their clinical accounts indicated an impressive knowledge of gastric and anorectal conditions. In their thinking on disease mechanism, the circulating materia peccans absorbed from feces represented a major cause of medical symptoms and disorders. This served as the rationale for the popular practice of self-purgation with enemas.", "A brief journey into medical care and disease in ancient Egypt. Ancient Egypt was one of the greatest civilizations to have arisen, becoming the cradle of scientific enquiry and social development over 3 millennia; undoubtedly its knowledge of medicine has been vastly underestimated. Few artefacts survive which describe the medical organization, but from the extent of the diseases afflicting that ancient populus there would have been much to study. Evidence from papyri, tomb bas reliefs and the writings of historians of antiquity tell of an intense interest in the sciences, humanities and medicine born of an educated society which had overcome the superstitions of its nomadic ancestors."], ["Pesticides and human chronic diseases: evidences, mechanisms, and perspectives. Along with the wide use of pesticides in the world, the concerns over their health impacts are rapidly growing. There is a huge body of evidence on the relation between exposure to pesticides and elevated rate of chronic diseases such as different types of cancers, diabetes, neurodegenerative disorders like Parkinson, Alzheimer, and amyotrophic lateral sclerosis (ALS), birth defects, and reproductive disorders. There is also circumstantial evidence on the association of exposure to pesticides with some other chronic diseases like respiratory problems, particularly asthma and chronic obstructive pulmonary disease (COPD), cardiovascular disease such as atherosclerosis and coronary artery disease, chronic nephropathies, autoimmune diseases like systemic lupus erythematous and rheumatoid arthritis, chronic fatigue syndrome, and aging. The common feature of chronic disorders is a disturbance in cellular homeostasis, which can be induced via pesticides' primary action like perturbation of ion channels, enzymes, receptors, etc., or can as well be mediated via pathways other than the main mechanism. In this review, we present the highlighted evidence on the association of pesticide's exposure with the incidence of chronic diseases and introduce genetic damages, epigenetic modifications, endocrine disruption, mitochondrial dysfunction, oxidative stress, endoplasmic reticulum stress and unfolded protein response (UPR), impairment of ubiquitin proteasome system, and defective autophagy as the effective mechanisms of action. Copyright \u00a9 2013 Elsevier Inc. All rights reserved.", "Major Pesticides Are More Toxic to Human Cells Than Their Declared Active Principles Pesticides are used throughout the world as mixtures called formulations. They contain adjuvants, which are often kept confidential and are called inerts by the manufacturing companies, plus a declared active principle, which is usually tested alone. We tested the toxicity of 9 pesticides, comparing active principles and their formulations, on three human cell lines (HepG2, HEK293, and JEG3). Glyphosate, isoproturon, fluroxypyr, pirimicarb, imidacloprid, acetamiprid, tebuconazole, epoxiconazole, and prochloraz constitute, respectively, the active principles of 3 major herbicides, 3 insecticides, and 3 fungicides. We measured mitochondrial activities, membrane degradations, and caspases 3/7 activities. Fungicides were the most toxic from concentrations 300\u2013600 times lower than agricultural dilutions, followed by herbicides and then insecticides, with very similar profiles in all cell types. Despite its relatively benign reputation, Roundup was among the most toxic herbicides and insecticides tested. Most importantly, 8 formulations out of 9 were up to one thousand times more toxic than their active principles. Our results challenge the relevance of the acceptable daily intake for pesticides because this norm is calculated from the toxicity of the active principle alone. Chronic tests on pesticides may not reflect relevant environmental exposures if only one ingredient of these mixtures is tested alone.", "Pesticide residues in imported, organic, and \\\"suspect\\\" fruits and vegetables. Consumers are frequently urged to avoid imported foods as well as specific fruits and vegetables due to health concerns from pesticide residues and are often encouraged to choose organic fruits and vegetables rather than conventional forms. Studies have demonstrated that while organic fruits and vegetables have lower levels of pesticide residues than do conventional fruits and vegetables, pesticide residues are still frequently detected on organic fruits and vegetables; typical dietary consumer exposure to pesticide residues from conventional fruits and vegetables does not appear to be of health significance. Similarly, research does not demonstrate that imported fruits and vegetables pose greater risks from pesticide residues than do domestic fruits and vegetables or that specific fruits and vegetables singled out as being the most highly contaminated by pesticides should be avoided in their conventional forms.", "Effect of handling and processing on pesticide residues in food- a review Pesticides are one of the major inputs used for increasing agricultural productivity of crops. The pesticide residues, left to variable extent in the food materials after harvesting, are beyond the control of consumer and have deleterious effect on human health. The presence of pesticide residues is a major bottleneck in the international trade of food commodities. The localization of pesticides in foods varies with the nature of pesticide molecule, type and portion of food material and environmental factors. The food crops treated with pesticides invariably contain unpredictable amount of these chemicals, therefore, it becomes imperative to find out some alternatives for decontamination of foods. The washing with water or soaking in solutions of salt and some chemicals e.g. chlorine, chlorine dioxide, hydrogen peroxide, ozone, acetic acid, hydroxy peracetic acid, iprodione and detergents are reported to be highly effective in reducing the level of pesticides. Preparatory steps like peeling, trimming etc. remove the residues from outer portions. Various thermal processing treatments like pasteurization, blanching, boiling, cooking, steaming, canning, scrambling etc. have been found valuable in degradation of various pesticides depending upon the type of pesticide and length of treatment. Preservation techniques like drying or dehydration and concentration increase the pesticide content many folds due to concentration effect. Many other techniques like refining, fermentation and curing have been reported to affect the pesticide level in foods to varied extent. Milling, baking, wine making, malting and brewing resulted in lowering of pesticide residue level in the end products. Post harvest treatments and cold storage have also been found effective. Many of the decontamination techniques bring down the concentration of pesticides below MRL. However, the diminution effect depends upon the initial concentration at the time of harvest, substrate/food and type of pesticide. There is diversified information available in literature on the effect of preparation, processing and subsequent handling and storage of foods on pesticide residues which has been compiled in this article.", "Reduction of pesticide residues on produce by rinsing. In 1997 this laboratory initiated a research program with the objective of examining the effect that rinsing of produce with tap water would have on pesticide residues. Samples were obtained from local markets and/or grown at our experimental farm. Because approximately 35% of produce from retail sources contains pesticide residues, growing and treating produce at an experimental farm had the advantage that all such samples contain pesticide residues. Pesticides were applied under normal field conditions to a variety of food crops and the vegetation was allowed to undergo natural weathering prior to harvest. The resulting samples contained field-incurred or \\\"field-fortified\\\" residues. This experimental design was employed to mimic as closely as possible real world samples. Crops were treated, harvested, and divided into equal subsamples. One subsample was processed unwashed, whereas the other was rinsed under tap water. The extraction and analysis method used was a multi-residue method developed in our laboratory. Twelve pesticides were included in this study: the fungicides captan, chlorothalonil, iprodione, and vinclozolin; and the insecticides endosulfan, permethrin, methoxychlor, malathion, diazinon, chlorpyrifos, bifenthrin, and DDE (a soil metabolite of DDT). Statistical analysis of the data using the Wilcoxon signed-rank test showed that rinsing removed residues for nine of the twelve pesticides studied. Residues of vinclozolin, bifenthrin, and chlorpyrifos were not reduced. The rinsability of a pesticide is not correlated with its water solubility."], ["Richard Pearson Strong and the iatrogenic plague disaster in Bilibid Prison, Manila, 1906. In November 1906, Richard Pearson Strong, then head of the Philippine Biological Laboratory, inoculated 24 men--inmates of Manila's Bilibid Prison--with a cholera vaccine that somehow had been contaminated with plague organisms; 13 men died. The governor-general of the Philippines appointed a general committee to investigate the affair, and the U.S. Senate demanded information about the episode. Although the Senate, the secretary of war, and even the president were kept informed of developments, no mainland investigations ensued. The general committee concluded that Strong was negligent for not having locks on his incubators and for leaving a visiting physician alone in the laboratory, where he might have mixed up the cholera and plague cultures on the fateful day. The committee's charge was referred to the attorney general, who found Strong innocent of criminal negligence, whereupon the governor-general exonerated Strong. Strong was despondent over Bilibid but recovered and developed a noteworthy career in American tropical medicine. In retrospect, the disaster at Bilibid presents an epitome of the problems surrounding the use of prisoner-subjects without authorization and without their voluntary consent. Far ahead of its time, the general committee recognized and condemned the shortcomings and urged reform, pleas the government ignored. The Bilibid episode remains, however, as a cautionary tale for those engaged in clinical research.", "A Multicountry Ecological Study of Cancer Incidence Rates in 2008 with Respect to Various Risk-Modifying Factors Observational and ecological studies are generally used to determine the presence of effect of cancer risk-modifying factors. Researchers generally agree that environmental factors such as smoking, alcohol consumption, poor diet, lack of physical activity, and low serum 25-hdyroxyvitamin D levels are important cancer risk factors. This ecological study used age-adjusted incidence rates for 21 cancers for 157 countries (87 with high-quality data) in 2008 with respect to dietary supply and other factors, including per capita gross domestic product, life expectancy, lung cancer incidence rate (an index for smoking), and latitude (an index for solar ultraviolet-B doses). The factors found to correlate strongly with multiple types of cancer were lung cancer (direct correlation with 12 types of cancer), energy derived from animal products (direct correlation with 12 types of cancer, inverse with two), latitude (direct correlation with six types, inverse correlation with three), and per capita gross national product (five types). Life expectancy and sweeteners directly correlated with three cancers, animal fat with two, and alcohol with one. Consumption of animal products correlated with cancer incidence with a lag time of 15\u201325 years. Types of cancer which correlated strongly with animal product consumption, tended to correlate weakly with latitude; this occurred for 11 cancers for the entire set of countries. Regression results were somewhat different for the 87 high-quality country data set and the 157-country set. Single-country ecological studies have inversely correlated nearly all of these cancers with solar ultraviolet-B doses. These results can provide guidance for prevention of cancer.", "Marine edible algae as disease preventers. As modern lifestyles and new feeding habits settle in the world, noncommunicable diseases (NCDs) have evolved to be major causes of disability in developing as well as developed countries. As a concomitant effect, there is a growing interest in natural, healthy food and an increasing awareness of risk factors and determinants of disease. This chapter describes some nutritional facts about seaweeds, which have been used as food since ancient times in China, Japan, Egypt, and India and comments on the potential utilization of marine algae as functional foods. This concept and the description of metabolic syndrome are used as a basis to comprehension of seaweeds against two dreadful illnesses of our times: high blood pressure and cancer. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Does Flavanol Intake Influence Mortality from Nitric Oxide-Dependent Processes? Ischemic Heart Disease, Stroke, Diabetes Mellitus, and Cancer in Panama Substantial data suggest that flavonoid-rich food could help prevent cardiovascular disease and cancer. Cocoa is the richest source of flavonoids, but current processing reduces the content substantially. The Kuna living in the San Blas drink a flavanol-rich cocoa as their main beverage, contributing more than 900 mg/day and thus probably have the most flavonoid-rich diet of any population. We used diagnosis on death certificates to compare cause-specific death rates from year 2000 to 2004 in mainland and the San Blas islands where only Kuna live. Our hypothesis was that if the high flavanoid intake and consequent nitric oxide system activation were important the result would be a reduction in the frequency of ischemic heart disease, stroke, diabetes mellitus, and cancer \u2013 all nitric oxide sensitive processes. There were 77,375 deaths in mainland Panama and 558 deaths in the San Blas. In mainland Panama, as anticipated, cardiovascular disease was the leading cause of death (83.4 \u00b1 0.70 age adjusted deaths/100,000) and cancer was second (68.4 \u00b1 1.6). In contrast, the rate of CVD and cancer among island-dwelling Kuna was much lower (9.2 \u00b1 3.1) and (4.4 \u00b1 4.4) respectively. Similarly deaths due to diabetes mellitus were much more common in the mainland (24.1 \u00b1 0.74) than in the San Blas (6.6 \u00b1 1.94). This comparatively lower risk among Kuna in the San Blas from the most common causes of morbidity and mortality in much of the world, possibly reflects a very high flavanol intake and sustained nitric oxide synthesis activation. However, there are many risk factors and an observational study cannot provide definitive evidence.", "Global fishmeal and fish-oil supply: inputs, outputs and markets. Recent data on fishmeal and fish-oil supply are presented identifying key producer countries and raw material sources and distinguishing between whole fish and by-products. The conversion of these raw materials into marine ingredients is discussed and global volumes presented. This is followed by a summary of the main countries using these marine ingredients over recent years. Uses of fishmeal and fish-oil by market segment are then presented. From this, a global mass balance of inputs and outputs is derived which allows the calculation of the input-to-output ratios (fish in:fish out; FIFO) for the main aquaculture production types to be made. Current areas of focus by the industry include the need to demonstrate sustainable practice, more strategic use of marine ingredients, greater use of fishery and land-animal by-products as well as vegetable substitutes, and novel sources of essential omega-3 fats, notably the long-chain polyunsaturated fatty acids, eicosapentaenoic (EPA) and docosahexaenoic (DHA) acids. Implications are drawn for future supply prospects of fishmeal and fish-oil and their future role in aquaculture, agriculture and human health. \u00a9 2013 The Fisheries Society of the British Isles."], ["The role of phytic acid in legumes: antinutrient or beneficial function? This review describes the present state of knowledge about phytic acid (phytate), which is often present in legume seeds. The antinutritional effects of phytic acid primarily relate to the strong chelating associated with its six reactive phosphate groups. Its ability to complex with proteins and particularly with minerals has been a subject of investigation from chemical and nutritional viewpoints. The hydrolysis of phytate into inositol and phosphates or phosphoric acid occurs as a result of phytase or nonenzymatic cleavage. Enzymes capable of hydrolysing phytates are widely distributed in micro-organisms, plants and animals. Phytases act in a stepwise manner to catalyse the hydrolysis of phytic acid. To reduce or eliminate the chelating ability of phytate, dephosphorylation of hexa- and penta-phosphate forms is essential since a high degree of phosphorylation is necessary to bind minerals. There are several methods of decreasing the inhibitory effect of phytic acid on mineral absorption (cooking, germination, fermentation, soaking, autolysis). Nevertheless, inositol hexaphosphate is receiving increased attention owing to its role in cancer prevention and/or therapy and its hypocholesterolaemic effect.", "Phytate in foods and significance for humans: food sources, intake, processing, bioavailability, protective role and analysis. The article gives an overview of phytic acid in food and of its significance for human nutrition. It summarises phytate sources in foods and discusses problems of phytic acid/phytate contents of food tables. Data on phytic acid intake are evaluated and daily phytic acid intake depending on food habits is assessed. Degradation of phytate during gastro-intestinal passage is summarised, the mechanism of phytate interacting with minerals and trace elements in the gastro-intestinal chyme described and the pathway of inositol phosphate hydrolysis in the gut presented. The present knowledge of phytate absorption is summarised and discussed. Effects of phytate on mineral and trace element bioavailability are reported and phytate degradation during processing and storage is described. Beneficial activities of dietary phytate such as its effects on calcification and kidney stone formation and on lowering blood glucose and lipids are reported. The antioxidative property of phytic acid and its potentional anticancerogenic activities are briefly surveyed. Development of the analysis of phytic acid and other inositol phosphates is described, problems of inositol phosphate determination and detection discussed and the need for standardisation of phytic acid analysis in foods argued.", "Effect of phytic acid on the absorption, distribution, and endogenous excretion of zinc in rats. Zinc metabolism in male rats was studied by combining nutritional balance methods with an analysis of 65Zn kinetics. The rats, two groups of 84 each, were fed zinc-adequate diets (33 ppm Zn) with either 0 (basal) or 2% phytic acid added as sodium phytate. A fourth-order exponential function described the time-course of 65Zn in plasma, and compartmental models were developed accordingly. Plasma zinc exchanged more rapidly with zinc in liver and kidneys than it did with zinc in testes, skeletal muscle, or bone. Total body zinc content (2.6 mg/100 g live body weight) measured chemically was about 9 times higher than estimates of exchangeable zinc in the body. Whole-body retention of 65Zn was higher and endogenous fecal zinc excretion was lower in rats fed phytate than in those fed the basal diet; these responses to phytate may reflect a homeostatic adjustment to decreased absorption of zinc. Respective values for apparent absorption and true absorption of zinc were 13 and 32% of zinc intake in rats fed phytate, and 19 and 46% of zinc intake in rats fed the basal diet. When whole grains or mature seeds constitute a major portion of the diet, the phytate: zinc molar ratio may approach that (60:1) used in our study. Whether or not phytic acid occurring naturally in foods affects zinc metabolism to the same extent as sodium phytate can not be determined from our study.", "Neuroprotective effect of the natural iron chelator, phytic acid in a cell culture model of Parkinson's disease. Disrupted iron metabolism and excess iron accumulation has been reported in the brains of Parkinson's disease (PD) patients. Because excessive iron can induce oxidative stress subsequently causing degradation of nigral dopaminergic neurons in PD, we determined the protective effect of a naturally occurring iron chelator, phytic acid (IP6), on 1-methyl-4-phenylpyridinium (MPP(+))-induced cell death in immortalized rat mesencephalic/dopaminergic cells. Cell death was induced with MPP(+) in normal and iron-excess conditions and cytotoxicity was measured by thiazolyl blue tetrazolium bromide (MTT assay) and trypan blue staining. Apoptotic cell death was also measured with caspase-3 activity, DNA fragmentation, and Hoechst nuclear staining. Compared to MPP(+) treatment, IP6 (30 micromol/L) increased cell viability by 19% (P<0.05) and decreased cell death by 22% (P<0.05). A threefold increase in caspase-3 activity (P<0.001) and a twofold increase in DNA fragmentation (P<0.05) with MPP(+) treatment was decreased by 55% (P<0.01) and 52% (P<0.05), respectively with IP6. Cell survival was increased by 18% (P<0.05) and 42% (P<0.001) with 30 and 100 micromol/L of IP6, respectively in iron-excess conditions. A 40% and 52% (P<0.001) protection was observed in caspase-3 activity with 30 and 100 micromol/L IP6, respectively in iron-excess condition. Similarly, a 45% reduction (P<0.001) in DNA fragmentation was found with 100 micromol/L IP6. In addition, Hoechst nuclear staining results confirmed the protective effect of IP6 against apoptosis. Similar protection was also observed with the differentiated cells. Collectively, our results demonstrate a significant neuroprotective effect of phytate in a cell culture model of PD.", "Phytate (myo-inositol hexaphosphate) and risk factors for osteoporosis. Several risk factors seem to play a role in the development of osteoporosis. Phytate is a naturally occurring compound that is ingested in significant amounts by those with diets rich in whole grains. The aim of this study was to evaluate phytate consumption as a risk factor in osteoporosis. In a first group of 1,473 volunteer subjects, bone mineral density was determined by means of dual radiological absorptiometry in the calcaneus. In a second group of 433 subjects (used for validation of results obtained for the first group), bone mineral density was determined in the lumbar column and the neck of the femur. Subjects were individually interviewed about selected osteoporosis risk factors. Dietary information related to phytate consumption was acquired by questionnaires conducted on two different occasions, the second between 2 and 3 months after performing the first one. One-way analysis of variance or Student's t test was used to determine statistical differences between groups. Bone mineral density increased with increasing phytate consumption. Multivariate linear regression analysis indicated that body weight and low phytate consumption were the risk factors with greatest influence on bone mineral density. Phytate consumption had a protective effect against osteoporosis, suggesting that low phytate consumption should be considered an osteoporosis risk factor."], ["Fructose: It\u2019s \u201cAlcohol Without the Buzz\u201d What do the Atkins Diet and the traditional Japanese diet have in common? The Atkins Diet is low in carbohydrate and usually high in fat; the Japanese diet is high in carbohydrate and usually low in fat. Yet both work to promote weight loss. One commonality of both diets is that they both eliminate the monosaccharide fructose. Sucrose (table sugar) and its synthetic sister high fructose corn syrup consist of 2 molecules, glucose and fructose. Glucose is the molecule that when polymerized forms starch, which has a high glycemic index, generates an insulin response, and is not particularly sweet. Fructose is found in fruit, does not generate an insulin response, and is very sweet. Fructose consumption has increased worldwide, paralleling the obesity and chronic metabolic disease pandemic. Sugar (i.e., fructose-containing mixtures) has been vilified by nutritionists for ages as a source of \u201cempty calories,\u201d no different from any other empty calorie. However, fructose is unlike glucose. In the hypercaloric glycogen-replete state, intermediary metabolites from fructose metabolism overwhelm hepatic mitochondrial capacity, which promotes de novo lipogenesis and leads to hepatic insulin resistance, which drives chronic metabolic disease. Fructose also promotes reactive oxygen species formation, which leads to cellular dysfunction and aging, and promotes changes in the brain\u2019s reward system, which drives excessive consumption. Thus, fructose can exert detrimental health effects beyond its calories and in ways that mimic those of ethanol, its metabolic cousin. Indeed, the only distinction is that because fructose is not metabolized in the central nervous system, it does not exert the acute neuronal depression experienced by those imbibing ethanol. These metabolic and hedonic analogies argue that fructose should be thought of as \u201calcohol without the buzz.\u201d", "Evaluation of phenolic compounds in commercial fruit juices and fruit drinks. The total phenolic content of 13 commercially available fruit juices and juice drinks, selected to represent the most popular juice flavors in the United Kingdom, were analyzed using the Folin-Ciocalteu assay. Individual phenolic compounds were identified and quantified using HPLC-PDA-MS2. The catechin content and degree of polymerization of proanthocyanidins were also analyzed. Purple grape juice contained the largest number of individual phenolic compounds and also the highest concentration of total phenolics. The main components were flavan-3-ols, anthocyanins, and hydroxycinnamates, which accounted for 93% of the total phenolic content. In contrast, white grape juice, which contained principally hydroxycinnamates, had the lowest total phenolic content. Antioxidant activity was measured using the ORAC and FRAP assays, and the data obtained were in broad agreement with total phenol content. In view of the recent findings of the Kame project indicating that long-term fruit juice consumption can provide protection against Alzheimer's disease (Dai et al. Am. J. Med. 2006, 379, 464-475), it is suggested that the protective effects may be enhanced by consumption of a combination of juices rich in phenolics and containing a diverse variety of individual phenolic compounds, namely, juices derived from purple grapes, grapefruit, cranberries, and apples.", "From beans to berries and beyond: teamwork between plant chemicals for protection of optimal human health. It is now well known to consumers around the world that certain fruits and vegetables can help prevent or treat chronic human diseases. But, what many people don't fully appreciate is that it is not a single component in these plant-derived foods, but rather complex mixtures of interacting natural chemicals, that produce such powerful health-protective effects. These natural components accumulate simultaneously together in a plant, and provide a multifaceted defensive strategy for both the plant, and the human consumer. In order to investigate the strength of natural chemical cooperation in highly-pigmented, flavonoid-rich functional foods, our lab has relied on analysis of both whole fruits, and continuous, reliable plant cell culture production systems which accumulate anthocyanins and proanthocyanidins in high concentrations. Successive rounds of relatively gentle, rapid, and large-volume fractionations are linked to bioassay of complex to simple mixtures and semi-purified compounds. By means of this strategy, additive interactions or synergies between related compounds in health maintenance can be sorted out. Interestingly, phytochemical interactions between the same classes of compounds intensify the efficacy of flavonoid-rich fruits against multiple, not necessarily discrete, human disease conditions including CVD, cancer, metabolic syndrome, and others.", "International multidimensional authenticity specification (IMAS) algorithm for detection of commercial pomegranate juice adulteration. The pomegranate fruit ( Punica granatum ) has become an international high-value crop for the production of commercial pomegranate juice (PJ). The perceived consumer value of PJ is due in large part to its potential health benefits based on a significant body of medical research conducted with authentic PJ. To establish criteria for authenticating PJ, a new International Multidimensional Authenticity Specifications (IMAS) algorithm was developed through consideration of existing databases and comprehensive chemical characterization of 45 commercial juice samples from 23 different manufacturers in the United States. In addition to analysis of commercial juice samples obtained in the United States, data from other analyses of pomegranate juice and fruits including samples from Iran, Turkey, Azerbaijan, Syria, India, and China were considered in developing this protocol. There is universal agreement that the presence of a highly constant group of six anthocyanins together with punicalagins characterizes polyphenols in PJ. At a total sugar concentration of 16 degrees Brix, PJ contains characteristic sugars including mannitol at >0.3 g/100 mL. Ratios of glucose to mannitol of 4-15 and of glucose to fructose of 0.8-1.0 are also characteristic of PJ. In addition, no sucrose should be present because of isomerase activity during commercial processing. Stable isotope ratio mass spectrometry as > -25 per thousand assures that there is no added corn or cane sugar added to PJ. Sorbitol was present at <0.025 g/100 mL; maltose and tartaric acid were not detected. The presence of the amino acid proline at >25 mg/L is indicative of added grape products. Malic acid at >0.1 g/100 mL indicates adulteration with apple, pear, grape, cherry, plum, or aronia juice. Other adulteration methods include the addition of highly concentrated aronia, blueberry, or blackberry juices or natural grape pigments to poor-quality juices to imitate the color of pomegranate juice, which results in abnormal anthocyanin profiles. To adjust the astringent taste of poor-quality juice or peel extract, addition of nonpomegranate sugars is a commonly detected adulteration method. The profile generated from these analyses combined with information from existing databases and published literature has been integrated into a validated IMAS for PJ, which can be utilized to detect PJ adulteration. In this survey of commercial pomegranate juices, only 6 of 23 strictly met all of the IMAS criteria.", "The fruit of the date palm: its possible use as the best food for the future? The fruits (dates) of the date palm (Phoenix dactylifera L.) contain a high percentage of carbohydrate (total sugars, 44-88%), fat (0.2-0.5%), 15 salts and minerals, protein (2.3-5.6%), vitamins and a high percentage of dietary fibre (6.4-11.5%). The flesh of dates contains 0.2-0.5% oil, whereas the seed contains 7.7-9.7% oil. The weight of the seed is 5.6-14.2% of the date. The fatty acids occur in both flesh and seed as a range of saturated and unsaturated acids, the seeds containing 14 types of fatty acids, but only eight of these fatty acids occur in very low concentration in the flesh. Unsaturated fatty acids include palmitoleic, oleic, linoleic and linolenic acids. The oleic acid content of the seeds varies from 41.1 to 58.8%, which suggests that the seeds of date could be used as a source of oleic acid. There are at least 15 minerals in dates. The percentage of each mineral in dried dates varies from 0.1 to 916 mg/100 g date depending on the type of mineral. In many varieties, potassium can be found at a concentration as high as 0.9% in the flesh while it is as high as 0.5% in some seeds. Other minerals and salts that are found in various proportions include boron, calcium, cobalt, copper, fluorine, iron, magnesium, manganese, potassium, phosphorous, sodium and zinc. Additionally, the seeds contain aluminum, cadmium, chloride, lead and sulphur in various proportions. Dates contain elemental fluorine that is useful in protecting teeth against decay. Selenium, another element believed to help prevent cancer and important in immune function, is also found in dates. The protein in dates contains 23 types of amino acids, some of which are not present in the most popular fruits such as oranges, apples and bananas. Dates contain at least six vitamins including a small amount of vitamin C, and vitamins B(1) thiamine, B(2) riboflavin, nicotinic acid (niacin) and vitamin A. The dietary fibre of 14 varieties of dates has been shown to be as high as 6.4-11.5% depending on variety and degree of ripeness. Dates contain 0.5-3.9% pectin, which may have important health benefits. The world production of dates has increased 2.9 times over 40 years, whereas the world population has doubled. The total world export of dates increased by 1.71% over 40 years. In many ways, dates may be considered as an almost ideal food, providing a wide range of essential nutrients and potential health benefits."], ["Effects of plant-based diets on plasma lipids. Dyslipidemia is a primary risk factor for cardiovascular disease, peripheral vascular disease, and stroke. Current guidelines recommend diet as first-line therapy for patients with elevated plasma cholesterol concentrations. However, what constitutes an optimal dietary regimen remains a matter of controversy. Large prospective trials have demonstrated that populations following plant-based diets, particularly vegetarian and vegan diets, are at lower risk for ischemic heart disease mortality. The investigators therefore reviewed the published scientific research to determine the effectiveness of plant-based diets in modifying plasma lipid concentrations. Twenty-seven randomized controlled and observational trials were included. Of the 4 types of plant-based diets considered, interventions testing a combination diet (a vegetarian or vegan diet combined with nuts, soy, and/or fiber) demonstrated the greatest effects (up to 35% plasma low-density lipoprotein cholesterol reduction), followed by vegan and ovolactovegetarian diets. Interventions allowing small amounts of lean meat demonstrated less dramatic reductions in total cholesterol and low-density lipoprotein levels. In conclusion, plant-based dietary interventions are effective in lowering plasma cholesterol concentrations.", "The effects of a low-fat, plant-based dietary intervention on body weight, metabolism, and insulin sensitivity. PURPOSE: This study investigated the effect of a low-fat, plant-based diet on body weight, metabolism, and insulin sensitivity, while controlling for exercise in free-living individuals. SUBJECTS AND METHODS: In an outpatient setting, 64 overweight, postmenopausal women were randomly assigned to a low-fat, vegan diet or a control diet based on National Cholesterol Education Program guidelines, without energy intake limits, and were asked to maintain exercise unchanged. Dietary intake, body weight and composition, resting metabolic rate, thermic effect of food, and insulin sensitivity were measured at baseline and 14 weeks. RESULTS: Mean +/- standard deviation intervention-group body weight decreased 5.8 +/- 3.2 kg, compared with 3.8 +/- 2.8 kg in the control group (P = .012). In a regression model of predictors of weight change, including diet group and changes in energy intake, thermic effect of food, resting metabolic rate, and reported energy expenditure, significant effects were found for diet group (P < .05), thermic effect of food (P < .05), and resting metabolic rate (P < .001). An index of insulin sensitivity increased from 4.6 +/- 2.9 to 5.7 +/- 3.9 (P = .017) in the intervention group, but the difference between groups was not significant (P = .17). CONCLUSION: Adoption of a low-fat, vegan diet was associated with significant weight loss in overweight postmenopausal women, despite the absence of prescribed limits on portion size or energy intake.", "Pilot dietary study with normoproteic protein-redistributed plant-food diet and motor performance in patients with Parkinson's disease. Although a plant-based diet can provide some benefits in Parkinson's disease (PD), no study to date has evaluated the effectiveness of a plant-food diet in the management of the disease. In this pilot study, we compared the effect of a plant-food menu (PFD) and of a omnivorous menu on motor performance of 25 PD patients, 12 in the intervention group (PDi) and 13 in the control group (PDc). After 4 weeks, the PDi group showed a significant reduction (Mann-Whitney test) in the Unified Parkinson's Disease Rating Scale, total score (47.67 vs. 74.46, P = 0.008) and sub-score III motor performances (25.42 vs. 46.46, P = 0.001), and the modified Hoehn and Yahr Staging Scale (1.96 vs. 3.15, P = 0.005). These data suggest that PFD may be useful in the management of PD patients by improving their motor performances. Additional studies are needed in order to confirm these preliminary results.", "Resolving the Coronary Artery Disease Epidemic Through Plant-Based Nutrition. The world's advanced countries have easy access to plentiful high-fat food; ironically, it is this rich diet that produces atherosclerosis. In the world's poorer nations, many people subsist on a primarily plant-based diet, which is far healthier, especially in terms of heart disease. To treat coronary heart disease, a century of scientific investigation has produced a device-driven, risk factor-oriented strategy. Nevertheless, many patients treated with this approach experience progressive disability and death. This strategy is a rear-guard defensive one. In contrast, compelling data from nutritional studies, population surveys, and interventional studies support the effectiveness of a plant-based diet and aggressive lipid lowering to arrest, prevent, and selectively reverse heart disease. In essence, this is an offensive strategy. The single biggest step toward adopting this strategy would be to have United States dietary guidelines support a plant-based diet. An expert committee purged of industrial and political influence is required to assure that science is the basis for dietary recommendations. (c)2001 CHF, Inc.", "Resolving the Coronary Artery Disease Epidemic Through Plant-Based Nutrition. The world's advanced countries have easy access to plentiful high-fat food; ironically, it is this rich diet that produces atherosclerosis. In the world's poorer nations, many people subsist on a primarily plant-based diet, which is far healthier, especially in terms of heart disease. To treat coronary heart disease, a century of scientific investigation has produced a device-driven, risk factor-oriented strategy. Nevertheless, many patients treated with this approach experience progressive disability and death. This strategy is a rear-guard defensive one. In contrast, compelling data from nutritional studies, population surveys, and interventional studies support the effectiveness of a plant-based diet and aggressive lipid lowering to arrest, prevent, and selectively reverse heart disease. In essence, this is an offensive strategy. The single biggest step toward adopting this strategy would be to have United States dietary guidelines support a plant-based diet. An expert committee purged of industrial and political influence is required to assure that science is the basis for dietary recommendations. (c)2001 CHF, Inc."], ["Potato glycoalkaloids: true safety or false sense of security? As one of the major agricultural crops, the cultivated potato is consumed each day by millions of people from diverse cultural backgrounds. A product of global importance, the potato tuber contains toxic glycoalkaloids (GAs) that cause sporadic outbreaks of poisoning in humans, as well as many livestock deaths. This article will discuss some aspects of the potato GAs, including their toxic effects and risk factors, methods of detection of GAs and biotechnological aspects of potato breeding. An attempt has been made to answer a question of vital importance - are potato GAs dangerous to humans and animals and, if so, to what extent?", "Aloe-induced Toxic Hepatitis Aloe has been widely used in phytomedicine. Phytomedicine describes aloe as a herb which has anti-inflammatory, anti-proliferative, anti-aging effects. In recent years several cases of aloe-induced hepatotoxicity were reported. But its pharmacokinetics and toxicity are poorly described in the literature. Here we report three cases with aloe-induced toxic hepatitis. A 57-yr-old woman, a 62-yr-old woman and a 55-yr-old woman were admitted to the hospital for acute hepatitis. They had taken aloe preparation for months. Their clinical manifestation, laboratory findings and histologic findings met diagnostic criteria (RUCAM scale) of toxic hepatitis. Upon discontinuation of the oral aloe preparations, liver enzymes returned to normal level. Aloe should be considered as a causative agent in hepatotoxicity.", "The toxicity of extracts of plant parts of Moringa stenopetala in HEPG2 cells in vitro. The cytotoxicity of extracts from a widely used species of plant, Moringa stenopetala, was assessed in HEPG2 cells, by measuring the leakage of lactate dehydrogenase (LDH) and cell viability. The functional integrity of extract-exposed cells was determined by measuring intracellular levels of ATP and glutathione (GSH). The ethanol extracts of leaves and seeds increased significantly (p < 0.01) LDH leakage in a dose- and time-dependent manner. The water extract of leaves and the ethanol extract of the root did not increase LDH leakage. A highly significant (p < 0.001) decrease in HEPG2 viability was found after incubating the cells with the highest concentration (500 microg/mL) of the ethanol leaf and seed extracts. At a concentration of 500 microg/mL, the water extract of leaves increased (p < 0.01), while the ethanol extract of the same plant part decreased (p < 0.01), ATP levels. The root and seed extracts had no significant effect on ATP levels. The ethanol leaf extract decreased GSH levels at a concentration of 500 microg/mL (p < 0.01), as did the ethanol extract of the seeds at 250 microg/mL and 500 microg/mL (p < 0.05). The water extract of the leaves did not alter GSH or LDH levels or affect cell viability, suggesting that it may be non-toxic, and is consistent with its use as a vegetable. The data obtained from the studies with the ethanol extract of the leaves and seeds from Moringa stenopetala show that they contain toxic substances that are extractable with organic solvents or are formed during the process of extraction with these solvents. The significant depletion of ATP and GSH only occurred at concentrations of extract that caused leakage of LDH. Further investigation with this plant in order to identify the constituents extracted and their individual toxic effects both in vivo and in vitro is warranted. This study also illustrates the utility of cell culture for screening plant extracts for potential toxicity. Copyright (c) 2005 John Wiley & Sons, Ltd.", "Antidiabetic drugs used in Europe prior to the discovery of insulin. Many therapeutic agents had been used for the treatment of diabetes mellitus before insulin was discovered and several hundred plants have shown some extent of antidiabetic activity. This study tries to explore which agents were most widely used in Europe in the pre-insulin era. According to the scientific literature and the proprietary drug industry around 1900, more than 100 agents were considered to have hypoglycemic activity. Most of them seem to have been used only occasionally while some others were recommended and marketed to a large extent. Among the medicinal plants, Syzygium cumini (syn. S. jambolanum, Eugenia jambolana), Vaccinum myrtillus and Phaseolus sp. were most common, and other frequently used agents were opium, opium alkaloids, other alkaloids like quinine or Belladonna alkaloids, salicylates, alkaline substances like sodium (bi)carbonate and even strong poisons like arsenic or uranium salts. Syzygium jambolanum seed powder seems to be one of the most intensively studied antidiabetic agents of plant origin.", "TRP channel blamed for burning cold after a tropical fish meal EMBO J (2012) 31 19, 3795\u20133808 doi:10.1038/emboj.2012.207; published online July312012 Ciguatera is one of the most common forms of food poisoning, occurring after consumption of fish contaminated with ciguatoxins. New work by Vetter et al (2012) reveals the key molecular players that underlie the altered temperature sensation associated with ciguatera. In particular, they show that ciguatoxins act on sensory neurons that express TRPA1, an ion channel implicated in the detection of noxious cold."], ["Bisphenol A (BPA) in U.S. food. Bisphenol A (BPA) is a chemical used for lining metal cans and in polycarbonate plastics, such as baby bottles. In rodents, BPA is associated with early sexual maturation, altered behavior, and effects on prostate and mammary glands. In humans, BPA is associated with cardiovascular disease, diabetes, and male sexual dysfunction in exposed workers. Food is a major exposure source. We know of no studies reporting BPA in U.S. fresh food, canned food, and food in plastic packaging in peer reviewed journals. We measured BPA levels in 105 fresh and canned foods, foods sold in plastic packaging, and in cat and dog foods in cans and plastic packaging. We detected BPA in 63 of 105 samples, including fresh turkey, canned green beans, and canned infant formula. Ninety-three of these samples were triplicates which had similar detected levels. Detected levels ranged from 0.23 to 65.0 ng/g ww and were not associated with type of food or packaging but did vary with pH. BPA levels were higher for foods of pH 5 compared to more acidic and alkaline foods. Detected levels were comparable to those found by others. Further research is indicated to determine BPA levels in U.S. food in larger, representative sampling.", "p-Nonyl-phenol: an estrogenic xenobiotic released from \\\"modified\\\" polystyrene. Alkylphenols are widely used as plastic additives and surfactants. We report the identification of an alkylphenol, nonylphenol, as an estrogenic substance released from plastic centrifuge tubes. This compound was extracted with methanol, purified by flash chromatography and reverse-phase high performance liquid chromatography, and identified by gas chromatography-mass spectrometry. Nonylphenol induced both cell proliferation and progesterone receptor in human estrogen-sensitive MCF7 breast tumor cells. Nonylphenol also triggered mitotic activity in rat endometrium; this result confirms the reliability of the MCF7 cell proliferation bioassay. The estrogenic properties of alkylphenols, specifically nonylphenols, indicate that the use of plasticware containing these chemicals in experimental and diagnostic tests may lead to spurious results, and these compounds as well as alkylphenol polyethoxylates may also be potentially harmful to exposed humans and the environment at large.", "Effect of IP6 on human neutrophil cytokine production and cell morphology. Inositol hexaphosphate (IP6) has anti-cancer properties, but recently other extracellular functions have been observed for IP6, including enhancing superoxide production and phagocytosis by neutrophils in the presence of microbial stimuli. This study investigated other inflammatory functions of IP6 on adherent neutrophils. The effect of IP6 on the release of IL-8, tumour necrosis factor (TNF-alpha) and IL-6 by neutrophils attached to either plastic or laminin for up to 6 hours in response to stimulation with lipopolysaccharide or N-formyl-Met-Leu-Phe (fMLP) was investigated. An increase in IL-8 secretion by stimulated cells occurred in the presence of IP6. The incubation of cells attached to laminin with IP6 alone (100-250 BM) did not effect cell morphology, but in the presence of 10(-7) M fMLP altered cell shape. A direct effect of IP6 on cell function was to trigger a sustained assembly of F-actin. Thus, exposure of neutrophils to low levels of IP6 appears to modulate selective neutrophil functions.", "Bronchiolitis obliterans and consumer exposure to butter-flavored microwave popcorn: a case series. Respiratory exposure to diacetyl and diacetyl-containing flavorings used in butter-flavored microwave popcorn (BFMP) causes lung disease, including bronchiolitis obliterans (BO), in flavorings and popcorn manufacturing workers. However, there are no published reports of lung disease among BFMP consumers. We present a case series of three BFMP consumers with biopsy-confirmed BO. We review data relating to consumer exposures, estimate case exposures, and compare them to diacetyl-containing flavoring-exposed manufacturing workers with lung disease. These consumer cases' exposure levels are comparable to those that caused disease in workers. We were unable to identify any other exposures or diseases known or suspected to cause BO in these cases. BFMP poses a significant respiratory risk to consumers. Some manufacturers have substituted diacetyl with other alpha-diketones that are likely to pose a similar risk. Simple consumer practices such as cooling the popcorn bag would eliminate the risk of severe lung disease.", "Inhibitory effect of oatmeal extract oligomer on vasoactive intestinal peptide-induced inflammation in surviving human skin. The aim of this study was to evaluate the antiinflammatory effect of oatmeal extract oligomer on skin fragments stimulated by a neuromediator, vasoactive intestinal peptide (VIP). Skin fragments (from plastic surgery) were maintained in survival conditions for 6 h. To induce inflammation, VIP was placed in contact with dermis by culture medium. Histological analysis was then performed on hematoxylin- and eosin-stained slides. Edema was evaluated with semiquantitative scores. Vasodilation was studied by quantifying the percentage of dilated vessels according to scores and by measuring their surface by morphometrical image analysis. TNF-alpha dosage was made on culture supernatants. Vasodilation was significantly increased after application of VIP. After treatment with oatmeal extract oligomer, the mean surface of dilated vessels and edema were significantly decreased compared with VIP-treated skin. Moreover, treatment with this extract decreased TNF-alpha."], ["From pig to pork: methicillin-resistant Staphylococcus aureus in the pork production chain. Methicillin-resistant Staphylococcus aureus (MRSA) is a major global public health concern and could be a food safety issue. Recurrent reports have documented that pig herds are an important reservoir for MRSA, specifically the livestock-associated sequence type 398. The high prevalence of MRSA in pig primary production facilities and the frequent detection of MRSA of the same types in pork and pig meat products raise the question of underlying mechanisms behind the introduction and transmission of MRSA along the pork production chain. A comprehensive review of current literature on the worldwide presence of livestock-associated MRSA in various steps of the pork production chain revealed that the slaughter process plays a decisive role in MRSA transmission from farm to fork. Superficial heat treatments such as scalding and flaming during the slaughter process can significantly reduce the burden of MRSA on the carcasses. However, recontamination with MRSA might occur via surface treating machinery, as a result of fecal contamination at evisceration, or via increased human handling during meat processing. By optimizing processes for carcass decontamination and avoiding recontamination by effective cleaning and personal hygiene management, transmission of MRSA from pig to pork can be minimized.", "Outbreak of progressive inflammatory neuropathy following exposure to aerosolized porcine neural tissue. In the fall of 2007, the Minnesota Department of Health was notified of 11 cases of an unexplained neurological illness, all linked to a pork processing plant, Quality Pork Processors, Inc., in Austin, MN. The cluster of workers had been experiencing similar symptoms, including fatigue, pain, numbness, and tingling in their extremities as well as weakness. The symptoms were described as more sensory than motor, and all patients had evidence of polyradiculoneuropathy with signs of nerve root irritation. An epidemiological investigation revealed that the only commonality between cases was their exposure to a pork brain extraction procedure involving compressed air. As relatives of the cases remained asymptomatic and all cultures for known pathogens were negative, the etiology of the syndrome seemed not to be infectious. Clinically, the syndrome was most akin to chronic inflammatory demyelinating polyneuropathy. Laboratory tests corroborated the clinical findings, revealing inflammation of peripheral nerves and nerve roots; however, these cases also had features clinically distinct from chronic inflammatory demyelinating polyneuropathy as well as laboratory testing revealing a novel immunoglobulin G immunostaining pattern. This suggested that the observed inflammation was the result of 1 or more unidentified antigens. This syndrome was ultimately dubbed progressive inflammatory neuropathy and was theorized to be an autoimmune reaction to aerosolized porcine neural tissue. Since the investigation's outset, 18 cases of progressive inflammatory neuropathy have been identified at the Minnesota pork processing plant, with 5 similar cases at an Indiana plant and 1 case at a Nebraskan plant. The plants in which cases have been identified have since stopped the use of compressed air in removing pork brains. All cases have stabilized or improved, with some requiring immunosuppressive and analgesic treatment. The study of progressive inflammatory neuropathy is ongoing, and the details of this investigation highlight the value of epidemiological principles in the identification and containment of outbreaks while researchers attempt to uncover the unique pathophysiology and potential etiology of the illness. Mt Sinai J Med 76:442-447, 2009. (c) 2009 Mount Sinai School of Medicine.", "Survey of naturally and conventionally cured commercial frankfurters, ham, and bacon for physio-chemical characteristics that affect bacterial growth. Natural and organic food regulations preclude the use of sodium nitrite/nitrate and other antimicrobials for processed meat products. Consequently, processors have begun to use natural nitrate/nitrite sources, such as celery juice/powder, sea salt, and turbinado sugar, to manufacture natural and organic products with cured meat characteristics but without sodium nitrite. The objective of this study was to compare physio-chemical characteristics that affect Clostridium perfringens and Listeria monocytogenes growth in naturally cured and traditionally cured commercial frankfurters, hams, and bacon. Correlations of specific product characteristics to pathogen growth varied between products and pathogens, though water activity, salt concentration, and product composition (moisture, protein and fat) were common intrinsic factors correlated to pathogen growth across products. Other frequently correlated traits were related to curing reactions such as % cured pigment. Residual nitrite and nitrate were significantly correlated to C. perfringens growth but only for the ham products. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "N-Nitroso compounds in the diet. N-Nitroso compounds were known almost 40 years ago to be present in food treated with sodium nitrite, which made fish meal hepatotoxic to animals through formation of nitrosodimethylamine (NDMA). Since that time, N-nitroso compounds have been shown in animal experiments to be the most broadly acting and the most potent group of carcinogens. The key role of nitrite and nitrogen oxides in forming N-nitroso compounds by interaction with secondary and tertiary amino compounds has led to the examination worldwide of foods for the presence of N-nitroso compounds, which have been found almost exclusively in those foods containing nitrite or which have become exposed to nitrogen oxides. Among these are cured meats, especially bacon-and especially when cooked; concentrations of 100 micrograms kg(-1) have been found or, more usually, near 10 micrograms kg(-1). This would correspond to consumption of 1 microgram of NDMA in a 100-g portion. Much higher concentrations of NDMA (but lower ones of other nitrosamines) have been found in Japanese smoked and cured fish (more than 100 micrograms kg(-1)). Beer is one source of NDMA, in which as much as 70 micrograms l(-1) has been reported in some types of German beer, although usual levels are much lower (10 or 5 micrograms l(-1)); this could mean a considerable intake for a heavy beer drinker of several liters per day. Levels of nitrosamines have been declining during the past three decades, concurrent with a lowering of the nitrite used in food and greater control of exposure of malt to nitrogen oxides in beer making. There have been declines of N-nitroso compound concentrations in many foods during the past two decades. The small amounts of nitrosamines in food are nonetheless significant because of the possibility-even likelihood-that humans are more sensitive to these carcinogens than are laboratory rodents. Although it is probable that alkylnitrosamides (which induce brain tumors in rodents) are present in cured meats and other potentially nitrosated products in spite of much searching, there has been only limited indirect evidence of their presence. Copyright 1999 Elsevier Science B.V.", "Formation and biochemistry of carcinogenic heterocyclic aromatic amines in cooked meats. Heteroyclic aromatic amines (HAAs) are a class of hazardous chemicals that are receiving heightened attention as a risk factor for human cancer. HAAs arise during the cooking of meats, fish, and poultry, and several HAAs also occur in tobacco smoke condensate and diesel exhaust. Many HAAs are carcinogenic and induce tumors at multiple sites in rodents. A number of epidemiologic studies have reported that frequent consumption of well-done cooked meats containing HAAs can result in elevated risks for colon, prostate, and mammary cancers. Moreover, DNA adducts of HAAs have been detected in human tissues, demonstrating that HAAs induce genetic damage even though the concentrations of these compounds in cooked meats are generally in the low parts-per-billion (ppb) range. With recent improvements in sensitivity of mass spectrometry instrumentation, HAAs, their metabolites, and DNA adducts can be detected at trace amounts in biological fluids and tissues of humans. The incorporation of HAA biomarkers in epidemologic studies will help to clarify the role of these dietary genotoxicants in the etiology of human cancer."], ["Mortality in the Baltimore union poultry cohort: non-malignant diseases. BACKGROUND: Workers in poultry plants have high exposure to a variety of transmissible agents present in poultry and their products. Subjects in the general population are also exposed. It is not known whether many of these agents cause disease in humans. If they do, we reason this would be readily evident in a highly exposed group such as poultry workers. We report here on mortality from non-malignant diseases in a cohort of poultry workers. METHODS: Mortality was compared with that of the US general population, and with that of a comparison group from the same union. Risk was estimated by standardized mortality ratio, proportional mortality ratio, and directly standardized risk ratio. RESULTS: Poultry workers as a group had an overall excess of deaths from diabetes, anterior horn disease, and hypertensive disease, and a deficit of deaths from intracerebral hemorrhage. Deaths from zoonotic bacterial diseases, helminthiasis, myasthenia gravis, schizophrenia, other diseases of the spinal cord, diseases of the esophagus and peritonitis were non-significantly elevated overall by all analyses, and significantly so in particular race/sex subgroups. CONCLUSIONS: Poultry workers may have excess occurrence of disease affecting several organs and systems, probably originating from widespread infection with a variety of microorganisms. The results for neurologic diseases could well represent important clues to the etiology of these diseases in humans. The small numbers of deaths involved in some cases limit interpretation.", "Occupational exposure assessment using antibody levels: exposure to avian leukosis/sarcoma viruses in the poultry industry. Avian leukosis/sarcoma viruses (ALSV) infect and cause cancers in chickens. Poultry workers are exposed to ALSV and other infectious agents in the workplace. This study examines if industrial hygiene assessment of antibody levels in poultry workers can identify risky job tasks at the higher exposure risk to an infectious agent, i.e., ALSV. We compared ALSV antibody levels in poultry workers and control subjects. Occupational and demographical factors were examined for an association with the exposure risk in poultry workers. We found that the antibody levels were significantly higher in poultry workers than in control subjects. Job category and age together were significantly associated with the antibody levels in workers. Certain job tasks were identified with significantly higher antibody levels as compared to others, implying that recommendations should be made to protect workers at these jobs. The findings of this study indicate that the measurement of antibody levels in workers can be useful for industrial hygiene assessment of exposure to infectious agents.", "Industrial hygiene assessment of reticuloendotheliosis viruses exposure in the poultry industry. OBJECTIVES: Reticuloendotheliosis viruses (REV) are a group of retroviruses like avian leukosis/sarcoma viruses (ALSV) that naturally infect and cause cancers in chickens. We recently found that ALSV antibody levels were associated with job tasks in the poultry industry. The objectives of this study are to examine whether a similar association can be found with REV antibody levels and to examine the correlation between REV and ALSV antibody levels. METHODS: Relative risk was estimated comparing REV antibody levels of 45 poultry workers with those of 44 controls. The expected mean antibody level was predicted for the association with employment by a generalized linear model. Correlation coefficient was measured between ALSV and REV antibody levels. RESULTS: REV antibody levels were significantly higher in poultry workers than in control subjects and were associated with gender and employment conditions, especially employment duration. The relative risk was significantly higher for some job categories. A significant correlation was observed between REV and ALSV antibody levels, which was strong among poultry workers, but weak among the control subjects. CONCLUSION: Antibody levels can be validly used to identify certain job tasks associated with high risk of exposure to REV in the workplace, and the practical implication is recommendations for protection at these job tasks. Importantly, in situations where there is exposure to multiple pathogens in the workplace, the analysis of antibody levels of one pathogen may sufficiently represent exposure to the other correlated pathogens. This suggested exposure assessment may hold true for pathogens with a similar route of transmission.", "The effectiveness of hygiene procedures for prevention of cross-contamination from chicken carcases in the domestic kitchen. Thirteen sites in each of 60 domestic kitchens were examined for Salmonella and Campylobacter spp. following the preparation of a chicken for cooking and the application of different hygiene regimes. During food preparation bacteria became widely disseminated to hand and food contact surfaces. Where cleaning was carried out with detergent and hot water using a prescribed routine there was no significant decrease in the frequency of contaminated surfaces. Where hypochlorite was used in addition, a significant reduction in the number of contaminated sites was observed. The study suggests that there is a need to better understand and promote effective hygiene procedures for the domestic kitchen.", "Influence of keeping pheasants in captivity vs. nature on the biological value of meat and its use in human nutrition. The life of game birds (pheasants) in nature is coupled with a number of difficulties in all seasons of the year. This refers to finding food, breeding, laying eggs, raising the young, fleeing from their natural enemies and lack of protection from unfavorable climatic conditions. The pheasants that live in captivity--aviaries for pheasants--do not have such difficulties--they are fed regularly by quality feed for pheasants, they are protected from bad weather and natural enemies. Our research was aimed at determining the biological value of meat of pheasants grown in the two different settings--in captivity and in nature. The highest weight achieved wild pheasant males (1232.4 +/- 147.36 g). The differences between tested pheasant groups were statistically very high significant (P < 0.001). The differences between groups related to breast weight and tights with drumsticks weight were statistically very high significant (P < 0.001). Between breast parts (%) and legs parts (%) were notified very high (P < 0.001) i.e. high (P = 0.002) differences. The highest weight breast muscles and tights with drumsticks had wild pheasants (282.6 +/- 63.53 g i.e. 206.2 +/- 37.88g). Wilde pheasants had lower part (%) and lighter (g) skin with subcutaneous fatty tissue on breasts. Female pheasants cultivated on both ways had higher skin part (%) and subcutaneous fatty tissue in tights with drumsticks. Related to chemical composition of breast muscles is established statistically significant differences (P < 0.001 i.s. P = 0.040)) in part of Ca (%) and P (%). In wild pheasant tights with drumsticks muscles established statistically very significant (P < 0.001) higher part of moisture, protein and Ca, i.e. statistically very high significant (P < 0.001) lower part of fat and energetic value. Research results indicate that the quality of meat of pheasants grown in nature has higher biological value than the meat of pheasants kept in aviaries, which means it has advantages in human nutrition."], ["Essentials of Healthy Eating: A Guide Enough solid evidence now exists to offer women several fundamental strategies for healthy eating. They include emphasizing healthful unsaturated fats, whole grains, good protein \u201cpackages,\u201d and fruits and vegetables; limiting consumption of trans and saturated fats, highly refined grains, and sugary beverages; and taking a multivitamin with folic acid and extra vitamin D as a nutritional safety net. A diet based on these principles is healthy through virtually all life stages, from young adulthood through planning for pregnancy, pregnancy, and on into old age.", "First trimester curtailment of iron absorption: innate suppression of a teratogen? In human pregnancies, maternal absorption of iron is markedly curtailed in the first trimester. In a murine model, iron was teratogenic in the analogous embryonic period. Although iron is a weak mutagen, it is a powerful oxidant and a catalyst of formation of hydroxyl radicals. Studies are needed to determine if there might be an association of first trimester iron supplementation with miscarriage/fetal abnormalities.", "Nowhere to hide: Chemical toxicants and the unborn child. Contemporary reproductive aged women and their offspring are facing an unprecedented onslaught of toxicant exposures from myriad sources in their day-to-day life. Public health recommendations regarding optimal diet and nutrition in pregnancy must incorporate several considerations including safety of available foodstuffs, cultural practices and lifestyle issues. Gestational consumption of contaminated seafood remains a potential source of toxicant exposure, including mercury, for the developing child. Health care professionals responsible for the care of women and their developing children need to become apprised of: a) risks associated with toxicant bioaccumulation in pregnancy; b) ongoing information emerging in the important field of reproductive toxicology; and c) strategies within the clinical setting to facilitate nutritional sufficiency and precautionary avoidance of adverse exposure among young women.", "Safety considerations and potential interactions of vitamins: should vitamins be considered drugs? OBJECTIVE: To examine adverse effects, adverse events, and potential interactions of vitamins in light of their current prevalence of use, and to discuss whether vitamins should be considered over-the-counter drugs or natural health products/dietary supplements. DATA SOURCES: We performed a MEDLINE/PubMed search, explored 4 online databases (Medline Plus, Drug Digest, Natural Medicine Comprehensive Database, and the database of the University of Maryland), and examined reference lists of included studies published from 1966 through October 2009. STUDY SELECTION AND DATA EXTRACTION: The studies were reviewed, with an emphasis on randomized controlled clinical trials. We included articles with the most clinically important information with regard to adverse events and interactions. DATA SYNTHESIS: Vitamins are used by over one third of the North American population. Vitamins have documented adverse effects and toxicities, and most have documented interactions with drugs. While some vitamins (biotin, pantothenic acid, riboflavin, thiamine, vitamin B(12), vitamin K) have minor and reversible adverse effects, others, such as fat-soluble vitamins (A, E, D), can cause serious adverse events. Two water-soluble vitamins, folic acid and niacin, can also have significant toxicities and adverse events. CONCLUSIONS: Our recommendation is that vitamins A, E, D, folic acid, and niacin should be categorized as over-the-counter medications. Labeling of vitamins, especially those intended for children and other vulnerable groups, should include information on possible toxicities, dosing, recommended upper intake limits, and concurrent use with other products. Vitamin A should be excluded from multivitamin supplements and food fortificants.", "[Consequences of exclusive breast-feeding in vegan mother newborn--case report]. We report on the case of an infant who was hospitalized because of failure to thrive, megaloblastic anemia, and delayed psychomotor development. He was 10 months old and had been exclusively breast-fed by his vegan mother. Investigations showed vitamin B(12) deficiency with hematocytopenia and pervasive developmental disorders as well as vitamin K and vitamin D deficiencies. The infant's mother presented the same deficiencies. Introduction of vitamin supplementation normalized the biological disorders, and the infant showed weight gain and neurological improvement. This case highlights that a vegan diet during pregnancy followed by exclusive breast-feeding can induce nutritional deficiencies in the newborn, with clinical consequences. Detecting mother and child vitamin deficiencies and preventing them is essential."], ["Serum prolactin and oestradiol levels in women with cyclical mastalgia. Basal serum prolactin and serum oestradiol-17-beta concentrations were measured four times during one menstrual cycle in 20 women with severe cyclical mastalgia and normal to slightly fibroadenotic breasts. A group of 10 normal women who had never experienced mastalgia served as controls. Basal serum prolactin was significantly elevated in patients compared to normals, although within the normal range. Serum oestradiol concentrations did not differ in the two groups and were also within the normal range. A significant positive correlation between oestradiol and prolactin was found in patients and normals, but with larger prolactin levels in patients. The results point towards a prolactin secretory hypersensitivity for oestradiol in patients with cyclical mastalgia. Prolactin is considered a central factor in the eliciting of cyclical mastalgia.", "A double blind trial of the prolactin inhibitor bromocriptine in painful benign breast disease. A double blind crossover trial of the prolactin inhibitor bromocriptine in painful benign breast disease is reported. Twenty-nine women with cyclical mastalgia and 11 with non-cyclical pain were treated with bromocriptine, 5 mg daily, and placebo over six menstrual cycels. Assessment of response to treatment was made by a linear analogue system and clinical examination together with plasma prolactin estimations. Bromocriptine produced a significant improvement in breast symptoms and a significant fall in prolactin levels in the cyclical pain group, but had no effect in the non-cyclical group. These results suggest that bromocriptine offers a new and effective approach in the management of cyclical breast pain.", "Identification of peptide hormones of the amphipathic helix class using the helical hydrophobic moment algorithm. Eisenberg's helical hydrophobic moment (less than mu H greater than) algorithm was applied to the analysis of the primary structure of amphipathic alpha-helical peptide hormones and an optimal method for identifying other peptides of this class determined. We quantitate and compare known amphipathic helical peptide hormones with a second group of peptides with proven nonamphipathic properties and determine the best method of distinguishing between them. The respective means of the maximum 11 residue less than mu H greater than for the amphipathic helical and control peptides were 0.46 (+/-/-0.07) and 0.33 (0.07) (P + 0.004). To better reflect the amphipathic potential of the entire peptide, the percent of 11 residue segments in each peptide above a particular less than mu H greater than was plotted vs less than mu H greater than. The resulting curves are referred to as HM-C. The mean HM-C (of the two groups) was highly significantly different such that the HM-C method was superior to others in its ability to distinguish amphipathic from nonamphipathic peptides. Several potential new members of this structural class were identified using this approach. Molecular modeling of a portion of one of these, prolactin inhibitory factor, reveals a strongly amphipathic alpha helix at residues 4-21. This computer-based method may enable rapid identification of peptides of the amphipathic alpha-helix class.", "Evidence for acne-promoting effects of milk and other insulinotropic dairy products. Acne vulgaris, the most common skin disease of western civilization, has evolved to an epidemic affecting more than 85% of adolescents. Acne can be regarded as an indicator disease of exaggerated insulinotropic western nutrition. Especially milk and whey protein-based products contribute to elevations of postprandial insulin and basal insulin-like growth factor-I (IGF-I) plasma levels. It is the evolutional principle of mammalian milk to promote growth and support anabolic conditions for the neonate during the nursing period. Whey proteins are most potent inducers of glucose-dependent insulinotropic polypeptide secreted by enteroendocrine K cells which in concert with hydrolyzed whey protein-derived essential amino acids stimulate insulin secretion of pancreatic \u03b2-cells. Increased insulin/IGF-I signaling activates the phosphoinositide-3 kinase/Akt pathway, thereby reducing the nuclear content of the transcription factor FoxO1, the key nutrigenomic regulator of acne target genes. Nuclear FoxO1 deficiency has been linked to all major factors of acne pathogenesis, i.e. androgen receptor transactivation, comedogenesis, increased sebaceous lipogenesis, and follicular inflammation. The elimination of the whey protein-based insulinotropic mechanisms of milk will be the most important future challenge for nutrition research. Both, restriction of milk consumption or generation of less insulinotropic milk will have an enormous impact on the prevention of epidemic western diseases like obesity, diabetes mellitus, cancer, neurodegenerative diseases and acne. Copyright \u00a9 2011 S. Karger AG, Basel.", "Probiotics function mechanistically as delivery vehicles for neuroactive compounds: Microbial endocrinology in the design and use of probiotics. I hypothesize here that the ability of probiotics to synthesize neuroactive compounds provides a unifying microbial endocrinology-based mechanism to explain the hitherto incompletely understood action of commensal microbiota that affect the host's gastrointestinal and psychological health. Once ingested, probiotics enter an interactive environment encompassing microbiological, immunological, and neurophysiological components. By utilizing a trans-disciplinary framework known as microbial endocrinology, mechanisms that would otherwise not be considered become apparent since any candidate would need to be shared among all three components. The range of neurochemicals produced by probiotics includes neurochemicals for which receptor-based targets on immune and neuronal elements (intestinal and extra-intestinal) have been well characterized. Production of neurochemicals by probiotics therefore allows for their consideration as delivery vehicles for neuroactive compounds. This unifying microbial endocrinology-based hypothesis, which may facilitate the selection and design of probiotics for clinical use, also highlights the largely unrecognized role of neuroscience in understanding how microbes may influence health. Copyright \u00a9 2011 WILEY Periodicals, Inc."], ["Report: prunes and liver function: a clinical trial. Prunes are used by folks as a remedy of various diseases including hepatitis. A clinical trial was designed to see the effects of prunes (Prunus domestica) on liver function. 166 healthy volunteers were divided into three groups randomly. Either three (about 11.43g) or six (23g approx.) prunes were soaked in a glass of water (250ml) overnight. Each subject from two test groups was asked to drink prune juice & eat whole fruit(single or double dose of prunes) as well, early in the morning, daily for 8 weeks; whereas each subject from control group was given a glass of water to drink. Blood samples were taken at week 0 and week 8 for chemical analysis. There was significant reduction of serum alanine transaminase (p 0.048) and serum alkaline phosphatase (p 0.017) by the lower dose of prunes. There was no change in serum aspartate transaminase and bilirubin. Alteration in liver function by use of prunes may have clinical relevance in appropriate cases and prunes might prove beneficial in hepatic disease.", "Randomised clinical trial: dried plums (prunes) vs. psyllium for constipation. BACKGROUND: Treatment of chronic constipation remains challenging with 50% of patients dissatisfied with current therapy. There is an unmet need for natural and safe alternatives. Dried plums (prunes) have been used traditionally for constipation but their efficacy is not known. Aim To assess and compare the effects of dried plums and psyllium in patients with chronic constipation. METHODS: Subjects were enrolled in an 8-week, single-blind, randomised cross-over study. Subjects received either dried plums (50 g b.d., fibre=6 gm/day) or psyllium (11 g b.d., fibre=6 gm/day) for 3 weeks each, in a crossover trial with a 1-week washout period. Subjects maintained a daily symptom and stool diary. Assessments included number of complete spontaneous bowel movements per week, global relief of constipation, stool consistency, straining, tolerability and taste. RESULTS: Forty constipated subjects (m/f=3/37, mean age=38 years) participated. The number of complete spontaneous bowel movements per week (primary outcome measure) and stool consistency scores improved significantly (P<0.05) with dried plums when compared to psyllium. Straining and global constipation symptoms did not differ significantly between treatments (P=N.S.). Dried plums and psyllium were rated as equally palatable and both were safe and well tolerated. CONCLUSION: Dried plums are safe, palatable and more effective than psyllium for the treatment of mild to moderate constipation, and should be considered as a first line therapy. \u00a9 2011 Blackwell Publishing Ltd.", "Comparison of health-relevant flavonoids in commonly consumed cranberry products. The human health benefits from consumption of cranberry products have been associated with the fruits' unique flavonoid composition, including a complex profile of anthocyanins and proanthocyanidins. However, when processed by techniques such as pressing, canning, concentrating, or drying, a number of these natural components may be compromised or inactivated due to physical separation, thermal degradation, or oxidation. Fresh cranberries were compared to freeze-dried berries and individual fruit tissues (skin and peeled fruit). Products examined included cranberry juices (commercial and prepared from concentrate), cranberry sauces (commercial and homemade), and sweetened-dried cranberries (commercial). Freeze-drying resulted in no detectable losses of anthocyanins or proanthocyanidins from cranberry fruits. Anthocyanins were localized in the skin. Proanthocyanins were higher in the skin than in the flesh, with the exception of procyanidin A-2 dimer which was concentrated in the flesh. Anthocyanins were significantly higher in not-from-concentrate juice than in reconstituted juice from concentrate (8.3 mg and 4.2 mg/100 mL, respectively). Similarly, proanthocyanidins were markedly higher in not-from-concentrate juice compared to juice from concentrate (23.0 mg and 8.9 mg/100 mL, respectively). Homemade sauce contained far higher anthocyanins and proanthocyanidins (15.9 and 87.9 mg/100 g, respectively) than canned sauces processed with whole berries (9.6 and 54.4 mg/100 g, respectively) or jelled-type (1.1 and 16 mg/100 g, respectively). Sweetened-dried cranberries were quite low in anthocyanins (7.9 mg/100 g), but they still retained considerable proanthocyanidins (64.2 mg/100 g). Commercially processed products contained significantly lower levels of polyphenols as compared to fresh and home-processed preparations. Anthocyanins were more sensitive to degradation than proanthocyanidins. PRACTICAL APPLICATION: As cranberry juices and other products are increasingly consumed for their recognized health benefits (including prophylaxis against urinary tract infection), it is relevant to consider how various degrees of commercial and home processing can alter innate levels of the biologically active flavonoids (especially anthocyanins and proanthocyanidins) characteristic to the intact fruits. \u00a9 2012 Institute of Food Technologists\u00ae", "Lignans in man and in animal species. In our laboratories, for several years, two phenolic compounds have been detected during gas chromatographic-mass spectrometric analysis of urinary steroid extracts from human and animal species. Although features of the mass spectra of their trimethylsilyl (TMS) ether derivatives resembled those of oestrogens, they were atypical of steroids. The possibility that they were artefacts of the isolation procedures was discounted after careful studies with blanks, by varying the extraction method and because they were present almost exclusively as conjugates of glucuronic acid. Several of the general characteristics of the unknown compounds were reported after one (referred to as compound 180/442) was found to have a cyclic pattern of excretion during the menstrual cycle of an adult vervet monkey (Fig. 1). An investigation of the nature and distribution of the compounds has shown them to be urinary constituents in humans, baboons, vervet monkeys and rats, and further related compounds have been detected, so far only in vervet monkey urine. We now report spectroscopic and chemical studies that show the two original compounds to be lignans, which have a 2,3-dibenzylbutane skeleton as their basic structure. Unlike all previously known natural lignans, invariably of plant origin, the two mammalian compounds carry phenolic hydroxy groups only in the meta position of the aromatic rings.", "Human gut microbiota does not ferment erythritol. Erythritol, a naturally occurring polyol, is gaining attention as a bulk sweetener for human nutrition. Industrially, it is produced from glucose by fermentation. From various studies it is known to be non-cariogenic. Moreover, it is rapidly absorbed in the small intestine and quantitatively excreted in the urine. Only about 10 % enters the colon. Earlier in vitro experiments showed that erythritol remained unfermented for a fermentation period of 12 h. In order to investigate whether fresh human intestinal microbiota is able to adapt its enzyme activities to erythritol, a 24 h lasting fermentation was carried out under well-standardised in vitro conditions. For comparison maltitol, lactulose and blank (faecal inoculum only) were incubated as well. Fermentation patterns were established by following total gas production, hydrogen accumulation, changes in pH value, SCFA production and substrate degradation. Taking all fermentation parameters into account, erythritol turned out to be completely resistant to bacterial attack within 24 h, thus excluding an adaptation within that period. Since under in vivo conditions more easily fermentable substrates enter the colon continuously, it seems very unlikely that erythritol will be fermented in vivo."], ["The case of the purple colon. Purple discoloration of the large bowel at autopsy was related to beetroot ingestion and post-mortem changes.", "Cranberry and blueberry: evidence for protective effects against cancer and vascular diseases. Growing evidence from tissue culture, animal, and clinical models suggests that the flavonoid-rich fruits of the North American cranberry and blueberry (Vaccinium spp.) have the potential ability to limit the development and severity of certain cancers and vascular diseases including atherosclerosis, ischemic stroke, and neurodegenerative diseases of aging. The fruits contain a variety of phytochemicals that could contribute to these protective effects, including flavonoids such as anthocyanins, flavonols, and proanthocyanidins; substituted cinnamic acids and stilbenes; and triterpenoids such as ursolic acid and its esters. Cranberry and blueberry constituents are likely to act by mechanisms that counteract oxidative stress, decrease inflammation, and modulate macromolecular interactions and expression of genes associated with disease processes. The evidence suggests a potential role for dietary cranberry and blueberry in the prevention of cancer and vascular diseases, justifying further research to determine how the bioavailability and metabolism of berry phytonutrients influence their activity in vivo.", "Energy and Fructose From Beverages Sweetened With Sugar or High-Fructose Corn Syrup Pose a Health Risk for Some People Sugar intake in the United States has increased by >40 fold since the American Revolution. The health concerns that have been raised about the amounts of sugar that are in the current diet, primarily as beverages, are the subject of this review. Just less than 50% of the added sugars (sugar and high-fructose corn syrup) are found in soft drinks and fruit drinks. The intake of soft drinks has increased 5-fold between 1950 and 2000. Most meta-analyses have shown that the risk of obesity, diabetes, cardiovascular disease, and metabolic syndrome are related to consumption of beverages sweetened with sugar or high-fructose corn syrup. Calorically sweetened beverage intake has also been related to the risk of nonalcoholic fatty liver disease, and, in men, gout. Calorically sweetened beverages contribute to obesity through their caloric load, and the intake of beverages does not produce a corresponding reduction in the intake of other food, suggesting that beverage calories are \u201cadd-on\u201d calories. The increase in plasma triglyceride concentrations by sugar-sweetened beverages can be attributed to fructose rather than glucose in sugar. Several randomized trials of sugar-containing soft drinks versus low-calorie or calorie-free beverages show that either sugar, 50% of which is fructose, or fructose alone increases triglycerides, body weight, visceral adipose tissue, muscle fat, and liver fat. Fructose is metabolized primarily in the liver. When it is taken up by the liver, ATP decreases rapidly as the phosphate is transferred to fructose in a form that makes it easy to convert to lipid precursors. Fructose intake enhances lipogenesis and the production of uric acid. By worsening blood lipids, contributing to obesity, diabetes, fatty liver, and gout, fructose in the amounts currently consumed is hazardous to the health of some people.", "Amla (Emblica officinalis Gaertn), a wonder berry in the treatment and prevention of cancer. Emblica officinalis Gaertn. or Phyllanthus emblica Linn, commonly known as Indian gooseberry or amla, is arguably the most important medicinal plant in the Indian traditional system of medicine, the Ayurveda. Various parts of the plant are used to treat a range of diseases, but the most important is the fruit. The fruit is used either alone or in combination with other plants to treat many ailments such as common cold and fever; as a diuretic, laxative, liver tonic, refrigerant, stomachic, restorative, alterative, antipyretic, anti-inflammatory, hair tonic; to prevent peptic ulcer and dyspepsia, and as a digestive. Preclinical studies have shown that amla possesses antipyretic, analgesic, antitussive, antiatherogenic, adaptogenic, cardioprotective, gastroprotective, antianemia, antihypercholesterolemia, wound healing, antidiarrheal, antiatherosclerotic, hepatoprotective, nephroprotective, and neuroprotective properties. In addition, experimental studies have shown that amla and some of its phytochemicals such as gallic acid, ellagic acid, pyrogallol, some norsesquiterpenoids, corilagin, geraniin, elaeocarpusin, and prodelphinidins B1 and B2 also possess antineoplastic effects. Amla is also reported to possess radiomodulatory, chemomodulatory, chemopreventive effects, free radical scavenging, antioxidant, anti-inflammatory, antimutagenic and immunomodulatory activities, properties that are efficacious in the treatment and prevention of cancer. This review for the first time summarizes the results related to these properties and also emphasizes the aspects that warrant future research to establish its activity and utility as a cancer preventive and therapeutic drug in humans.", "Date fruits (Phoenix dactylifera Linn): an emerging medicinal food. Date palm is one of the oldest trees cultivated by man. In the folk-lore, date fruits have been ascribed to have many medicinal properties when consumed either alone or in combination with other herbs. Although, fruit of the date palm served as the staple food for millions of people around the world for several centuries, studies on the health benefits are inadequate and hardly recognized as a healthy food by the health professionals and the public. In recent years, an explosion of interest in the numerous health benefits of dates had led to many in vitro and animal studies as well as the identification and quantification of various classes of phytochemicals. On the basis of available documentation in the literature on the nutritional and phytochemical composition, it is apparent that the date fruits are highly nutritious and may have several potential health benefits. Although dates are sugar-packed, many date varieties are low GI diet and refutes the dogma that dates are similar to candies and regular consumption would develop chronic diseases. More investigations in these areas would validate its beneficial effects, mechanisms of actions, and fully appreciate as a potential medicinal food for humans all around the world. Therefore, in this review we summarize the phytochemical composition, nutritional significance, and potential health benefits of date fruit consumption and discuss its great potential as a medicinal food for a number of diseases inflicting human beings."], ["Biological Clues to Potent DNA-Damaging Activities in Food and Flavoring Population differences in age-related diseases and cancer could stem from differences in diet. To characterize DNA strand-breaking activities in selected foods/beverages, flavorings, and some of their constituent chemicals, we used p53R cells, a cellular assay sensitive to such breaks. Substances testing positive included reference chemicals: quinacrine (peak response, 51X) and etoposide (33X); flavonoids: EGCG (19X), curcumin (12X), apigenin (9X), and quercetin (7X); beverages: chamomile (11X), green (21X), and black tea (26X) and coffee (3 to 29X); and liquid smoke (4 to 28X). Damage occurred at dietary concentrations: etoposide near 5 \u03bcg/ml produced responses similar to a 1:1000 dilution of liquid smoke, a 1:20 dilution of coffee, and a 1:5 dilution of tea. Pyrogallol-related chemicals and tannins are present in dietary sources and individually produced strong activity: pyrogallol (30X), 3-methoxycatechol (25X), gallic acid (21X), and 1,2,4-benzenetriol (21X). From structure-activity relationships, high activities depended on specific orientations of hydroxyls on the benzene ring. Responses accompanied cellular signals characteristic of DNA breaks such as H2AX phosphorylation. Breaks were also directly detected by comet assay. Cellular toxicological effects of foods and flavorings could guide epidemiologic and experimental studies of potential disease risks from DNA strand-breaking chemicals in diets.", "Biochemical basis of enhanced drug bioavailability by piperine: evidence that piperine is a potent inhibitor of drug metabolism. Piperine, a major active component of black and long peppers, has been reported to enhance drug bioavailability. The present studies were aimed at understanding the interaction of piperine with enzymatic drug biotransforming reactions in hepatic tissue in vitro and in vivo. Piperine inhibited arylhydrocarbon hydroxylation, ethylmorphine-N-demethylation, 7-ethoxycoumarin-O-deethylation and 3-hydroxy-benzo(a)pyrene glucuronidation in rat postmitochondrial supernatant in vitro in a dose-dependent manner. Piperine inhibition of these reactions in postmitochondrial supernatant from 3-methylcholanthrene- and phenobarbital-treated rats was similar to the controls. Inhibition by piperine of arylhydrocarbon hydroxylase (AHH) from 3-methylcholanthrene-treated rats was comparable to that observed with 7,8-benzoflavone. Piperine caused noncompetitive inhibition of hepatic microsomal AHH from the untreated and 3-methylcholanthrene-treated rats with a Ki of 30 microM which was close to the apparent Km of AHH observed in the controls. Similarly, the kinetics of inhibition of ethylmorphine-N-demethylase from control rat liver microsomes exhibited noncompetitive inhibition with an apparent Km of 0.8 mM and Ki of 35 microM. These studies demonstrated that piperine is a nonspecific inhibitor of drug metabolism which shows little discrimination between different cytochrome P-450 forms. Oral administration of piperine in rats strongly inhibited the hepatic AHH and UDP-glucuronyltransferase activities. The maximal inhibition of AHH observed within 1 hr restored to normal value in 6 hr. Pretreatment with piperine prolonged hexobarbital sleeping time and zoxazolamine paralysis time in mice at half the dose of SKF-525A. These results demonstrate that piperine is a potent inhibitor of drug metabolism.", "Amla (Emblica officinalis Gaertn), a wonder berry in the treatment and prevention of cancer. Emblica officinalis Gaertn. or Phyllanthus emblica Linn, commonly known as Indian gooseberry or amla, is arguably the most important medicinal plant in the Indian traditional system of medicine, the Ayurveda. Various parts of the plant are used to treat a range of diseases, but the most important is the fruit. The fruit is used either alone or in combination with other plants to treat many ailments such as common cold and fever; as a diuretic, laxative, liver tonic, refrigerant, stomachic, restorative, alterative, antipyretic, anti-inflammatory, hair tonic; to prevent peptic ulcer and dyspepsia, and as a digestive. Preclinical studies have shown that amla possesses antipyretic, analgesic, antitussive, antiatherogenic, adaptogenic, cardioprotective, gastroprotective, antianemia, antihypercholesterolemia, wound healing, antidiarrheal, antiatherosclerotic, hepatoprotective, nephroprotective, and neuroprotective properties. In addition, experimental studies have shown that amla and some of its phytochemicals such as gallic acid, ellagic acid, pyrogallol, some norsesquiterpenoids, corilagin, geraniin, elaeocarpusin, and prodelphinidins B1 and B2 also possess antineoplastic effects. Amla is also reported to possess radiomodulatory, chemomodulatory, chemopreventive effects, free radical scavenging, antioxidant, anti-inflammatory, antimutagenic and immunomodulatory activities, properties that are efficacious in the treatment and prevention of cancer. This review for the first time summarizes the results related to these properties and also emphasizes the aspects that warrant future research to establish its activity and utility as a cancer preventive and therapeutic drug in humans.", "Final report on the safety assessment of capsicum annuum extract, capsicum annuum fruit extract, capsicum annuum resin, capsicum annuum fruit powde... Capsicum-derived ingredients function as skin-conditioning agents--miscellaneous, external analgesics, flavoring agents, or fragrance components in cosmetics. These ingredients are used in 19 cosmetic products at concentrations as high as 5%. Cosmetic-grade material may be extracted using hexane, ethanol, or vegetable oil and contain the full range of phytocompounds that are found in the Capsicum annuum or Capsicum frutescens plant (aka red chiles), including Capsaicin. Aflatoxin and N-nitroso compounds (N-nitrosodimethylamine and N-nitrosopyrrolidine) have been detected as contaminants. The ultraviolet (UV) absorption spectrum for Capsicum Annuum Fruit Extract indicates a small peak at approximately 275 nm, and a gradual increase in absorbance, beginning at approximately 400 nm. Capsicum and paprika are generally recognized as safe by the U.S. Food and Drug Administration for use in food. Hexane, chloroform, and ethyl acetate extracts of Capsicum Frutescens Fruit at 200 mg/kg resulted in death of all mice. In a short-term inhalation toxicity study using rats, no difference was found between vehicle control and a 7% Capsicum Oleoresin solution. In a 4-week feeding study, red chilli (Capsicum annuum) in the diet at concentrations up to 10% was relatively nontoxic in groups of male mice. In an 8-week feeding study using rats, intestinal exfoliation, cytoplasmic fatty vacuolation and centrilobular necrosis of hepatocytes, and aggregation of lymphocytes in the portal areas were seen at 10% Capsicum Frutescens Fruit, but not 2%. Rats fed 0.5 g/kg day-1 crude Capsicum Fruit Extract for 60 days exhibited no significant gross pathology at necropsy, but slight hyperemia of the liver and reddening of the gastric mucosa were observed. Weanling rats fed basal diets supplemented with whole red pepper at concentrations up to 5.0% for up to 8 weeks had no pathology of the large intestines, livers, and kidneys, but destruction of the taste buds and keratinization and erosion of the gastrointestinal (GI) tract were noted in groups fed 0.5% to 5.0% red pepper. The results of 9-and 12-month extension of this study showed normal large intestines and kidneys. In rabbits fed Capsicum Annuum Powder at 5 mg/kg day-1 in the diet daily for 12 months damage to the liver and spleen was noted. A rabbit skin irritation test of Capsicum Annuum Fruit Extract at concentrations ranging from 0.1% to 1.0% produced no irritation, but Capsicum Frutescens Fruit Extract induced concentration-dependent (at 25 to 500 microg/ml) cytotoxicity in a human buccal mucosa fibroblast cell line. An ethanol extract of red chili was mutagenic in Salmonella typhimurium TA98, but not in TA100, or in Escherichia coli. Other genotoxicity assays gave a similar pattern of mixed results. Adenocarcinoma of the abdomen was observed in 7/20 mice fed 100 mg red chilies per day for 12 months; no tumors were seen in control animals. Neoplastic changes in the liver and intestinal tumors were observed in rats fed red chili powder at 80 mg/kg day-1 for 30 days, intestinal and colon tumors were seen in rats fed red chili powder and 1,2-dimethyl hydrazine, but no tumors were observed in controls. In another study in rats, however, red chile pepper in the diet at the same dose decreased the number of tumors seen with 1,2-dimethylhydrazine. Other feeding studies evaluated the effect of red chili peppers on the incidence of stomach tumors produced by N-methyl-N'-nitro-N-nitrosoguanidine, finding that red pepper had a promoting effect. Capsicum Frutescens Fruit Extract promoted the carcinogenic effect of methyl(acetoxymethyl)nitrosamine (carcinogen) or benzene hexachloride (hepatocarcinogen) in inbred male and female Balb/c mice dosed orally (tongue application). Clinical findings include symptoms of cough, sneezing, and runny nose in chili factory workers. Human respiratory responses to Capsicum Oleoresin spray include burning of the throat, wheezing, dry cough, shortness of breath, gagging, gasping, inability to breathe or speak, and, rarely, cyanosis, apnea, and respiratory arrest. A trade name mixture containing 1% to 5% Capsicum Frutescens Fruit Extract induced very slight erythema in 1 of 10 volunteers patch tested for 48 h. Capsicum Frutescens Fruit Extract at 0.025% in a repeated-insult patch test using 103 subjects resulted in no clinically meaningful irritation or allergic contact dermatitis. One epidemiological study indicated that chili pepper consumption may be a strong risk factor for gastric cancer in populations with high intakes of chili pepper; however, other studies did not find this association. Capsaicin functions as an external analgesic, a fragrance ingredient, and as a skin-conditioning agent--miscellaneous in cosmetic products, but is not in current use. Capsaicin is not generally recognized as safe and effective by the U.S. Food and Drug Administration for fever blister and cold sore treatment, but is considered to be safe and effective as an external analgesic counterirritant. Ingested Capsaicin is rapidly absorbed from the stomach and small intestine in animal studies. Subcutaneous injection of Capsaicin in rats resulted in a rise in the blood concentration, reaching a maximum at 5 h; the highest tissue concentrations were in the kidney and lowest in the liver. In vitro percutaneous absorption of Capsaicin has been demonstrated in human, rat, mouse, rabbit, and pig skin. Enhancement of the skin permeation of naproxen (nonsteroidal anti-inflammatory agent) in the presence of Capsaicin has also been demonstrated. Pharmacological and physiological studies demonstrated that Capsaicin, which contains a vanillyl moiety, produces its sensory effects by activating a Ca2 +-permeable ion channel on sensory neurons. Capsaicin is a known activator of vanilloid receptor 1. Capsaicin-induced stimulation of prostaglandin biosynthesis has been shown using bull seminal vesicles and rheumatoid arthritis synoviocytes. Capsaicin inhibits protein synthesis in Vero kidney cells and human neuroblastoma SHSY-5Y cells in vitro, and inhibits growth of E. coli, Pseudomonas solanacearum, and Bacillus subtilis bacterial cultures, but not Saccharomyces cerevisiae. Oral LD50 values as low as 161.2 mg/kg (rats) and 118.8 mg/kg (mice) have been reported for Capsaicin in acute oral toxicity studies, with hemorrhage of the gastric fundus observed in some of the animals that died. Intravenous, intraperitoneal, and subcutaneous LD50 values were lower. In subchronic oral toxicity studies using mice, Capsaicin produced statistically significant differences in the growth rate and liver/body weight increases. Capsaicin is an ocular irritant in mice, rats, and rabbits. Dose-related edema was observed in animals receiving Capsaicin injections into the hindpaw (rats) or application to the ear (mice). In guinea pigs, dinitrochlorobenzene contact dermatitis was enhanced in the presence of Capsaicin, injected subcutaneously, whereas dermal application inhibited sensitization in mice. Immune system effects have been observed in neonatal rats injected subcutaneously with Capsaicin. Capsaicin produced mixed results in S. typhimurium micronucleus and sister-chromatid exchange genotoxicity assays. Positive results for Capsaicin were reported in DNA damage assays. Carcinogenic, cocarcinogenic, anticarcinogenic, antitumorigenic, tumor promotion, and anti-tumor promotion effects of Capsaicin have been reported in animal studies. Except for a significant reduction in crown-rump length in day 18 rats injected subcutaneously with Capsaicin (50 mg/kg) on gestation days 14, 16, 18, or 20, no reproductive or developmental toxicity was noted. In pregnant mice dosed subcutaneously with Capsaicin, depletion of substance P in the spinal cord and peripheral nerves of pregnant females and fetuses was noted. In clinical tests, nerve degeneration of intracutaneous nerve fibers and a decrease in pain sensation induced by heat and mechanical stimuli were evident in subjects injected intradermally with Capsaicin. An increase in mean inspiratory flow was reported for eight normal subjects who inhaled nebulized 10(-7) M Capsaicin. The results of provocative and predictive tests involving human subjects indicated that Capsaicin is a skin irritant. Overall, studies suggested that these ingredients can be irritating at low concentrations. Although the genotoxicity, carcinogenicity, and tumor promotion potential of Capsaicin have been demonstrated, so have opposite effects. Skin irritation and other tumor-promoting effects of Capsaicin appear to be mediated through interaction with the same vanilloid receptor. Given this mechanism of action and the observation that many tumor promoters are irritating to the skin, the Panel considered it likely that a potent tumor promoter may also be a moderate to severe skin irritant. Thus, a limitation on Capsaicin content that would significantly reduce its skin irritation potential is expected to, in effect, lessen any concerns relating to tumor promotion potential. Because Capsaicin enhanced the penetration of an anti-inflammatory agent through human skin, the Panel recommends that care should be exercised in using ingredients that contain Capsaicin in cosmetic products. The Panel advised industry that the total polychlorinated biphenyl (PCB)/pesticide contamination should be limited to not more than 40 ppm, with not more than 10 ppm for any specific residue, and agreed on the following limitations for other impurities: arsenic (3 mg/kg max), heavy metals (0.002% max), and lead (5 mg/kg max). Industry was also advised that aflatoxin should not be present in these ingredients (the Panel adopted < or =15 ppb as corresponding to \\\"negative\\\" aflatoxin content), and that ingredients derived from Capsicum annuum and Capsicum Frutescens Plant species should not be used in products where N-nitroso compounds may be formed. (ABSTRACT TRUNCATED)", "Physical activity increases the bioavailability of flavanones after dietary aronia-citrus juice intake in triathletes. Control and triathlete volunteers (n=8 and n=15, respectively) were given 400 mL and 200 mL of aronia-citrus juice (AC-juice), respectively. The 24h urine samples were hydrolysed to determine the flavanones concentration by UPLC-QqQ-MS/MS. The flavanones metabolites in both groups of volunteers were glucuronides, sulfates, and sulfo-glucuronides, and the total excretion of flavanones increased fivefold in the triathletes compared with the control volunteers. The increase of ninefold in the homoeriodictyol of triathletes compared to control volunteers may suggest the overactivation of the microbiota metabolism caused by physical exercise. No differences concerning the bioavailability were detected between men and women in controlboth groups. The AC-juice could provide synergistic effects on health due to the increase in the bioavailability of flavanones, avoiding the deleterious effects caused by the overdosage of nutritional supplements. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved."], ["Rapamycin (AY-22,989), a new antifungal antibiotic. I. Taxonomy of the producing streptomycete and isolation of the active principle. A streptomycete was isolated from an Easter Island soil sample and found to inhibit Candida albicans, Microsporum gypseum and Trichophyton granulosum. The antibiotic-producing microorganism was characterized and identified as Streptomyces hygroscopicus. The antifungal principle was extracted with organic solvent from the mycelium, isolated in crystalline form and named rapamycin. Rapamycin is mainly active against Candida albicans; minimum inhibitory concentration against ten strains ranged from 0.02 to 0.2 mug/ml. Its apparent activity against Microsporum gypseum and Trichophyton granulosum is lower because of its instability in culture media on prolonged incubation required by these fungi. No activity was observed against gram-positive and gram-negative bacteria. Acute toxicity in mice is low.", "Rapalogs in cancer prevention Common cancer is an age-related disease. Slow aging is associated with reduced and delayed carcinogenesis. Calorie restriction (CR), the most studied anti-aging intervention, prevents cancer by slowing down the aging process. Evidence is emerging that CR decelerates aging by deactivating MTOR (Target of Rapamycin). Rapamycin and other rapalogs suppress cellular senescence, slow down aging and postpone age-related diseases including cancer. At the same time, rapalogs are approved for certain cancer treatments. Can cancer prevention be explained by direct targeting of cancer cells? Or does rapamycin prevent cancer indirectly through slowing down the aging process? Increasing evidence points to the latter scenario.", "mTOR and cancer therapy. Proteins regulating the mammalian target of rapamycin (mTOR), as well as some of the targets of the mTOR kinase, are overexpressed or mutated in cancer. Rapamycin, the naturally occurring inhibitor of mTOR, along with a number of recently developed rapamycin analogs (rapalogs) consisting of synthetically derived compounds containing minor chemical modifications to the parent structure, inhibit the growth of cell lines derived from multiple tumor types in vitro, and tumor models in vivo. Results from clinical trials indicate that the rapalogs may be useful for the treatment of subsets of certain types of cancer. The sporadic responses from the initial clinical trials, based on the hypothesis of general translation inhibition of cancer cells are now beginning to be understood owing to a more complete understanding of the dynamics of mTOR regulation and the function of mTOR in the tumor microenvironment. This review will summarize the preclinical and clinical data and recent discoveries of the function of mTOR in cancer and growth regulation.", "mTORC1 signaling: what we still don't know. The mammalian target of rapamycin (mTOR) is a protein kinase that plays key roles in cellular regulation. It forms complexes with additional proteins. The best-understood one is mTOR complex 1 (mTORC1). The regulation and cellular functions of mTORC1 have been the subjects of intense study; despite this, many questions remain to be answered. They include questions about the actual mechanisms by which mTORC1 signaling is stimulated by hormones and growth factors, which involves the small GTPase Rheb, and by amino acids, which involves other GTPase proteins. The control of Rheb and the mechanism by which it activates mTORC1 remain incompletely understood. Although it has been known for many years that rapamycin interferes with some functions of mTORC1, it is not known how it does this, or why only some functions of mTORC1 are affected. mTORC1 regulates diverse cellular functions. Several mTORC1 substrates are now known, although in several cases their physiological roles are poorly or incompletely understood. In the case of several processes, although it is clear that they are regulated by mTORC1, it is not known how mTORC1 does this. Lastly, mTORC1 is implicated in ageing, but again it is unclear what mechanisms account for this. Given the importance of mTORC1 signaling both for cellular functions and in human disease, it is a high priority to gain further insights into the control of mTORC1 signaling and the mechanisms by which it controls cellular functions and animal physiology.", "Nutrient Signaling to mTOR and Cell Growth The mammalian target of rapamycin (mTOR) is a conserved protein kinase involved in a multitude of cellular processes including cell growth. Increased mTOR activation is observed in multiple human cancers and inhibition of mTOR has proven efficacious in numerous clinical trials. mTOR comprises two complexes, termed mTORC1 and mTORC2. Both complexes respond to growth factors, whereas only mTORC1 is controlled by nutrients, such as glucose and amino acids. Since the discovery of mTOR, extensive studies have intricately detailed the molecular mechanisms by which mTORC1 is regulated. Somewhat paradoxically, amino acid induced mTORC1 activation\u2014arguably the most essential stimulus leading to mTORC1 activation\u2014is the least understood. Here we review the current knowledge of nutrient dependent regulation of mTORC1."], ["Erosive potentials of brewed teas. PURPOSE: To measure the pH, titratable acidity, fluoride concentration and erosive potential of brewed teas. METHODS: Bag teas were purchased to represent black, green, citrus, fruity, and floral tea flavors from Tulsi, Bigelow, HyVee, Tazo, and Yogi brands and brewed (1 bag/240 ml) in boiling water for 3 minutes. The pH, titratable acidity, and fluoride concentrations were measured. Following these measurements, a representative tea from each flavor was selected for investigation of erosion potential. Six extracted human molars were randomly assigned to each tea. Teeth were painted with fingernail polish to expose a 1 x 4 mm window and then soaked in tea for a total of 25 hours with teas refreshed every 5 hours. Teeth were then sectioned using a microtome and photographed using a polarized light microscope. Lesion depths (i.e., eroded surfaces) were measured using Image Pro Plus software. Differences in physiochemical properties and lesion depths between beverages were investigated using one-way ANOVA with post-hoc Tukey's HSD test. Relationships among lesion depths and physiochemical properties were evaluated using the Pearson correlation test. RESULTS: pH, titratable acidity and fluoride concentrations differed between tea flavors (P < 0.05) and between brands (P < 0.05). Lesion depths produced by the citrus tea (83.1 +/- 10.3 microm) were greater than those produced by the fruity tea (56.5 +/- 6.1 microm); both teas produced greater depths than black (30.1 +/- 7.4 microm), floral (25.0 +/- 3.2 microm) or green (22.3 +/- 6.3 microm) teas (P < 0.05). pH (r = -0.96; P = 0.009) was inversely and titratable acidity (r = 0.97; P = 0.006) was positively associated with lesion depths.", "Overview of antibacterial, antitoxin, antiviral, and antifungal activities of tea flavonoids and teas. Tea leaves produce organic compounds that may be involved in the defense of the plants against invading pathogens including insects, bacteria, fungi, and viruses. These metabolites include polyphenolic compounds, the six so-called catechins, and the methyl-xanthine alkaloids caffeine, theobromine, and theophylline. Postharvest inactivation of phenol oxidases in green tea leaves prevents oxidation of the catechins, whereas postharvest enzyme-catalyzed oxidation (fermentation) of catechins in tea leaves results in the formation of four theaflavins as well as polymeric thearubigins. These substances impart the black color to black teas. Black and partly fermented oolong teas contain both classes of phenolic compounds. A need exists to develop a better understanding of the roles of polyphenolic tea compounds in food and medical microbiology. This overview surveys and interprets our present knowledge of activities of tea flavonoids and teas against foodborne and other pathogenic bacteria, virulent protein toxins produced by some of the bacteria, virulent bacteriophages, pathogenic viruses and fungi. Also covered are synergistic, mechanistic, and bioavailability aspects of the antimicrobial effects. Further research is suggested for each of these categories. The herein described findings are not only of fundamental interest, but also have practical implications for nutrition, food safety, and animal and human health.", "Green tea: nature's defense against malignancies. The current practice of introducing phytochemicals to support the immune system or fight against diseases is based on centuries old traditions. Nutritional support is a recent advancement in the domain of diet-based therapies; green tea and its constituents are one of the important components of these strategies to prevent and cure various malignancies. The anti-carcinogenic and anti-mutagenic activities of green tea were highlighted some years ago suggesting that it could reduce the prevalence of cancer and even provide protection. The pharmacological actions of green tea are mainly attributed to polyphenols that includes epigallocatechin-3-gallate (EGCG), epicatechin, epicatechin-3-gallate, epigallocatechin. Green tea and its components effectively mitigate cellular damage arising due to oxidative stress. Green tea is supposed to enhance humoral and cell-mediated immunity, decreasing the risk of certain cancers, and may have certain advantage in treating inflammatory disorders. Much of the cancer chemopreventive properties of green tea are mediated by EGCG that induces apoptosis and promotes cell growth arrest, by altering the expression of cell cycle regulatory proteins, activating killer caspases, and suppressing nuclear factor kappa-B activation. Besides, it regulates and promotes IL-23 dependent DNA repair and stimulates cytotoxic T cells activities in a tumor microenvironment. It also blocks carcinogenesis by modulating the signal transduction pathways involved in cell proliferation, transformation, inflammation and metastasis. The review is intended to highlight the chemistry of green tea, its antioxidant potential, its immunopotentiating properties and mode of action against various cancer cell lines that showed its potential as a chemopreventive agent against colon, skin, lung, prostate, and breast cancer.", "Black tea is not significantly different from water in the maintenance of normal hydration in human subjects: results from a randomised controlled ... There is a belief that caffeinated drinks, such as tea, may adversely affect hydration. This was investigated in a randomised controlled trial. Healthy resting males (n 21) were recruited from the general population. Following 24 h of abstention from caffeine, alcohol and vigorous physical activity, including a 10 h overnight fast, all men underwent four separate test days in a counter-balanced order with a 5 d washout in between. The test beverages, provided at regular intervals, were 4 \u00d7 240 ml black (i.e. regular) tea and 6 \u00d7 240 ml black tea, providing 168 or 252 mg of caffeine. The controls were identical amounts of boiled water. The tea was prepared in a standardised way from tea bags and included 20 ml of semi-skimmed milk. All food taken during the 12 h intervention period was controlled, and subjects remained at rest. No other beverages were offered. Blood was sampled at 0, 1, 2, 4, 8 and 12 h, and a 24 h urine sample was collected. Outcome variables were whole blood cell count, Na, K, bicarbonate, total protein, urea, creatinine and osmolality for blood; and total volume, colour, Na, K, creatinine and osmolality for urine. Although data for all twenty-one participants were included in the analysis (mean age 36 years and mean BMI 25\u00b78 kg/m(2)), nineteen men completed all conditions. Statistical analysis, using a factorial ANOVA approach within PROC MIXED, revealed no significant differences between tea and water for any of the mean blood or urine measurements. It was concluded that black tea, in the amounts studied, offered similar hydrating properties to water.", "Review of the efficacy of green tea, isoflavones and aloe vera supplements based on randomised controlled trials. We assess the evidence for health benefits of three commonly consumed plant food supplements (PFS), green tea, isoflavone and aloe vera, based on published systematic reviews of randomised controlled trials (RCTs). Whilst the potential benefits of green tea have been reported in a wide range of health areas, it is only in the area of the metabolic syndrome that the number of RCTs is approaching sufficient to judge such efficacy. Isoflavone supplements are widely used, and RCTs indicate that they affect bone resorption at lower doses in postmenopausal women undergoing estrogen-related bone loss, but this is only translated to attenuation of bone loss at higher doses of isoflavones. A systematic review on RCTs concluded that the effects of isoflavones on hot flashes in postmenopausal women were highly variable and no conclusions could be drawn. Despite the popularity of aloe vera as a PFS, the evaluation of its efficacy as a coadjuvant therapy for certain metabolic or digestive pathologies remains scarce; it constitutes a typical example of a naturally occurring ingredient whose efficacy in topical applications presupposes its efficacy in systemic applications. Nevertheless, its possible toxic effects on oral consumption call for caution in its utility as a PFS. Since 2007, efficacy evaluation of PFS in Europe has been covered by European Union Nutrition and Health Claims legislation. The European Food Safety Authority has adopted an approach relying on RCTs, while medicinal effects are accepted based on traditional use. In general, there are insufficient RCTs for claims to be made, and conclusive results on PFS should be obtained in the future by conducting studies with more homogeneous populations, by using supplements with optimised and measured bioavailability, and by conducting larger RCTs."], ["Rhabdomyolysis associated with the use of a mislabeled \\\"acai berry\\\" dietary supplement. INTRODUCTION: This case report describes a patient who developed rhabdomyolysis temporally associated with the use of a mislabeled acai berry dietary supplement. METHODS AND RESULTS: The authors describe a 22-year-old man presenting with rhabdomyolysis approximately 2 weeks after starting a weight-loss dietary supplement. His medical history was significant only for hypertension treated with amlodipine. The diagnosis of rhabdomyolysis was confirmed (creatine kinase, 84,000 IU/L, positive urine myoglobin) with other potential causes ruled out. The signs and symptoms of the patient gradually resolved and he was discharged on hospital day 5. Assessment using the Naranjo Adverse Drug Reaction Probability Scale yielded a score of 3, indicating a possible relationship between the supplement and rhabdomyolysis. Although the product was labeled and promoted as containing acai berry and additional ingredients, there was no acai berry found on analysis. CONCLUSION: Clinicians should be aware that all dietary supplements may vary in uniformity and contain unknown contaminants.", "Acute rhabdomyolysis caused by Spirulina (Arthrospira platensis). Rhabdomyolysis is a potentially life-threatening disorder that occurs as a primary disease or as a complication of a broad spectrum of other diseases. We report the first case of acute rhabdomyolysis after ingestion of Spirulina (Arthrospira platensis), a plantonic blue-green alga, as a dietary supplement.", "Haff disease after eating salmon. While fish consumption is considered a component of a heart-healthy diet, many illnesses have been associated with eating contaminated fish. The authors describe two cases of muscle weakness and rhabdomyolysis that occurred after eating salmon. Cases of rhabdomyolysis and muscle weakness after consumption of fresh water fish have rarely been reported in the United States but have been frequently reported from the Baltic region. This illness is known as Haff disease. While the etiology is unknown, it is felt to be a toxin. Palytoxin, found in marine fish, has been associated with rhabdomyolysis, and may serve as a model for further study of the suspected toxin responsible for rhabdomyolysis after consumption of fresh water fish. If a case of Haff disease is suspected, contact the Centers for Disease Control and Prevention and collect any uneaten fish, which may be sent for laboratory analysis.", "A case of Kombucha tea toxicity. INTRODUCTION: Kombucha \\\"mushroom'' tea is touted to have medicinal properties. Here, we present a case of hyperthermia, lactic acidosis, and acute renal failure within 15 hours of Kombucha tea ingestion. CASE PRESENTATION: A 22 year old male, newly diagnosed with HIV, became short of breath and febrile to 103.0F, within twelve hours of Kombucha tea ingestion. He subsequently became combative and confused, requiring sedation and intubation for airway control. Laboratories revealed a lactate of 12.9 mmol/L, and serum creatinine of 2.1 mg/dL. DISCUSSION: Kombucha tea is black tea fermented in a yeast-bacteria medium. Several case reports exist of serious, and sometimes fatal, hepatic dysfunction and lactic acidosis within close proximity to ingestion. CONCLUSION: While Kombucha tea is considered a healthy elixir, the limited evidence currently available raises considerable concern that it may pose serious health risks. Consumption of this tea should be discouraged, as it may be associated with life-threatening lactic acidosis.", "Muscle soreness and delayed-onset muscle soreness. Immediate and delayed-onset muscle soreness differ mainly in chronology of presentation. Both conditions share the same quality of pain, eliciting and relieving activities and a varying degree of functional deficits. There is no single mechanism for muscle soreness; instead, it is a culmination of 6 different mechanisms. The developing pathway of DOMS begins with microtrauma to muscles and then surrounding connective tissues. Microtrauma is then followed by an inflammatory process and subsequent shifts of fluid and electrolytes. Throughout the progression of these events, muscle spasms may be present, exacerbating the overall condition. There are a multitude of modalities to manage the associated symptoms of immediate soreness and DOMS. Outcomes of each modality seem to be as diverse as the modalities themselves. The judicious use of NSAIDs and continued exercise are suggested to be the most reliable methods and recommended. This review article and each study cited, however, represent just one part of the clinician's decisionmaking process. Careful affirmation of temporary deficits from muscle soreness is not to be taken lightly, nor is the advisement and medical management of muscle soreness prescribed by the clinician."], ["Treatment of Hypovitaminosis D in Infants and Toddlers Context: Hypovitaminosis D appears to be on the rise in young children, with implications for skeletal and overall health. Objective: The objective of the study was to compare the safety and efficacy of vitamin D2 daily, vitamin D2 weekly, and vitamin D3 daily, combined with supplemental calcium, in raising serum 25-hydroxyvitamin D [25(OH)D] and lowering PTH concentrations. Design: This was a 6-wk randomized controlled trial. Setting: The study was conducted at an urban pediatric clinic in Boston. Subjects: Forty otherwise healthy infants and toddlers with hypovitaminosis D [25(OH)D < 20 ng/ml] participated in the study. Interventions: Participants were assigned to one of three regimens: 2,000 IU oral vitamin D2 daily, 50,000 IU vitamin D2 weekly, or 2,000 IU vitamin D3 daily. Each was also prescribed elemental calcium (50 mg/kg\u00b7d). Infants received treatment for 6 wk. Main Outcome Measures: Before and after treatment, serum measurements of 25(OH)D, PTH, calcium, and alkaline phosphatase were taken. Results: All treatments approximately tripled the 25(OH)D concentration. Preplanned comparisons were nonsignificant: daily vitamin D2 vs. weekly vitamin D2 (12% difference in effect, P = 0.66) and daily D2 vs. daily D3 (7%, P = 0.82). The mean serum calcium change was small and similar in the three groups. There was no significant difference in PTH suppression. Conclusions: Short-term vitamin D2 2,000 IU daily, vitamin D2 50,000 IU weekly, or vitamin D3 2,000 IU daily yield equivalent outcomes in the treatment of hypovitaminosis D among young children. Therefore, pediatric providers can individualize the treatment regimen for a given patient to ensure compliance, given that no difference in efficacy or safety was noted among these three common treatment regimens.", "VITAMIN D: A D-LIGHTFUL SOLUTION FOR HEALTH Throughout evolution sunlight produced vitamin D in the skin has been critically important for health. Vitamin D, known as the sunshine vitamin, is actually a hormone. Once it is produced in the skin or ingested from the diet it is converted sequentially in the liver and kidneys to its biologically active form 1,25-dihydroxyvitamin D. This hormone interacts with its receptor in the small intestine to increase the efficiency of intestinal calcium and phosphate absorption for the maintenance of the skeleton throughout life. Vitamin D deficiency during the first few years of life results in a flattened pelvis making it difficult for childbirth. Vitamin D deficiency causes osteopenia and osteoporosis increasing risk of fracture. Essentially every tissue and cell in the body has a vitamin D receptor. Therefore vitamin D deficiency has been linked to increased risk for preeclampsia, requiring a Cesarean section for birthing, multiple sclerosis, rheumatoid arthritis, type I diabetes, type II diabetes, heart disease, dementia, deadly cancers and infectious diseases. Therefore sensible sun exposure along with vitamin D supplementation of at least 2000 IU/d for adults and 1000 IU/d for children is essential to maximize their health.", "Vitamin D: extraskeletal health. Vitamin D deficiency is the most common nutritional deficiency and likely the most common medical condition in the world. The major cause of vitamin D deficiency has been the lack of appreciation that the body requires 5- to 10-fold higher intakes than is currently recommended by health agencies. There is now overwhelming and compelling scientific and epidemiologic data suggesting that the human body requires a blood level of 25(OH)D above 30 ng/mL for maximum health. To increase the blood level to the minimum 30 ng/mL requires the ingestion of at least 1000 IU of vitamin D per day for adults. In general, there is no downside to increasing either a child's or adult's vitamin D intake. Copyright 2010 Elsevier Inc. All rights reserved.", "Paleolithic vs. modern diets--selected pathophysiological implications. The nutritional patterns of Paleolithic humans influenced genetic evolution during the time segment within which defining characteristics of contemporary humans were selected. Our genome can have changed little since the beginnings of agriculture, so, genetically, humans remain Stone Agers--adapted for a Paleolithic dietary regimen. Such diets were based chiefly on wild game, fish and uncultivated plant foods. They provided abundant protein; a fat profile much different from that of affluent Western nations; high fibre; carbohydrate from fruits and vegetables (and some honey) but not from cereals, refined sugars and dairy products; high levels of micronutrients and probably of phytochemicals as well. Differences between contemporary and ancestral diets have many pathophysiological implications. This review addresses phytochemicals and cancer; calcium, physical exertion, bone mineral density and bone structural geometry; dietary protein, potassium, renal acid secretion and urinary calcium loss; and finally sarcopenia, adiposity, insulin receptors and insulin resistance. While not, yet, a basis for formal recommendations, awareness of Paleolithic nutritional patterns should generate novel, testable hypotheses grounded in evolutionary theory and it should dispel complacency regarding currently accepted nutritional tenets.", "Diet, infection and wheezy illness: lessons from adults. An increase in asthma and atopic disease has been recorded in many countries where society has become more prosperous. We have investigated two possible explanations: a reduction in childhood infections and a change in diet. In a cohort of people followed up since 1964, originally selected as a random sample of primary school children, we have investigated the relevance of family size and the common childhood infectious diseases to development of eczema, hay fever and asthma. Although membership of a large family reduced risks of hay fever and eczema (but not asthma), this was not explained by the infections the child had suffered. Indeed, the more infections the child had had, the greater the likelihood of asthma, although measles gave a modest measure of protection. We have investigated dietary factors in two separate studies. In the first, we have shown the risks of bronchial hyper-reactivity are increased seven-fold among those with the lowest intake of vitamin C, while the lowest intake of saturated fats gave a 10-fold protection. In the second, we have shown that the risk of adult-onset wheezy illness is increased five-fold by the lowest intake of vitamin E and doubled by the lowest intake of vitamin C. These results were supported by direct measurements of the vitamins and triglycerides in plasma. We have proposed that changes in the diet of pregnant women may have reflected those observed in the population as a whole and that these may have resulted in the birth of cohorts of children predisposed to atopy and asthma. The direct test of this is to study the diet and nutritional status of a large cohort of pregnant women and to follow their offspring forward. This is our current research."], ["Cyclooxygenase inhibitory and antioxidant cyanidin glycosides in cherries and berries. Anthocyanins from tart cherries, Prunus cerasus L. (Rosaceae) cv. Balaton and Montmorency; sweet cherries, Prunus avium L. (Rosaceae); bilberries, Vaccinum myrtillus L. (Ericaceae); blackberries, Rubus sp. (Rosaceae); blueberries var. Jersey, Vaccinium corymbosum L. (Ericaceae); cranberries var. Early Black, Vaccinium macrocarpon Ait. (Ericaceae); elderberries, Sambucus canadensis (Caprifoliaceae); raspberries, Rubus idaeus (Rosaceae); and strawberries var. Honeoye, Fragaria x ananassa Duch. (Rosaceae), were investigated for cyclooxygenase inhibitory and antioxidant activities. The presence and levels of cyanidin-3-glucosylrutinoside 1 and cyanidin-3-rutinoside 2 were determined in the fruits using HPLC. The antioxidant activity of anthocyanins from cherries was comparable to the commercial antioxidants, tert-butylhydroquinone, butylated hydroxytoluene and butylated hydroxyanisole, and superior to vitamin E, at a test concentration of 125 microg/ml. Anthocyanins from raspberries and sweet cherries demonstrated 45% and 47% cyclooxygenase-I and cyclooxygenase-II inhibitory activities, respectively, when assayed at 125 microg/ml. The cyclooxygenase inhibitory activities of anthocyanins from these fruits were comparable to those of ibuprofen and naproxen at 10 microM concentrations. Anthocyanins 1 and 2 are present in both cherries and raspberry. The yields of pure anthocyanins 1 and 2 in 100 g Balaton and Montmorency tart cherries, sweet cherries and raspberries were 21, 16.5; 11, 5; 4.95, 21; and 4.65, 13.5 mg, respectively. Fresh blackberries and strawberries contained only anthocyanin 2 in yields of 24 and 22.5 mg/100 g, respectively. Anthocyanins 1 and 2 were not found in bilberries, blueberries, cranberries or elderberries.", "Anthocyanin composition of wild bananas in Thailand. Anthocyanins were isolated from male bracts of 10 wild species of bananas (Musa spp. and Ensete spp.) distributed in Thailand. Six major anthocyanin pigments were identified by high performance liquid chromatography (HPLC), mass spectrometry (MS), and tandem mass spectrometry (MS/MS). They are delphinidin-3-rutinoside (m/z 611.2), cyanidin-3-rutinoside (m/z 595.8), petunidin-3-rutinoside (m/z 624.9), pelargonidin-3-rutinoside (m/z 579.4), peonidin-3-rutinoside (m/z 608.7), and malvidin-3-rutinoside (m/z 638.8). On the basis of the types of pigment present, the wild bananas can be divided into 5 groups. The first group comprises M. itinerans, Musa sp. one, Musa sp. two, and M. acuminata accessions, which contain almost or all anthocyanin pigments except for pelargonidin-3-rutinoside, including both nonmethylated and methylated anthocyanins. The second group, M. acuminata subsp. truncata, contains only malvidin-3-rutinoside while the third group, M. coccinea, contains cyanidin-3-rutinoside and pelargonidin-3-rutinoside. The forth group, M. acuminata yellow bract and E. glaucum do not appear to contain any anthocyanin pigment. The fifth group consists of M. balbisiana, M. velutina, M. laterita, and E. superbum which contain only nonmethylated anthocyanin, delphinidin-3-rutinoside, and cyanidin-3-rutinoside. Total anthocyanin content in the analyzed bracts ranged from 0-119.70 mg/100 g bract fresh weight. The differences in the type of anthocyanin and variation in the amounts present indicate that wild bananas show biochemical diversity, which may be useful for identifying specific groups of bananas or for clarifying the evolution of flavonoid metabolism in each banana group.", "Flavonoids, a ubiquitous dietary phenolic subclass, exert extensive in vitro anti-invasive and in vivo anti-metastatic activities. Cancer metastasis refers to the spread of cancer cells from the primary neoplasm to distant sites, where secondary tumors are formed, and is the major cause of death from cancer. Natural phytochemicals containing phenolic compounds have been widely demonstrated to have the capability to prevent cancer metastasis. Among phenolic compounds, flavonoids are a very large subclass, and they are abundant in food and nutraceuticals. The number of reports demonstrating that flavonoids are an effective natural inhibitor of cancer invasion and metastasis is increasing in the scientific literature. Catechin derivatives, (\u2212)-epigallocatechin-3-gallate, (\u2212)-epigallocatechin, (\u2212)-epicatechin-3-gallate,and (\u2212)-epicatechin, are the most studied compounds in this topic so far; genistein/genistin, silibinin, quercetin, and anthocyanin have also been widely investigated for their inhibitory activities on invasion/metastasis. Other flavonoids in dietary vegetable foods that are responsible for anti-invasive and anti-metastatic activities of tumors include luteolin,apigenin, myricetin, tangeretin, kaempferol, glycitein, licoricidin,daidzein, and naringenin. To effectively overcome the metastatic cascade, including cell-cell attachment, tissue barrier degradation, migration, invasion, cell-matrix adhesion,and angiogenesis, it is essential that a bioactive compound prevent tumor cells from metastasizing. This review summarizes the effects of flavonoids on the metastatic cascade and the related proteins, the in vitro anti-invasive activity of flavonoids against cancer cells, and the effects of flavonoids on antiangiogenic and in vivo anti-metastatic models. The available scientific evidence indicates that flavonoids are a ubiquitous dietary phenolics subclass and exert extensive in vitro anti-invasive and in vivo anti-metastatic activities.", "Purple rice (Oryza sativa L.) extract and its constituents inhibit VEGF-induced angiogenesis. The study evaluated the protective effects of purple rice (Oryza sativa L.) bran extract (PRE) and its constituents, cyanidin and peonidin, against angiogenesis induced by vascular endothelial growth factor (VEGF). The effects of VEGF and PRE were examined by in vitro tube formation assays and following 14-day co-culture of human umbilical vein endothelial cells (HUVECs) and fibroblasts. The antiangiogenic mechanism of PRE was evaluated by VEGF-induced proliferation and migration of HUVECs and/or human retinal microvascular endothelial cells (HRMECs) and phosphorylation of extracellular signal-regulated kinase (ERK) and p38. The PRE significantly suppressed VEGF-induced tube formation, proliferation and migration in HUVECs and HRMECs as well as phosphorylation of ERK and p38. Cyanidin and peonidin also suppressed the proliferation and migration induced by VEGF. These findings indicate that PRE and anthocyanidins suppress VEGF-induced angiogenesis by inhibiting proliferation and migration and suggest that the inhibition of phosphorylated-ERK and -p38 may be involved in the underlying mechanism. Copyright \u00a9 2011 John Wiley & Sons, Ltd.", "Comparison of health-relevant flavonoids in commonly consumed cranberry products. The human health benefits from consumption of cranberry products have been associated with the fruits' unique flavonoid composition, including a complex profile of anthocyanins and proanthocyanidins. However, when processed by techniques such as pressing, canning, concentrating, or drying, a number of these natural components may be compromised or inactivated due to physical separation, thermal degradation, or oxidation. Fresh cranberries were compared to freeze-dried berries and individual fruit tissues (skin and peeled fruit). Products examined included cranberry juices (commercial and prepared from concentrate), cranberry sauces (commercial and homemade), and sweetened-dried cranberries (commercial). Freeze-drying resulted in no detectable losses of anthocyanins or proanthocyanidins from cranberry fruits. Anthocyanins were localized in the skin. Proanthocyanins were higher in the skin than in the flesh, with the exception of procyanidin A-2 dimer which was concentrated in the flesh. Anthocyanins were significantly higher in not-from-concentrate juice than in reconstituted juice from concentrate (8.3 mg and 4.2 mg/100 mL, respectively). Similarly, proanthocyanidins were markedly higher in not-from-concentrate juice compared to juice from concentrate (23.0 mg and 8.9 mg/100 mL, respectively). Homemade sauce contained far higher anthocyanins and proanthocyanidins (15.9 and 87.9 mg/100 g, respectively) than canned sauces processed with whole berries (9.6 and 54.4 mg/100 g, respectively) or jelled-type (1.1 and 16 mg/100 g, respectively). Sweetened-dried cranberries were quite low in anthocyanins (7.9 mg/100 g), but they still retained considerable proanthocyanidins (64.2 mg/100 g). Commercially processed products contained significantly lower levels of polyphenols as compared to fresh and home-processed preparations. Anthocyanins were more sensitive to degradation than proanthocyanidins. PRACTICAL APPLICATION: As cranberry juices and other products are increasingly consumed for their recognized health benefits (including prophylaxis against urinary tract infection), it is relevant to consider how various degrees of commercial and home processing can alter innate levels of the biologically active flavonoids (especially anthocyanins and proanthocyanidins) characteristic to the intact fruits. \u00a9 2012 Institute of Food Technologists\u00ae"], ["Haff disease after eating salmon. While fish consumption is considered a component of a heart-healthy diet, many illnesses have been associated with eating contaminated fish. The authors describe two cases of muscle weakness and rhabdomyolysis that occurred after eating salmon. Cases of rhabdomyolysis and muscle weakness after consumption of fresh water fish have rarely been reported in the United States but have been frequently reported from the Baltic region. This illness is known as Haff disease. While the etiology is unknown, it is felt to be a toxin. Palytoxin, found in marine fish, has been associated with rhabdomyolysis, and may serve as a model for further study of the suspected toxin responsible for rhabdomyolysis after consumption of fresh water fish. If a case of Haff disease is suspected, contact the Centers for Disease Control and Prevention and collect any uneaten fish, which may be sent for laboratory analysis.", "First record of human infection with the tapeworm Diphyllobothrium nihonkaiense in North America. The tapeworm Diphyllobothrium nihonkaiense (Cestoda: Diphyllobothriidea), originally described from Japan, is reported from a man in North America for the first time. Species identification was based on sequences of ribosomal (partial 18S rRNA) and mitochondrial (partial Cytochrome c Oxidase subunit I) genes of proglottids expelled from a Czech tourist who ate raw Pacific sockeye salmon (Oncorhynchus nerka) from British Columbia, Canada.", "Nutrient and methyl mercury exposure from consuming fish. There is controversy about the risks and benefits of consuming fish. Fish consumption provides nutrients, some of which are essential for brain growth and development. All fish, however, contain methyl mercury (MeHg), a known neurotoxicant. The toxic effect of MeHg seems most damaging during brain development, and thus, prenatal exposure is of greatest concern. At present the level of prenatal exposure associated with risk to a child's neurodevelopment is not known. Balancing the rewards and possible risks of fish consumption presents a dilemma to consumers and regulatory authorities. We review the nutrients in fish that are important in brain development and the current evidence of risk from MeHg at exposure levels achieved by consuming fish. We then review the findings from a large prospective cohort study of a population that consumes fish daily, the Seychelles Child Development Study. The MeHg content of the fish consumed in the Seychelles is similar to that of ocean fish available in industrialized countries, so they represent a sentinel population for any risk from fish consumption. In the Seychelles, evaluations of the children through 9 y of age show no consistent pattern of adverse associations with prenatal MeHg exposure. Recent studies in the Seychelles have focused on nutrients in fish that might influence a child's development, including long-chain polyunsaturated fatty acids, iodine, iron, and choline. Preliminary findings from this study suggest that the beneficial influence of nutrients from fish may counter any adverse effects of MeHg on the developing nervous system.", "Hair mercury levels of women of reproductive age in Ontario, Canada: implications to fetal safety and fish consumption. OBJECTIVE: To study hair mercury concentrations among women of reproductive age in relation to fish intake in Ontario, Canada. STUDY DESIGN: Three groups were studied: 22 women who had called the Motherisk Program for information on the reproductive safety of consuming fish during pregnancy, a group of Japanese residing in Toronto (n=23) consuming much larger amounts of fish, and a group of Canadian women of reproductive age (n=20) not seeking advice, were studied. Mercury concentrations in hair samples were measured using inductively coupled plasma mass spectrometry. Seafood consumption habits were recorded for each participant. Based on the types of fish consumed and consumption frequencies, the estimated monthly intake of mercury was calculated. Hair mercury concentrations were correlated to both the number of monthly seafood servings and the estimated ingested mercury dose. RESULTS: There were significant correlations between fish servings and hair mercury (Spearman r=0.73, P<.0001) and between amounts of consumed mercury and hair mercury concentrations (Spearman r=0.81, P<.0001). Nearly two thirds of the Motherisk callers, all of the Japanese women, and 15% of the Canadian women of reproductive age had hair mercury above 0.3 microg/g, which was shown recently to be the lowest observable adverse effect level in a large systematic review of all perinatal studies. CONCLUSIONS: Because of very wide variability, general recommendations for a safe number of fish servings may not be sufficient to protect the fetus. Analysis of hair mercury may be warranted before pregnancy in selected groups of women consuming more than 12 ounces of fish per week, as dietary modification can decrease body burden and ensure fetal safety. Copyright (c) 2010. Published by Mosby, Inc.", "A fishy cause of sudden near fatal hypotension. Seafood-borne illnesses are a common but under recognised source of morbidity. We report the case of an 80-year-old woman who presented to hospital after collapsing in a restaurant following lunch consisting of mackerel fish. A detailed food history and clinical exclusion helped diagnose the condition as scombroid poisoning. The patient made a complete recovery following antihistamine therapy."], ["Saturated fat intake and insulin resistance in men with coronary artery disease. The Stanford Coronary Risk Intervention Project Investigators and ... BACKGROUND: To determine whether there is an association between diet and plasma insulin concentration that is independent of obesity, we studied the relation of dietary composition and caloric intake to obesity and plasma insulin concentrations in 215 nondiabetic men aged 32-74 years with angiographically proven coronary artery disease. METHODS AND RESULTS: After adjusting for age, the intake of saturated fatty acids and cholesterol were positively correlated (p less than 0.05) with body mass index (r = 0.18, r = 0.16), waist-to-hip circumference ratio (r = 0.21, r = 0.22), and fasting insulin (r = 0.26, r = 0.23). Carbohydrate intake was negatively correlated with body mass index (r = -0.21), waist-to-hip ratio (r = -0.21), and fasting insulin (r = -0.16). Intake of monounsaturated fatty acids did not correlate significantly with body mass index or waist-to-hip circumference ratio but did correlate positively with fasting insulin (r = 0.24). Intake of dietary calories was negatively correlated with body mass index (r = -0.15). In multivariate analysis, intake of saturated fatty acids was significantly related to elevated fasting insulin concentration independently of body mass index. CONCLUSIONS: These cross-sectional findings in nondiabetic men with coronary artery disease suggest that increased consumption of saturated fatty acids is associated independently with higher fasting insulin concentrations.", "Substituting dietary saturated for monounsaturated fat impairs insulin sensitivity in healthy men and women: The KANWU Study. AIMS/HYPOTHESIS: The amount and quality of fat in the diet could be of importance for development of insulin resistance and related metabolic disorders. Our aim was to determine whether a change in dietary fat quality alone could alter insulin action in humans. METHODS: The KANWU study included 162 healthy subjects chosen at random to receive a controlled, isoenergetic diet for 3 months containing either a high proportion of saturated (SAFA diet) or monounsaturated (MUFA diet) fatty acids. Within each group there was a second assignment at random to supplements with fish oil (3.6 g n-3 fatty acids/d) or placebo. RESULTS: Insulin sensitivity was significantly impaired on the saturated fatty acid diet (-10%, p = 0.03) but did not change on the monounsaturated fatty acid diet (+2%, NS) (p = 0.05 for difference between diets). Insulin secretion was not affected. The addition of n-3 fatty acids influenced neither insulin sensitivity nor insulin secretion. The favourable effects of substituting a monounsaturated fatty acid diet for a saturated fatty acid diet on insulin sensitivity were only seen at a total fat intake below median (37E%). Here, insulin sensitivity was 12.5% lower and 8.8% higher on the saturated fatty acid diet and monounsaturated fatty acid diet respectively (p = 0.03). Low density lipoprotein cholesterol (LDL) increased on the saturated fatty acid diet (+4.1%, p < 0.01) but decreased on the monounsaturated fatty acid diet (MUFA) (-5.2, p < 0.001), whereas lipoprotein (a) [Lp(a)] increased on a monounsaturated fatty acid diet by 12% (p < 0.001). CONCLUSIONS/INTERPRETATION: A change of the proportions of dietary fatty acids, decreasing saturated fatty acid and increasing monounsaturated fatty acid, improves insulin sensitivity but has no effect on insulin secretion. A beneficial impact of the fat quality on insulin sensitivity is not seen in individuals with a high fat intake (> 37E%).", "Relationship between saturated fatty acids and periodontal disease. Saturated fatty acids (SFAs) produce an inflammatory response. Hyperinflammation is now recognized as one of the key underlying etiologic factors in periodontal disease. The longitudinal relationship between dietary SFAs and periodontal disease in 264 Japanese individuals, aged 75 years, for whom data were available for the years 2003-2004, was investigated. SFA intake was assessed with a brief self-administered diet history questionnaire. Participants were classified by quartiles of SFA intake. Full-mouth periodontal status, measured as the clinical attachment level (CAL), was recorded at baseline and follow-up examinations. The number of teeth with a loss of CAL\u22653 mm at any site over a year was calculated as 'periodontal disease events'. Poisson regression analysis was conducted, with dietary SFAs as the primary predictor of interest, to estimate their influence on periodontal disease events. High dietary SFA intake was significantly associated with a greater number of periodontal disease events among non-smokers. The multivariate adjusted relative risk (95% confidence intervals) in the 1st, 2nd, 3rd, and 4th quartiles of dietary SFAs was 1.00, 1.19 (0.72-1.97), 1.55 (0.95-2.52), and 1.92 (1.19-3.11), respectively. These findings suggest an independent association of dietary SFA intake to the progression of periodontal disease in older Japanese non-smokers. ABBREVIATIONS: saturated fatty acid (SFA); clinical attachment level (CAL); Toll-like receptor (TLR); lipopolysaccharide (LPS); brief self-administered diet history questionnaire (BDHQ); decayed, missing, and filled teeth (DMFT); clinical attachment level (CAL); body mass index (BMI); relative risk (RR); confidence intervals (CI); nuclear factor-kappa B (NF-\u03baB).", "Lipotoxicity: Effects of Dietary Saturated and Transfatty Acids The ingestion of excessive amounts of saturated fatty acids (SFAs) and transfatty acids (TFAs) is considered to be a risk factor for cardiovascular diseases, insulin resistance, dyslipidemia, and obesity. The focus of this paper was to elucidate the influence of dietary SFA and TFA intake on the promotion of lipotoxicity to the liver and cardiovascular, endothelial, and gut microbiota systems, as well as on insulin resistance and endoplasmic reticulum stress. The saturated and transfatty acids favor a proinflammatory state leading to insulin resistance. These fatty acids can be involved in several inflammatory pathways, contributing to disease progression in chronic inflammation, autoimmunity, allergy, cancer, atherosclerosis, hypertension, and heart hypertrophy as well as other metabolic and degenerative diseases. As a consequence, lipotoxicity may occur in several target organs by direct effects, represented by inflammation pathways, and through indirect effects, including an important alteration in the gut microbiota associated with endotoxemia. Interactions between these pathways may perpetuate a feedback process that exacerbates an inflammatory state. The importance of lifestyle modification, including an improved diet, is recommended as a strategy for treatment of these diseases.", "Differential effects of monounsaturated, polyunsaturated and saturated fat ingestion on glucose-stimulated insulin secretion, sensitivity and clear... AIMS/HYPOTHESIS: Prolonged elevation of plasma specific fatty acids may exert differential effects on glucose-stimulated insulin secretion (GSIS), insulin sensitivity and clearance. SUBJECTS AND METHODS: We examined the effect of oral ingestion, at regular intervals for 24 h, of an emulsion containing either predominantly monounsaturated (MUFA), polyunsaturated (PUFA) or saturated (SFA) fat or water (control) on GSIS, insulin sensitivity and insulin clearance in seven overweight or obese, non-diabetic humans. Four studies were conducted in each individual in random order, 4-6 weeks apart. Twenty-four hours after initiation of oral ingestion, subjects underwent a 2 h, 20 mmol/l hyperglycaemic clamp to assess GSIS, insulin sensitivity and insulin clearance. RESULTS: Following oral ingestion of any of the three fat emulsions over 24 h, plasma NEFAs were elevated by approximately 1.5- to 2-fold over the basal level. Ingestion of any of the three fat emulsions resulted in reduction in insulin clearance, and SFA ingestion reduced insulin sensitivity. PUFA ingestion was associated with an absolute reduction in GSIS, whereas insulin secretion failed to compensate for insulin resistance in subjects who ingested SFA. CONCLUSIONS/INTERPRETATION: Oral ingestion of fats with differing degrees of saturation resulted in different effects on insulin secretion and action. PUFA ingestion resulted in an absolute reduction in insulin secretion and SFA ingestion induced insulin resistance. Failure of insulin secretion to compensate for insulin resistance implies impaired beta cell function in the SFA study."], ["Exploration of biomarkers for total fish intake in pregnant Norwegian women. OBJECTIVE: Few biomarkers for dietary intake of various food groups have been established. The aim of the present study was to explore whether selenium (Se), iodine, mercury (Hg) or arsenic may serve as a biomarker for total fish and seafood intake in addition to the traditionally used n-3 fatty acids EPA and DHA. DESIGN: Intake of fish and seafood estimated by an FFQ was compared with intake assessed by a 4 d weighed food diary and with biomarkers in blood and urine. SETTING: Validation study in the Norwegian Mother and Child Cohort Study (MoBa). SUBJECTS: One hundred and nineteen women. RESULTS: Total fish/seafood intake (median 39 g/d) calculated with the MoBa FFQ was comparable to intake calculated by the food diary (median 30 g/d, rS = 0.37, P < 0.001). Erythrocyte DHA and blood Hg, Se and arsenic concentrations were positively correlated with intake of fish and seafood, but the association for DHA was weakened by the widespread use of supplements. The main finding was the consistent positive association between the intake of fish/seafood and blood arsenic concentration. In multivariate analyses, blood arsenic was associated with blood Hg and fish and seafood intake. In these models, arsenic turned out to be the best indicator of intake of fish and seafood, both totally and in subgroups of fish/seafood intake. CONCLUSIONS: While DHA reflected the intake of fatty fish and n-3 PUFA supplements, blood arsenic concentration also reflected the intake of lean fish and seafood. Blood arsenic appears to be a useful biomarker for total fish and seafood intake.", "Nutrient and contaminant tradeoffs: exchanging meat, poultry, or seafood for dietary protein. When making food choices, consumers are faced with the dilemma of reconciling differences between health benefits and exposure to potential toxins. Analyses to estimate likely intake and exposure outcomes for young children and women of child-bearing age shows that seafood, chicken, and beef, while approximately equivalent in protein, vary in key nutrients of importance as well as in levels of certain contaminants. Increasing the variety of choices among meats, poultry, and seafood and consuming them in amounts consistent with current dietary guidelines and advisories will contribute toward meeting nutritional needs while reducing exposure to any single type of contaminant.", "A fishy cause of sudden near fatal hypotension. Seafood-borne illnesses are a common but under recognised source of morbidity. We report the case of an 80-year-old woman who presented to hospital after collapsing in a restaurant following lunch consisting of mackerel fish. A detailed food history and clinical exclusion helped diagnose the condition as scombroid poisoning. The patient made a complete recovery following antihistamine therapy.", "Nutrient and methyl mercury exposure from consuming fish. There is controversy about the risks and benefits of consuming fish. Fish consumption provides nutrients, some of which are essential for brain growth and development. All fish, however, contain methyl mercury (MeHg), a known neurotoxicant. The toxic effect of MeHg seems most damaging during brain development, and thus, prenatal exposure is of greatest concern. At present the level of prenatal exposure associated with risk to a child's neurodevelopment is not known. Balancing the rewards and possible risks of fish consumption presents a dilemma to consumers and regulatory authorities. We review the nutrients in fish that are important in brain development and the current evidence of risk from MeHg at exposure levels achieved by consuming fish. We then review the findings from a large prospective cohort study of a population that consumes fish daily, the Seychelles Child Development Study. The MeHg content of the fish consumed in the Seychelles is similar to that of ocean fish available in industrialized countries, so they represent a sentinel population for any risk from fish consumption. In the Seychelles, evaluations of the children through 9 y of age show no consistent pattern of adverse associations with prenatal MeHg exposure. Recent studies in the Seychelles have focused on nutrients in fish that might influence a child's development, including long-chain polyunsaturated fatty acids, iodine, iron, and choline. Preliminary findings from this study suggest that the beneficial influence of nutrients from fish may counter any adverse effects of MeHg on the developing nervous system.", "Haff disease after eating salmon. While fish consumption is considered a component of a heart-healthy diet, many illnesses have been associated with eating contaminated fish. The authors describe two cases of muscle weakness and rhabdomyolysis that occurred after eating salmon. Cases of rhabdomyolysis and muscle weakness after consumption of fresh water fish have rarely been reported in the United States but have been frequently reported from the Baltic region. This illness is known as Haff disease. While the etiology is unknown, it is felt to be a toxin. Palytoxin, found in marine fish, has been associated with rhabdomyolysis, and may serve as a model for further study of the suspected toxin responsible for rhabdomyolysis after consumption of fresh water fish. If a case of Haff disease is suspected, contact the Centers for Disease Control and Prevention and collect any uneaten fish, which may be sent for laboratory analysis."], ["HPLC analysis of serotonin, tryptamine, tyramine, and the hydroxycinnamic acid amides of serotonin and tyramine in food vegetables. Biogenic monoamines such as serotonin, tryptamine, and tyramine function as neurotransmitters and mitogenic factors in animals and are involved in flowering, morphogenesis, and protection from and adaptation to environmental changes in plants. In plants, serotonin and tyramine are conjugated to form phenolic compounds via thioester linkages during the synthesis of hydroxycinnamic acid amides, including p-coumaroylserotonin (CS), feruloylserotonin (FS), p-coumaroyltyramine (CT), and feruloyltyramine (FT). In this study, we determined the amounts of the biogenic monoamines CS, FS, CT, and FT in commonly consumed vegetables using high-performance liquid chromatography. Serotonin, tryptamine, and tyramine were detected in all vegetables tested. The serotonin levels ranged from 1.8 to 294 microg/g of dry weight, the tryptamine levels ranged from 0.8 to 372 microg/g of dry weight, and the tyramine levels ranged from 1.4 to 286 microg/g of dry weight. The highest serotonin and tryptamine contents were found in tomato and cherry tomato (140.3-222 microg/g of dry weight), while paprika and green pepper had higher tyramine contents than the other vegetables (286 and 141.5 microg/g of dry weight, respectively). Overall, the levels of CS, FS, CT, and FT ranged from 0.03 to 13.8 microg/g of dry weight, with green onion possessing the highest levels of CS (0.69 microg/g of dry weight), FT (1.99 microg/g of dry weight), and CT (13.85 microg/g of dry weight).", "Brain serotonin content: physiological regulation by plasma neutral amino acids. When plasma tryptophan is elevated by the injection of tryptophan or insulin, or by the consumption of carbohydrates, brain tryptophan and serotonin also rise; however, when even larger elevations of plasma tryptophan are produced by the ingestion of protein-containing diets, brain tryptophan and serotonin do not change. The main determinant of brain tryptophan and serotonin concentrations does not appear to be plasma tryptophan alone, but the ratio of this amino acid to other plasma neutral amino acids (that is, tyrosine, phenylalanine, leucine, isoleucine, and valine) that compete with it for uptake into the brain.", "Application of LC and LC-MS to the analysis of melatonin and serotonin in edible plants. Melatonin is a neurohormone produced by the pineal gland of animals. Serotonin is a monoamine neurotransmitter and one of the precursors of melatonin biosynthesis. These two indoleamines have recently been reported to have widespread occurrence in many edible plants. Consuming foodstuffs containing melatonin and serotonin could raise their physiologic concentrations in blood and enhance human health. Literature concerning analytical methods suitable for determination of melatonin and serotonin in edible plants is limited, although several liquid chromatographic (LC) techniques have been used for their quantification. Liquid chromatography-mass spectrometry (LC-MS) methods combine selectivity, sensitivity, and high precision, and enable the simultaneous determination of melatonin and serotonin. This work reviews LC and LC-MS techniques used to determine melatonin and serotonin, and the available data on melatonin and serotonin levels in edible plants. \u00a9 2011 Crown Copyright", "Primum Non Nocere: An Evolutionary Analysis of Whether Antidepressants Do More Harm than Good Antidepressant medications are the first-line treatment for people meeting current diagnostic criteria for major depressive disorder. Most antidepressants are designed to perturb the mechanisms that regulate the neurotransmitter serotonin \u2013 an evolutionarily ancient biochemical found in plants, animals, and fungi. Many adaptive processes evolved to be regulated by serotonin, including emotion, development, neuronal growth and death, platelet activation and the clotting process, attention, electrolyte balance, and reproduction. It is a principle of evolutionary medicine that the disruption of evolved adaptations will degrade biological functioning. Because serotonin regulates many adaptive processes, antidepressants could have many adverse health effects. For instance, while antidepressants are modestly effective in reducing depressive symptoms, they increase the brain\u2019s susceptibility to future episodes after they have been discontinued. Contrary to a widely held belief in psychiatry, studies that purport to show that antidepressants promote neurogenesis are flawed because they all use a method that cannot, by itself, distinguish between neurogenesis and neuronal death. In fact, antidepressants cause neuronal damage and mature neurons to revert to an immature state, both of which may explain why antidepressants also cause neurons to undergo apoptosis (programmed death). Antidepressants can also cause developmental problems, they have adverse effects on sexual and romantic life, and they increase the risk of hyponatremia (low sodium in the blood plasma), bleeding, stroke, and death in the elderly. Our review supports the conclusion that antidepressants generally do more harm than good by disrupting a number of adaptive processes regulated by serotonin. However, there may be specific conditions for which their use is warranted (e.g., cancer, recovery from stroke). We conclude that altered informed consent practices and greater caution in the prescription of antidepressants are warranted.", "An introduction to migraine: from ancient treatment to functional pharmacology and antimigraine therapy. Migraine treatment has evolved from the realms of the supernatural into the scientific arena, but it seems still controversial whether migraine is primarily a vascular or a neurological dysfunction. Irrespective of this controversy, the levels of serotonin (5-hydroxytryptamine; 5-HT), a vasoconstrictor and a central neurotransmitter, seem to decrease during migraine (with associated carotid vasodilatation) whereas an i.v. infusion of 5-HT can abort migraine. In fact, 5-HT as well as ergotamine, dihydroergotamine and other antimigraine agents invariably produce vasoconstriction in the external carotid circulation. The last decade has witnessed the advent of sumatriptan and second generation triptans (e.g. zolmitriptan, rizatriptan, naratriptan), which belong to a new class of drugs, now known as 5-HT1B/1D/1F receptor agonists. Compared to sumatriptan, the second-generation triptans have a higher oral bioavailability and longer plasma half-life. In line with the vascular and neurogenic theories of migraine, all triptans produce selective carotid vasoconstriction (via 5-HT1B receptors) and presynaptic inhibition of the trigeminovascular inflammatory responses implicated in migraine (via 5-HT1D/5-ht1F receptors). Moreover, selective agonists at 5-HT1D (PNU-142633) and 5-ht1F (LY344864) receptors inhibit the trigeminovascular system without producing vasoconstriction. Nevertheless, PNU-142633 proved to be ineffective in the acute treatment of migraine, whilst LY344864 did show some efficacy when used in doses which interact with 5-HT1B receptors. Finally, although the triptans are effective antimigraine agents producing selective cranial vasoconstriction, efforts are being made to develop other effective antimigraine alternatives acting via the direct blockade of vasodilator mechanisms (e.g. antagonists at CGRP receptors, antagonists at 5-HT7 receptors, inhibitors of nitric oxide biosynthesis, etc). These alternatives will hopefully lead to fewer side-effects."], ["Oxidative stability and shelf-life evaluation of selected culinary oils. Four out of eight 'healthier' oils-namely, almond oil, avocado oil, hazelnut oil and macadamia nut oil-studied were rich sources of monounsaturated fatty acids like olive oil. Grape seed oil, rice barn oil (marketed recently), toasted sesame oil and walnut oil contained high levels of essential fatty acids. The order of oxidative stability determined by Rancimat measuring of the induction period at four temperatures (90 degrees C, 100 degrees C, 110 degrees C, and 120 degrees C) was found to be macadamia oil > rice bran oil approximately toasted sesame oil > avocado oil > almond oil > hazelnut oil > grape seed oil > walnut oil. High-level monounsaturated fatty acid oils gave a linear relationship between 100 times the reciprocal of the induction period against the total unsaturated fatty acid content obtained as %C18:2 + 0.08 x C18:1 + 2.08 x %C18:3, while the polyunsaturated fatty acid oils gave an exponential relationship. In the case of rice bran and hazelnut oils, shelf-life prediction from the extrapolation of the Arrhenius plots and the Q(10) factors was compared well with that of storage time given by the oil producers. In the cases of the other oils (with an exception of macadamia nut oil), the predicted shelf-lives were significantly lower than that of the storage times; especially, walnut oil (very prone to oxidation) gave 15-20 times lower shelf-life than the best-before storage life.", "The impact of meals on a probiotic during transit through a model of the human upper gastrointestinal tract. Commercial literature on various probiotic products suggests that they can be taken before meals, during meals or after meals or even without meals. This has led to serious confusion for the industry and the consumer. The objective of our study was to examine the impact of the time of administration with respect to mealtime and the impact of the buffering capacity of the food on the survival of probiotic microbes during gastrointestinal transit. We used an in vitro Digestive System (IViDiS) model of the upper gastrointestinal tract to examine the survival of a commercial multi-strain probiotic, ProtecFlor\u00ae. This product, in a capsule form, contains four different microbes: two lactobacilli (Lactobacillus helveticus R0052 and Lactobacillus rhamnosus R0011), Bifidobacterium longum R0175 and Saccharomyces cerevisiae boulardii. Enumeration during and after transit of the stomach and duodenal models showed that survival of all the bacteria in the product was best when given with a meal or 30 minutes before a meal (cooked oatmeal with milk). Probiotics given 30 minutes after the meal did not survive in high numbers. Survival in milk with 1% milk fat and oatmeal-milk gruel were significantly better than apple juice or spring water. S. boulardii was not affected by time of meal or the buffering capacity of the meal. The protein content of the meal was probably not as important for the survival of the bacteria as the fat content. We conclude that ideally, non-enteric coated bacterial probiotic products should be taken with or just prior to a meal containing some fats.", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "Strawberry fields forever? On the basis of copious preclinical data supporting the preventive efficacy of small fruits such as berries and grapes, Chen and colleagues conducted a randomized (noncomparative) phase II trial evaluating two doses of strawberry powder (60 g/d or 30 g/d for six months) to prevent esophageal cancer in China (reported in this issue of the journal, beginning on page 41); 60 g/d reduced the histologic grade of dysplastic lesions and reduced localized biomarkers, whereas 30 g/d was not effective. Fundamental questions remain such as the best formulation of strawberry powder, the active components associated with powder, and the actual mechanism of action, and standardized preparations will be required to permit the widespread use of strawberry powder with a predicable outcome. Clearly, however, this work is a good example of proof-of-principle and highlights the important role of diet, nutrition, and natural products in cancer prevention. \u00a92012 AACR.", "Longevity. The allostatic load of dietary restriction. Restriction of food intake by 10-50% of ad libitum on a per unit of weight or energy content basis can extend the lifespan of a wide variety of species and prevent or delay age-related disease. This review first briefly summarizes the data delineating mortality trajectories of various species' populations maintained on restricted diets to provide insight into the effects of nutrient deprivation on distinct components of the aging process. Next, I discuss a number of important studies that have addressed the question whether it is the lack of calories and/or specific nutrients that determines the longevity response to dietary restriction. Finally, I review the evidence for hormesis as a proximate mechanism underpinning the impact of dietary restriction on lifespan. In aggregate, the currently available demographic data suggest that dietary restriction can both slow the age-related progressive accumulation of cellular damage and also enhance the ability of organisms to cope with irreversible injury. Restriction of essential nutrients as well as calories may affect life expectancy, perhaps in a species specific fashion. Hormesis, i.e. an evolutionary conserved stress response routine providing protection against a wide variety of (other) hazards in response to low levels of stress, is very likely to contribute to the beneficial health effects of dietary restriction. Copyright \u00c2\u00a9 2011 Elsevier Inc. All rights reserved."], ["Do Sirtuins Promote Mammalian Longevity?: A Critical Review on Its Relevance to the Longevity Effect Induced by Calorie Restriction Sirtuins (SIRTs), a family of nicotinamide adenine dinucleotide (NAD)-dependent deacetylases, are emerging as key molecules that regulate aging and age-related diseases including cancers, metabolic disorders, and neurodegenerative diseases. Seven isoforms of SIRT (SIRT1\u20137) have been identified in mammals. SIRT1 and 6, mainly localized in the nucleus, regulate transcription of genes and DNA repair. SIRT3 in the mitochondria regulates mitochondrial bioenergetics. Initial studies in yeasts, nematodes, and flies indicated a strong connection of SIRT with the life-prolonging effects of calorie restriction (CR), a robust experimental intervention for longevity in a range of organisms. However, subsequent studies reported controversial findings regarding SIRT roles in the effect of CR. This review describes the functional roles of mammalian SIRTs and discusses their relevance to mechanisms underlying the longevity effect of CR.", "Protective effects and mechanisms of sirtuins in the nervous system Silent information regulator two proteins (sirtuins or SIRTs) are a group of histone deacetylases whose activities are dependent on and regulated by nicotinamide adenine dinucleotide (NAD+). They suppress genome-wide transcription, yet upregulate a select set of proteins related to energy metabolism and pro-survival mechanisms, and therefore play a key role in the longevity effects elicited by calorie restriction. Recently, a neuroprotective effect of sirtuins has been reported for both acute and chronic neurological diseases. The focus of this review is to summarize the latest progress regarding the protective effects of sirtuins, with a focus on SIRT1. We first introduce the distribution of sirtuins in the brain and how their expression and activity are regulated. We then highlight their protective effects against common neurological disorders, such as cerebral ischemia, axonal injury, Alzheimer\u2019s disease, Parkinson\u2019s disease, amyotrophic lateral sclerosis, and multiple sclerosis. Finally, we analyze the mechanisms underlying sirtuin-mediated neuroprotection, centering on their non-histone substrates such as DNA repair enzymes, protein kinases, transcription factors, and coactivators. Collectively, the information compiled here will serve as a comprehensive reference for the actions of sirtuins in the nervous system to date, and will hopefully help to design further experimental research and expand sirtuins as therapeutic targets in the future.", "At the crossroad of lifespan, calorie restriction, chromatin and disease: meeting on sirtuins. Longevity, lifespan, cancer, cellular transformation, energy, calorie restriction, diabetes--what can tie together such a diversity of hot topics in biomedical research? Emerging findings suggest that the answer lies in understanding the functions of the recently discovered family of proteins known as Sirtuins. Barcelona hosted the first scientific meeting completely focused on these evolutionary conserved protein deacetylases, bringing together experts in the biochemistry to cellular biology, mice models, drug targeting and pathophysiology of these molecules. Their work, summarized here, establishes the Sirtuins as major players in cellular homeostasis and human diseases that act through a whole range of biochemical substrates and physiological processes. Undoubtedly, this is an increasingly expanding field that it is here to stay and growth.", "Sirtuins in cognitive ageing and Alzheimer's disease. PURPOSE OF REVIEW: Sirtuins are a family of enzymes highly conserved in evolution and involved in mechanisms known to promote healthy ageing and longevity. This review aims to discuss recent advances in understanding the role of sirtuins, in particular mammalian SIRT1, in promoting longevity and its potential molecular basis for neuroprotection against cognitive ageing and Alzheimer's disease pathology. RECENT FINDINGS: Accumulative increase in oxidative stress during ageing has been shown to decrease SIRT1 activity in catabolic tissue, possibly by direct inactivation by reactive oxygen. SIRT1 overexpression prevents oxidative stress-induced apoptosis and increases resistance to oxidative stress through regulation of the FOXO family of forkhead transcription factors. In addition, resveratrol strongly stimulates SIRT1 deacetylase activity in a dose-dependent manner by increasing its binding affinity to both the acetylated substrate and NAD(+). Recently, SIRT1 has been shown to affect amyloid production through its influence over the ADAM10 gene. Upregulation of SIRT1 can also induce the Notch pathway and inhibit mTOR signalling. SUMMARY: Recent studies have revealed some of the mechanisms and pathways that are associated with the neuroprotective effects of SIRT1.", "A berry thought-provoking idea: the potential role of plant polyphenols in the treatment of age-related cognitive disorders. Today, tens of millions of elderly individuals worldwide suffer from dementia. While the pathogenesis of dementia is complex and incompletely understood, it may be, at least to a certain extent, the consequence of systemic vascular pathology. The metabolic syndrome and its individual components induce a proinflammatory state that damages blood vessels. This condition of chronic inflammation may damage the vasculature of the brain or be directly neurotoxic. Associations have been established between the metabolic syndrome, its constituents and dementia. A relationship has also been observed between certain dietary factors, such as constituents of the 'Mediterranean diet', and the metabolic syndrome; similar associations have been noted between these dietary factors and dementia. Fruit juices and extracts are under investigation as treatments for cognitive impairment. Blueberry, strawberry, blackberry, grape and plum juices or extracts have been successfully tested in cognitively impaired rodents. Published trials of the benefits of grape and blueberry juice in the treatment of small numbers of cognitively impaired persons have recently appeared. The benefits of fruit products are thought to be a result of its polyphenol content. A grape polyphenol found in grapes, resveratrol, now being studied in humans, and one in grapes and blueberries, pterostilbene, have been found to improve cognition in rodents. In the design of future human trials, one ought to consider the poor bioavailability of these products, the possible need to initiate the experimental therapy long before the onset of symptoms, and currently limited knowledge about the appropriate form (e.g. juice, powder or individual polyphenol) of treatment."], ["Physician smoking status, attitudes toward smoking, and cessation advice to patients: an international survey. OBJECTIVE: The smoking status of physicians can impact interactions with patients about smoking. The 'Smoking: The Opinions of Physicians' (STOP) survey examined whether an association existed between physician smoking status and beliefs about smoking and cessation and a physician's clinical interactions with patients relevant to smoking cessation, and perceptions of barriers to assisting with quitting. METHODS: General and family practitioners across 16 countries were surveyed via telephone or face-to-face interviews using a convenience-sample methodology. Physician smoking status was self-reported. RESULTS: Of 4473 physicians invited, 2836 (63%) participated in the survey, 1200 (42%) of whom were smokers. Significantly fewer smoking than non-smoking physicians volunteered that smoking was a harmful activity (64% vs 77%; P<0.001). More non-smokers agreed that smoking cessation was the single biggest step to improving health (88% vs 82%; P<0.001) and discussed smoking at every visit (45% vs 34%; P<0.001). Although more non-smoking physicians identified willpower (37% vs 32%; P<0.001) and lack of interest (28% vs 22%; P<0.001) as barriers to quitting, more smoking physicians saw stress as a barrier (16% vs 10%; P<0.001). CONCLUSION: Smoking physicians are less likely to initiate cessation interventions. PRACTICE IMPLICATIONS: There is a need for specific strategies to encourage smoking physicians to quit, and to motivate all practitioners to adopt systematic approaches to assisting with smoking cessation.", "Cigarette Smoke Toxins Deposited on Surfaces: Implications for Human Health Cigarette smoking remains a significant health threat for smokers and nonsmokers alike. Secondhand smoke (SHS) is intrinsically more toxic than directly inhaled smoke. Recently, a new threat has been discovered \u2013 Thirdhand smoke (THS) \u2013 the accumulation of SHS on surfaces that ages with time, becoming progressively more toxic. THS is a potential health threat to children, spouses of smokers and workers in environments where smoking is or has been allowed. The goal of this study is to investigate the effects of THS on liver, lung, skin healing, and behavior, using an animal model exposed to THS under conditions that mimic exposure of humans. THS-exposed mice show alterations in multiple organ systems and excrete levels of NNAL (a tobacco-specific carcinogen biomarker) similar to those found in children exposed to SHS (and consequently to THS). In liver, THS leads to increased lipid levels and non-alcoholic fatty liver disease, a precursor to cirrhosis and cancer and a potential contributor to cardiovascular disease. In lung, THS stimulates excess collagen production and high levels of inflammatory cytokines, suggesting propensity for fibrosis with implications for inflammation-induced diseases such as chronic obstructive pulmonary disease and asthma. In wounded skin, healing in THS-exposed mice has many characteristics of the poor healing of surgical incisions observed in human smokers. Lastly, behavioral tests show that THS-exposed mice become hyperactive. The latter data, combined with emerging associated behavioral problems in children exposed to SHS/THS, suggest that, with prolonged exposure, they may be at significant risk for developing more severe neurological disorders. These results provide a basis for studies on the toxic effects of THS in humans and inform potential regulatory policies to prevent involuntary exposure to THS.", "Changes in brain activation associated with reward processing in smokers and nonsmokers. A positron emission tomography study. Tobacco smoking is the most frequent form of substance abuse. Several studies have shown that the addictive action of nicotine is mediated by the mesolimbic dopamine system. This system is implicated in reward processing. In order to better understand the relationship between nicotine addiction and reward in humans, we investigated differences between smokers and nonsmokers in the activation of brain regions involved in processing reward information. Using [H2(15O)] positron emission tomography (PET), we measured regional cerebral blood flow (rCBF) in healthy smokers and nonsmokers while they performed a prelearned, pattern-recognition task. We compared two conditions involving nonmonetary reinforcement or monetary reward with a baseline condition in which nonsense feedback was presented. With monetary reward, we found activation in the frontal and orbitofrontal cortex, occipital cortex, cingulate gyrus, cerebellum, and midbrain in both groups. Additionally, monetary reward activated typical dopaminergic regions such as the striatum in nonsmokers but not in smokers. We found a similar pattern of activation associated with nonmonetary reinforcement in nonsmokers, whereas activation was found in smokers only in the cerebellum. The different patterns of activation suggest that the brains of smokers react in a different way to reward than those of nonsmokers. This difference involves in particular the regions of the dopaminergic system including the striatum. In principle these observations could be interpreted either as a consequence of tobacco use or as a primitive condition of the brain that led people to smoke. Supported by related nonimaging studies, we interpret these differences as a consequence of tobacco smoking, even if a short-term effect of smoking prior to the experiment cannot be excluded.", "Cannabis and the lung. The use of cannabis is embedded within many societies, mostly used by the young and widely perceived to be safe. Increasing concern regarding the potential for cannabis to cause mental health effects has dominated cannabis research and the potential adverse respiratory effects have received relatively little attention. Studies on cannabis are challenging and subject to confounding by concomitant use of tobacco and other social factors, and while many of the studies referred to in this review are beset by the difficulties inherent in undertaking epidemiological research of the effects of cannabis, there is an emerging concern among many chest physicians who would suggest that habitual smoking of cannabis may contribute to the development of chronic obstructive pulmonary disease, pneumothorax and respiratory infections, including tuberculosis. Special attention should be given to the risk of lung cancer, particularly as biological plausibility may precede epidemiology.", "Contribution of monoamine oxidase (MAO) inhibition to tobacco and alcohol addiction. Whole-body PET-scan studies in brains of tobacco smokers have shown a decrease in monoamine oxidase (MAO) activity, which reverts to control level when they quit smoking. The observed decrease in MAO activity in smokers is presumably due to their exposure to tobacco constituents that possess MAO-inhibiting properties. The inhibition of MAO activity seems, however, not to be a unique feature of tobacco smoking as subjects with Type II alcoholism have been reported to show a similar decrease in MAO activity that reverses when they cease to use alcohol. The present review summarizes the data on MAO-inhibiting tobacco constituents and explains that the decrease in MAO activity observed in alcoholics is probably due to concomitant tobacco use. It is concluded that the inhibition of MAO by constituents contained in tobacco and tobacco smoke, enhances the addiction induced by tobacco smoking."], ["Fruit and Soil Quality of Organic and Conventional Strawberry Agroecosystems Background Sale of organic foods is one of the fastest growing market segments within the global food industry. People often buy organic food because they believe organic farms produce more nutritious and better tasting food from healthier soils. Here we tested if there are significant differences in fruit and soil quality from 13 pairs of commercial organic and conventional strawberry agroecosystems in California. Methodology/Principal Findings At multiple sampling times for two years, we evaluated three varieties of strawberries for mineral elements, shelf life, phytochemical composition, and organoleptic properties. We also analyzed traditional soil properties and soil DNA using microarray technology. We found that the organic farms had strawberries with longer shelf life, greater dry matter, and higher antioxidant activity and concentrations of ascorbic acid and phenolic compounds, but lower concentrations of phosphorus and potassium. In one variety, sensory panels judged organic strawberries to be sweeter and have better flavor, overall acceptance, and appearance than their conventional counterparts. We also found the organically farmed soils to have more total carbon and nitrogen, greater microbial biomass and activity, and higher concentrations of micronutrients. Organically farmed soils also exhibited greater numbers of endemic genes and greater functional gene abundance and diversity for several biogeochemical processes, such as nitrogen fixation and pesticide degradation. Conclusions/Significance Our findings show that the organic strawberry farms produced higher quality fruit and that their higher quality soils may have greater microbial functional capability and resilience to stress. These findings justify additional investigations aimed at detecting and quantifying such effects and their interactions.", "Are organic foods safer or healthier than conventional alternatives?: a systematic review. BACKGROUND: The health benefits of organic foods are unclear. PURPOSE: To review evidence comparing the health effects of organic and conventional foods. DATA SOURCES: MEDLINE (January 1966 to May 2011), EMBASE, CAB Direct, Agricola, TOXNET, Cochrane Library (January 1966 to May 2009), and bibliographies of retrieved articles. STUDY SELECTION: English-language reports of comparisons of organically and conventionally grown food or of populations consuming these foods. DATA EXTRACTION: 2 independent investigators extracted data on methods, health outcomes, and nutrient and contaminant levels. DATA SYNTHESIS: 17 studies in humans and 223 studies of nutrient and contaminant levels in foods met inclusion criteria. Only 3 of the human studies examined clinical outcomes, finding no significant differences between populations by food type for allergic outcomes (eczema, wheeze, atopic sensitization) or symptomatic Campylobacter infection. Two studies reported significantly lower urinary pesticide levels among children consuming organic versus conventional diets, but studies of biomarker and nutrient levels in serum, urine, breast milk, and semen in adults did not identify clinically meaningful differences. All estimates of differences in nutrient and contaminant levels in foods were highly heterogeneous except for the estimate for phosphorus; phosphorus levels were significantly higher than in conventional produce, although this difference is not clinically significant. The risk for contamination with detectable pesticide residues was lower among organic than conventional produce (risk difference, 30% [CI, -37% to -23%]), but differences in risk for exceeding maximum allowed limits were small. Escherichia coli contamination risk did not differ between organic and conventional produce. Bacterial contamination of retail chicken and pork was common but unrelated to farming method. However, the risk for isolating bacteria resistant to 3 or more antibiotics was higher in conventional than in organic chicken and pork (risk difference, 33% [CI, 21% to 45%]). LIMITATION: Studies were heterogeneous and limited in number, and publication bias may be present. CONCLUSION: The published literature lacks strong evidence that organic foods are significantly more nutritious than conventional foods. Consumption of organic foods may reduce exposure to pesticide residues and antibiotic-resistant bacteria. PRIMARY FUNDING SOURCE: None.", "Organic food: buying more safety or just peace of mind? A critical review of the literature. Consumer concern over the quality and safety of conventional food has intensified in recent years, and primarily drives the increasing demand for organically grown food, which is perceived as healthier and safer. Relevant scientific evidence, however, is scarce, while anecdotal reports abound. Although there is an urgent need for information related to health benefits and/or hazards of food products of both origins, generalized conclusions remain tentative in the absence of adequate comparative data. Organic fruits and vegetables can be expected to contain fewer agrochemical residues than conventionally grown alternatives; yet, the significance of this difference is questionable, inasmuch as actual levels of contamination in both types of food are generally well below acceptable limits. Also, some leafy, root, and tuber organic vegetables appear to have lower nitrate content compared with conventional ones, but whether or not dietary nitrate indeed constitutes a threat to human health is a matter of debate. On the other hand, no differences can be identified for environmental contaminants (e.g. cadmium and other heavy metals), which are likely to be present in food from both origins. With respect to other food hazards, such as endogenous plant toxins, biological pesticides and pathogenic microorganisms, available evidence is extremely limited preventing generalized statements. Also, results for mycotoxin contamination in cereal crops are variable and inconclusive; hence, no clear picture emerges. It is difficult, therefore, to weigh the risks, but what should be made clear is that 'organic' does not automatically equal 'safe.' Additional studies in this area of research are warranted. At our present state of knowledge, other factors rather than safety aspects seem to speak in favor of organic food.", "Xenohormesis: health benefits from an eon of plant stress response evolution Xenohormesis is a biological principle that explains how environmentally stressed plants produce bioactive compounds that can confer stress resistance and survival benefits to animals that consume them. Animals can piggyback off products of plants' sophisticated stress response which has evolved as a result of their stationary lifestyle. Factors eliciting the plant stress response can judiciously be employed to maximize yield of health-promoting plant compounds. The xenohormetic plant compounds can, when ingested, improve longevity and fitness by activating the animal's cellular stress response and can be applied in drug discovery, drug production, and nutritional enhancement of diet.", "Zinc and multi-mineral supplementation should mitigate the pathogenic impact of cadmium exposure. High-level cadmium (Cd) exposure has long been known to induce nephropathy, severe osteoporosis, and fractures in humans. More recent epidemiology, however, reveals that, in populations not known to have important industrial exposure to this heavy metal, high-normal blood or urine Cd levels correlate with increased risk for vascular disorders, cancers, diabetes, and total mortality, as well as osteoporosis and nephropathy. Since these disorders appear unlikely to expedite Cd absorption, and since Cd has promoted these pathologies in rodent studies, it seems reasonable to conclude that Cd is an important mediating risk factor for these disorders in humans. Avoiding tobacco smoke or frequent ingestion of shellfish or organ meats can lessen humans exposure to Cd, but the chief dietary sources of Cd are plant-derived foods - green leafy vegetables, whole grains, tubers, and root vegetables - typically recommended for their health-supportive properties; indeed, among non-smokers, vegans tend to have the highest Cd body burden. Fortunately, iron sufficiency and ample dietary intakes of calcium, magnesium, and zinc can impede absorption of dietary Cd, both by down-regulating intestinal expression of mineral transporters, and by directly competing with Cd for access to these transporters. Correction of iron deficiency appears to be of particular importance for controlling Cd absorption. Moreover, zinc supplementation can counteract the toxicity of Cd already in the body via induction of metallothionein, which binds Cd avidly via its sulfhydryl groups; so long as it remains sequestered in this form, Cd is innocuous. Zinc supplementation may in any case be recommendable, as optimal zinc status exerts protective anti-inflammatory, antioxidant, and immunosupportive effects. Inasmuch as the toxicity of Cd appears to be mediated in large part by oxidative stress, ingestion of spirulina, lipoic acid, melatonin, and N-acetylcysteine may also have potential for mitigating the risk associated with Cd exposure, as suggested by rodent studies. Hence, although Cd may prove to be a major risk factor for morbidity and mortality in humans, practical strategies for limiting its absorption and pathogenic impact are at hand. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved."], ["Spearmint herbal tea has significant anti-androgen effects in polycystic ovarian syndrome. A randomized controlled trial. Hirsutism in polycystic ovarian syndrome (PCOS), consequent to elevated androgen levels leads to significant cosmetic and psychological problems. Recent research in Turkey has shown that spearmint tea has antiandrogenic properties in females with hirsutism. No research has yet been undertaken to assess whether a reduction in androgen levels brought about by spearmint tea, translates to a clinical improvement in the degree of hirsutism. This study was a two centre, 30 day randomized controlled trial. Forty two volunteers were randomized to take spearmint tea twice a day for a 1 month period and compared with a placebo herbal tea. At 0, 15 and 30 days of the study serum androgen hormone levels and gonadotrophins were checked, the degree of hirsutism was clinically rated using the Ferriman-Galwey score and a questionnaire (the modified DQLI = Dermatology Quality of Life Index) was used to assess improvements in the level of self-reported hirsutism. Forty one of 42 patients completed the study. Free and total testosterone levels were significantly reduced over the 30 day period in the spearmint tea group (p < 0.05). LH and FSH also increased (p < 0.05). Patient's subjective assessments of their degree of hirsutism scored by the modified DQLI were significantly reduced in the spearmint tea group (p < 0.05). There was, however, no significant reduction in the objective Ferriman-Galwey ratings of hirsutism between the two trial groups over the trial duration (p = 0.12). There was a clear and significant alteration in the relevant hormone levels. This is associated clinically with a reduction in the self-reported degree of hirsutism but unfortunately not with the objectively rated score. It was demonstrated and confirmed that spearmint has antiandrogen properties, the simple fact that this does not clearly translate into clinical practice is due to the relationship between androgen hormones and follicular hair growth and cell turnover time. Simply put, the study duration was not long enough. The original studies from Turkey were in fact only 5 days long. The time taken for hirsutism to resolve is significant and a much longer future study is proposed as the preliminary findings are encouraging that spearmint has the potential for use as a helpful and natural treatment for hirsutism in PCOS. (c) 2009 John Wiley & Sons, Ltd.", "Effect of spearmint (Mentha spicata Labiatae) teas on androgen levels in women with hirsutism. Mentha spicata Labiatae, known as spearmint and Mentha piperita Labiatae, known as peppermint can be used for various kinds of illnesses in herbal medicine and flavoring in industry. M. spicata Labiatae grows on the Anamas plateau of Yenithornarbademli town of Isparta, located in southwest part of Turkey. In this town, clinicians thought that consumption of tea steeped with M. spicata or M. piperita caused a diminished libido. Because antiandrogenic effects of spearmint and peppermint were found previously in rats, it was decided to observe the effect of this herbal tea on the androgen levels in hirsute women.Twenty-one female hirsute patients, 12 with polycystic ovary syndrome and 9 with idiopathic hirsutism were included to the study. They were took a cup of herbal tea which was steeped with M. spicata for 5 days twice a day in the follicular phase of their menstrual cycles. After treatment with spearmint teas, there was a significant decrease in free testosterone and increase in luteinizing hormone, follicle-stimulating hormone and estradiol. There were no significant decreases in total testosterone or dehydroepiandrostenedione sulphate levels. Spearmint can be an alternative to antiandrogenic treatment for mild hirsutism. Further studies are needed to test the reliability of these results and the availability of spearmint as a drug for hirsutism. Copyright 2007 John Wiley & Sons, Ltd.", "The effects of peppermint on exercise performance Background Enhancing athletic performance is a great desire among the athletes, coaches and researchers. Mint is one of the most famous natural herbs used for its analgesic, anti-inflammatory, antispasmodic, antioxidant, and vasoconstrictor effects. Even though inhaling mint aroma in athletes has been investigated, there were no significant effects on the exercise performance. Methods Twelve healthy male students every day consumed one 500\u2009ml bottle of mineral water, containing 0.05\u2009ml peppermint essential oil for ten days. Blood pressure, heart rate, and spirometry parameters including forced vital capacity (FVC), peak expiratory flow rate (PEF), and peak inspiratory flow (PIF) were determined one day before, and after the supplementation period. Participants underwent a treadmill-based exercise test with metabolic gas analysis and ventilation measurement using the Bruce protocol. Results The FVC (4.57\u2009\u00b1\u20090.90 vs. 4.79\u2009\u00b1\u20090.84; p\u2009<\u20090.001), PEF (8.50\u2009\u00b1\u20090.94 vs. 8.87\u2009\u00b1\u20090.92; p\u2009<\u20090.01), and PIF (5.71\u2009\u00b1\u20091.16 vs. 6.58 \u00b11.08; p\u2009<\u20090.005) significantly changed after ten days of supplementation. Exercise performance evaluated by time to exhaustion (664.5\u2009\u00b1\u2009114.2 vs. 830.2\u2009\u00b1\u2009129.8\u2009s), work (78.34 \u00b132.84 vs. 118.7\u2009\u00b1\u200947.38 KJ), and power (114.3\u2009\u00b1\u200924.24 vs. 139.4\u2009\u00b1\u200927.80 KW) significantly increased (p\u2009<\u20090.001). In addition, the results of respiratory gas analysis exhibited significant differences in VO2 (2.74\u2009\u00b1\u20090.40 vs. 3.03\u2009\u00b1\u20090.351\u2009L/min; p\u2009<\u20090.001), and VCO2 (3.08\u2009\u00b1\u20090.47 vs. 3.73\u2009\u00b1\u20090.518\u2009L/min; p\u2009<\u20090.001). Conclusions The results of the experiment support the effectiveness of peppermint essential oil on the exercise performance, gas analysis, spirometry parameters, blood pressure, and respiratory rate in the young male students. Relaxation of bronchial smooth muscles, increase in the ventilation and brain oxygen concentration, and decrease in the blood lactate level are the most plausible explanations.", "The effect of inhaling peppermint odor and ethanol in women athletes. The purpose of this study was to determine whether inhaling peppermint odor has effects on time of running, maximum heart rate (MHR), maximum oxygen consumption (VO2max), oxygen consumption (VO2), minute ventilation (VE) and respiratory exchange ratio (RER) during acute intensive exercise or not. 36 women soccer player were chosen for participating in this research. They were randomly divided in 3 groups (control, inhaling peppermint, inhaling mixture of peppermint and ethanol). In order to be aware of similarity of groups, the subjects' BMI was determined and ANOVA did not show any significant differences (p < 0.05). The subjects of three groups ran on treadmill according to Bruce test. Heart rate, time of running, VO2max, VO2, VE and RER were measured by Gas Analyzer. After collecting the data, ANOVA was done (p < 0.05) and the results showed that in this study the inhaling of fragrant odors did not have any significant effect on the time of running, MHR, VO2max, VO2, VE and RER, which we think is due to the intensity and duration of training. Referring to our results of the present study; we suggest that inhaling peppermint odor during acute intensive exercise has no significant effect on pulmonary indexes and physical performance (Tab. 4, Fig. 1, Ref. 21).", "Examination of the effectiveness of peppermint aromatherapy on nausea in women post C-section. PURPOSE: This study examined the effect of peppermint spirits on postoperative nausea in women following a scheduled C-section. DESIGN: A pretest-posttest research design with three groups was used. The peppermint group inhaled peppermint spirits, the placebo aromatherapy control group inhaled an inert placebo, green-colored sterile water, and the standard antiemetic therapy control group received standard antiemetics, usually intravenous ondansetron or promethazine suppositories. METHODS: Women were randomly assigned to a group on admission to the hospital. If they became nauseated, nurses on the mother-baby unit assessed their nausea (baseline), administered the assigned intervention, and then reassessed participants' nausea 2 and 5 minutes after the initial intervention. Participants rated their nausea using a 6-point nausea scale. FINDINGS: Thirty-five participants became nauseated post-operatively. Participants in all three intervention groups had similar levels of nausea at baseline. The nausea levels of participants in the peppermint spirits group were significantly lower than those of participants in the other two groups 2 and 5 minutes after the initial intervention. CONCLUSIONS: Peppermint spirits may be a useful adjunct in the treatment of postoperative nausea. This study should be replicated with more participants, using a variety of aromatherapies to treat nausea in participants with different preoperative diagnoses."], ["Pseudo-maple syrup urine disease due to maternal prenatal ingestion of fenugreek. Fenugreek, maple syrup and the urine of maple syrup urine disease (MSUD) patients all share a characteristic odour originating from a common component, sotolone. Ingestion of fenugreek by mothers during labour resulted in a maple syrup-like odour in their newborn infants, leading to a false suspicion of MSUD.", "Does Flavanol Intake Influence Mortality from Nitric Oxide-Dependent Processes? Ischemic Heart Disease, Stroke, Diabetes Mellitus, and Cancer in Panama Substantial data suggest that flavonoid-rich food could help prevent cardiovascular disease and cancer. Cocoa is the richest source of flavonoids, but current processing reduces the content substantially. The Kuna living in the San Blas drink a flavanol-rich cocoa as their main beverage, contributing more than 900 mg/day and thus probably have the most flavonoid-rich diet of any population. We used diagnosis on death certificates to compare cause-specific death rates from year 2000 to 2004 in mainland and the San Blas islands where only Kuna live. Our hypothesis was that if the high flavanoid intake and consequent nitric oxide system activation were important the result would be a reduction in the frequency of ischemic heart disease, stroke, diabetes mellitus, and cancer \u2013 all nitric oxide sensitive processes. There were 77,375 deaths in mainland Panama and 558 deaths in the San Blas. In mainland Panama, as anticipated, cardiovascular disease was the leading cause of death (83.4 \u00b1 0.70 age adjusted deaths/100,000) and cancer was second (68.4 \u00b1 1.6). In contrast, the rate of CVD and cancer among island-dwelling Kuna was much lower (9.2 \u00b1 3.1) and (4.4 \u00b1 4.4) respectively. Similarly deaths due to diabetes mellitus were much more common in the mainland (24.1 \u00b1 0.74) than in the San Blas (6.6 \u00b1 1.94). This comparatively lower risk among Kuna in the San Blas from the most common causes of morbidity and mortality in much of the world, possibly reflects a very high flavanol intake and sustained nitric oxide synthesis activation. However, there are many risk factors and an observational study cannot provide definitive evidence.", "The fruit of the date palm: its possible use as the best food for the future? The fruits (dates) of the date palm (Phoenix dactylifera L.) contain a high percentage of carbohydrate (total sugars, 44-88%), fat (0.2-0.5%), 15 salts and minerals, protein (2.3-5.6%), vitamins and a high percentage of dietary fibre (6.4-11.5%). The flesh of dates contains 0.2-0.5% oil, whereas the seed contains 7.7-9.7% oil. The weight of the seed is 5.6-14.2% of the date. The fatty acids occur in both flesh and seed as a range of saturated and unsaturated acids, the seeds containing 14 types of fatty acids, but only eight of these fatty acids occur in very low concentration in the flesh. Unsaturated fatty acids include palmitoleic, oleic, linoleic and linolenic acids. The oleic acid content of the seeds varies from 41.1 to 58.8%, which suggests that the seeds of date could be used as a source of oleic acid. There are at least 15 minerals in dates. The percentage of each mineral in dried dates varies from 0.1 to 916 mg/100 g date depending on the type of mineral. In many varieties, potassium can be found at a concentration as high as 0.9% in the flesh while it is as high as 0.5% in some seeds. Other minerals and salts that are found in various proportions include boron, calcium, cobalt, copper, fluorine, iron, magnesium, manganese, potassium, phosphorous, sodium and zinc. Additionally, the seeds contain aluminum, cadmium, chloride, lead and sulphur in various proportions. Dates contain elemental fluorine that is useful in protecting teeth against decay. Selenium, another element believed to help prevent cancer and important in immune function, is also found in dates. The protein in dates contains 23 types of amino acids, some of which are not present in the most popular fruits such as oranges, apples and bananas. Dates contain at least six vitamins including a small amount of vitamin C, and vitamins B(1) thiamine, B(2) riboflavin, nicotinic acid (niacin) and vitamin A. The dietary fibre of 14 varieties of dates has been shown to be as high as 6.4-11.5% depending on variety and degree of ripeness. Dates contain 0.5-3.9% pectin, which may have important health benefits. The world production of dates has increased 2.9 times over 40 years, whereas the world population has doubled. The total world export of dates increased by 1.71% over 40 years. In many ways, dates may be considered as an almost ideal food, providing a wide range of essential nutrients and potential health benefits.", "Marine edible algae as disease preventers. As modern lifestyles and new feeding habits settle in the world, noncommunicable diseases (NCDs) have evolved to be major causes of disability in developing as well as developed countries. As a concomitant effect, there is a growing interest in natural, healthy food and an increasing awareness of risk factors and determinants of disease. This chapter describes some nutritional facts about seaweeds, which have been used as food since ancient times in China, Japan, Egypt, and India and comments on the potential utilization of marine algae as functional foods. This concept and the description of metabolic syndrome are used as a basis to comprehension of seaweeds against two dreadful illnesses of our times: high blood pressure and cancer. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "A multi-center, double-blind, randomised study of the Lavender oil preparation Silexan in comparison to Lorazepam for generalized anxiety disorder. Generalized and persistent anxiety, accompanied by nervousness and other symptoms (Generalised Anxiety Disorder, GAD) is frequent in the general population and leads to benzodiazepine usage. Unfortunately, these substances induce sedation and have a high potential for drug abuse, and there is thus a need for alternatives. As the anxiolytic properties of lavender have already been demonstrated in pharmacological studies and small-scale clinical trials, it was postulated that lavender has a positive effect in GAD. A controlled clinical study was then performed to evaluate the efficacy of silexan, a new oral lavender oil capsule preparation, versus a benzodiazepine. In this study, the efficacy of a 6-week-intake of silexan compared to lorazepam was investigated in adults with GAD. The primary target variable was the change in the Hamilton Anxiety Rating Scale (HAM-A-total score) as an objective measurement of the severity of anxiety between baseline and week 6. The results suggest that silexan effectively ameliorates generalized anxiety comparable to a common benzodiazepine (lorazepam). The mean of the HAM-A-total score decreased clearly and to a similar extent in both groups (by 11.3+/-6.7 points (45%) in the silexan group and by 11.6+/-6.6 points (46%) in the lorazepam group, from 25+/-4 points at baseline in both groups). During the active treatment period, the two HAM-A subscores \\\"somatic anxiety\\\" (HAM-A subscore I) and \\\"psychic anxiety\\\" (HAM-A subscore II) also decreased clearly and to a similar extent in both groups. The changes in other subscores measured during the study, such as the SAS (Self-rating Anxiety Scale), PSWQ-PW (Penn State Worry Questionnaire), SF 36 Health survey Questionnaire and Clinical Global Impressions of severity of disorder (CGI item 1, CGI item 2, CGI item 3), and the results of the sleep diary demonstrated comparable positive effects of the two compounds. In conclusion, our results demonstrate that silexan is as effective as lorazepam in adults with GAD. The safety of silexan was also demonstrated. Since lavender oil showed no sedative effects in our study and has no potential for drug abuse, silexan appears to be an effective and well tolerated alternative to benzodiazepines for amelioration of generalised anxiety. Copyright 2009 Elsevier GmbH. All rights reserved."], ["Herbal medicines, other than St. John's Wort, in the treatment of depression: a systematic review. OBJECTIVE: To evaluate herbal medicines, other than St. John's wort, in the treatment of depression. DATA SOURCES/SEARCH METHODS: A computer-based search of Medline, Cinahl, AMED, ALT Health Watch, Psych Articles, Psych Info, Current Contents databases, Cochrane Controlled Trials Register, and Cochrane Database of Systematic Reviews, was performed. Researchers were contacted, and bibliographies of relevant papers and previous meta-analysis were hand searched for additional references. REVIEW METHODS: Trials were included in the review if they were prospective human trials assessing herbal medicines, other than St. John's wort, in the treatment of mild-to-moderate depression and utilized validated instruments to assess participant eligibility and clinical endpoints. RESULTS: Nine trials were identified that met all eligibility requirements. Three studies investigated saffron stigma, two investigated saffron petal, and one compared saffron stigma to the petal. Individual trials investigating lavender, Echium, and Rhodiola were also located. DISCUSSION: Results of the trials are discussed. Saffron stigma was found to be significantly more effective than placebo and equally as efficacious as fluoxetine and imipramine. Saffron petal was significantly more effective than placebo and was found to be equally efficacious compared to fluoxetine and saffron stigma. Lavender was found to be less effective than imipramine, but the combination of lavender and imipramine was significantly more effective than imipramine alone. When compared to placebo, Echium was found to significantly decrease depression scores at week 4, but not week 6. Rhodiola was also found to significantly improve depressive symptoms when compared to placebo. CONCLUSION: A number of herbal medicines show promise in the management of mild-to-moderate depression.", "Immunity: plants as effective mediators. In the domain of nutrition, exploring the diet-health linkages is major area of research. The outcomes of such interventions led to widespread acceptance of functional and nutraceutical foods; however, augmenting immunity is a major concern of dietary regimens. Indeed, the immune system is incredible arrangement of specific organs and cells that enabled humans to carry out defense against undesired responses. Its proper functionality is essential to maintain the body homeostasis. Array of plants and their components hold immunomodulating properties. Their possible inclusion in diets could explore new therapeutic avenues to enhanced immunity against diseases. The review intended to highlight the importance of garlic (Allium sativum), green tea (Camellia sinensis), ginger (Zingiber officinale), purple coneflower (Echinacea), black cumin (Nigella sativa), licorice (Glycyrrhiza glabra), Astragalus and St. John's wort (Hypericum perforatum) as natural immune boosters. These plants are bestowed with functional ingredients that may provide protection against various menaces. Modes of their actions include boosting and functioning of immune system, activation and suppression of immune specialized cells, interfering in several pathways that eventually led to improvement in immune responses and defense system. In addition, some of these plants carry free radical scavenging and anti-inflammatory activities that are helpful against cancer insurgence. Nevertheless, interaction between drugs and herbs/botanicals should be well investigated before recommended for their safe use, and such information must be disseminated to the allied stakeholders.", "Hydro-alcoholic extract of Crocus sativus L. versus fluoxetine in the treatment of mild to moderate depression: a double-blind, randomized pilot tr... Depressive disorders are very common in clinical practice, with approximately 11.3 of all adults afflicted during any a year. Saffron is the world's most expensive spice and apart from its traditional value as a food additive, recent studies indicate several therapeutic effects for saffron. It is used for depression in Persian traditional medicine. Our objective was to compare the efficacy of hydro-alcoholic extract of Crocus sativus (stigma) with fluoxetine in the treatment of mild to moderate depression in a 6-week double-blind, randomized trial. Forty adult outpatients who met the Diagnostic and Statistical Manual of Mental Disorders, fourth edition for major depression based on the structured clinical interview for DSM-IV and with mild to moderate depression participated in the trial. In this double-blind, single-center trial and randomized trial, patients were randomly assigned to receive capsules of saffron 30 mg/day (BD) (Group 1) and capsule of fluoxetine 20 mg/day (BD) (Group 2) for a 6-week study. Saffron at this dose was found to be effective similar to fluoxetine in the treatment of mild to moderate depression (F = 0.13, d.f. = 1, P = 0.71). There were no significant differences in the two groups in terms of observed side effects. The results of this study indicate the efficacy of Crocus sativus in the treatment of mild to moderate depression. A large-scale trial is justified.", "Baker's yeast beta-glucan supplement reduces upper respiratory symptoms and improves mood state in stressed women. OBJECTIVE: Several studies have shown a baker's yeast beta-1,3/1,6-d-glucan, extracted from Saccharomyces cerevisiae, is effective in reducing the incidence of cold and flu symptoms. This study evaluated the effect of a specific beta-glucan supplement (Wellmune) on upper respiratory tract symptoms and psychological well-being in women with moderate levels of psychological stress. METHODS: Healthy women (38 \u00b1 12 years old) prescreened for moderate levels of psychological stress, self-administered a placebo (n = 38) or 250 mg of Wellmune (n = 39) daily for 12 weeks. We used the Profile of Mood States (POMS) psychological survey to assess changes in mental/physical energy levels (vigor) and overall well-being (global mood state). A quantitative health perception log was used to track upper respiratory symptoms. RESULTS: Subjects in the Wellmune group reported fewer upper respiratory symptoms compared to placebo (10% vs 29%), better overall well-being (global mood state: 99 \u00b1 19 vs 108 \u00b1 23, p < 0.05), and superior mental/physical energy levels (vigor: 19.9 \u00b1 4.7 vs 15.8 \u00b1 6.3, p < 0.05). CONCLUSIONS: These data show that daily dietary supplementation with Wellmune reduces upper respiratory symptoms and improves mood state in stressed subjects, and thus it may be a useful approach for maintaining immune protection against daily stressors.", "Studies on the antidiarrhoeal effect of dragon's blood from Croton urucurana. The red sap obtained by slashing the bark of Croton urucurana Baill. (Euphorbiaceae), also known as dragon's blood, was screened for a possible antidiarrhoeal activity on castor oil-induced diarrhoea in rats, cholera toxin-induced intestinal secretion in mice and on small intestinal transit in mice. Dragon's blood at an oral dose of 600 mg/kg caused in marked inhibition of the diarrhoeal response following castor oil administration as well as the intestinal fluid accumulation promoted by cholera toxin. At a similar dose the red sap significantly inhibited the small intestinal transit which was, however, found to be independent of the opioid mechanism. These results suggest a potential usefulness of the red sap from Croton urucurana Baill. in the control of secretory diarrhoea associated pathologies. Copyright 2001 John Wiley & Sons, Ltd."], ["Stevia (Stevia rebaudiana) a bio-sweetener: a review. Studies revealed that Stevia has been used throughout the world since ancient times for various purposes; for example, as a sweetener and a medicine. We conducted a systematic literature review to summarize and quantify the past and current evidence for Stevia. We searched relevant papers up to 2007 in various databases. As we know that the leaves of Stevia plants have functional and sensory properties superior to those of many other high-potency sweeteners, Stevia is likely to become a major source of high-potency sweetener for the growing natural food market in the future. Although Stevia can be helpful to anyone, there are certain groups who are more likely to benefit from its remarkable sweetening potential. These include diabetic patients, those interested in decreasing caloric intake, and children. Stevia is a small perennial shrub that has been used for centuries as a bio-sweetener and for other medicinal uses such as to lower blood sugar. Its white crystalline compound (stevioside) is the natural herbal sweetener with no calories and is over 100-300 times sweeter than table sugar.", "A critical review of the genetic toxicity of steviol and steviol glycosides. Extracts of the leaves of the stevia plant (Stevia rebaudiana Bertoni) are used to sweeten food and beverages in South America, Japan and China. The components responsible for the sweet properties of the plant are glycosides of steviol, primary stevioside (ent-13-hydroxykaur-16-en-18-oic acid), which is 250-300 times sweeter than sucrose and rebaudiosides A and C. Stevioside and steviol have been subjected to extensive genetic testing. The majority of the findings show no evidence of genotoxic activity. Neither stevioside nor its aglycone steviol have been shown to react directly with DNA or demonstrate genotoxic damage in assays relevant to human risk. The mutagenic activity of steviol and some of its derivatives, exhibited in strain TM677, was not reproduced in the same bacteria having normal DNA repair processes. The single positive in vivo study measuring single-strand DNA breaks in Wistar rat tissues by stevioside, was not confirmed in experiments in mice and appears to be measuring processes other than direct DNA damage. Neither stevioside nor steviol-induced clastogenic effects at extremely high dose levels in vivo. Application of a Weight-of-Evidence approach to assess the genetic toxicology database concludes that these substances do not pose a risk of genetic damage following human consumption.", "Evaluation of the genotoxicity of stevioside and steviol using six in vitro and one in vivo mutagenicity assays. Stevioside, a constituent of Stevia rebaudiana, is commonly used as a non-caloric sugar substitute in Japan. The genetic toxicities of stevioside and its aglycone, steviol, were examined with seven mutagenicity tests using bacteria (reverse mutation assay, forward mutation assay, umu test and rec assay), cultured mammalian cells (chromosomal aberration test and gene mutation assay) and mice (micronucleus test). Stevioside was not mutagenic in any of the assays examined. The aglycone, steviol, however, produced dose-related positive responses in some mutagenicity tests, i.e. the forward mutation assay using Salmonella typhimurium TM677, the chromosomal aberration test using Chinese hamster lung fibroblast cell line (CHL) and the gene mutation assay using CHL. Metabolic activation systems containing 9000 g supernatant fraction (S9) of liver homogenates prepared from polychlorinated biphenyl or phenobarbital plus 5,6-benzoflavone-pretreated rats were required for mutagenesis and clastogenesis. Steviol was weakly positive in the umu test using S.typhimurium TA1535/pSK1002 either with or without the metabolic activation system. Steviol, even in the presence of the S9 activation system, was negative in other assays, i.e. the reverse mutation assays using S.typhimurium TA97, TA98, TA100, TA102, TA104, TA1535, TA1537 and Escherichia coli WP2 uvrA/pKM101 and the rec-assay using Bacillus subtilis. Steviol was negative in the mouse micronucleus test. The genotoxic risk of steviol to humans is discussed.", "The potential toxicity of artificial sweeteners. Since their discovery, the safety of artificial sweeteners has been controversial. Artificial sweeteners provide the sweetness of sugar without the calories. As public health attention has turned to reversing the obesity epidemic in the United States, more individuals of all ages are choosing to use these products. These choices may be beneficial for those who cannot tolerate sugar in their diets (e.g., diabetics). However, scientists disagree about the relationships between sweeteners and lymphomas, leukemias, cancers of the bladder and brain, chronic fatigue syndrome, Parkinson's disease, Alzheimer's disease, multiple sclerosis, autism, and systemic lupus. Recently these substances have received increased attention due to their effects on glucose regulation. Occupational health nurses need accurate and timely information to counsel individuals regarding the use of these substances. This article provides an overview of types of artificial sweeteners, sweetener history, chemical structure, biological fate, physiological effects, published animal and human studies, and current standards and regulations.", "Dietary sugar and body weight: have we reached a crisis in the epidemic of obesity and diabetes?: health be damned! Pour on the sugar. Sugar-sweetened drinks have been associated with several health problems. In the point narrative as presented below, we provide our opinion and review of the data to date that we need to reconsider consumption of dietary sugar based on the growing concern of obesity and type 2 diabetes. In the counterpoint narrative following our contribution, Drs. Kahn and Sievenpiper provide a defense and suggest that dietary sugar is not the culprit. Data from the National Health and Nutrition Examination Survey and U.S. Department of Agriculture dietary surveys along with commercial Homescan data on household purchases were used to understand changes in sugar and fructose consumption. Meta-analyses and randomized clinical trials were used to evaluate outcomes of beverage and fructose intake. About 75% of all foods and beverages contain added sugar in a large array of forms. Consumption of soft drinks has increased fivefold since 1950. Meta-analyses suggest that consumption of sugar-sweetened beverages (SSBs) is related to the risk of diabetes, the metabolic syndrome, and cardiovascular disease. Drinking two 16-ounce SSBs per day for 6 months induced features of the metabolic syndrome and fatty liver. Randomized controlled trials in children and adults lasting 6 months to 2 years have shown that lowering the intake of soft drinks reduced weight gain. Recent studies suggest a gene-SSB potential relationship. Consumption of calorie-sweetened beverages has continued to increase and plays a role in the epidemic of obesity, the metabolic syndrome, and fatty liver disease. Reducing intake of soft drinks is associated with less weight gain."], ["Food prices and blood cholesterol. Cardiovascular diseases (CVD) cost Americans billions of dollars per year. High cholesterol levels, which are closely related to dietary habits, are a major contributor to CVD. In this article, we study whether changes in food prices are related to cholesterol levels and whether taxes or subsidies on particular foods would be effective in lowering cholesterol levels and, consequently, CVD costs. We find that prices of vegetables, processed foods, whole milk and whole grains are significantly associated with blood cholesterol levels. Having analyzed the costs and benefits of government interventions, we find that a subsidy of vegetables and whole grains would be an efficient way to reduce CVD expenditures. Published by Elsevier B.V.", "New metrics of affordable nutrition: which vegetables provide most nutrients for least cost? Measuring food prices per gram, rather than per calorie, is one way to make healthful vegetables appear less expensive. However, a better measure of affordability would take the nutrient content of vegetables into account. This study, based on analyses of US Department of Agriculture datasets, aimed to identify which vegetables, including juices and soups, provided the most nutrients per unit cost. Nutrient density was measured using the Nutrient Rich Foods (NRF) index, based on nine nutrients to encourage: protein; fiber; vitamins A, C, and E; calcium; iron; magnesium; and potassium; and on three nutrients to limit: saturated fat, added sugar, and sodium. Food cost in dollars was calculated per 100 g, per 100 kcal, per serving, and per nutrient content. One-way analyses of variance with post hoc tests were used to determine statistical significance. Results showed that tomato juices and tomato soups, dark green leafy and nonleafy vegetables, and deep yellow vegetables, including sweet potatoes, had the highest NRF scores overall. Highest NRF scores per dollar were obtained for sweet potatoes, white potatoes, tomato juices and tomato soups, carrots, and broccoli. Tomato sauces, raw tomatoes, and potato chips were eaten more frequently than were many other vegetables that were both more affordable and more nutrient-rich. These new measures of affordable nutrition can help foodservice and health professionals identify those vegetables that provide the highest nutrient density per unit cost. Processed vegetables, including soups and juices, can contribute to the quality and the affordability of the diet. Copyright \u00a9 2013 Academy of Nutrition and Dietetics. Published by Elsevier Inc. All rights reserved.", "Profits and pandemics: prevention of harmful effects of tobacco, alcohol, and ultra-processed food and drink industries. The 2011 UN high-level meeting on non-communicable diseases (NCDs) called for multisectoral action including with the private sector and industry. However, through the sale and promotion of tobacco, alcohol, and ultra-processed food and drink (unhealthy commodities), transnational corporations are major drivers of global epidemics of NCDs. What role then should these industries have in NCD prevention and control? We emphasise the rise in sales of these unhealthy commodities in low-income and middle-income countries, and consider the common strategies that the transnational corporations use to undermine NCD prevention and control. We assess the effectiveness of self-regulation, public-private partnerships, and public regulation models of interaction with these industries and conclude that unhealthy commodity industries should have no role in the formation of national or international NCD policy. Despite the common reliance on industry self-regulation and public-private partnerships, there is no evidence of their effectiveness or safety. Public regulation and market intervention are the only evidence-based mechanisms to prevent harm caused by the unhealthy commodity industries. Copyright \u00a9 2013 Elsevier Ltd. All rights reserved.", "Economic evaluation of direct-acting antiviral therapy in chronic hepatitis C. In 2011, the protease inhibitors boceprevir and telaprevir were approved in the United States and European Union for the treatment of hepatitis C infection. While remarkably effective, the newly approved therapies are also accompanied by additional side effects and considerable costs. Understanding the balance between costs and effectiveness is critical to making decisions about the optimal use of these new agents, especially for health care systems constrained by rising costs. Our goal for this review is to facilitate an understanding of the importance of cost-effectiveness analyses in guiding policy decisions about the use of newly approved drugs as well as future therapies for hepatitis C.", "Selection of levels of prevention. This article outlines the advantages and disadvantages of universal and targeted intervention programs. Two advantages of universal programs are the absence of labeling and stigmatization, and the inclusion of the middle class which makes it more likely that the program will be well run. Two disadvantages are that they are unappealing to the public and politicians, and they may have their greatest effect on those at lowest risk. Targeted programs have the potential of addressing problems early on, and are potentially efficient if targeting can be done accurately. Disadvantages include difficulties around screening and the possibility of labeling and stigmatization. The argument is put forth that what is needed to reduce the immense burden of suffering from child and adolescent psychiatric disorders is the optimal mix of universal, targeted, and clinical programs carried out in the context of a civic community. There will always be trade-offs among these strategies, and the elements of the combination will change as knowledge accumulates."], ["Investigating Antibacterial Effects of Garlic (Allium sativum) Concentrate and Garlic-Derived Organosulfur Compounds on Campylobacter jejuni by Using Fourier Transform Infrared Spectroscopy, Raman Spectroscopy, and Electron Microscopy Fourier transform infrared (FT-IR) spectroscopy and Raman spectroscopy were used to study the cell injury and inactivation of Campylobacter jejuni from exposure to antioxidants from garlic. C. jejuni was treated with various concentrations of garlic concentrate and garlic-derived organosulfur compounds in growth media and saline at 4, 22, and 35\u00b0C. The antimicrobial activities of the diallyl sulfides increased with the number of sulfur atoms (diallyl sulfide < diallyl disulfide < diallyl trisulfide). FT-IR spectroscopy confirmed that organosulfur compounds are responsible for the substantial antimicrobial activity of garlic, much greater than those of garlic phenolic compounds, as indicated by changes in the spectral features of proteins, lipids, and polysaccharides in the bacterial cell membranes. Confocal Raman microscopy (532-nm-gold-particle substrate) and Raman mapping of a single bacterium confirmed the intracellular uptake of sulfur and phenolic components. Scanning electron microscopy (SEM) and transmission electron microscopy (TEM) were employed to verify cell damage. Principal-component analysis (PCA), discriminant function analysis (DFA), and soft independent modeling of class analogs (SIMCA) were performed, and results were cross validated to differentiate bacteria based upon the degree of cell injury. Partial least-squares regression (PLSR) was employed to quantify and predict actual numbers of healthy and injured bacterial cells remaining following treatment. PLSR-based loading plots were investigated to further verify the changes in the cell membrane of C. jejuni treated with organosulfur compounds. We demonstrated that bacterial injury and inactivation could be accurately investigated by complementary infrared and Raman spectroscopies using a chemical-based, \u201cwhole-organism fingerprint\u201d with the aid of chemometrics and electron microscopy.", "Higher bioaccessibility of iron and zinc from food grains in the presence of garlic and onion. Bioavailability of micronutrients iron and zinc is particularly low from plant foods. Hence there is a need to evolve a food-based strategy to improve the same to combat widespread deficiencies of these minerals in a population dependent on plant foods. Dietary sulfur-containing amino acids have been reported to improve the mineral status of experimental animals. Our objective was to examine whether sulfur compound-rich Allium spices have a similar potential of beneficially modulating the mineral bioavailability. In this context, we examined the influence of exogenously added garlic and onion on the bioaccessibility of iron and zinc from food grains. Two representative cereals and pulses each were studied in both raw and cooked condition employing two levels of garlic (0.25 and 0.5 g/10 g of grain) and onion (1.5 and 3 g/10 g of grain). The enhancing effect of these two spices on iron bioaccessibility was generally evidenced in the case of both the cereals (9.4-65.9% increase) and pulses (9.9-73.3% increase) in both raw and cooked conditions. The two spices similarly enhanced the bioaccessibility of zinc from the food grains, the extent of increase in cereals ranging from 10.4% to 159.4% and in pulses from 9.8% to 49.8%. Thus, both garlic and onion were evidenced here to have a promoting influence on the bioaccessibility of iron and zinc from food grains. This novel information has the potential application in evolving a food-based strategy to improve the bioavailability of trace minerals and hence contributes to the human health benefit.", "Antimicrobial properties of Allium sativum (garlic). Although garlic has been used for its medicinal properties for thousands of years, investigations into its mode of action are relatively recent. Garlic has a wide spectrum of actions; not only is it antibacterial, antiviral, antifungal and antiprotozoal, but it also has beneficial effects on the cardiovascular and immune systems. Resurgence in the use of natural herbal alternatives has brought the use of medicinal plants to the forefront of pharmacological investigations, and many new drugs are being discovered. This review aims to address the historical use of garlic and its sulfur chemistry, and to provide a basis for further research into its antimicrobial properties.", "A moderate increase in daily protein intake causing an enhanced endogenous insulin secretion does not alter circulating levels or urinary excretion... To study the effect of a moderate increase in insulin secretion produced by an increased daily protein intake on dehydroepiandrosterone sulfate (DHEAS), a balanced randomized crossover trial consisting of three strictly controlled dietary regimens was performed in six healthy male volunteers. The basic diet (B) contained 50 g protein/d; diets P and M (also basic diets) were enriched with either 32 g protein/d (P) or 10 mmol L-methionine/d (M). Methionine was given (as a specific nonprotein source of endogenously derived sulfate) to control for possible confounding effects on DHEAS due to an increased sulfate supply. At the end of each 4-day diet period, blood and 24-hour urine samples were collected. Fasting plasma levels of testosterone, cortisol, insulin-like growth factor-I (IGF-I), and insulin, as well as urinary output of total (hot acid-cleaved) testosterone conjugates and 3alpha-androstanediol glucuronide, did not show significant changes in response to dietary manipulations. Endogenous sulfate availability (as reflected by renal sulfate output per 24 hours) approximately doubled with diets P and M. However, plasma levels (6.3 +/- 1.5, 6.8 +/- 1.8, and 6.9 +/- 2.1 micromol/L for B, P, and M, respectively) and urinary excretion (8.8 +/- 9.8, 9.4 +/- 11.2, 8.0 +/- 8.3 micromol/d) of DHEAS remained unaffected. Considering the clear increments (P < .01) in urinary C-peptide excretion with diet P (20.4 +/- 10.3 nmol/d) versus diets B and M (12.6 +/- 5.1 and 13.2 +/- 3.6 nmol/d), respectively, our results suggest that a moderately strong diet-induced increase in daily insulin secretion does not alter urinary and plasma levels of DHEAS.", "Safety, tolerance, and metabolism of broccoli sprout glucosinolates and isothiocyanates: a clinical phase I study. Broccoli sprouts are widely consumed in many parts of the world. There have been no reported concerns with respect to their tolerance and safety in humans. A formal phase I study of safety, tolerance, and pharmacokinetics appeared justified because these sprouts are being used as vehicles for the delivery of the glucosinolate glucoraphanin and its cognate isothiocyanate sulforaphane [1-isothiocyanato-(4R)-(methylsulfinyl)butane] in clinical trials. Such trials have been designed to evaluate protective efficacy against development of neoplastic and other diseases. A placebo-controlled, double-blind, randomized clinical study of sprout extracts containing either glucosinolates (principally glucoraphanin, the precursor of sulforaphane) or isothiocyanates (principally sulforaphane) was conducted on healthy volunteers who were in-patients on our clinical research unit. The subjects were studied in three cohorts, each comprising three treated individuals and one placebo recipient. Following a 5-day acclimatization period on a crucifer-free diet, the broccoli sprout extracts were administered orally at 8-h intervals for 7 days (21 doses), and the subjects were monitored during this period and for 3 days after the last treatment. Doses were 25 micromol of glucosinolate (cohort A), 100 micromol of glucosinolate (cohort B), or 25 micromol of isothiocyanate (cohort C). The mean cumulative excretion of dithiocarbamates as a fraction of dose was very similar in cohorts A and B (17.8 +/- 8.6% and 19.6 +/- 11.7% of dose, respectively) and very much higher and more consistent in cohort C (70.6 +/- 2.0% of dose). Thirty-two types of hematology or chemistry tests were done before, during, and after the treatment period. Indicators of liver (transaminases) and thyroid [thyroid-stimulating hormone, total triiodothyronine (T3), and free thyroxine (T4)] function were examined in detail. No significant or consistent subjective or objective abnormal events (toxicities) associated with any of the sprout extract ingestions were observed."], ["Patients' attitudes to rectal drug administration. One hundred adult patients attending for day case surgery were surveyed by anonymous questionnaire in order to determine their attitudes to rectal drug administration. Fifty four patients did not want an analgesic drug (diclofenac sodium) administered rectally whilst under anaesthesia, all preferring to take it orally if available. Ninety eight patients thought that drugs administered per rectum should always be discussed with them beforehand and a few had very strong feelings about this route of administration. We suggest that prescribers of rectal diclofenac should always discuss it with patients pre-operatively. Whilst many are happy to have suppositories, some young patients are sensitive about this and prefer to take such medication by mouth.", "Effectiveness of devices purported to reduce flatus odor. OBJECTIVE: A variety of charcoal-containing devices are purported to minimize problems with odoriferous rectal gas; however, the evidence supporting the efficacy of these products is virtually all anecdotal. We objectively evaluated the ability of these devices to adsorb two malodorous, sulfide gases (hydrogen sulfide and methylmercaptan) instilled at the anus. METHODS: Via a tube, 100 ml of nitrogen containing 40 ppm of sulfide gases and 0.5% H(2) was instilled at the anus of six healthy volunteers who wore gas impermeable Mylar pantaloons over their garments. Since H(2) is not adsorbed by charcoal, the fraction of the sulfide gases removed could be determined from the concentration ratio of sulfide gas: H(2) in the pantaloon space relative to the ratio in instilled gas. RESULTS: Measurements with no device in place showed that subjects' garments removed 22.0 +/- 5.3% of the sulfide gases, and results obtained with each device were corrected for this removal. The only product that adsorbed virtually all of the sulfide gases was briefs constructed from an activated carbon fiber fabric. Pads worn inside the underwear removed 55-77% of the sulfide gases. Most cushions were relatively ineffective, adsorbing about 20% of the gases. CONCLUSIONS: The ability of charcoal-containing devices to adsorb odoriferous rectal gases is limited by incomplete exposure of the activated carbon to the gases. Briefs made from carbon fiber are highly effective; pads are less effective, removing 55-77% of the odor; cushions are relatively ineffective.", "Faecal retention: a common cause in functional bowel disorders, appendicitis and haemorrhoids--with medical and surgical therapy. The present studies explored whether faecal retention in the colon is a causative factor in functional bowel disease, appendicitis, and haemorrhoids. Faecal retention was characterized by colon transit time (CTT) after radio-opaque marker ingestion and estimation of faecal loading on abdominal radiographs at 48 h and 96 h. Specific hypotheses were tested in patients (n = 251 plus 281) and in healthy random controls (n = 44). A questionnaire was completed for each patient, covering abdominal and anorectal symptoms and without a priori grouping. Patients with functional bowel disorders, predominantly women, had a significantly increased CTT and faecal load compared to controls. The CTT was significantly and positively correlated with segmental and total faecal loading. The faecal load was equal at 48 h and 96 h, mirroring the presence of permanent faecal reservoirs. In these first clinical studies to correlate bowel symptoms with CTT and colon faecal loading, abdominal bloating was significantly correlated with faecal loading in the right colon, total faecal load, and CTT. Abdominal pain was significantly and positively correlated to distal faecal loading and significantly associated with bloating. A new phenomenon with a high faecal load and a normal CTT was observed in a subset of patients (n = 90), proving faecal retention as hidden constipation. The CTT and faecal load were significantly higher in the right-side compared to the left and distal segments. Within the control group of healthy persons, the right-sided faecal load was significantly greater than the left and distal load. The CTT and faecal load significantly positively correlated with a palpable mass in the left iliac fossa and meteorism. Cluster analysis revealed that CTT and faecal load positively correlated with a symptom factor consisting of bloating, proctalgia and infrequent defecation of solid faeces. On the other hand, CTT and faecal load negatively correlated with a symptom factor comprising frequent easy defecations, repetitiveness, and incompleteness with solid or liquid faeces. The majority of patients with a heavy faecal load but normal CTT had repetitive daily defecation, mostly with ease and with altering faecal consistence. Flue-like episodes co-existed in symptom factors with abdominal pain and meteorism, and these symptoms together with a palpable right iliac fossa mass and tenderness, and in other factors with seldom and difficult defecation, and with epigastric discomfort and halitosis. Patients with seldom and difficult defecation of solid faeces experienced abdominal pain significantly more often and presented a palpable mass in the right iliac fossa with tenderness and meteorism. The CTT was significantly prolonged and faecal load significantly increased. In patients with a normal CTT and increased faecal load, only patients with abdominal pain had a significant correlation between faecal loading and bloating. CTT and faecal load were shown for the first time to increase significantly with the number of colonic redundancies (colon length), which also resulted in significantly increased bloating and pain. Intervention with a bowel stimulation regimen combining a fibre-rich diet, fluid, physical activity, and a prokinetic drug was essential to proving that abdominal symptoms and defecation disorders are caused by faecal retention, with or without a prolonged CTT. The CTT was significantly reduced, as was faecal load. Bloating and pain were reduced significantly. The defecation became easy with solid faeces, towards one per day and with significant reductions in incompleteness and repetitiveness. Proctalgia and flue-like episodes were significantly reduced. The intervention significantly reduced the presence of a tender palpable mass in the right fossa and rectal constipation. In patients with a normal CTT but increased faecal load, the intervention did not significantly change the CTT or load, but bloating and pain were significantly reduced, just as defecation improved overall. The novel knowledge of faecal retention in the patients does not explain why faecal retention occurs. However, it may be inferred from the present results that a constipated or irritable bowel may belong to the same underlying disease dimension, where faecal retention is a common factor. Thus, measuring CTT and faecal load is suggested as a guide to a positive functional diagnosis of bowel disorders compared to the constellation of symptoms alone. Thirty-five patients underwent surgery after being refractory to the conservative treatment for constipation. They had a significantly prolonged CTT and heavy faecal loading, which was responsible for the aggravated abdominal and defaecatory symptoms. The operated patients presented with a redundant colon (dolichocolon) significantly more often. These patients also had an extremely high rate of previous appendectomy. Twenty-one patients underwent hemicolectomy, and 11 patients had a subtotal colectomy with an ileosigmoidal anastomosis; three patients received a stoma. However, some patients had to have the initial segmental colectomy converted to a final subtotal colectomy because of persisting symptoms. Six more subtotal colectomies have been performed and the leakage rate of all colectomies is then 4.9 % (one patient died). After a mean follow-up of 5 years, the vast majority of patients were without abdominal pain and bloating, having two to four defecations daily with control and their quality of life had increased considerably. A faecalith is often located in the appendix, the occlusion of which is responsible for many cases of acute appendicitis, which is infrequent in all except white populations. An effort to trace the origin of the faecalith to faecal retention in the colon was made in a case control study (56 patients and 44 random controls). The CTT was longer and faecal load greater in patients with appendicitis compared to controls, though the difference was not significant. Power calculations showed that more patients were needed to reach statistical significance for these parameters. The presence of a faecalith was most often associated with a gangrenous or perforated appendix. No significant differences were found between the CTT and faecal load of patients who had or did not have a faecalith. However, the right-sided faecal load was significantly higher than the left and distal load. Haemorrhoids are often a consequence of constipation and defaecatory disorders and were found in every second patient with functional bowel disorders. The present studies are the first Danish reports of a novel operation to cure this disease, stapled haemorrhoidopexy (n = 40 and 258 patients). The majority of patients had prolapsed haemorrhoids, and the durability of procedure was confirmed with a follow-up of up to 5 years, meaning a normal anus. The operation time was short, post-operative pain was low, and recovery was rapid. No incontinence was observed, and patient satisfaction was high and significantly correlated with the appearance of a normal anus without prolapse. The cumulative risk of re-operation was greatest in the first 2 years after the stapled haemorrhoidopexy. Patients with persisting haemorrhoidal prolapse had the procedure repeated with results as good as those obtained in the rest of the patients. It was shown in a statistical model that the preoperative severity of haemorrhoidal disease and the immediate postoperative result contributed significantly to predicting the outcome that is the durability of the operation. The most frequent post-operative complication was bleeding requiring surgical haemostasis. One serious complication occurred after an anastomotic leak from a highly placed anastomosis, resulting in retro rectal, retro- and intra-peritoneal, and mediastinal gas. The patient recovered after conservative treatment and without surgical intervention. The stapling technique now used has revolutionized the surgical treatment of prolapsing haemorrhoids. Finally, a common cause may be suspected for diseases constantly associated with one another. Epidemiological evidence has recognized that constipation, diverticulosis and IBS increase the risk of colon cancer (and adenomas), diseases exceedingly rare in communities exempt from appendicitis. Haemorrhoids are a colonic co-morbidity as well. Notably, the patients with a functional bowel disorder had a much higher rate of a previous appendectomy than the background population. In addition, the patients who had previously had an appendectomy had a significantly longer CTT compared to patients, who had not. The data points to the involvement of faecal retention in the origin of faecaliths and, thus, acute appendicitis. Faecal reservoirs were shown in the right and left colon segments in both patients and controls, which are the same areas bearing the highest incidences of adenomateous polyps and malignancies. Familial colorectal cancer occurred significantly more often in patients who had a higher faecal load than the controls. Four malignancies and 25 adenomas were identified. An increased faecal load in the colon with or without delayed transit will increase bacterial counts and create a chronic inflammation of the colonic mucosa, which is a risk factor for cancer onset. A functional bowel disorder is then likely to occur with gradually transition from a primary functional disease into specific organic diseases. A diet rich in fibre and regular physical activity have a therapeutic and preventive effect on colorectal diseases associated with faecal retention.", "Efficacy of cleaning products for C difficile OBJECTIVE To review the evidence for the efficacy of products used for environmental or hand cleaning on the rates of Clostridium difficile\u2013associated diarrhea (CDAD). QUALITY OF EVIDENCE MEDLINE, EMBASE, and the Cochrane Database of Systematic Reviews were searched for articles pertinent to the efficacy of cleaning products against C difficile or studies with outcomes related to rates of CDAD. Evidence was level II. MAIN MESSAGE Minimizing the incidence of CDAD in geriatric rehabilitation units is essential to achieving the goals of increasing patient function and independence for discharge into the community. Attention to environmental control of C difficile and its spores by health care workers and patient visitors is an important secondary prevention strategy. CONCLUSION Chlorine-releasing agents are more effective than detergents for killing spores produced by C difficile. No level I evidence is available to determine if the use of chlorine-releasing agents has an effect on rates of CDAD. Hand-washing is currently the recommended strategy for reducing transmission of C difficile. Alcohol gels do not inactivate C difficile spores; however, increased use of alcohol hand gel has not been associated with higher rates of CDAD. R\u00e9sum\u00e9 OBJECTIF Examiner les preuves indiquant que les produits utilis\u00e9s pour nettoyer l\u2019environnement et les mains sont efficaces pour r\u00e9duire le taux de diarrh\u00e9e due au Clostridium difficile (DDCD). QUALIT\u00c9 DES PREUVES On a consult\u00e9 MEDLINE, EMBASE et la Cochrane Database of Systematic Reviews en retenant les articles portant sur l\u2019efficacit\u00e9 des agents de nettoyage contre le C difficile ou les \u00e9tudes traitant de questions li\u00e9es aux taux de DDCD. Les preuves \u00e9taient de niveau II. PRINCIPAL MESSAGE La r\u00e9duction de l\u2019incidence de la DDCD dans les unit\u00e9s de r\u00e9adaptation g\u00e9riatrique est une condition essentielle pour accro\u00eetre l\u2019\u00e9tat fonctionnel et l\u2019ind\u00e9pendance des patients qui retournent dans la communaut\u00e9. Pour les intervenants et pour les visiteurs des patients, le contr\u00f4le du C difficile et de ses spores dans l\u2019environnement est primordial comme strat\u00e9gie de pr\u00e9vention secondaire. Les agents qui lib\u00e8rent du chlore sont plus efficaces que les d\u00e9tergents pour tuer les spores du C difficile. Il n\u2019existe pas de preuves de niveau I indiquant que l\u2019utilisation d\u2019agents lib\u00e9rant du chlore influence les taux de DDCD. Le lavage des mains est la strat\u00e9gie pr\u00e9sentement recommand\u00e9e pour r\u00e9duire la transmission du C difficile. Les gels d\u2019alcool n\u2019inactivent pas les spores du C difficile; toutefois, une utilisation accrue de gels d\u2019alcool n\u2019a pas entra\u00een\u00e9 d\u2019augmentation du taux de DDCD.", "The effect of a sweet potato, footbath, and acupressure intervention in preventing constipation in hospitalized patients with acute coronary syndro... Constipation is a common health problem that adversely affects quality of life and the prognosis of hospitalized patients with acute coronary syndromes (ACS). The purpose of this study was to develop and test the sweet potato/footbath/acupressure massage (SFA) intervention as a safe treatment for prevention of constipation and to increase satisfaction with bowel emptying in hospitalized patients with ACS. The study was a prospective, randomized controlled trial with a sample of 93 patients (SFA group, n = 44; usual care group, n = 49). Patients in the SFA group received SFA intervention combined with usual care. The results showed that there were statistical differences between the two groups in terms of (1) the incidence of constipation; (2) the use of laxatives and enemas; (3) patients' subjective satisfaction with their bowel emptying during hospitalization; and (4) sensation of incomplete evacuation and anorectal obstruction/blockade. The SFA intervention was more effective, economical, and practical than usual care alone in managing constipation and satisfaction with defecation in patients hospitalized with ACS."], ["Sugar substitutes: Health controversy over perceived benefits Sugar is an inseparable part of the food we consume. But too much sugar is not ideal for our teeth and waistline. There have been some controversial suggestions that excessive sugar may play an important role in certain degenerative diseases. So artificial sweeteners or artificially sweetened products continue to attract consumers. A sugar substitute (artificial sweetener) is a food additive that duplicates the effect of sugar in taste, but usually has less food energy. Besides its benefits, animal studies have convincingly proven that artificial sweeteners cause weight gain, brain tumors, bladder cancer and many other health hazards. Some kind of health related side effects including carcinogenicity are also noted in humans. A large number of studies have been carried out on these substances with conclusions ranging from \u201csafe under all conditions\u201d to \u201cunsafe at any dose\u201d. Scientists are divided in their views on the issue of artificial sweetener safety. In scientific as well as in lay publications, supporting studies are often widely referenced while the opposing results are de-emphasized or dismissed. So this review aims to explore the health controversy over perceived benefits of sugar substitutes.", "The potential toxicity of artificial sweeteners. Since their discovery, the safety of artificial sweeteners has been controversial. Artificial sweeteners provide the sweetness of sugar without the calories. As public health attention has turned to reversing the obesity epidemic in the United States, more individuals of all ages are choosing to use these products. These choices may be beneficial for those who cannot tolerate sugar in their diets (e.g., diabetics). However, scientists disagree about the relationships between sweeteners and lymphomas, leukemias, cancers of the bladder and brain, chronic fatigue syndrome, Parkinson's disease, Alzheimer's disease, multiple sclerosis, autism, and systemic lupus. Recently these substances have received increased attention due to their effects on glucose regulation. Occupational health nurses need accurate and timely information to counsel individuals regarding the use of these substances. This article provides an overview of types of artificial sweeteners, sweetener history, chemical structure, biological fate, physiological effects, published animal and human studies, and current standards and regulations.", "Sucrose activates human taste pathways differently from artificial sweetener. Animal models suggest that sucrose activates taste afferents differently than non-caloric sweeteners. Little information exists how artificial sweeteners engage central taste pathways in the human brain. We assessed sucrose and sucralose taste pleasantness across a concentration gradient in 12 healthy control women and applied 10% sucrose and matched sucralose during functional magnet resonance imaging. The results indicate that (1) both sucrose and sucralose activate functionally connected primary taste pathways; (2) taste pleasantness predicts left insula response; (3) sucrose elicits a stronger brain response in the anterior insula, frontal operculum, striatum and anterior cingulate, compared to sucralose; (4) only sucrose, but not sucralose, stimulation engages dopaminergic midbrain areas in relation to the behavioral pleasantness response. Thus, brain response distinguishes the caloric from the non-caloric sweetener, although the conscious mind could not. This could have important implications on how effective artificial sweeteners are in their ability to substitute sugar intake.", "Stevia (Stevia rebaudiana) a bio-sweetener: a review. Studies revealed that Stevia has been used throughout the world since ancient times for various purposes; for example, as a sweetener and a medicine. We conducted a systematic literature review to summarize and quantify the past and current evidence for Stevia. We searched relevant papers up to 2007 in various databases. As we know that the leaves of Stevia plants have functional and sensory properties superior to those of many other high-potency sweeteners, Stevia is likely to become a major source of high-potency sweetener for the growing natural food market in the future. Although Stevia can be helpful to anyone, there are certain groups who are more likely to benefit from its remarkable sweetening potential. These include diabetic patients, those interested in decreasing caloric intake, and children. Stevia is a small perennial shrub that has been used for centuries as a bio-sweetener and for other medicinal uses such as to lower blood sugar. Its white crystalline compound (stevioside) is the natural herbal sweetener with no calories and is over 100-300 times sweeter than table sugar.", "The effects of high fructose syrup. High fructose corn syrup (HFCS) has become an increasingly common food ingredient in the last 40 years. However, there is concern that HFCS consumption increases the risk for obesity and other adverse health outcomes compared to other caloric sweeteners. The most commonly used types of HFCS (HFCS-42 and HFCS-55) are similar in composition to sucrose (table sugar), consisting of roughly equal amounts of fructose and glucose. The primary difference is that these monosaccharides exist free in solution in HFCS, but in disaccharide form in sucrose. The disaccharide sucrose is easily cleaved in the small intestine, so free fructose and glucose are absorbed from both sucrose and HFCS. The advantage to food manufacturers is that the free monosaccharides in HFCS provide better flavor enhancement, stability, freshness, texture, color, pourability, and consistency in foods in comparison to sucrose. Because the composition of HFCS and sucrose is so similar, particularly on absorption by the body, it appears unlikely that HFCS contributes more to obesity or other conditions than sucrose does. Nevertheless, few studies have evaluated the potentially differential effect of various sweeteners, particularly as they relate to health conditions such as obesity, which develop over relatively long periods of time. Improved nutrient databases are needed to analyze food consumption in epidemiologic studies, as are more strongly designed experimental studies, including those on the mechanism of action and relationship between fructose dose and response. At the present time, there is insufficient evidence to ban or otherwise restrict use of HFCS or other fructose-containing sweeteners in the food supply or to require the use of warning labels on products containing HFCS. Nevertheless, dietary advice to limit consumption of all added caloric sweeteners, including HFCS, is warranted."], ["In vitro and in vivo efficacy of sulfo-carrabiose, a sugar-based cosmetic ingredient with anti-cellulite properties. Most of adult women exhibit cellulite on the hips, buttock and thighs. Although extracellular matrix and lymphatic system disorders can increase its appearance, cellulite basically results from an excessive fat storage in the adipose tissue which exerts considerable pressure on the surrounding skin tissue and creates a dimpled irregular appearance. Caffeine, the most widely used anti-cellulite ingredient, favours fat break-down by inhibiting the phosphodiesterase enzyme and encouraging a high intracellular level of cAMP. A series of studies has shown that spermine and spermidine, two ubiquitous polyamines, encouraged fat storage and slowed fat break-down in the adipose tissue. Besides, it was shown that heparan sulfate glycosaminoglycans had a strong affinity for polyamines. To design a new cosmetic ingredient with anti-cellulite properties, we used molecular modelling to screen several ingredients with a structure similar to that of heparan sulfate glycosaminoglycans. This way, we identified sulfo-carrabiose as a potent molecule for trapping spermine and spermidine. These virtual results were first confirmed in tubo where sulfo-carrabiose was shown to dose-dependently inactivate spermine and spermidine. In vitro, adipocytes cultured with sulfo-carrabiose exhibited a significant reduction of lipogenesis and a significant increase of lipolysis. When sulfo-carrabiose was incorporated in a cosmetic formula, significant improvements were observed in thigh circumference, with better results than those obtained with caffeine after 28 days of use. Furthermore, a combination of caffeine and sulfo-carrabiose led to results significantly better than those obtained with caffeine alone. As measured by fringe projection, thigh volume was also significantly reduced after sulfo-carrabiose treatment. Finally, the appearance of cellulite assessed by clinical evaluation was also significantly reduced within 28 days. \u00a9 2010 BASF Beauty Care Solutions. ICS \u00a9 2010 Society of Cosmetic Scientists and the Soci\u00e9t\u00e9 Fran\u00e7aise de Cosm\u00e9tologie.", "Risk assessment of consumption of methylchavicol and tarragon: the genotoxic potential in vivo and in vitro. Methylchavicol (or estragole), a natural flavouring substance present in tarragon, was confirmed as a genotoxic chemical in the in vitro UDS test in cultured rat hepatocytes and in the in vivo UDS test in hepatocytes of exposed rats. Deep-frozen tarragon was clearly less genotoxic than methylchavicol at equivalent dose levels, and desiccated tarragon was negative. Both forms of tarragon tested in vitro have the ability to decrease significantly the genotoxicity of methylchavicol added to the culture medium at concentrations 10% titanium by weight. While some other cr\u00e8mes contained titanium, despite being colored white, most shampoos, deodorants, and shaving creams contained the lowest levels of titanium (<0.01 \u03bcg/mg). For several high-consumption pharmaceuticals, the titanium content ranged from below the instrument detection limit (0.0001 \u03bcg Ti/mg) to a high of 0.014 \u03bcg Ti/mg. Electron microscopy and stability testing of food-grade TiO2 (E171) suggests that approximately 36% of the particles are less than 100 nm in at least one dimension and that it readily disperses in water as fairly stable colloids. However, filtration of water solubilized consumer products and personal care products indicated that less than 5% of the titanium was able to pass through 0.45 or 0.7 \u03bcm pores. Two white paints contained 110 \u03bcg Ti/mg while three sealants (i.e., prime coat paint) contained less titanium (25 to 40 \u03bcg Ti/mg). This research showed that while many white-colored products contained titanium, it was not a prerequisite. Although several of these product classes contained low amounts of titanium, their widespread use and disposal down the drain and eventually to WWTPs deserves attention. A Monte Carlo human exposure analysis to TiO2 through foods identified children as having the highest exposures because TiO2 content of sweets is higher than other food products, and that a typical exposure for a US adult may be on the order of 1 mg Ti per kilogram body weight per day. Thus, because of the millions of tons of titanium based white pigment used annually, testing should focus on food-grade TiO2 (E171) rather than that adopted in many environmental health and safety tests (i.e., P25), which is used in much lower amounts in products less likely to enter the environment (e.g., catalyst supports, photocatalytic coatings).", "Nanomaterials in consumer products: a challenging analytical problem. Many products used in everyday life are made with the assistance of nanotechnologies. Cosmetic, pharmaceuticals, sunscreen, powdered food are only few examples of end products containing nano-sized particles (NPs), generally added to improve the product quality. To evaluate correctly benefits vs. risks of engineered nanomaterials and consequently to legislate in favor of consumer's protection, it is necessary to know the hazards connected with the exposure levels. This information implies transversal studies and a number of different competences. On analytical point of view the identification, quantification and characterization of NPs in food matrices and in cosmetic or personal care products pose significant challenges, because NPs are usually present at low concentration levels and the matrices, in which they are dispersed, are complexes and often incompatible with analytical instruments that would be required for their detection and characterization. This paper focused on some analytical techniques suitable for the detection, characterization and quantification of NPs in food and cosmetics products, reports their recent application in characterizing specific metal and metal-oxide NPs in these two important industrial and market sectors. The need of a characterization of the NPs as much as possible complete, matching complementary information about different metrics, possible achieved through validate procedures, is what clearly emerges from this research. More work should be done to produce standardized materials and to set-up methodologies to determine number-based size distributions and to get quantitative date about the NPs in such a complex matrices.", "The significance of azo-reduction in the mutagenesis and carcinogenesis of azo dyes. Azo dyes are widely used in textile, printing, cosmetic, drug and food-processing industries. They are also used extensively in laboratories as either biological stains or pH indicators. The extent of such use is related to the degree of industrialization. Since intestinal cancer is more common in highly industrialized countries, a possible connection may exist between the increase in the number of cancer cases and the use of azo dyes. Azo dyes can be reduced to aromatic amines by the intestinal microflora. The mutagenicity of a number of azo dyes is reviewed in this paper. They include Trypan Blue, Ponceau 3R, Pinceau 2R, Methyl Red, Methyl Yellow, Methyl Orange, Lithol Red, Orange I, Orange II, 4-Phenylazo-Naphthylamine, Sudan I, Sudan IV, Acid Alizarin Violet N, Fast Garnet GBC, Allura Red, Ponceau SX, Sunset Yellow, Tartrazine, Citrus Red No. 2, Orange B, Yellow AB, Carmoisine, Mercury Orange, Ponceau S, Versatint Blue, Phenylazophenol, Evan's Blue and their degraded aromatic amines. The significance of azo reduction in the mutagenesis and carcinogenesis of azo dyes is discussed.", "Hydrogen peroxide poisoning. Hydrogen peroxide is an oxidising agent that is used in a number of household products, including general-purpose disinfectants, chlorine-free bleaches, fabric stain removers, contact lens disinfectants and hair dyes, and it is a component of some tooth whitening products. In industry, the principal use of hydrogen peroxide is as a bleaching agent in the manufacture of paper and pulp. Hydrogen peroxide has been employed medicinally for wound irrigation and for the sterilisation of ophthalmic and endoscopic instruments. Hydrogen peroxide causes toxicity via three main mechanisms: corrosive damage, oxygen gas formation and lipid peroxidation. Concentrated hydrogen peroxide is caustic and exposure may result in local tissue damage. Ingestion of concentrated (>35%) hydrogen peroxide can also result in the generation of substantial volumes of oxygen. Where the amount of oxygen evolved exceeds its maximum solubility in blood, venous or arterial gas embolism may occur. The mechanism of CNS damage is thought to be arterial gas embolisation with subsequent brain infarction. Rapid generation of oxygen in closed body cavities can also cause mechanical distension and there is potential for the rupture of the hollow viscus secondary to oxygen liberation. In addition, intravascular foaming following absorption can seriously impede right ventricular output and produce complete loss of cardiac output. Hydrogen peroxide can also exert a direct cytotoxic effect via lipid peroxidation. Ingestion of hydrogen peroxide may cause irritation of the gastrointestinal tract with nausea, vomiting, haematemesis and foaming at the mouth; the foam may obstruct the respiratory tract or result in pulmonary aspiration. Painful gastric distension and belching may be caused by the liberation of large volumes of oxygen in the stomach. Blistering of the mucosae and oropharyngeal burns are common following ingestion of concentrated solutions, and laryngospasm and haemorrhagic gastritis have been reported. Sinus tachycardia, lethargy, confusion, coma, convulsions, stridor, sub-epiglottic narrowing, apnoea, cyanosis and cardiorespiratory arrest may ensue within minutes of ingestion. Oxygen gas embolism may produce multiple cerebral infarctions. Although most inhalational exposures cause little more than coughing and transient dyspnoea, inhalation of highly concentrated solutions of hydrogen peroxide can cause severe irritation and inflammation of mucous membranes, with coughing and dyspnoea. Shock, coma and convulsions may ensue and pulmonary oedema may occur up to 24-72 hours post exposure. Severe toxicity has resulted from the use of hydrogen peroxide solutions to irrigate wounds within closed body cavities or under pressure as oxygen gas embolism has resulted. Inflammation, blistering and severe skin damage may follow dermal contact. Ocular exposure to 3% solutions may cause immediate stinging, irritation, lacrimation and blurred vision, but severe injury is unlikely. Exposure to more concentrated hydrogen peroxide solutions (>10%) may result in ulceration or perforation of the cornea. Gut decontamination is not indicated following ingestion, due to the rapid decomposition of hydrogen peroxide by catalase to oxygen and water. If gastric distension is painful, a gastric tube should be passed to release gas. Early aggressive airway management is critical in patients who have ingested concentrated hydrogen peroxide, as respiratory failure and arrest appear to be the proximate cause of death. Endoscopy should be considered if there is persistent vomiting, haematemesis, significant oral burns, severe abdominal pain, dysphagia or stridor. Corticosteroids in high dosage have been recommended if laryngeal and pulmonary oedema supervene, but their value is unproven. Endotracheal intubation, or rarely, tracheostomy may be required for life-threatening laryngeal oedema. Contaminated skin should be washed with copious amounts of water. Skin lesions should be treated as thermal burns; surgery may be required for deep burns. In the case of eye exposure, the affected eye(s) shod eye(s) should be irrigated immediately and thoroughly with water or 0.9% saline for at least 10-15 minutes. Instillation of a local anaesthetic may reduce discomfort and assist more thorough decontamination.", "Creation of a databank for content of antioxidants in food products by an amperometric method. Oxidative stress, i.e. excessive content of reactionary, oxygen, and nitrogen compounds (ROAC), including free radicals, is one of the causes of various dangerous diseases as well as premature aging. The adverse effect of free radicals can be neutralized by antioxidants. In order to carry out antioxidant therapy, one needs to know the contents of antioxidants in food products. We have created the databank for the contents of antioxidants in 1,140 food products, beverages, etc. Apart from water-soluble antioxidants, fat-soluble antioxidants in dairy and fish products, cacao, chocolate, nuts etc. were determined for the first time using an amperometric method."], ["Anisakis simplex: from Obscure Infectious Worm to Inducer of Immune Hypersensitivity Summary: Infection of humans with the nematode worm parasite Anisakis simplex was first described in the 1960s in association with the consumption of raw or undercooked fish. During the 1990s it was realized that even the ingestion of dead worms in food fish can cause severe hypersensitivity reactions, that these may be more prevalent than infection itself, and that this outcome could be associated with food preparations previously considered safe. Not only may allergic symptoms arise from infection by the parasites (\u201cgastroallergic anisakiasis\u201d), but true anaphylactic reactions can also occur following exposure to allergens from dead worms by food-borne, airborne, or skin contact routes. This review discusses A. simplex pathogenesis in humans, covering immune hypersensitivity reactions both in the context of a living infection and in terms of exposure to its allergens by other routes. Over the last 20 years, several studies have concentrated on A. simplex antigen characterization and innate as well as adaptive immune response to this parasite. Molecular characterization of Anisakis allergens and isolation of their encoding cDNAs is now an active field of research that should provide improved diagnostic tools in addition to tools with which to enhance our understanding of pathogenesis and controversial aspects of A. simplex allergy. We also discuss the potential relevance of parasite products such as allergens, proteinases, and proteinase inhibitors and the activation of basophils, eosinophils, and mast cells in the induction of A. simplex-related immune hypersensitivity states induced by exposure to the parasite, dead or alive.", "First record of human infection with the tapeworm Diphyllobothrium nihonkaiense in North America. The tapeworm Diphyllobothrium nihonkaiense (Cestoda: Diphyllobothriidea), originally described from Japan, is reported from a man in North America for the first time. Species identification was based on sequences of ribosomal (partial 18S rRNA) and mitochondrial (partial Cytochrome c Oxidase subunit I) genes of proglottids expelled from a Czech tourist who ate raw Pacific sockeye salmon (Oncorhynchus nerka) from British Columbia, Canada.", "Evaluation of a real-time polymerase chain reaction (PCR) assay for detection of anisakis simplex parasite as a food-borne allergen source in seafo... Anisakis simplex has been recognized as an important cause of disease in humans and as a food-borne allergen source. Actually, this food-borne parasite was recently identified as an emerging food safety risk. An A. simplex -specific primer-probe system based on a real-time polymerase chain reaction (PCR) detection assay has been successfully optimized and validated with seafood samples. In addition, a DNA extraction procedure has been optimized to detect the presence of the nematode in food samples. The assay is a very reliable, specific, and sensitive methodology to detect the presence of traces of this parasite in seafood products, including highly processed samples. As a result, 13 sequences of cytochrome c oxidase II gene were obtained and scrutinized to calculate intra- and interspecific variabilities of 0 and 35-67%, respectively. Finally, an efficiency of 2.07 +/- 0.14 of the assay was calculated, and a limit of detection of 40 ppm parasite in 25 g of sample was also optimized. Actually, the presence of this parasite in several seafood products has been demonstrated, enforcing the necessity of a design for a good manufacturing practice protocol for the processing industry to minimize the presence of this parasite as a food-borne allergen source in seafood products.", "Ciguatera: recent advances but the risk remains. Ciguatera is an important form of human poisoning caused by the consumption of seafood. The disease is characterised by gastrointestinal, neurological and cardiovascular disturbances. In cases of severe toxicity, paralysis, coma and death may occur. There is no immunity, and the toxins are cumulative. Symptoms may persist for months or years, or recur periodically. The epidemiology of ciguatera is complex and of central importance to the management and future use of marine resources. Ciguatera is an important medical entity in tropical and subtropical Pacific and Indian Ocean regions, and in the tropical Caribbean. As reef fish are increasingly exported to other areas, it has become a world health problem. The disease is under-reported and often misdiagnosed. Lipid-soluble, polyether toxins known as ciguatoxins accumulated in the muscles of certain subtropical and tropical marine finfish cause ciguatera. Ciguatoxins arise from biotransformation in the fish of less polar ciguatoxins (gambiertoxins) produced by Gambierdiscus toxicus, a marine dinoflagellate that lives on macroalgae, usually attached to dead coral. The toxins and their metabolites are concentrated in the food chain when carnivorous fish prey on smaller herbivorous fish. Humans are exposed at the end of the food chain. More than 400 species of fish can be vectors of ciguatoxins, but generally only a relatively small number of species are regularly incriminated in ciguatera. Ciguateric fish look, taste and smell normal, and detection of toxins in fish remains a problem. More than 20 precursor gambiertoxins and ciguatoxins have been identified in G. toxicus and in herbivorous and carnivorous fish. The toxins become more polar as they undergo oxidative metabolism and pass up the food chain. The main Pacific ciguatoxin (P-CTX-1) causes ciguatera at levels=0.1 microg/kg in the flesh of carnivorous fish. The main Caribbean ciguatoxin (C-CTX-1) is less polar and 10-fold less toxic than P-CTX-1. Ciguatoxins activate sodium ion (Na ) channels, causing cell membrane excitability and instability. Worldwide coral bleaching is now well documented, and there is a strong association between global warming and the bleaching and death of coral. This, together with natural environmental factors such as earthquakes and hurricanes, and man-made factors such as tourism, dock construction, sewage and eutrophication, may create more favourable environments for G. toxicus. While low levels of G. toxicus are found throughout tropical and subtropical waters, the presence of bloom numbers is unpredictable and patchy. Only certain genetic strains produce ciguatoxins, and environmental triggers for increasing toxin production are unknown.", "Fish-induced keriorrhea. Many deep-sea fishes store large amounts of wax esters in their body for buoyancy control. Some of them are frequently caught as by-catch of tuna and other fishes. The most noteworthy ones include escolar and oilfish. The accumulation of the indigestible wax esters in the rectum through consumption of these fish engenders discharges or leakage per rectum as orange or brownish green oil, but without noticeable loss of water. This physiological response is called keriorrhea, which is variously described as \\\"oily diarrhea,\\\" \\\"oily orange diarrhea,\\\" or \\\"orange oily leakage\\\" by the mass media and bloggers on the internet. Outbreaks of keriorrhea have been repeatedly reported across continents. Additional symptoms including nausea, vomiting, abdominal cramps, and diarrhea were complained by the victims. They are probably due to anxiety or panic when suffering from keriorrhea. Escolar and oilfish are banned from import and sale in Italy, Japan, and South Korea. Rapid detection of the two fishes is imperative to ensure proper labeling and safeguarding of the public before and after any keriorrhea outbreak."], ["Trans Fat Consumption and Aggression Background Dietary trans fatty acids (dTFA) are primarily synthetic compounds that have been introduced only recently; little is known about their behavioral effects. dTFA inhibit production of omega-3 fatty acids, which experimentally have been shown to reduce aggression. Potential behavioral effects of dTFA merit investigation. We sought to determine whether dTFA are associated with aggression/irritability. Methodolgy/Prinicpal Findings We capitalized on baseline dietary and behavioral assessments in an existing clinical trial to analyze the relationship of dTFA to aggression. Of 1,018 broadly sampled baseline subjects, the 945 adult men and women who brought a completed dietary survey to their baseline visit are the target of this analysis. Subjects (seen 1999\u20132004) were not on lipid medications, and were without LDL-cholesterol extremes, diabetes, HIV, cancer or heart disease. Outcomes assessed adverse behaviors with impact on others: Overt Aggression Scale Modified-aggression subscale (primary behavioral endpoint); Life History of Aggression; Conflict Tactics Scale; and self-rated impatience and irritability. The association of dTFA to aggression was analyzed via regression and ordinal logit, unadjusted and adjusted for potential confounders (sex, age, education, alcohol, and smoking). Additional analyses stratified on sex, age, and ethnicity, and examined the prospective association. Greater dTFA were strongly significantly associated with greater aggression, with dTFA more consistently predictive than other assessed aggression predictors. The relationship was upheld with adjustment for confounders, was preserved across sex, age, and ethnicity strata, and held cross-sectionally and prospectively. Conclusions/Significance This study provides the first evidence linking dTFA with behavioral irritability and aggression. While confounding is always a concern in observational studies, factors including strength and consistency of association, biological gradient, temporality, and biological plausibility add weight to the prospect of a causal connection. Our results may have relevance to public policy determinations regarding dietary trans fats. Clinicaltrials.gov # NCT00330980", "Updated estimate of trans fat intake by the US population. The dietary intake of industrially-produced trans fatty acids (IP-TFA) was estimated for the US population (aged 2 years or more), children (aged 2-5 years) and teenage boys (aged 13-18 years) using the 2003-2006 National Health and Nutrition Examination Survey (NHANES) food consumption database, market share information and trans fat levels based on label survey data and analytical data for packaged and in-store purchased foods. For fast foods, a Monte Carlo model was used to estimate IP-TFA intake. Further, the intake of trans fat was also estimated using trans fat levels reported in the US Department of Agriculture (USDA) National Nutrient Database for Standard Reference, Release 22 (SR 22, 2009) and the 2003-2006 NHANES food consumption database. The cumulative intake of IP-TFA was estimated to be 1.3 g per person per day (g/p/d) at the mean for the US population. Based on this estimate, the mean dietary intake of IP-TFA has decreased significantly from that cited in the 2003 US Food and Drug Administration (FDA) final rule that established labelling requirements for trans fat (4.6 g/p/d for adults). Although the overall intake of IP-TFA has decreased as a result of the implementation of labelling requirements, individuals with certain dietary habits may still consume high levels of IP-TFA if certain brands or types of food products are frequently chosen.", "Tolerable upper intake levels for trans fat, saturated fat, and cholesterol. Tolerable upper intake levels (ULs) set by the Institute of Medicine (IOM) are important, in part because they are used for estimating the percentage of the population at potential risk of adverse effects from excessive nutrient intake. The IOM did not set ULs for trans fat, saturated fat, and cholesterol because any intake level above 0% of energy increased LDL cholesterol concentration and these three food components are unavoidable in ordinary diets. The purpose of the analysis presented in this review was to evaluate clinical trial and prospective observational data that were not previously considered for setting a UL with the aim of determining whether the current UL model could be used for saturated fat, trans fat, and cholesterol. The results of this analysis confirm the limitations of the risk assessment model for setting ULs because of its inability to identify a UL for food components, such as cholesterol, that lack an intake threshold associated with increased chronic disease risk. \u00a9 2011 International Life Sciences Institute.", "Lipotoxicity: Effects of Dietary Saturated and Transfatty Acids The ingestion of excessive amounts of saturated fatty acids (SFAs) and transfatty acids (TFAs) is considered to be a risk factor for cardiovascular diseases, insulin resistance, dyslipidemia, and obesity. The focus of this paper was to elucidate the influence of dietary SFA and TFA intake on the promotion of lipotoxicity to the liver and cardiovascular, endothelial, and gut microbiota systems, as well as on insulin resistance and endoplasmic reticulum stress. The saturated and transfatty acids favor a proinflammatory state leading to insulin resistance. These fatty acids can be involved in several inflammatory pathways, contributing to disease progression in chronic inflammation, autoimmunity, allergy, cancer, atherosclerosis, hypertension, and heart hypertrophy as well as other metabolic and degenerative diseases. As a consequence, lipotoxicity may occur in several target organs by direct effects, represented by inflammation pathways, and through indirect effects, including an important alteration in the gut microbiota associated with endotoxemia. Interactions between these pathways may perpetuate a feedback process that exacerbates an inflammatory state. The importance of lifestyle modification, including an improved diet, is recommended as a strategy for treatment of these diseases.", "The beriberi analogy to myocardial infarction. Two pandemics of heart attack deaths have plagued the world's population during the past 130 years. The first pandemic, induced by beriberi, was caused by the industrial revolution altering the nutritional composition of rice. By 1892 a simple working knowledge, then at hand, could have terminated the beriberi plague; however, orthodox medicine being then enchanted with the false concept that all disease was caused by germs, permitted millions of Asians to die needlessly of beriberi by refusing to tell them to eat rice bran or to drink rice bran tea. A second pandemic of heart attack deaths, called myocardial infarction (MI), struck the developed nations of the Western World in full force after 1930. As a hypothesis, it is suggested that this MI pandemic, still raging today, was caused by a change in food processing that occurred after 1920, when the new oil seed industry introduced into our food three greatly harmful lipid substances. The unnatural trans-trans isomer of linoleic acid, which had never been in human food prior to 1920 and which entered our food in margarines and refined oils, blocked the conversion of natural cis-cis linoleic acid to prostaglandin E1, which tends to prevent MI, both by acting as a vasodilator and by minimizing platelet aggregation. Harmful lactones were also introduced into our food, increasing the risk of MI by decreasing the fibrinolytic activity of our blood. The oil seed industry also introduced into our diet free radical lipid peroxides that make the myocardium more vulnerable to infarction. It is suggested that except for the one in 500 of us who is afflicted by familial hypercholesterolemia, the cholesterol concept of MI is as false today as was the concept in 1900 that germs caused beriberi. It is further suggested that a working knowledge is at hand today that can make death from MI just as rare as death is now from a beriberi-induced heart attack."], ["Can exercise-related improvements in immunity influence cancer prevention and prognosis in the elderly? Cancer incidence increases with advancing age. Over 60% of new cancers and 70% of cancer deaths occur in individuals aged 65 years or older. One factor that may contribute to this is immunosenescence - a canopy term that is used to describe age-related declines in the normal functioning of the immune system. There are multiple age-related deficits in both the innate and adaptive systems that may play a role in the increased incidence of cancer. These include decreased NK-cell function, impaired antigen uptake and presentation by monocytes and dendritic cells, an increase in 'inflammaging', a decline in the number of na\u00efve T-cells able to respond to evolving tumor cells, and an increase in functionally exhausted senescent cells. There is consensus that habitual physical exercise can offer protection against certain types of cancer; however the evidence linking immunological mechanisms, exercise, and reduced cancer risk remain tentative. Multiple studies published over the last two decades suggest that exercise can mitigate the deleterious effects of age on immune function, thus increasing anti-cancer immunity. The potential ameliorative effect of exercise on these mechanisms include evidence that physical activity is able to stimulate greater NK-cell activity, enhance antigen-presentation, reduce inflammation, and prevent senescent cell accumulation in the elderly. Here we discuss the role played by the immune system in preventing and controlling cancer and how aging may retard these anti-cancer mechanisms. We also propose a pathway by which exercise-induced alterations in immunosenescence may decrease the incidence of cancer and help improve prognosis in cancer patients. Copyright \u00a9 2013 Elsevier Ireland Ltd. All rights reserved.", "Identification of cheese mite species inoculated on Mimolette and Milbenkase cheese through cryogenic scanning electron microscopy. Samples of Mimolette (France) and Milbenkase (Germany) cheeses traditionally ripened by mites were analyzed to determine the mite species present on each sample. Scientific literature was reviewed to understand which mite species most commonly infest cheese. Morphological features possessed by mites were then studied to understand what unique characteristics are required to ensure accurate identification. After identification and compilation of a detailed key of stored food mites (subclass Acari, order Astigmata) and their delineating features, the mites were viewed through a cryogenic scanning electron microscope. It was determined that Mimolette cheese is inoculated with Acarus siro L. The features studied to identify this mite species included idiosomal length and shape, setae length and arrangement, leg size, placement of anus and genitals, and solenidia shape. The Milbenkase cheese is inoculated with Tyrolichus casei Oudemans, which was evident after viewing the same features used to identify A. siro and the supracoxal seta shape. With this knowledge, further research can be conducted on the 2 cheese varieties to understand what chemical, physical, and microbial changes occur within the cheeses because of mites. It is important to identify the mite species present on each cheese variety to improve our understanding of their role in creating the distinctive characteristics that set these cheeses apart from others. Copyright (c) 2010 American Dairy Science Association. Published by Elsevier Inc. All rights reserved.", "Generation of gaseous sulfur-containing compounds in tumour tissue and suppression of gas diffusion as an antitumour treatment. BACKGROUND AND AIMS: The mechanisms of cancer cell growth and metastasis are still not entirely understood, especially from the viewpoint of chemical reactions in tumours. Glycolytic metabolism is markedly accelerated in cancer cells, causing the accumulation of glucose (a reducing sugar) and methionine (an amino acid), which can non-enzymatically react and form carcinogenic substances. There is speculation that this reaction produces gaseous sulfur-containing compounds in tumour tissue. The aims of this study were to clarify the products in tumour and to investigate their effect on tumour proliferation. METHODS: Products formed in the reaction between glucose and methionine or its metabolites were analysed in vitro using gas chromatography. Flatus samples from patients with colon cancer and exhaled air samples from patients with lung cancer were analysed using near-edge x-ray fine adsorption structure spectroscopy and compared with those from healthy individuals. The tumour proliferation rates of mice into which HT29 human colon cancer cells had been implanted were compared with those of mice in which the cancer cells were surrounded by sodium hyaluronate gel to prevent diffusion of gaseous material into the healthy cells. RESULTS: Gaseous sulfur-containing compounds such as methanethiol and hydrogen sulfide were produced when glucose was allowed to react with methionine or its metabolites homocysteine or cysteine. Near-edge x-ray fine adsorption structure spectroscopy showed that the concentrations of sulfur-containing compounds in the samples of flatus from patients with colon cancer and in the samples of exhaled air from patients with lung cancer were significantly higher than in those from healthy individuals. Animal experiments showed that preventing the diffusion of sulfur-containing compounds had a pronounced antitumour effect. CONCLUSIONS: Gaseous sulfur-containing compounds are the main products in tumours and preventing the diffusion of these compounds reduces the tumour proliferation rate, which suggests the possibility of a new approach to cancer treatment.", "Lycopene-rich treatments modify noneosinophilic airway inflammation in asthma: proof of concept. Antioxidant-rich diets are associated with reduced asthma prevalence. However, direct evidence that altering intake of antioxidant-rich foods affects asthma is lacking. The objective was to investigate changes in asthma and airway inflammation resulting from a low antioxidant diet and subsequent use of lycopene-rich treatments. Asthmatic adults (n=32) consumed a low antioxidant diet for 10 days, then commenced a randomized, cross-over trial involving 3 x 7 day treatment arms (placebo, tomato extract (45 mg lycopene/day) and tomato juice (45 mg lycopene/day)). With consumption of a low antioxidant diet, plasma carotenoid concentrations decreased, Asthma Control Score worsened, %FEV(1) and %FVC decreased and %sputum neutrophils increased. Treatment with both tomato juice and extract reduced airway neutrophil influx. Treatment with tomato extract also reduced sputum neutrophil elastase activity. In conclusion, dietary antioxidant consumption modifies clinical asthma outcomes. Changing dietary antioxidant intake may be contributing to rising asthma prevalence. Lycopene-rich supplements should be further investigated as a therapeutic intervention.", "Postinfectious functional gastrointestinal disorders. Functional gastrointestinal disorders are associated with low health-related quality of life and high resource utilization. Postinfectious irritable bowel syndrome (PI-IBS) is a functional gastrointestinal disorder defined as the acute onset of new IBS symptoms in an individual who has not previously met the Rome criteria for IBS, immediately after an acute illness characterized by 2 or more of the following: fever, vomiting, diarrhea, or a positive bacterial stool culture. Although the pathophysiological mechanisms involved in PI-IBS are currently unknown, it is believed that a transitory inflammation leads to subtle but permanent changes in the structure and function of the digestive system that induce symptoms. This review considers recent evidence surrounding the role of inflammatory mediators in the development of hypersensitivity, along with the mediators and mechanisms of abdominal pain and discomfort once the acute inflammation has cleared. Recent data suggest that anatomic changes to mast cells-nerve fibers are necessary, but not sufficient to induce symptoms. It is now possible to estimate the risk of developing PI-FGID based on the presence and relative severity of different risk factors, including prolonged duration of initial illness, toxicity of infecting bacterial strain, smoking, mucosal markers of inflammation, female sex, depression, hypochondriasis, and adverse life events in the preceding 3 months."], ["Microbiological examination of vegetable seed sprouts in Korea. Sprouted vegetable seeds used as food have been implicated as sources of outbreaks of Salmonella and Escherichia coli O157:H7 infections. We profiled the microbiological quality of sprouts and seeds sold at retail shops in Seoul, Korea. Ninety samples of radish sprouts and mixed sprouts purchased at department stores, supermarkets, and traditional markets and 96 samples of radish, alfalfa, and turnip seeds purchased from online stores were analyzed to determine the number of total aerobic bacteria (TAB) and molds or yeasts (MY) and the incidence of Salmonella, E. coli O157:H7, and Enterobacter sakazakii. Significantly higher numbers of TAB (7.52 log CFU/g) and MY (7.36 log CFU/g) were present on mixed sprouts than on radish sprouts (6.97 and 6.50 CFU/g, respectively). Populations of TAB and MY on the sprouts were not significantly affected by location of purchase. Radish seeds contained TAB and MY populations of 4.08 and 2.42 log CFU/g, respectively, whereas populations of TAB were only 2.54 to 2.84 log CFU/g and populations of MY were 0.82 to 1.69 log CFU/g on alfalfa and turnip seeds, respectively. Salmonella and E. coli O157:H7 were not detected on any of the sprout and seed samples tested. E. sakazakii was not found on seeds, but 13.3% of the mixed sprout samples contained this potentially pathogenic bacterium.", "HPLC analysis of serotonin, tryptamine, tyramine, and the hydroxycinnamic acid amides of serotonin and tyramine in food vegetables. Biogenic monoamines such as serotonin, tryptamine, and tyramine function as neurotransmitters and mitogenic factors in animals and are involved in flowering, morphogenesis, and protection from and adaptation to environmental changes in plants. In plants, serotonin and tyramine are conjugated to form phenolic compounds via thioester linkages during the synthesis of hydroxycinnamic acid amides, including p-coumaroylserotonin (CS), feruloylserotonin (FS), p-coumaroyltyramine (CT), and feruloyltyramine (FT). In this study, we determined the amounts of the biogenic monoamines CS, FS, CT, and FT in commonly consumed vegetables using high-performance liquid chromatography. Serotonin, tryptamine, and tyramine were detected in all vegetables tested. The serotonin levels ranged from 1.8 to 294 microg/g of dry weight, the tryptamine levels ranged from 0.8 to 372 microg/g of dry weight, and the tyramine levels ranged from 1.4 to 286 microg/g of dry weight. The highest serotonin and tryptamine contents were found in tomato and cherry tomato (140.3-222 microg/g of dry weight), while paprika and green pepper had higher tyramine contents than the other vegetables (286 and 141.5 microg/g of dry weight, respectively). Overall, the levels of CS, FS, CT, and FT ranged from 0.03 to 13.8 microg/g of dry weight, with green onion possessing the highest levels of CS (0.69 microg/g of dry weight), FT (1.99 microg/g of dry weight), and CT (13.85 microg/g of dry weight).", "Evaluation of certain food additives and contaminants. This report represents the conclusions of a Joint FAO/WHO Expert Committee convened to evaluate the safety of various food additives, with a view to recommending acceptable daily intakes (ADIs) and to preparing specifications for identity and purity. The Committee also evaluated the risk posed by two food contaminants, with the aim of deriving tolerable intakes where appropriate and advising on risk management options for the purpose of public health protection. The first part of the report contains a general discussion of the principles governing the toxicological evaluation of and assessment of dietary exposure to food additives and contaminants. A summary follows of the Committee's evaluations of technical, toxicological and dietary exposure data for certain food additives (aluminium-containing food additives, Benzoe Tonkinensis, glycerol ester of gum rosin, glycerol ester of tall oil rosin, glycerol ester of wood rosin, octenyl succinic acid modified gum arabic, polydimethyl siloxane, Ponceau 4R, pullulan, pullulanase from Bacillus deromificans expressed in Bacillus licheniformis, Quinoline Yellow and Sunset Yellow FCF) and two food contaminants (cyanogenic glycosides and fumonisins). Specifications for the following food additives were revised: aluminium lakes of colouring matters; beta-apo-8'-carotenal; beta-apo-8'-carotenoic acid ethyl ester; beta-carotene, synthetic; hydroxypropyl methyl cellulose; magnesium silicate, synthetic; modified starches; nitrous oxide; sodium carboxymethyl cellulose; and sucrose monoesters of lauric, palmitic or stearic acid. Annexed to the report are tables summarizing the Committee's recommendations for dietary exposures to and toxicological evaluations of the food additives and contaminants considered.", "Antimutagenic effect of broccoli flower head by the ames salmonella reverse mutation assay. A study was performed to investigate the antimutagenic effect of broccoli flower head by the Ames Salmonella reverse mutation assay. Broccoli flower head being the most highly edible part in the plant was analysed for its antimutagenic effect. Without isolating the phytomolecules, the crude ethanol extract of broccoli flower head was tested for suppressing the mutagenic effect induced by certain chemical mutagens. Three strains - TA 98, TA102 and TA 1535 were used in the study. The tester strains were challenged with their respective mutagens. These were challenged with the ethanol extract of broccoli flower head at concentrations of 23 and 46 mg/plate. The plates were incubated for 72 h and the revertant colonies were counted. The crude extract did not prove to be promutagenic. The ethanol extract of the broccoli flower head at 46 mg/plate suppressed the mutagenic effect induced by the corresponding positive mutagens on all the three tester strains used in this study. The crude extract of broccoli flower head alone was not cytotoxic even at the maximum concentration tested (46 mg/plate). In conclusion, the ethanol extract of broccoli at 46 mg/plate suggests their diverse antimutagenic potential against the mutagenic chemicals employed in this study. (c) 2007 John Wiley & Sons, Ltd.", "The capacity of foodstuffs to induce innate immune activation of human monocytes in vitro is dependent on food content of stimulants of Toll-like r... The ingestion of fatty meals is associated with a transient, low-grade systemic inflammatory response in human subjects, involving the activation of circulating monocytes and the secretion of pro-inflammatory cytokines. However, it is not yet clear how different foodstuffs may promote inflammatory signalling. In a screen of forty filter-sterilised soluble extracts from common foodstuffs, seven were found to induce the secretion of TNF-\u03b1 and IL-6 from human monocytes in vitro. To investigate what may differentiate inflammatory from non-inflammatory food extracts, stimulants of Toll-like receptor (TLR) 2 and TLR4 were quantified using human embryonic kidney-293 cells transfected with each TLR, and calibrated with defined bacterial lipopeptide (BLP) and lipopolysaccharide (LPS) standards. These assays revealed that while most foods contained undetectable levels of TLR2 or TLR4 stimulants, all TNF-\u03b1-inducing foods contained stimulants of either TLR2 (up to 1100\u00a0ng BLP-equivalent/g) or TLR4 (up to 2700\u00a0ng LPS-equivalent/g) in both the soluble and insoluble fractions. TLR stimulants were present mainly in meat products and processed foods, but were minimal or undetectable in fresh fruit and vegetables. The capacity of food extracts to induce TNF-\u03b1 secretion in monocytes correlated with the content of both TLR2 (r 0\u00b7837) and TLR4 stimulants (r 0\u00b7748), and was completely abolished by specific inhibition of TLR2 and TLR4. LPS and BLP were found to be highly resistant to typical cooking times and temperatures, low pH and protease treatment. In conclusion, apparently unspoiled foodstuffs can contain large quantities of stimulants of TLR2 and TLR4, both of which may regulate their capacity to stimulate inflammatory signalling."], ["Advanced Glycation End Products in Foods and a Practical Guide to Their Reduction in the Diet Modern diets are largely heat-processed and as a result contain high levels of advanced glycation end products (AGEs). Dietary advanced glycation end products (dAGEs) are known to contribute to increased oxidant stress and inflammation, which are linked to the recent epidemics of diabetes and cardiovascular disease. This report significantly expands the available dAGE database, validates the dAGE testing methodology, compares cooking procedures and inhibitory agents on new dAGE formation, and introduces practical approaches for reducing dAGE consumption in daily life. Based on the findings, dry heat promotes new dAGE formation by >10- to 100-fold above the uncooked state across food categories. Animal-derived foods that are high in fat and protein are generally AGE-rich and prone to new AGE formation during cooking. In contrast, carbohydrate-rich foods such as vegetables, fruits, whole grains, and milk contain relatively few AGEs, even after cooking. The formation of new dAGEs during cooking was prevented by the AGE inhibitory compound aminoguanidine and significantly reduced by cooking with moist heat, using shorter cooking times, cooking at lower temperatures, and by use of acidic ingredients such as lemon juice or vinegar. The new dAGE database provides a valuable instrument for estimating dAGE intake and for guiding food choices to reduce dAGE intake.", "Processed tart cherry products--comparative phytochemical content, in vitro antioxidant capacity and in vitro anti-inflammatory activity. Processing of fruits and vegetables affects their phytochemical and nutrient content. Tart cherries are commercially promoted to possess antioxidant and anti-inflammatory activity. However, processing affects their phytochemical content and may affect their related health benefits. The current study compares the in vitro antioxidant capacity and anti-inflammatory cyclooxygenase activity of processed tart cherry (Prunus cerasus) products-cherry juice concentrate, individually quick-frozen cherries, canned cherries, and dried cherries. Cherry products were analyzed for total anthocyanin and proanthocyanidin content and profile. On a per serving basis, total anthocyanins were highest in frozen cherries and total proanthocyanidins were highest in juice concentrate. Total phenolics were highest in juice concentrate. Juice concentrate had the highest oxygen radical absorbance capacity (ORAC) and peroxynitrite radical averting capacity (NORAC). Dried cherries had the highest hydroxyl radical averting capacity (HORAC) and superoxide radical averting capacity (SORAC). Processed tart cherry products compared very favorably to the U.S. Dept. of Agriculture-reported ORAC of other fresh and processed fruits. Inhibition of in vitro inflammatory COX-1 activity was greatest in juice concentrate. In summary, all processed tart cherry products possessed antioxidant and anti-inflammatory activity, but processing differentially affected phytochemical content and in vitro bioactivity. On a per serving basis, juice concentrate was superior to other tart cherry products. \u00a9 2012 Institute of Food Technologists\u00ae", "Stability of carotenoids, total phenolics and in vitro antioxidant capacity in the thermal processing of orange-fleshed sweet potato (Ipomoea batat... Intervention strategies regarding the biofortification of orange-fleshed sweet potato, which is a rich source of carotenoids for combating vitamin A deficiency, are being developed in Brazil. This study was conducted to evaluate the concentrations of individual carotenoids, total phenolic compounds and antioxidant capacity in the roots of four biofortified sweet potato cultivars that were raw or processed by four common heat treatments. HPLC, Folin-Ciocalteu, DPPH and ABTS assays were used. All cultivars showed high levels of carotenoids in raw roots, predominantly all-trans-\u03b2-carotene (79.1-128.5\u00a0mg.100\u00a0g(-1) DW), suggesting a high estimated vitamin A activity. The CNPH 1194 cultivar reported carotenoids values highest than those of other cultivars (p\u2009<\u20090.05). The total phenolic compounds varied among cultivars and heat treatments (0.96-2.05\u00a0mg.g(-1) DW). In most cases, the heat treatments resulted in a significant decrease in the carotenoids and phenolic compounds contents as well as antioxidant capacity. Processing of flour presented the greatest losses of major carotenoids and phenolics. The phenolic compounds showed more stability than carotenoids after processing. There were significant correlations between the carotenoids and phenolic compounds and the antioxidant capacity.", "Beyond celery and starter culture: advances in natural/organic curing processes in the United States. Over the past 10years there has been ongoing development of curing processes with natural ingredients designed to meet consumer demand and regulatory requirements for natural and organic processed meats. Initially, these processes utilized celery concentrates with a high nitrate content combined with a nitrate-reducing starter culture. Subsequent advances included celery concentrates with the nitrate converted to nitrite by suppliers. Further, as questions developed concerning reduced concentration of preservatives and the microbiological safety of these processed meats, additional advances have resulted in a wide variety of ingredients and processes designed to provide supplementary antimicrobial effects for improved product safety. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "From beans to berries and beyond: teamwork between plant chemicals for protection of optimal human health. It is now well known to consumers around the world that certain fruits and vegetables can help prevent or treat chronic human diseases. But, what many people don't fully appreciate is that it is not a single component in these plant-derived foods, but rather complex mixtures of interacting natural chemicals, that produce such powerful health-protective effects. These natural components accumulate simultaneously together in a plant, and provide a multifaceted defensive strategy for both the plant, and the human consumer. In order to investigate the strength of natural chemical cooperation in highly-pigmented, flavonoid-rich functional foods, our lab has relied on analysis of both whole fruits, and continuous, reliable plant cell culture production systems which accumulate anthocyanins and proanthocyanidins in high concentrations. Successive rounds of relatively gentle, rapid, and large-volume fractionations are linked to bioassay of complex to simple mixtures and semi-purified compounds. By means of this strategy, additive interactions or synergies between related compounds in health maintenance can be sorted out. Interestingly, phytochemical interactions between the same classes of compounds intensify the efficacy of flavonoid-rich fruits against multiple, not necessarily discrete, human disease conditions including CVD, cancer, metabolic syndrome, and others."], ["Dioxin May Promote Inflammation-Related Development of Endometriosis Laboratory and population-based studies suggest that exposure to environmental toxicants may be one of several triggers for the development of endometriosis. We discuss evidence that modulation of the endometrial endocrine-immune interface could mechanistically link toxicant exposure to the development of this disease. Capsule Summary: Environmental toxicant exposure induces an inflammatory-like endometrial response that may promote the development of endometriosis.", "The prevalence of bacterial vaginosis in the United States, 2001-2004; associations with symptoms, sexual behaviors, and reproductive health. OBJECTIVES: Bacterial vaginosis (BV), a disturbance of vaginal microflora, is a common cause of vaginal symptoms and is associated with an increased risk of acquisition of sexually transmitted infections, HIV, and with adverse pregnancy outcomes. We determined prevalence and associations with BV among a representative sample of women of reproductive age in the United States. STUDY DESIGN: Women aged 14-49 years participating in the National Health and Nutrition Examination Survey 2001-2004 were asked to submit a self-collected vaginal swab for Gram staining. BV, determined using Nugent's score, was defined as a score of 7-10. RESULTS: The prevalence of BV was 29.2% (95% confidence interval 27.2%-31.3%) corresponding to 21 million women with BV; only 15.7% of the women with BV reported vaginal symptoms. Prevalence was 51.4% among non-Hispanic blacks, 31.9% among Mexican Americans, and 23.2% among non-Hispanic whites (P <0.01 for each comparison). Although BV was also associated with poverty (P <0.01), smoking (P <0.05), increasing body mass index (chi2 P <0.0001 for trend), and having had a female sex partner (P <0.005), in the multivariate model, BV only remained positively associated with race/ethnicity, increasing lifetime sex partners (chi2 P <0.001 for trend), increasing douching frequency (chi2 P for trend <0.001), low educational attainment (P <0.01), and inversely associated with current use of oral contraceptive pills (P <0.005). CONCLUSION: BV is a common condition; 84% of women with BV did not report symptoms. Because BV increases the risk of acquiring sexually transmitted infections, BV could contribute to racial disparities in these infections.", "Essentials of Healthy Eating: A Guide Enough solid evidence now exists to offer women several fundamental strategies for healthy eating. They include emphasizing healthful unsaturated fats, whole grains, good protein \u201cpackages,\u201d and fruits and vegetables; limiting consumption of trans and saturated fats, highly refined grains, and sugary beverages; and taking a multivitamin with folic acid and extra vitamin D as a nutritional safety net. A diet based on these principles is healthy through virtually all life stages, from young adulthood through planning for pregnancy, pregnancy, and on into old age.", "Some subgroups of reproductive age women in the United States may be at risk for iodine deficiency. Consuming an adequate amount of iodine during pregnancy is critical for fetal neurologic development. Even a mild deficiency can impair cognitive ability. Important sources of iodine in the United States include dairy products and iodized salt. Although the U.S. population has traditionally been considered iodine sufficient, median urinary iodine concentrations (UIC) have decreased 50% since the 1970s. We analyzed 2001-2006 NHANES data from urine iodine spot tests for pregnant (n = 326), lactating (n = 53), and nonpregnant, nonlactating (n = 1437) women of reproductive age (15-44 y). We used WHO criteria to define iodine sufficiency (median UIC: 150-249 microg/L among pregnant women; >or=100 microg/L among lactating women; and 100-199 microg/L among nonpregnant, nonlactating women). The iodine status of pregnant women was borderline sufficient (median UIC = 153 microg/L; 95% CI = 105-196), while lactating (115 microg/L; 95% CI = 62-162) and nonpregnant, nonlactating (130 microg/L; 95% CI = 117-140) women were iodine sufficient. Dairy product consumption was an important contributor to iodine status among both pregnant and nonpregnant, nonlactating women, and those who do not consume dairy products may be at risk for iodine deficiency. Although larger samples are needed to confirm these findings, these results raise concerns about the iodine status of pregnant women and women of reproductive age who are not consuming dairy products. Iodine levels among U.S. women should be monitored, particularly among subgroups at risk for iodine deficiency.", "Hair mercury levels of women of reproductive age in Ontario, Canada: implications to fetal safety and fish consumption. OBJECTIVE: To study hair mercury concentrations among women of reproductive age in relation to fish intake in Ontario, Canada. STUDY DESIGN: Three groups were studied: 22 women who had called the Motherisk Program for information on the reproductive safety of consuming fish during pregnancy, a group of Japanese residing in Toronto (n=23) consuming much larger amounts of fish, and a group of Canadian women of reproductive age (n=20) not seeking advice, were studied. Mercury concentrations in hair samples were measured using inductively coupled plasma mass spectrometry. Seafood consumption habits were recorded for each participant. Based on the types of fish consumed and consumption frequencies, the estimated monthly intake of mercury was calculated. Hair mercury concentrations were correlated to both the number of monthly seafood servings and the estimated ingested mercury dose. RESULTS: There were significant correlations between fish servings and hair mercury (Spearman r=0.73, P<.0001) and between amounts of consumed mercury and hair mercury concentrations (Spearman r=0.81, P<.0001). Nearly two thirds of the Motherisk callers, all of the Japanese women, and 15% of the Canadian women of reproductive age had hair mercury above 0.3 microg/g, which was shown recently to be the lowest observable adverse effect level in a large systematic review of all perinatal studies. CONCLUSIONS: Because of very wide variability, general recommendations for a safe number of fish servings may not be sufficient to protect the fetus. Analysis of hair mercury may be warranted before pregnancy in selected groups of women consuming more than 12 ounces of fish per week, as dietary modification can decrease body burden and ensure fetal safety. Copyright (c) 2010. Published by Mosby, Inc."], ["Restriction of meat, fish, and poultry in omnivores improves mood: A pilot randomized controlled trial Background Omnivorous diets are high in arachidonic acid (AA) compared to vegetarian diets. Research shows that high intakes of AA promote changes in brain that can disturb mood. Omnivores who eat fish regularly increase their intakes of eicosapentaenoic acid (EPA) and docosahexaenoic acid (DHA), fats that oppose the negative effects of AA in vivo. In a recent cross-sectional study, omnivores reported significantly worse mood than vegetarians despite higher intakes of EPA and DHA. This study investigated the impact of restricting meat, fish, and poultry on mood. Findings Thirty-nine omnivores were randomly assigned to a control group consuming meat, fish, and poultry daily (OMN); a group consuming fish 3-4 times weekly but avoiding meat and poultry (FISH), or a vegetarian group avoiding meat, fish, and poultry (VEG). At baseline and after two weeks, participants completed a food frequency questionnaire, the Profile of Mood States questionnaire and the Depression Anxiety and Stress Scales. After the diet intervention, VEG participants reduced their EPA, DHA, and AA intakes, while FISH participants increased their EPA and DHA intakes. Mood scores were unchanged for OMN or FISH participants, but several mood scores for VEG participants improved significantly after two weeks. Conclusions Restricting meat, fish, and poultry improved some domains of short-term mood state in modern omnivores. To our knowledge, this is the first trial to examine the impact of restricting meat, fish, and poultry on mood state in omnivores.", "Vegetarian diets are associated with healthy mood states: a cross-sectional study in Seventh Day Adventist adults Background The physical health status of vegetarians has been extensively reported, but there is limited research regarding the mental health status of vegetarians, particularly with regard to mood. Vegetarian diets exclude fish, the major dietary source of eicosapentaenoic acid (EPA) and docosahexaenoic acid (DHA), critical regulators of brain cell structure and function. Omnivorous diets low in EPA and DHA are linked to impaired mood states in observational and experimental studies. Methods We examined associations between mood state and polyunsaturated fatty acid intake as a result of adherence to a vegetarian or omnivorous diet in a cross-sectional study of 138 healthy Seventh Day Adventist men and women residing in the Southwest. Participants completed a quantitative food frequency questionnaire, Depression Anxiety Stress Scale (DASS), and Profile of Mood States (POMS) questionnaires. Results Vegetarians (VEG:n = 60) reported significantly less negative emotion than omnivores (OMN:n = 78) as measured by both mean total DASS and POMS scores (8.32 \u00b1 0.88 vs 17.51 \u00b1 1.88, p = .000 and 0.10 \u00b1 1.99 vs 15.33 \u00b1 3.10, p = .007, respectively). VEG reported significantly lower mean intakes of EPA (p < .001), DHA (p < .001), as well as the omega-6 fatty acid, arachidonic acid (AA; p < .001), and reported higher mean intakes of shorter-chain \u03b1-linolenic acid (p < .001) and linoleic acid (p < .001) than OMN. Mean total DASS and POMS scores were positively related to mean intakes of EPA (p < 0.05), DHA (p < 0.05), and AA (p < 0.05), and inversely related to intakes of ALA (p < 0.05), and LA (p < 0.05), indicating that participants with low intakes of EPA, DHA, and AA and high intakes of ALA and LA had better mood. Conclusions The vegetarian diet profile does not appear to adversely affect mood despite low intake of long-chain omega-3 fatty acids.", "Modern organic and broiler chickens sold for human consumption provide more energy from fat than protein. OBJECTIVE: In 1976, the Royal College of Physicians and the British Cardiac Society recommended eating less fatty red meat and more poultry instead because it was lean. However, the situation has changed since that time, with a striking increase in fat content of the standard broiler chicken. The aim of the present study was to report a snapshot of data on fat in chickens now sold to the public. DESIGN: Samples were obtained randomly between 2004 and 2008 from UK supermarkets, farm shops and a football club. The amount of chicken fat was estimated by emulsification and chloroform/methanol extraction. SETTING: Food sold in supermarkets and farms in England. SUBJECTS: Chicken samples. RESULTS: The fat energy exceeded that of protein. There has been a loss of n-3 fatty acids. The n-6:n-3 ratio was found to be as high as 9:1, as opposed to the recommendation of about 2:1. Moreover, the TAG level in the meat and whole bird mostly exceeded the proportion of phospholipids, which should be the higher for muscle function. The n-3 fatty acid docosapentaenoic acid (DPA, 22 : 5n-3) was in excess of DHA (22 : 6n-3). Previous analyses had, as usual for birds, more DHA than DPA. CONCLUSIONS: Traditional poultry and eggs were one of the few land-based sources of long-chain n-3 fatty acids, especially DHA, which is synthesized from its parent precursor in the green food chain. In view of the obesity epidemic, chickens that provide several times the fat energy compared with protein seem illogical. This type of chicken husbandry needs to be reviewed with regard to its implications for animal welfare and human nutrition.", "Omega-3 fatty acids for nutrition and medicine: considering microalgae oil as a vegetarian source of EPA and DHA. Long-chain EPA/DHA omega-3 fatty acid supplementation can be co-preventative and co-therapeutic. Current research suggests increasing accumulated long chain omega-3s for health benefits and as natural medicine in several major diseases. But many believe plant omega-3 sources are nutritionally and therapeutically equivalent to the EPA/DHA omega-3 in fish oil. Although healthy, precursor ALA bio-conversion to EPA is inefficient and production of DHA is nearly absent, limiting the protective value of ALA supplementation from flax-oil, for example. Along with pollutants certain fish acquire high levels of EPA/DHA as predatory species. However, the origin of EPA/DHA in aquatic ecosystems is algae. Certain microalgae produce high levels of EPA or DHA. Now, organically produced DHA-rich microalgae oil is available. Clinical trials with DHA-rich oil indicate comparable efficacies to fish oil for protection from cardiovascular risk factors by lowering plasma triglycerides and oxidative stress. This review discusses 1) omega-3 fatty acids in nutrition and medicine; 2) omega-3s in physiology and gene regulation; 3) possible protective mechanisms of EPA/DHA in major diseases such as coronary heart disease, atherosclerosis, cancer and type 2 diabetes; 4) EPA and DHA requirements considering fish oil safety; and 5) microalgae EPA and DHA-rich oils and recent clinical results.", "Nutrient based estimation of acid-base balance in vegetarians and non-vegetarians. A first objective of the present study was to estimate the acid-base balance of the food intake in vegetarians and non-vegetarians. A second objective was to evaluate if additional input of specific food items on the existing potential renal acid load (PRAL) list was necessary for the comparison of the two dietary patterns. Thirty vegetarians between the age of 18 and 30 years were matched for sex, age and BMI with 30 non-vegetarians. Based on the 3-days food diaries the acid-base status of the food intake was estimated using the PRAL method. Mean PRAL values as estimated with the standard table yielded an alkaline load of -5.4 +/- 14.4 mEq/d in the vegetarians compared to an acid load of 10.3 +/- 14.4 mEq/d in the nonvegetarians (p<0.001). Mean PRAL values as estimated with the extended table yielded an alkaline load of -10.9 +/-19.7 mEq/d in the vegetarians compared to an acid load of 13.8 +/- 17.1 mEq/d for the non-vegetarians (p<0.001). The findings of this study indicate that vegetarian food intake produces more alkaline outcomes compared to non-vegetarian diets. The use of the standard PRAL table was sufficient for discrimination between the two diets."], ["The autopsy of chicken nuggets reads \\\"chicken little\\\". PURPOSE: To determine the contents of chicken nuggets from 2 national food chains. BACKGROUND: Chicken nuggets have become a major component of the American diet. We sought to determine the current composition of this highly processed food. METHODS: Randomly selected nuggets from 2 different national fast food chains were fixed in formalin, sectioned and stained for microscopic analysis. RESULTS: Striated muscle (chicken meat) was not the predominate component in either nugget. Fat was present in equal or greater quantities along with epithelium, bone, nerve, and connective tissue. CONCLUSION: Chicken nuggets are mostly fat, and their name is a misnomer. Copyright \u00a9 2013 Elsevier Inc. All rights reserved.", "Modern organic and broiler chickens sold for human consumption provide more energy from fat than protein. OBJECTIVE: In 1976, the Royal College of Physicians and the British Cardiac Society recommended eating less fatty red meat and more poultry instead because it was lean. However, the situation has changed since that time, with a striking increase in fat content of the standard broiler chicken. The aim of the present study was to report a snapshot of data on fat in chickens now sold to the public. DESIGN: Samples were obtained randomly between 2004 and 2008 from UK supermarkets, farm shops and a football club. The amount of chicken fat was estimated by emulsification and chloroform/methanol extraction. SETTING: Food sold in supermarkets and farms in England. SUBJECTS: Chicken samples. RESULTS: The fat energy exceeded that of protein. There has been a loss of n-3 fatty acids. The n-6:n-3 ratio was found to be as high as 9:1, as opposed to the recommendation of about 2:1. Moreover, the TAG level in the meat and whole bird mostly exceeded the proportion of phospholipids, which should be the higher for muscle function. The n-3 fatty acid docosapentaenoic acid (DPA, 22 : 5n-3) was in excess of DHA (22 : 6n-3). Previous analyses had, as usual for birds, more DHA than DPA. CONCLUSIONS: Traditional poultry and eggs were one of the few land-based sources of long-chain n-3 fatty acids, especially DHA, which is synthesized from its parent precursor in the green food chain. In view of the obesity epidemic, chickens that provide several times the fat energy compared with protein seem illogical. This type of chicken husbandry needs to be reviewed with regard to its implications for animal welfare and human nutrition.", "Steam cooking significantly improves in vitro bile acid binding of collard greens, kale, mustard greens, broccoli, green bell pepper, and cabbage. Bile acid binding capacity has been related to the cholesterol-lowering potential of foods and food fractions. Lowered recirculation of bile acids results in utilization of cholesterol to synthesize bile acid and reduced fat absorption. Secondary bile acids have been associated with increased risk of cancer. Bile acid binding potential has been related to lowering the risk of heart disease and that of cancer. Previously, we have reported bile acid binding by several uncooked vegetables. However, most vegetables are consumed after cooking. How cooking would influence in vitro bile acid binding of various vegetables was investigated using a mixture of bile acids secreted in human bile under physiological conditions. Eight replicate incubations were conducted for each treatment simulating gastric and intestinal digestion, which included a substrate only, a bile acid mixture only, and 6 with substrate and bile acid mixture. Cholestyramine (a cholesterol-lowering, bile acid binding drug) was the positive control treatment and cellulose was the negative control. Relative to cholestyramine, in vitro bile acid binding on dry matter basis was for the collard greens, kale, and mustard greens, 13%; broccoli, 10%; Brussels sprouts and spinach, 8%; green bell pepper, 7%; and cabbage, 5%. These results point to the significantly different (P < or = .05) health-promoting potential of collard greens = kale = mustard greens > broccoli > Brussels sprouts = spinach = green bell pepper > cabbage as indicated by their bile acid binding on dry matter basis. Steam cooking significantly improved the in vitro bile acid binding of collard greens, kale, mustard greens, broccoli, green bell pepper, and cabbage compared with previously observed bile acid binding values for these vegetables raw (uncooked). Inclusion of steam-cooked collard greens, kale, mustard greens, broccoli, green bell pepper, and cabbage in our daily diet as health-promoting vegetables should be emphasized. These green/leafy vegetables, when consumed regularly after steam cooking, would lower the risk of cardiovascular disease and cancer, advance human nutrition research, and improve public health.", "Initial contamination of chicken parts with Salmonella at retail and cross-contamination of cooked chicken with Salmonella from raw chicken during ... The current study was undertaken to acquire data on contamination of chicken parts with Salmonella at retail and to acquire data on cross-contamination of cooked chicken with Salmonella from raw chicken during meal preparation. Whole raw chickens (n = 31) were obtained from local retail stores and cut into two wings, two breasts without skin or bones, two thighs, and two drumsticks. Data for cross-contamination were obtained by cutting up a sterile, cooked chicken breast with the same board and knife used to cut up the raw chicken. The board, knife, and latex gloves used by the food handler were not rinsed or washed before cutting up the sterile, cooked chicken breast, thus providing a worst-case scenario for cross-contamination. Standard curves for the concentration of Salmonella bacteria in 400 ml of buffered peptone water after 6 h of incubation of chicken parts as a function of the initial log number of Salmonella bacteria inoculated onto chicken parts were developed and used to enumerate Salmonella bacteria. Standard curves were not affected by the type of chicken part but did differ (P < 0.05) among the five isolates of Salmonella examined. Consequently, Salmonella bacteria were enumerated on naturally contaminated chicken parts using a standard curve developed with the serotype of Salmonella that was isolated from the original sample. The prevalence of contamination was 3 % (4 of 132), whereas the incidence of cross-contamination was 1.8 % (1 of 57). The positive chicken parts were a thigh from chicken 4, which contained 3 CFU of Salmonella enterica serotype Kentucky, and both wings, one thigh, and one cooked breast portion from chicken 15, which all contained 1 CFU of serotype 8,20:-:z(6). These results indicated that the poultry industry is providing consumers in the studied area with chicken that has a low prevalence and low number of Salmonella bacteria at retail and that has a low incidence and low level of cross-contamination of cooked chicken with Salmonella from raw chicken during meal preparation under a worst-case scenario.", "Detection and characterization of Clostridium difficile in retail chicken. AIMS: This study was designed to evaluate the prevalence of Clostridium difficile contamination of retail chicken. METHODS AND RESULTS: Chicken legs, thighs and wings were purchased using a standardized method from retail outlets across Ontario, Canada. Selective culture was used for qualitative and quantitative detection of C. difficile. Clostridium difficile was isolated from 26/203 (12.8%) chicken samples; 10/111 (9.0%) thighs, 13/72 (18%) wings and 3/20 (15%) legs (P = 0.19). All isolates were ribotype 078, a strain that has been associated with food animals and potentially community-associated disease in humans. All positive samples were positive only on enrichment culture. CONCLUSIONS: Clostridium difficile could be found relatively commonly in retail chicken meat, albeit at low levels. SIGNIFICANCE AND IMPACT OF THE STUDY: This is the first study to report C. difficile in chicken meat. Contamination of meat with C. difficile strains implicated in human infections raises concerns about food as a source of C. difficile infection. The relevance of food contamination is completely unclear at this point but food should be investigated as a source of infection."], ["Viral obesity: fact or fiction? The aetiology of obesity is multifactorial. An understanding of the contributions of various causal factors is essential for the proper management of obesity. Although it is primarily thought of as a condition brought on by lifestyle choices, recent evidence shows there is a link between obesity and viral infections. Numerous animal models have documented an increased body weight and a number of physiologic changes, including increased insulin sensitivity, increased glucose uptake and decreased leptin secretion that contribute to an increase in body fat in adenovirus-36 infection. Other viral agents associated with increasing obesity in animals included canine distemper virus, rous-associated virus 7, scrapie, Borna disease virus, SMAM-1 and other adenoviruses. This review attempted to determine if viral infection is a possible cause of obesity. Also, this paper discussed mechanisms by which viruses might produce obesity. Based on the evidence presented in this paper, it can be concluded that a link between obesity and viral infections cannot be ruled out. Further epidemiologic studies are needed to establish a causal link between the two, and determine if these results can be used in future management and prevention of obesity.", "Adenovirus 36 infection and obesity. The most important factors leading to fat accumulation in children are genetic inheritance, endocrine alterations, and behavioural/environmental causes. In addition, experimental animal studies have shown that infections due to various pathogens can lead to overweight and obesity conditions, and studies of humans have found that the incidence of seroconversion against some of these may be significantly more frequent in obese adults and children than in normal subjects. However, the results of these studies are not conclusive and, in some cases, have raised more questions than answers. We reviewed the literature concerning the role of adenovirus 36 (AD-36), the most widely studied infectious agent in animals and humans, because of its potential association with childhood obesity. The available evidence suggests that more studies are needed to evaluate whether or not the association between the presence of AD-36 antibodies and obesity is simply unrelated, and to verify whether there are subjects that have greater tendency to become obese because more easily susceptible to AD-36 infection or with a predisposition to suffer from persistent viral infection more easily leading to the development of obesity. If it is demonstrated that AD-36 does play a role in obesity, it will be important to investigate possible vaccines against the infection itself or antiviral drugs capable of inhibiting disease progression. Copyright \u00a9 2012 Elsevier B.V. All rights reserved.", "Infectobesity: obesity of infectious origin. The rapid increase in obesity and the associated health care costs have prompted a search for better approaches for its prevention and management. Such efforts may be facilitated by better understanding the etiology of obesity. Of the several etiological factors, infection, an unusual causative factor, has recently started receiving greater attention. In the last two decades, 10 adipogenic pathogens were reported, including human and nonhuman viruses, scrapie agents, bacteria, and gut microflora. Some of these pathogens are associated with human obesity, but their causative role in human obesity has not been established. This chapter presents information about the natural hosts, signs and symptoms, and pathogenesis of the adipogenic microorganisms. If relevant to humans, \\\"Infectobesity\\\" would be a relatively novel, yet extremely significant concept. A new perspective about the infectious etiology of obesity may stimulate additional research to assess the contribution of hitherto unknown pathogens to human obesity and possibly to prevent or treat obesity of infectious origins.", "A framework for identification of infections that contribute to human obesity. WHO has declared obesity to be a global epidemic. Obesity management strategies mainly target behavioural components of the disorder, but are only marginally effective. A comprehensive understanding of the causative factors of obesity might provide more effective management approaches. Several microbes are causatively and correlatively linked with obesity in animals and human beings. If infections contribute to human obesity, then entirely different prevention and treatment strategies and public health policies could be needed to address this subtype of the disorder. Ethical reasons preclude experimental infection of human beings with candidate microbes to unequivocally determine their contribution to obesity. As an alternative, the available information about the adipogenic human adenovirus Ad36 has been used to create a template that can be used to examine comprehensively the contributions of specific candidate microbes to human obesity. Clinicians should be aware of infectobesity (obesity of infectious origin), and its potential importance in effective obesity management. Copyright \u00a9 2011 Elsevier Ltd. All rights reserved.", "Diet, infection and wheezy illness: lessons from adults. An increase in asthma and atopic disease has been recorded in many countries where society has become more prosperous. We have investigated two possible explanations: a reduction in childhood infections and a change in diet. In a cohort of people followed up since 1964, originally selected as a random sample of primary school children, we have investigated the relevance of family size and the common childhood infectious diseases to development of eczema, hay fever and asthma. Although membership of a large family reduced risks of hay fever and eczema (but not asthma), this was not explained by the infections the child had suffered. Indeed, the more infections the child had had, the greater the likelihood of asthma, although measles gave a modest measure of protection. We have investigated dietary factors in two separate studies. In the first, we have shown the risks of bronchial hyper-reactivity are increased seven-fold among those with the lowest intake of vitamin C, while the lowest intake of saturated fats gave a 10-fold protection. In the second, we have shown that the risk of adult-onset wheezy illness is increased five-fold by the lowest intake of vitamin E and doubled by the lowest intake of vitamin C. These results were supported by direct measurements of the vitamins and triglycerides in plasma. We have proposed that changes in the diet of pregnant women may have reflected those observed in the population as a whole and that these may have resulted in the birth of cohorts of children predisposed to atopy and asthma. The direct test of this is to study the diet and nutritional status of a large cohort of pregnant women and to follow their offspring forward. This is our current research."], ["[Consequences of exclusive breast-feeding in vegan mother newborn--case report]. We report on the case of an infant who was hospitalized because of failure to thrive, megaloblastic anemia, and delayed psychomotor development. He was 10 months old and had been exclusively breast-fed by his vegan mother. Investigations showed vitamin B(12) deficiency with hematocytopenia and pervasive developmental disorders as well as vitamin K and vitamin D deficiencies. The infant's mother presented the same deficiencies. Introduction of vitamin supplementation normalized the biological disorders, and the infant showed weight gain and neurological improvement. This case highlights that a vegan diet during pregnancy followed by exclusive breast-feeding can induce nutritional deficiencies in the newborn, with clinical consequences. Detecting mother and child vitamin deficiencies and preventing them is essential.", "Safety considerations and potential interactions of vitamins: should vitamins be considered drugs? OBJECTIVE: To examine adverse effects, adverse events, and potential interactions of vitamins in light of their current prevalence of use, and to discuss whether vitamins should be considered over-the-counter drugs or natural health products/dietary supplements. DATA SOURCES: We performed a MEDLINE/PubMed search, explored 4 online databases (Medline Plus, Drug Digest, Natural Medicine Comprehensive Database, and the database of the University of Maryland), and examined reference lists of included studies published from 1966 through October 2009. STUDY SELECTION AND DATA EXTRACTION: The studies were reviewed, with an emphasis on randomized controlled clinical trials. We included articles with the most clinically important information with regard to adverse events and interactions. DATA SYNTHESIS: Vitamins are used by over one third of the North American population. Vitamins have documented adverse effects and toxicities, and most have documented interactions with drugs. While some vitamins (biotin, pantothenic acid, riboflavin, thiamine, vitamin B(12), vitamin K) have minor and reversible adverse effects, others, such as fat-soluble vitamins (A, E, D), can cause serious adverse events. Two water-soluble vitamins, folic acid and niacin, can also have significant toxicities and adverse events. CONCLUSIONS: Our recommendation is that vitamins A, E, D, folic acid, and niacin should be categorized as over-the-counter medications. Labeling of vitamins, especially those intended for children and other vulnerable groups, should include information on possible toxicities, dosing, recommended upper intake limits, and concurrent use with other products. Vitamin A should be excluded from multivitamin supplements and food fortificants.", "Dangerous nutrition? Calcium, vitamin D, and shark cartilage nutritional supplements and cancer-related hypercalcemia. The use of nutritional supplements in the general population and in cancer patients has become very popular. These supplements are not perceived as medications and are presumed to be safe by cancer patients, who may however be at risk for hypercalcemia. We note that many of our patients who have developed symptomatic hypercalcemia were taking vitamin D, calcium, or shark cartilage supplements. We report eight cases of hypercalcemia in cancer patients seen at the Cleveland Clinic Foundation in whom these nutritional supplements may have contributed to the prevalence or severity of hypercalcemia.", "Keratomalacia. Xerophthalmia and keratomalacia are public health problems of great magnitude which are usually associated with multiple vitamin and protein deficiencies. The authors report the case of a 27-year-old commune member who subjected herself to a bizarre protein and vitamin deficient diet for many months. This ultimately produced nyctalopia, xerophthalmia and keratomalacia with bilateral corneal perforation. Despite therapy, she remained comatose and expired shortly after admission. Ocular pathological changes included bilateral corneal melting with prolapse of intraocular contents, conjunctival epidermidalization, goblet cell atrophy and thinning of the outer nuclear layer of the retina. It is noted that ocular findings in pure avitaminosis A produced experimentalyy include epithelial atrophy followed by keratinization.", "Toxicology and risk assessment of coumarin: focus on human data. Coumarin is a secondary phytochemical with hepatotoxic and carcinogenic properties. For the carcinogenic effect, a genotoxic mechanism was considered possible, but was discounted by the European Food Safety Authority in 2004 based on new evidence. This allowed the derivation of a tolerable daily intake (TDI) for the first time, and a value of 0.1 mg/kg body weight was arrived at based on animal hepatotoxicity data. However, clinical data on hepatotoxicity from patients treated with coumarin as medicinal drug is also available. This data revealed a subgroup of the human population being more susceptible for the hepatotoxic effect than the animal species investigated. The cause of the high susceptibility is currently unknown; possible mechanisms are discussed. Using the human data, a TDI of 0.1 mg/kg body weight was derived, confirming that of the European Food Safety Authority. Nutritional exposure may be considerably, and is mainly due to use of cassia cinnamon, which is a popular spice especially, used for cookies and sweet dishes. To estimate exposure to coumarin during the Christmas season in Germany, a telephone survey was performed with more than 1000 randomly selected persons. Heavy consumers of cassia cinnamon may reach a daily coumarin intake corresponding to the TDI."], ["Oxidative stability and shelf-life evaluation of selected culinary oils. Four out of eight 'healthier' oils-namely, almond oil, avocado oil, hazelnut oil and macadamia nut oil-studied were rich sources of monounsaturated fatty acids like olive oil. Grape seed oil, rice barn oil (marketed recently), toasted sesame oil and walnut oil contained high levels of essential fatty acids. The order of oxidative stability determined by Rancimat measuring of the induction period at four temperatures (90 degrees C, 100 degrees C, 110 degrees C, and 120 degrees C) was found to be macadamia oil > rice bran oil approximately toasted sesame oil > avocado oil > almond oil > hazelnut oil > grape seed oil > walnut oil. High-level monounsaturated fatty acid oils gave a linear relationship between 100 times the reciprocal of the induction period against the total unsaturated fatty acid content obtained as %C18:2 + 0.08 x C18:1 + 2.08 x %C18:3, while the polyunsaturated fatty acid oils gave an exponential relationship. In the case of rice bran and hazelnut oils, shelf-life prediction from the extrapolation of the Arrhenius plots and the Q(10) factors was compared well with that of storage time given by the oil producers. In the cases of the other oils (with an exception of macadamia nut oil), the predicted shelf-lives were significantly lower than that of the storage times; especially, walnut oil (very prone to oxidation) gave 15-20 times lower shelf-life than the best-before storage life.", "Acute effects of high-fat meals enriched with walnuts or olive oil on postprandial endothelial function. OBJECTIVES: We sought to investigate whether the addition of walnuts or olive oil to a fatty meal have differential effects on postprandial vasoactivity, lipoproteins, markers of oxidation and endothelial activation, and plasma asymmetric dimethylarginine (ADMA). BACKGROUND: Compared with a Mediterranean diet, a walnut diet has been shown to improve endothelial function in hypercholesterolemic patients. We hypothesized that walnuts would reverse postprandial endothelial dysfunction associated with consumption of a fatty meal. METHODS: We randomized in a crossover design 12 healthy subjects and 12 patients with hypercholesterolemia to 2 high-fat meal sequences to which 25 g olive oil or 40 g walnuts had been added. Both test meals contained 80 g fat and 35% saturated fatty acids, and consumption of each meal was separated by 1 week. Venipunctures and ultrasound measurements of brachial artery endothelial function were performed after fasting and 4 h after test meals. RESULTS: In both study groups, flow-mediated dilation (FMD) was worse after the olive oil meal than after the walnut meal (p = 0.006, time-period interaction). Fasting, but not postprandial, triglyceride concentrations correlated inversely with FMD (r = -0.324; p = 0.024). Flow-independent dilation and plasma ADMA concentrations were unchanged, and the concentration of oxidized low-density lipoproteins decreased (p = 0.051) after either meal. The plasma concentrations of soluble inflammatory cytokines and adhesion molecules decreased (p < 0.01) independently of meal type, except for E-selectin, which decreased more (p = 0.033) after the walnut meal. CONCLUSIONS: Adding walnuts to a high-fat meal acutely improves FMD independently of changes in oxidation, inflammation, or ADMA. Both walnuts and olive oil preserve the protective phenotype of endothelial cells.", "Crossover study of diets enriched with virgin olive oil, walnuts or almonds. Effects on lipids and other cardiovascular risk markers. BACKGROUND AND AIMS: Virgin olive oil (VOO) and nuts are basic components of the Mediterranean diet, a heart-healthy dietary pattern. Nuts have well known cholesterol lowering effects, while evidence is unclear for VOO. We designed a study in hypercholesterolemic patients to assess the effects on serum lipids and other intermediate markers of cardiovascular risk of replacing 40% of the fat in the background diet with VOO, walnuts or almonds. METHODS AND RESULTS: After a 4 week run-in period with a healthy diet, eligible candidates were randomized into three diet sequences in a crossover design, with a common background diet enriched with VOO, walnuts or almonds, lasting 4 weeks each. Outcomes were changes of serum lipids and oxidation and inflammation markers, measured by standard methods. Plasma fatty acids were determined by gas chromatography to assess compliance. In 18 participants completing the study (9 women, mean age 56 y, BMI 25.7\u00a0kg/m(2)), LDL-cholesterol was reduced from baseline by 7.3%, 10.8% and 13.4% after the VOO, walnut and almond diets, respectively (P\u00a0=\u00a00.001, Friedman test). Total cholesterol and LDL/HDL ratios decreased in parallel. LDL-cholesterol decreases were greater than predicted from dietary fatty acid and cholesterol exchanges among diets. No changes of other lipid fractions, oxidation analytes or inflammatory biomarkers were observed. Plasma fatty acid changes after each diet sequence supported good compliance. CONCLUSION: The results confirm the cholesterol lowering properties of nut-enriched diets. They also suggest that phenolic-rich VOO has a cholesterol lowering effect independently of its fatty acid content, which clearly deserves further study. Copyright \u00a9 2010 Elsevier B.V. All rights reserved.", "Human cancer cell antiproliferative and antioxidant activities of Juglans regia L. Several studies suggest that regular consumption of nuts, mostly walnuts, may have beneficial effects against oxidative stress mediated diseases such as cardiovascular disease and cancer. Walnuts contain several phenolic compounds which are thought to contribute to their biological properties. The present study reports the total phenolic contents and antioxidant properties of methanolic and petroleum ether extracts obtained from walnut (Juglans regia L.) seed, green husk and leaf. The total phenolic contents were determined by the Folin-Ciocalteu method and the antioxidant activities assessed by the ability to quench the stable free radical 2,2'-diphenyl-1-picrylhydrazyl (DPPH) and to inhibit the 2,2'-azobis(2-amidinopropane) dihydrochloride (AAPH)-induced oxidative hemolysis of human erythrocytes. Methanolic seed extract presented the highest total phenolic content (116 mg GAE/g of extract) and DPPH scavenging activity (EC(50) of 0.143 mg/mL), followed by leaf and green husk. In petroleum ether extracts, antioxidant action was much lower or absent. Under the oxidative action of AAPH, all methanolic extracts significantly protected the erythrocyte membrane from hemolysis in a time- and concentration-dependent manner, although leaf extract inhibitory efficiency was much stronger (IC(50) of 0.060 mg/mL) than that observed for green husks and seeds (IC(50) of 0.127 and 0.121 mg/mL, respectively). Walnut methanolic extracts were also assayed for their antiproliferative effectiveness using human renal cancer cell lines A-498 and 769-P and the colon cancer cell line Caco-2. All extracts showed concentration-dependent growth inhibition toward human kidney and colon cancer cells. Concerning A-498 renal cancer cells, all extracts exhibited similar growth inhibition activity (IC(50) values between 0.226 and 0.291 mg/mL), while for both 769-P renal and Caco-2 colon cancer cells, walnut leaf extract showed a higher antiproliferative efficiency (IC(50) values of 0.352 and 0.229 mg/mL, respectively) than green husk or seed extracts. The results obtained herein strongly indicate that walnut tree constitute an excellent source of effective natural antioxidants and chemopreventive agents. Copyright 2009 Elsevier Ltd. All rights reserved.", "Coconut oil enhances tomato carotenoid tissue accumulation compared to safflower oil in the Mongolian gerbil ( Meriones unguiculatus ). Evidence suggests that monounsaturated and polyunsaturated fats facilitate greater absorption of carotenoids than saturated fats. However, the comparison of consuming a polyunsaturated fat source versus a saturated fat source on tomato carotenoid bioaccumulation has not been examined. The goal of this study was to determine the influence of coconut oil and safflower oil on tomato carotenoid tissue accumulation in Mongolian gerbils ( Meriones unguiculatus ) fed a 20% fat diet. Coconut oil feeding increased carotenoid concentrations among many compartments including total carotenoids in the serum (p = 0.0003), adrenal glandular phytoene (p = 0.04), hepatic phytofluene (p = 0.0001), testicular all-trans-lycopene (p = 0.01), and cis-lycopene (p = 0.006) in the prostate-seminal vesicle complex compared to safflower oil. Safflower oil-fed gerbils had greater splenic lycopene concentrations (p = 0.006) compared to coconut oil-fed gerbils. Coconut oil feeding increased serum cholesterol (p = 0.0001) and decreased hepatic cholesterol (p = 0.0003) compared to safflower oil. In summary, coconut oil enhanced tissue uptake of tomato carotenoids to a greater degree than safflower oil. These results may have been due to the large proportion of medium-chain fatty acids in coconut oil, which might have caused a shift in cholesterol flux to favor extrahepatic carotenoid tissue deposition."], ["Weight gain over 5 years in 21,966 meat-eating, fish-eating, vegetarian, and vegan men and women in EPIC-Oxford. BACKGROUND: Cross-sectional studies have shown that vegetarians and vegans are leaner than omnivores. Longitudinal data on weight gain in these groups are sparse. OBJECTIVE: We investigated changes in weight and body mass index (BMI) over a 5-year period in meat-eating, fish-eating, vegetarian, and vegan men and women in the UK. DESIGN: Self-reported anthropometric, dietary and lifestyle data were collected at baseline in 1994-1999 and at follow-up in 2000-2003; the median duration of follow-up was 5.3 years. SUBJECTS: A total of 21,966 men and women participating in Oxford arm of the European Prospective Investigation into Cancer and Nutrition aged 20-69 years at baseline. RESULTS: The mean annual weight gain was 389 (SD 884) g in men and 398 (SD 892) g in women. The differences between meat-eaters, fish-eaters, vegetarians and vegans in age-adjusted mean BMI at follow-up were similar to those seen at baseline. Multivariable-adjusted mean weight gain was somewhat smaller in vegans (284 g in men and 303 g in women, P<0.05 for both sexes) and fish-eaters (338 g, women only, P<0.001) compared with meat-eaters. Men and women who changed their diet in one or several steps in the direction meat-eater --> fish-eater --> vegetarian --> vegan showed the smallest mean annual weight gain of 242 (95% CI 133-351) and 301 (95% CI 238-365) g, respectively. CONCLUSION: During 5 years follow-up, the mean annual weight gain in a health-conscious cohort in the UK was approximately 400 g. Small differences in weight gain were observed between meat-eaters, fish-eaters, vegetarians and vegans. Lowest weight gain was seen among those who, during follow-up, had changed to a diet containing fewer animal food.", "Habitual Chocolate Consumption May Increase Body Weight in a Dose-Response Manner Objective Habitual chocolate intake was recently found to be associated with lower body weight in three cross-sectional epidemiological studies. Our objective was to assess whether these cross-sectional results hold up in a more rigorous prospective analysis. Methods We used data from the Atherosclerosis Risk in Communities cohort. Usual dietary intake was assessed by questionnaire at baseline (1987\u201398), and after six years. Participants reported usual chocolate intake as the frequency of eating a 1-oz (\u223c28 g) serving. Body weight and height were measured at the two visits. Missing data were replaced by multiple imputation. Linear mixed-effects models were used to evaluate cross-sectional and prospective associations between chocolate intake and adiposity. Results Data were from 15,732 and 12,830 participants at the first and second visit, respectively. More frequent chocolate consumption was associated with a significantly greater prospective weight gain over time, in a dose-response manner. For instance, compared to participants who ate a chocolate serving less often than monthly, those who ate it 1\u20134 times a month and at least weekly experienced an increase in Body Mass Index (kg/m2) of 0.26 (95% CI 0.08, 0.44) and 0.39 (0.23, 0.55), respectively, during the six-year study period. In cross-sectional analyses the frequency of chocolate consumption was inversely associated with body weight. This inverse association was attenuated after excluding participants with preexisting obesity-related illness. Compared to participants without such illness, those with it had higher BMI and reported less frequent chocolate intake, lower caloric intake, and diets richer in fruits and vegetables. They tended to make these dietary changes after becoming ill. Conclusions Our prospective analysis found that a chocolate habit was associated with long-term weight gain, in a dose-response manner. Our cross-sectional finding that chocolate intake was associated with lower body weight did not apply to participants without preexisting serious illness.", "Intake of total, animal and plant protein and subsequent changes in weight or waist circumference in European men and women: the Diogenes project. BACKGROUND: As protein is considered to increase thermogenesis and satiety more than other macronutrients, it may have beneficial effects on prevention of weight gain and weight maintenance. OBJECTIVE: The objective of this study is to assess the association between the amount and type of dietary protein, and subsequent changes in weight and waist circumference (WC). METHODS: 89,432 men and women from five countries participating in European Prospective Investigation into Cancer and Nutrition (EPIC) were followed for a mean of 6.5 years. Associations between the intake of protein or subgroups of protein (from animal and plant sources) and changes in weight (g per year) or WC (cm per year) were investigated using gender and centre-specific multiple regression analyses. Adjustments were made for other baseline dietary factors, baseline anthropometrics, demographic and lifestyle factors and follow-up time. We used random effect meta-analyses to obtain pooled estimates across centres. RESULTS: Higher intake of total protein, and protein from animal sources was associated with subsequent weight gain for both genders, strongest among women, and the association was mainly attributable to protein from red and processed meat and poultry rather than from fish and dairy sources. There was no overall association between intake of plant protein and subsequent changes in weight. No clear overall associations between intakes of total protein or any of the subgroups and changes in WC were present. The associations showed some heterogeneity between centres, but pooling of estimates was still considered justified. CONCLUSION: A high intake of protein was not found associated with lower weight or waist gain in this observational study. In contrast, protein from food items of animal origin, especially meat and poultry, seemed to be positively associated with long-term weight gain. There were no clear associations for waist changes.", "Increased food energy supply is more than sufficient to explain the US epidemic of obesity. BACKGROUND: The major drivers of the obesity epidemic are much debated and have considerable policy importance for the population-wide prevention of obesity. OBJECTIVE: The objective was to determine the relative contributions of increased energy intake and reduced physical activity to the US obesity epidemic. DESIGN: We predicted the changes in weight from the changes in estimated energy intakes in US children and adults between the 1970s and 2000s. The increased US food energy supply (adjusted for wastage and assumed to be proportional to energy intake) was apportioned to children and adults and inserted into equations that relate energy intake to body weight derived from doubly labeled water studies. The weight increases predicted from the equations were compared with weight increases measured in representative US surveys over the same period. RESULTS: For children, the measured weight gain was 4.0 kg, and the predicted weight gain for the increased energy intake was identical at 4.0 kg. For adults, the measured weight gain was 8.6 kg, whereas the predicted weight gain was somewhat higher (10.8 kg). CONCLUSIONS: Increased energy intake appears to be more than sufficient to explain weight gain in the US population. A reversal of the increase in energy intake of approximately 2000 kJ/d (500 kcal/d) for adults and of 1500 kJ/d (350 kcal/d) for children would be needed for a reversal to the mean body weights of the 1970s. Alternatively, large compensatory increases in physical activity (eg, 110-150 min of walking/d), or a combination of both, would achieve the same outcome. Population approaches to reducing obesity should emphasize a reduction in the drivers of increased energy intake.", "Dietary sugar and body weight: have we reached a crisis in the epidemic of obesity and diabetes?: health be damned! Pour on the sugar. Sugar-sweetened drinks have been associated with several health problems. In the point narrative as presented below, we provide our opinion and review of the data to date that we need to reconsider consumption of dietary sugar based on the growing concern of obesity and type 2 diabetes. In the counterpoint narrative following our contribution, Drs. Kahn and Sievenpiper provide a defense and suggest that dietary sugar is not the culprit. Data from the National Health and Nutrition Examination Survey and U.S. Department of Agriculture dietary surveys along with commercial Homescan data on household purchases were used to understand changes in sugar and fructose consumption. Meta-analyses and randomized clinical trials were used to evaluate outcomes of beverage and fructose intake. About 75% of all foods and beverages contain added sugar in a large array of forms. Consumption of soft drinks has increased fivefold since 1950. Meta-analyses suggest that consumption of sugar-sweetened beverages (SSBs) is related to the risk of diabetes, the metabolic syndrome, and cardiovascular disease. Drinking two 16-ounce SSBs per day for 6 months induced features of the metabolic syndrome and fatty liver. Randomized controlled trials in children and adults lasting 6 months to 2 years have shown that lowering the intake of soft drinks reduced weight gain. Recent studies suggest a gene-SSB potential relationship. Consumption of calorie-sweetened beverages has continued to increase and plays a role in the epidemic of obesity, the metabolic syndrome, and fatty liver disease. Reducing intake of soft drinks is associated with less weight gain."], ["Fish-induced keriorrhea. Many deep-sea fishes store large amounts of wax esters in their body for buoyancy control. Some of them are frequently caught as by-catch of tuna and other fishes. The most noteworthy ones include escolar and oilfish. The accumulation of the indigestible wax esters in the rectum through consumption of these fish engenders discharges or leakage per rectum as orange or brownish green oil, but without noticeable loss of water. This physiological response is called keriorrhea, which is variously described as \\\"oily diarrhea,\\\" \\\"oily orange diarrhea,\\\" or \\\"orange oily leakage\\\" by the mass media and bloggers on the internet. Outbreaks of keriorrhea have been repeatedly reported across continents. Additional symptoms including nausea, vomiting, abdominal cramps, and diarrhea were complained by the victims. They are probably due to anxiety or panic when suffering from keriorrhea. Escolar and oilfish are banned from import and sale in Italy, Japan, and South Korea. Rapid detection of the two fishes is imperative to ensure proper labeling and safeguarding of the public before and after any keriorrhea outbreak.", "Ciguatera: recent advances but the risk remains. Ciguatera is an important form of human poisoning caused by the consumption of seafood. The disease is characterised by gastrointestinal, neurological and cardiovascular disturbances. In cases of severe toxicity, paralysis, coma and death may occur. There is no immunity, and the toxins are cumulative. Symptoms may persist for months or years, or recur periodically. The epidemiology of ciguatera is complex and of central importance to the management and future use of marine resources. Ciguatera is an important medical entity in tropical and subtropical Pacific and Indian Ocean regions, and in the tropical Caribbean. As reef fish are increasingly exported to other areas, it has become a world health problem. The disease is under-reported and often misdiagnosed. Lipid-soluble, polyether toxins known as ciguatoxins accumulated in the muscles of certain subtropical and tropical marine finfish cause ciguatera. Ciguatoxins arise from biotransformation in the fish of less polar ciguatoxins (gambiertoxins) produced by Gambierdiscus toxicus, a marine dinoflagellate that lives on macroalgae, usually attached to dead coral. The toxins and their metabolites are concentrated in the food chain when carnivorous fish prey on smaller herbivorous fish. Humans are exposed at the end of the food chain. More than 400 species of fish can be vectors of ciguatoxins, but generally only a relatively small number of species are regularly incriminated in ciguatera. Ciguateric fish look, taste and smell normal, and detection of toxins in fish remains a problem. More than 20 precursor gambiertoxins and ciguatoxins have been identified in G. toxicus and in herbivorous and carnivorous fish. The toxins become more polar as they undergo oxidative metabolism and pass up the food chain. The main Pacific ciguatoxin (P-CTX-1) causes ciguatera at levels=0.1 microg/kg in the flesh of carnivorous fish. The main Caribbean ciguatoxin (C-CTX-1) is less polar and 10-fold less toxic than P-CTX-1. Ciguatoxins activate sodium ion (Na ) channels, causing cell membrane excitability and instability. Worldwide coral bleaching is now well documented, and there is a strong association between global warming and the bleaching and death of coral. This, together with natural environmental factors such as earthquakes and hurricanes, and man-made factors such as tourism, dock construction, sewage and eutrophication, may create more favourable environments for G. toxicus. While low levels of G. toxicus are found throughout tropical and subtropical waters, the presence of bloom numbers is unpredictable and patchy. Only certain genetic strains produce ciguatoxins, and environmental triggers for increasing toxin production are unknown.", "Fish odour syndrome Fish odour syndrome (trimethylaminuria) is a metabolic syndrome caused by abnormal excretion of trimethylamine in the breath, urine, sweat, saliva and vaginal secretions. Trimethylamine is derived from the intestinal bacterial degradation of foods rich in choline and carnitine and is normally oxidised by the liver to odourless trimethylamine N-oxide which is then excreted in the urine. Impaired oxidation of trimethylamine is thought to be the cause of the fish odour syndrome and is responsible for the smell of rotting fish. Certain foods rich in choline exacerbate the condition and the patients have a variety of psychological problems. Recognition of the condition is important as dietary adjustments reduce the excretion of trimethylamine and may reduce the odour. Occasionally, a short course of metronidazole, neomycin and lactulose may suppress production of trimethylamine by reducing the activity of gut microflora. Keywords: fish odour syndrome; trimethylaminuria", "Cretinism revisited. Endemic cretinism includes two syndromes: a more common neurological disorder with brain damage, deaf mutism, squint and spastic paresis of the legs and a less common syndrome of severe hypothyroidism, growth retardation and less severe mental defect. Both conditions are due to dietary iodine deficiency and can be prevented by correction of iodine deficiency before pregnancy. Endemic cretinism is now included in the spectrum of the effects of iodine deficiency in a population termed the 'iodine deficiency disorders (IDDs)', which also includes a wide range of lesser degrees of cognitive defect that can be prevented by the correction of iodine deficiency. Iodine deficiency is now recognised by the World Health Organization (WHO) as the most common preventable cause of brain damage with in excess of 2 billion at risk from 130 countries. A global United Nations (UN) programme of prevention has achieved 68% household usage of iodised salt by the year 2000 compared with less than 20% prior to 1990. Copyright 2009 Elsevier Ltd. All rights reserved.", "Reducing the fat content in ground beef without sacrificing quality: a review. Americans are becoming more health conscious in their food choices and many are interested in reducing dietary fat intake. Fat replacers can affect meat flavor both by adding flavors of their own, by reducing the original aroma-generating substrate (fat) and by altering release of aroma compounds. When fat is removed from meat, water is generally added to replace it. Water-binding compounds can be added to prevent the added water from cooking out or evaporating and to prevent patty shrinkage. Fat replacers are generally classified by their composition: protein-based replacers including whey, soy and collagen, lipid-based substances such as soy lecithin which function as emulsifiers maintaining the fat that is retained distributed in the product, and carbohydrate-based substances including flours (wheat, soy, oat), starches (potato, modified corn starch, tapioca) and gums (carrageenan, xanthin). Duplication of the characteristics contributed by fat often requires a combination of replacers to address juiciness and texture (firmness) without negatively impacting flavor. Published by Elsevier Ltd."], ["Anisakis simplex: from Obscure Infectious Worm to Inducer of Immune Hypersensitivity Summary: Infection of humans with the nematode worm parasite Anisakis simplex was first described in the 1960s in association with the consumption of raw or undercooked fish. During the 1990s it was realized that even the ingestion of dead worms in food fish can cause severe hypersensitivity reactions, that these may be more prevalent than infection itself, and that this outcome could be associated with food preparations previously considered safe. Not only may allergic symptoms arise from infection by the parasites (\u201cgastroallergic anisakiasis\u201d), but true anaphylactic reactions can also occur following exposure to allergens from dead worms by food-borne, airborne, or skin contact routes. This review discusses A. simplex pathogenesis in humans, covering immune hypersensitivity reactions both in the context of a living infection and in terms of exposure to its allergens by other routes. Over the last 20 years, several studies have concentrated on A. simplex antigen characterization and innate as well as adaptive immune response to this parasite. Molecular characterization of Anisakis allergens and isolation of their encoding cDNAs is now an active field of research that should provide improved diagnostic tools in addition to tools with which to enhance our understanding of pathogenesis and controversial aspects of A. simplex allergy. We also discuss the potential relevance of parasite products such as allergens, proteinases, and proteinase inhibitors and the activation of basophils, eosinophils, and mast cells in the induction of A. simplex-related immune hypersensitivity states induced by exposure to the parasite, dead or alive.", "First record of human infection with the tapeworm Diphyllobothrium nihonkaiense in North America. The tapeworm Diphyllobothrium nihonkaiense (Cestoda: Diphyllobothriidea), originally described from Japan, is reported from a man in North America for the first time. Species identification was based on sequences of ribosomal (partial 18S rRNA) and mitochondrial (partial Cytochrome c Oxidase subunit I) genes of proglottids expelled from a Czech tourist who ate raw Pacific sockeye salmon (Oncorhynchus nerka) from British Columbia, Canada.", "Neurocysticercosis in pregnancy: not just another headache. Infection with pork tapeworm, or Taenia solium, affects approximately 50 million people worldwide. The most important and potentially devastating form of the infestation, neurocysticercosis, occurs when the parasite invades the central nervous system. There has been a significant increase in the number of cases in the United States due to immigration from endemic areas. This case study of a pregnant woman in the 35th week of gestation exemplifies the serious consequences of this infection in pregnancy, and discusses an evidence-based approach to the diagnosis, treatment and eradication of this preventable disease. \u00a9 2012 AWHONN.", "Freezing of infested pork muscle kills cysticerci. A method for culturing cysticerci that allows successful evagination and growth of scolexes from metacestodes of Taenia solium was used to study the survival of cysticerci subjected to low temperatures. Refrigeration of pork muscle infested with cysticerci at temperatures above 0 degrees C did not affect the parasites' survival in culture. Conversely, freezing of meat prevented survival of cysts. A practical procedure to kill cysticerci is the storage of pork muscle for four days at -5 degrees C, three days at -15 degrees C, or one day at -24 degrees C. These simple measures would help prevent the most frequent parasitosis of man's central nervous system.", "Neurocysticercosis and oncogenesis. Recent studies suggest that neurocysticercosis may be a risk factor for human cancer. Pathogenetic mechanisms explaining possible oncogenic effects of cysticerci include the following: (a) parasite-induced modulation of the host immune response that may be associated with loss of regulatory mechanisms implicated in the immunological surveillance against cancer; (b) transfer of genetic material from the parasite to the host, causing DNA damage and malignant transformation of host cells, and (c) chronic inflammation with liberation of nitric oxide and inhibition of tumor suppressor genes. Further research is needed to confirm the potential role of cysticercosis in the development of cancer. These studies should determine the presence of cysticercotic factors responsible for the transfer of genetic material and potential mutations in the tumor suppressor genes in proliferating astrocytes surrounding cysticercotic lesions. Additionally, the complex interaction between the immune state of the host with variable cytokine release and the presence of inflammatory cells releasing nitric oxide that cause DNA damage and impair tumor suppressive mechanisms needs to be investigated."], ["Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "A multi-center, double-blind, randomised study of the Lavender oil preparation Silexan in comparison to Lorazepam for generalized anxiety disorder. Generalized and persistent anxiety, accompanied by nervousness and other symptoms (Generalised Anxiety Disorder, GAD) is frequent in the general population and leads to benzodiazepine usage. Unfortunately, these substances induce sedation and have a high potential for drug abuse, and there is thus a need for alternatives. As the anxiolytic properties of lavender have already been demonstrated in pharmacological studies and small-scale clinical trials, it was postulated that lavender has a positive effect in GAD. A controlled clinical study was then performed to evaluate the efficacy of silexan, a new oral lavender oil capsule preparation, versus a benzodiazepine. In this study, the efficacy of a 6-week-intake of silexan compared to lorazepam was investigated in adults with GAD. The primary target variable was the change in the Hamilton Anxiety Rating Scale (HAM-A-total score) as an objective measurement of the severity of anxiety between baseline and week 6. The results suggest that silexan effectively ameliorates generalized anxiety comparable to a common benzodiazepine (lorazepam). The mean of the HAM-A-total score decreased clearly and to a similar extent in both groups (by 11.3+/-6.7 points (45%) in the silexan group and by 11.6+/-6.6 points (46%) in the lorazepam group, from 25+/-4 points at baseline in both groups). During the active treatment period, the two HAM-A subscores \\\"somatic anxiety\\\" (HAM-A subscore I) and \\\"psychic anxiety\\\" (HAM-A subscore II) also decreased clearly and to a similar extent in both groups. The changes in other subscores measured during the study, such as the SAS (Self-rating Anxiety Scale), PSWQ-PW (Penn State Worry Questionnaire), SF 36 Health survey Questionnaire and Clinical Global Impressions of severity of disorder (CGI item 1, CGI item 2, CGI item 3), and the results of the sleep diary demonstrated comparable positive effects of the two compounds. In conclusion, our results demonstrate that silexan is as effective as lorazepam in adults with GAD. The safety of silexan was also demonstrated. Since lavender oil showed no sedative effects in our study and has no potential for drug abuse, silexan appears to be an effective and well tolerated alternative to benzodiazepines for amelioration of generalised anxiety. Copyright 2009 Elsevier GmbH. All rights reserved.", "The 2009 Garrod lecture: the evolution of antimicrobial resistance: a Darwinian perspective. Microbes have evolved over 3.5 billion years and are arguably the most adaptable organisms on earth. Restricted genetically by their inability to reproduce sexually, bacteria have acquired several additional mechanisms by which to exchange genetic material horizontally. Such mechanisms have allowed bacteria to inhabit some of the most inhospitable environments on earth. It is thus hardly surprising that when faced with a barrage of inimical chemicals (antibiotics) they have responded with an equal and opposite force. This article compares and contrasts the evolution of antimicrobial resistance to beta-lactam antibiotics over the last 70 years in two bacterial species, namely Staphylococcus aureus, a highly evolved human pathogen, and Pseudomonas aeruginosa, an opportunistic nosocomial pathogen.", "Identification of anthocyanins in the liver, eye, and brain of blueberry-fed pigs. Dietary intervention with anthocyanins may confer benefits in brain function, including vision. Research to date indicates that animals have only a limited capacity to absorb anthocyanins, compared to other types of flavonoids. Pigs, which are a suitable model for human digestive absorption, were used to examine the deposition of anthocyanins in tissues including the liver, eye, and brain tissue. Pigs were fed diets supplemented with 0, 1, 2, or 4% w/w blueberries ( Vaccinium corymbosum L. 'Jersey') for 4 weeks. Prior to euthanasia, pigs were fasted for 18-21 h. Although no anthocyanins were detected in the plasma or urine of the fasted animals, intact anthocyanins were detected in all tissues where they were sought. LC-MS/MS results are presented for the relative concentration of 11 intact anthocyanins in the liver, eye, cortex, and cerebellum. The results suggest that anthocyanins can accumulate in tissues, including tissues beyond the blood-brain barrier.", "Biological activities of lavender essential oil. Essential oils distilled from members of the genus Lavandula have been used both cosmetically and therapeutically for centuries with the most commonly used species being L. angustifolia, L. latifolia, L. stoechas and L. x intermedia. Although there is considerable anecdotal information about the biological activity of these oils much of this has not been substantiated by scientific or clinical evidence. Among the claims made for lavender oil are that is it antibacterial, antifungal, carminative (smooth muscle relaxing), sedative, antidepressive and effective for burns and insect bites. In this review we detail the current state of knowledge about the effect of lavender oils on psychological and physiological parameters and its use as an antimicrobial agent. Although the data are still inconclusive and often controversial, there does seem to be both scientific and clinical data that support the traditional uses of lavender. However, methodological and oil identification problems have severely hampered the evaluation of the therapeutic significance of much of the research on Lavandula spp. These issues need to be resolved before we have a true picture of the biological activities of lavender essential oil. Copyright 2002 John Wiley & Sons, Ltd."], ["Exercise and Pharmacotherapy in the Treatment of Major Depressive Disorder Objective To assess whether patients receiving aerobic exercise training performed either at home or in a supervised group setting achieve reductions in depression comparable to standard antidepressant medication (sertraline) and greater reductions in depression compared to placebo controls. Methods Between October 2000 and November 2005, we performed a prospective, randomized controlled trial (SMILE study) with allocation concealment and blinded outcome assessment in a tertiary care teaching hospital. A total of 202 adults (153 women; 49 men) diagnosed with major depression were assigned randomly to one of four conditions: supervised exercise in a group setting; home-based exercise; antidepressant medication (sertraline, 50\u2013200 mg daily); or placebo pill for 16 weeks. Patients underwent the structured clinical interview for depression and completed the Hamilton Depression Rating Scale (HAM-D). Results After 4 months of treatment, 41% of the participants achieved remission, defined as no longer meeting the criteria for major depressive disorder (MDD) and a HAM-D score of <8. Patients receiving active treatments tended to have higher remission rates than the placebo controls: supervised exercise = 45%; home-based exercise = 40%; medication = 47%; placebo = 31% (p = .057). All treatment groups had lower HAM-D scores after treatment; scores for the active treatment groups were not significantly different from the placebo group (p = .23). Conclusions The efficacy of exercise in patients seems generally comparable with patients receiving antidepressant medication and both tend to be better than the placebo in patients with MDD. Placebo response rates were high, suggesting that a considerable portion of the therapeutic response is determined by patient expectations, ongoing symptom monitoring, attention, and other nonspecific factors.", "Primum Non Nocere: An Evolutionary Analysis of Whether Antidepressants Do More Harm than Good Antidepressant medications are the first-line treatment for people meeting current diagnostic criteria for major depressive disorder. Most antidepressants are designed to perturb the mechanisms that regulate the neurotransmitter serotonin \u2013 an evolutionarily ancient biochemical found in plants, animals, and fungi. Many adaptive processes evolved to be regulated by serotonin, including emotion, development, neuronal growth and death, platelet activation and the clotting process, attention, electrolyte balance, and reproduction. It is a principle of evolutionary medicine that the disruption of evolved adaptations will degrade biological functioning. Because serotonin regulates many adaptive processes, antidepressants could have many adverse health effects. For instance, while antidepressants are modestly effective in reducing depressive symptoms, they increase the brain\u2019s susceptibility to future episodes after they have been discontinued. Contrary to a widely held belief in psychiatry, studies that purport to show that antidepressants promote neurogenesis are flawed because they all use a method that cannot, by itself, distinguish between neurogenesis and neuronal death. In fact, antidepressants cause neuronal damage and mature neurons to revert to an immature state, both of which may explain why antidepressants also cause neurons to undergo apoptosis (programmed death). Antidepressants can also cause developmental problems, they have adverse effects on sexual and romantic life, and they increase the risk of hyponatremia (low sodium in the blood plasma), bleeding, stroke, and death in the elderly. Our review supports the conclusion that antidepressants generally do more harm than good by disrupting a number of adaptive processes regulated by serotonin. However, there may be specific conditions for which their use is warranted (e.g., cancer, recovery from stroke). We conclude that altered informed consent practices and greater caution in the prescription of antidepressants are warranted.", "Monoaminergic neurotransmission: the history of the discovery of antidepressants from 1950s until today. The 1950s saw the clinical introduction of the first two specifically antidepressant drugs: iproniazid, a monoamine-oxidase inhibitor that had been used in the treatment of tuberculosis, and imipramine, the first drug in the tricyclic antidepressant family. Iproniazid and imipramine made two fundamental contributions to the development of psychiatry: one of a social-health nature, consisting in an authentic change in the psychiatric care of depressive patients; and the other of a purely pharmacological nature, since these agents have constituted an indispensable research tool for neurobiology and psychopharmacology, permitting, among other things, the postulation of the first aetiopathogenic hypotheses of depressive disorders. The clinical introduction of fluoxetine, a selective serotonin reuptake inhibitor, in the late 1980s, once again revolutionized therapy for depression, opening the way for new families of antidepressants. The present work reviews, from a historical perspective, the entire process that led to the discovery of these drugs, as well as their contribution to the development of the neuroscientific disciplines. However, all of these antidepressants, like the rest of those currently available for clinical practice, share the same action mechanism, which involves the modulation of monoaminergic neurotransmission at a synaptic level, so that the future of antidepressant therapy would seem to revolve around the search for extraneuronal non-aminergic mechanisms or mechanisms that modulate the intraneuronal biochemical pathways.", "Herbal medicines, other than St. John's Wort, in the treatment of depression: a systematic review. OBJECTIVE: To evaluate herbal medicines, other than St. John's wort, in the treatment of depression. DATA SOURCES/SEARCH METHODS: A computer-based search of Medline, Cinahl, AMED, ALT Health Watch, Psych Articles, Psych Info, Current Contents databases, Cochrane Controlled Trials Register, and Cochrane Database of Systematic Reviews, was performed. Researchers were contacted, and bibliographies of relevant papers and previous meta-analysis were hand searched for additional references. REVIEW METHODS: Trials were included in the review if they were prospective human trials assessing herbal medicines, other than St. John's wort, in the treatment of mild-to-moderate depression and utilized validated instruments to assess participant eligibility and clinical endpoints. RESULTS: Nine trials were identified that met all eligibility requirements. Three studies investigated saffron stigma, two investigated saffron petal, and one compared saffron stigma to the petal. Individual trials investigating lavender, Echium, and Rhodiola were also located. DISCUSSION: Results of the trials are discussed. Saffron stigma was found to be significantly more effective than placebo and equally as efficacious as fluoxetine and imipramine. Saffron petal was significantly more effective than placebo and was found to be equally efficacious compared to fluoxetine and saffron stigma. Lavender was found to be less effective than imipramine, but the combination of lavender and imipramine was significantly more effective than imipramine alone. When compared to placebo, Echium was found to significantly decrease depression scores at week 4, but not week 6. Rhodiola was also found to significantly improve depressive symptoms when compared to placebo. CONCLUSION: A number of herbal medicines show promise in the management of mild-to-moderate depression.", "Antidepressants and the placebo response. AIMS: To evaluate new generation antidepressants in relation to the placebo response. METHODS: I review meta-analyses in which response to antidepressant medication and response to placebo were calculated. RESULTS: All but one of these meta-analyses included unpublished as well as published trials. Most trials failed to show a significant advantage of SSRIs over inert placebo, and the differences between drug and placebo are not clinically significant for most depressed patients. Documents obtained from the U.S. Food and Drug Administration (FDA) revealed an explicit decision to keep this information from the public and from prescribing physicians. CONCLUSIONS: Because they do not incur drug risks, exercise and psychotherapy, which show at benefits at least equal to those of antidepressants, may be a better treatment choice for depressed individuals."], ["Preventing Alzheimer\u2019s disease-related gray matter atrophy by B-vitamin treatment Is it possible to prevent atrophy of key brain regions related to cognitive decline and Alzheimer\u2019s disease (AD)? One approach is to modify nongenetic risk factors, for instance by lowering elevated plasma homocysteine using B vitamins. In an initial, randomized controlled study on elderly subjects with increased dementia risk (mild cognitive impairment according to 2004 Petersen criteria), we showed that high-dose B-vitamin treatment (folic acid 0.8 mg, vitamin B6 20 mg, vitamin B12 0.5 mg) slowed shrinkage of the whole brain volume over 2 y. Here, we go further by demonstrating that B-vitamin treatment reduces, by as much as seven fold, the cerebral atrophy in those gray matter (GM) regions specifically vulnerable to the AD process, including the medial temporal lobe. In the placebo group, higher homocysteine levels at baseline are associated with faster GM atrophy, but this deleterious effect is largely prevented by B-vitamin treatment. We additionally show that the beneficial effect of B vitamins is confined to participants with high homocysteine (above the median, 11 \u00b5mol/L) and that, in these participants, a causal Bayesian network analysis indicates the following chain of events: B vitamins lower homocysteine, which directly leads to a decrease in GM atrophy, thereby slowing cognitive decline. Our results show that B-vitamin supplementation can slow the atrophy of specific brain regions that are a key component of the AD process and that are associated with cognitive decline. Further B-vitamin supplementation trials focusing on elderly subjets with high homocysteine levels are warranted to see if progression to dementia can be prevented.", "Homocysteine-Lowering by B Vitamins Slows the Rate of Accelerated Brain Atrophy in Mild Cognitive Impairment: A Randomized Controlled Trial Background An increased rate of brain atrophy is often observed in older subjects, in particular those who suffer from cognitive decline. Homocysteine is a risk factor for brain atrophy, cognitive impairment and dementia. Plasma concentrations of homocysteine can be lowered by dietary administration of B vitamins. Objective To determine whether supplementation with B vitamins that lower levels of plasma total homocysteine can slow the rate of brain atrophy in subjects with mild cognitive impairment in a randomised controlled trial (VITACOG, ISRCTN 94410159). Methods and Findings Single-center, randomized, double-blind controlled trial of high-dose folic acid, vitamins B6 and B12 in 271 individuals (of 646 screened) over 70 y old with mild cognitive impairment. A subset (187) volunteered to have cranial MRI scans at the start and finish of the study. Participants were randomly assigned to two groups of equal size, one treated with folic acid (0.8 mg/d), vitamin B12 (0.5 mg/d) and vitamin B6 (20 mg/d), the other with placebo; treatment was for 24 months. The main outcome measure was the change in the rate of atrophy of the whole brain assessed by serial volumetric MRI scans. Results A total of 168 participants (85 in active treatment group; 83 receiving placebo) completed the MRI section of the trial. The mean rate of brain atrophy per year was 0.76% [95% CI, 0.63\u20130.90] in the active treatment group and 1.08% [0.94\u20131.22] in the placebo group (P\u200a=\u200a0.001). The treatment response was related to baseline homocysteine levels: the rate of atrophy in participants with homocysteine >13 \u00b5mol/L was 53% lower in the active treatment group (P\u200a=\u200a0.001). A greater rate of atrophy was associated with a lower final cognitive test scores. There was no difference in serious adverse events according to treatment category. Conclusions and Significance The accelerated rate of brain atrophy in elderly with mild cognitive impairment can be slowed by treatment with homocysteine-lowering B vitamins. Sixteen percent of those over 70 y old have mild cognitive impairment and half of these develop Alzheimer's disease. Since accelerated brain atrophy is a characteristic of subjects with mild cognitive impairment who convert to Alzheimer's disease, trials are needed to see if the same treatment will delay the development of Alzheimer's disease. Trial Registration Controlled-Trials.com ISRCTN94410159", "Effect of homocysteine lowering treatment on cognitive function: a systematic review and meta-analysis of randomized controlled trials. Elevated total plasma homocysteine has been linked to the development of cognitive impairment and dementia in later life and this can be reliably lowered by the daily supplementation of vitamin B6, B12, and folic acid. We performed a systematic review and meta-analysis of 19 English language randomized, placebo-controlled trials of homocysteine lowering B-vitamin supplementation of individuals with and without cognitive impairment at the time of study entry. We standardized scores to facilitate comparison between studies and to enable us to complete a meta-analysis of randomized trials. In addition, we stratified our analyses according to the folate status of the country of origin. B-vitamin supplementation did not show an improvement in cognitive function for individuals with (SMD = 0.10, 95%CI -0.08 to 0.28) or without (SMD = -0.03, 95%CI -0.1 to 0.04) significant cognitive impairment. This was irrespective of study duration (SMD = 0.05, 95%CI -0.10 to 0.20 and SMD = 0, 95%CI -0.08 to 0.08), study size (SMD = 0.05, 95%CI -0.09 to 0.19 and SMD = -0.02, 95%CI -0.10 to 0.05), and whether participants came from countries with low folate status (SMD = 0.14, 95%CI -0.12 to 0.40 and SMD = -0.10, 95%CI -0.23 to 0.04). Supplementation of vitamins B12, B6, and folic acid alone or in combination does not appear to improve cognitive function in individuals with or without existing cognitive impairment. It remains to be established if prolonged treatment with B-vitamins can reduce the risk of dementia in later life.", "Low vitamin B-12 status and risk of cognitive decline in older adults. BACKGROUND: Elevated total homocysteine (tHcy) concentrations have been associated with cognitive impairment, but it is unclear whether low vitamin B-12 or folate status is responsible for cognitive decline. OBJECTIVE: We examined the associations of cognitive decline with vitamin B-12 and folate status in a longitudinal cohort study performed from 1993 to 2003 in Oxford, United Kingdom. DESIGN: Cognitive function was assessed with the Mini-Mental State Examination on >/=3 occasions during 10 y and related to serum concentrations of vitamin B-12, holotranscobalamin (holoTC), tHcy, methylmalonic acid (MMA), and folate with the use of linear mixed models in 1648 participants who provided blood in 1995. RESULTS: Cognitive function declined abruptly at younger ages in some participants but remained intact in others until very old age. In multivariate regression analyses after adjustment for established risk factors, concentrations of holoTC (a marker of reduced vitamin B-12 status), tHcy, and MMA predicted cognitive decline, but folate did not. A doubling in holoTC concentrations (from 50 to 100 pmol/L) was associated with a 30% slower rate of cognitive decline (-0.137 to -0.083), whereas a doubling in tHcy (from 10 to 20 micromol/L) or MMA (from 0.25 to 0.50 micromol/L) was associated with >50% more rapid cognitive decline (-0.090 to -0.169) and (-0.104 to -0.169), respectively. After adjustment for all vitamin markers simultaneously, the associations of cognitive decline with holoTC and MMA remained significant. CONCLUSIONS: Low vitamin B-12 status was associated with more rapid cognitive decline. Randomized trials are required to determine the relevance of vitamin B-12 supplementation for prevention of dementia.", "A turning point for Alzheimer's disease? Despite an archive of over 73,000 research papers published in the last two decades on the subject of Alzheimer's disease (AD), little clinical progress has been made relative to how people get sporadic AD and what can be done to help them avoid it. This review spotlights strategic steps that could be a turning point in the dramatic lowering of Alzheimer prevalence. The main strategy includes application of four pillars of prevention: 1) early identification of AD vascular risk factors; 2) early detection of AD vascular risk factors; 3) early intervention of AD vascular risk factors based on evidence-based medical decisions; 4) patient follow-up to assess and modify interventions as needed. Tandem to these four pillars of prevention, a proactive lifestyle consisting of a healthy diet coupled to physical and mental activity should be applied as part of any therapeutic intervention. We are persuaded by mounting and compelling evidence that AD is a multifactorial disorder kindled by vascular risk factors that generate chronic brain hypoperfusion (CBH) during advanced aging. A pathobiological cascade of biochemical events in the presence of CBH that leads to oxidative stress and neurodegeneration appears to involve multiple biofactors including micronutrients, trace metals, lipids, and pro-oxidants, as reviewed in this special issue of BioFactors. Modulation of these biofactors may help prevent or control incipient AD. \u00a9 2012 International Union of Biochemistry and Molecular Biology, Inc. Copyright \u00a9 2012 International Union of Biochemistry and Molecular Biology, Inc."], ["Cancer chemopreventive potential of apples, apple juice, and apple components. Apples ( MALUS sp., Rosaceae) are a rich source of nutrient as well as non-nutrient components and contain high levels of polyphenols and other phytochemicals. Main structural classes of apple constituents include hydroxycinnamic acids, dihydrochalcones, flavonols (quercetin glycosides), catechins and oligomeric procyanidins, as well as triterpenoids in apple peel and anthocyanins in red apples. Several lines of evidence suggest that apples and apple products possess a wide range of biological activities which may contribute to health beneficial effects against cardiovascular disease, asthma and pulmonary dysfunction, diabetes, obesity, and cancer (reviewed by Boyer and Liu, Nutr J 2004). The present review will summarize the current knowledge on potential cancer preventive effects of apples, apple juice and apple extracts (jointly designated as apple products). In brief, apple extracts and components, especially oligomeric procyanidins, have been shown to influence multiple mechanisms relevant for cancer prevention in IN VITRO studies. These include antimutagenic activity, modulation of carcinogen metabolism, antioxidant activity, anti-inflammatory mechanisms, modulation of signal transduction pathways, antiproliferative and apoptosis-inducing activity, as well as novel mechanisms on epigenetic events and innate immunity. Apple products have been shown to prevent skin, mammary and colon carcinogenesis in animal models. Epidemiological observations indicate that regular consumption of one or more apples a day may reduce the risk for lung and colon cancer.", "From beans to berries and beyond: teamwork between plant chemicals for protection of optimal human health. It is now well known to consumers around the world that certain fruits and vegetables can help prevent or treat chronic human diseases. But, what many people don't fully appreciate is that it is not a single component in these plant-derived foods, but rather complex mixtures of interacting natural chemicals, that produce such powerful health-protective effects. These natural components accumulate simultaneously together in a plant, and provide a multifaceted defensive strategy for both the plant, and the human consumer. In order to investigate the strength of natural chemical cooperation in highly-pigmented, flavonoid-rich functional foods, our lab has relied on analysis of both whole fruits, and continuous, reliable plant cell culture production systems which accumulate anthocyanins and proanthocyanidins in high concentrations. Successive rounds of relatively gentle, rapid, and large-volume fractionations are linked to bioassay of complex to simple mixtures and semi-purified compounds. By means of this strategy, additive interactions or synergies between related compounds in health maintenance can be sorted out. Interestingly, phytochemical interactions between the same classes of compounds intensify the efficacy of flavonoid-rich fruits against multiple, not necessarily discrete, human disease conditions including CVD, cancer, metabolic syndrome, and others.", "Can noncommunicable diseases be prevented? Lessons from studies of populations and individuals. Noncommunicable diseases (NCDs)--mainly cancers, cardiovascular diseases, diabetes, and chronic respiratory diseases--are responsible for about two-thirds of deaths worldwide, mostly in low- and middle-income countries. There is an urgent need for policies and strategies that prevent NCDs by reducing their major risk factors. Effective approaches for large-scale NCD prevention include comprehensive tobacco and alcohol control through taxes and regulation of sales and advertising; reducing dietary salt, unhealthy fats, and sugars through regulation and well-designed public education; increasing the consumption of fresh fruits and vegetables, healthy fats, and whole grains by lowering prices and improving availability; and implementing a universal, effective, and equitable primary-care system that reduces NCD risk factors, including cardiometabolic risk factors and infections that are precursors to NCDs, through clinical interventions.", "Diet, infection and wheezy illness: lessons from adults. An increase in asthma and atopic disease has been recorded in many countries where society has become more prosperous. We have investigated two possible explanations: a reduction in childhood infections and a change in diet. In a cohort of people followed up since 1964, originally selected as a random sample of primary school children, we have investigated the relevance of family size and the common childhood infectious diseases to development of eczema, hay fever and asthma. Although membership of a large family reduced risks of hay fever and eczema (but not asthma), this was not explained by the infections the child had suffered. Indeed, the more infections the child had had, the greater the likelihood of asthma, although measles gave a modest measure of protection. We have investigated dietary factors in two separate studies. In the first, we have shown the risks of bronchial hyper-reactivity are increased seven-fold among those with the lowest intake of vitamin C, while the lowest intake of saturated fats gave a 10-fold protection. In the second, we have shown that the risk of adult-onset wheezy illness is increased five-fold by the lowest intake of vitamin E and doubled by the lowest intake of vitamin C. These results were supported by direct measurements of the vitamins and triglycerides in plasma. We have proposed that changes in the diet of pregnant women may have reflected those observed in the population as a whole and that these may have resulted in the birth of cohorts of children predisposed to atopy and asthma. The direct test of this is to study the diet and nutritional status of a large cohort of pregnant women and to follow their offspring forward. This is our current research.", "Efficacy of home washing methods in controlling surface microbial contamination on fresh produce. Much effort has been focused on sanitation of fresh produce at the commercial level; however, few options are available to the consumer. The purpose of this study was to determine the efficacy of different cleaning methods in reducing bacterial contamination on fresh produce in a home setting. Lettuce, broccoli, apples, and tomatoes were inoculated with Listeria innocua and then subjected to combinations of the following cleaning procedures: (i) soak for 2 min in tap water, Veggie Wash solution, 5% vinegar solution, or 13% lemon solution and (ii) rinse under running tap water, rinse and rub under running tap water, brush under running tap water, or wipe with wet/dry paper towel. Presoaking in water before rinsing significantly reduced bacteria in apples, tomatoes, and lettuce, but not in broccoli. Wiping apples and tomatoes with wet or dry paper towel showed lower bacterial reductions compared with soaking and rinsing procedures. Blossom ends of apples were more contaminated than the surface after soaking and rinsing; similar results were observed between flower section and stem of broccoli. Reductions of L. innocua in both tomatoes and apples (2.01 to 2.89 log CFU/g) were more than in lettuce and broccoli (1.41 to 1.88 log CFU/g) when subjected to same washing procedures. Reductions of surface contamination of lettuce after soaking in lemon or vinegar solutions were not significantly different (P > 0.05) from lettuce soaking in cold tap water. Therefore, educators and extension workers might consider it appropriate to instruct consumers to rub or brush fresh produce under cold running tap water before consumption."], ["Organic food: buying more safety or just peace of mind? A critical review of the literature. Consumer concern over the quality and safety of conventional food has intensified in recent years, and primarily drives the increasing demand for organically grown food, which is perceived as healthier and safer. Relevant scientific evidence, however, is scarce, while anecdotal reports abound. Although there is an urgent need for information related to health benefits and/or hazards of food products of both origins, generalized conclusions remain tentative in the absence of adequate comparative data. Organic fruits and vegetables can be expected to contain fewer agrochemical residues than conventionally grown alternatives; yet, the significance of this difference is questionable, inasmuch as actual levels of contamination in both types of food are generally well below acceptable limits. Also, some leafy, root, and tuber organic vegetables appear to have lower nitrate content compared with conventional ones, but whether or not dietary nitrate indeed constitutes a threat to human health is a matter of debate. On the other hand, no differences can be identified for environmental contaminants (e.g. cadmium and other heavy metals), which are likely to be present in food from both origins. With respect to other food hazards, such as endogenous plant toxins, biological pesticides and pathogenic microorganisms, available evidence is extremely limited preventing generalized statements. Also, results for mycotoxin contamination in cereal crops are variable and inconclusive; hence, no clear picture emerges. It is difficult, therefore, to weigh the risks, but what should be made clear is that 'organic' does not automatically equal 'safe.' Additional studies in this area of research are warranted. At our present state of knowledge, other factors rather than safety aspects seem to speak in favor of organic food.", "Are organic foods safer or healthier than conventional alternatives?: a systematic review. BACKGROUND: The health benefits of organic foods are unclear. PURPOSE: To review evidence comparing the health effects of organic and conventional foods. DATA SOURCES: MEDLINE (January 1966 to May 2011), EMBASE, CAB Direct, Agricola, TOXNET, Cochrane Library (January 1966 to May 2009), and bibliographies of retrieved articles. STUDY SELECTION: English-language reports of comparisons of organically and conventionally grown food or of populations consuming these foods. DATA EXTRACTION: 2 independent investigators extracted data on methods, health outcomes, and nutrient and contaminant levels. DATA SYNTHESIS: 17 studies in humans and 223 studies of nutrient and contaminant levels in foods met inclusion criteria. Only 3 of the human studies examined clinical outcomes, finding no significant differences between populations by food type for allergic outcomes (eczema, wheeze, atopic sensitization) or symptomatic Campylobacter infection. Two studies reported significantly lower urinary pesticide levels among children consuming organic versus conventional diets, but studies of biomarker and nutrient levels in serum, urine, breast milk, and semen in adults did not identify clinically meaningful differences. All estimates of differences in nutrient and contaminant levels in foods were highly heterogeneous except for the estimate for phosphorus; phosphorus levels were significantly higher than in conventional produce, although this difference is not clinically significant. The risk for contamination with detectable pesticide residues was lower among organic than conventional produce (risk difference, 30% [CI, -37% to -23%]), but differences in risk for exceeding maximum allowed limits were small. Escherichia coli contamination risk did not differ between organic and conventional produce. Bacterial contamination of retail chicken and pork was common but unrelated to farming method. However, the risk for isolating bacteria resistant to 3 or more antibiotics was higher in conventional than in organic chicken and pork (risk difference, 33% [CI, 21% to 45%]). LIMITATION: Studies were heterogeneous and limited in number, and publication bias may be present. CONCLUSION: The published literature lacks strong evidence that organic foods are significantly more nutritious than conventional foods. Consumption of organic foods may reduce exposure to pesticide residues and antibiotic-resistant bacteria. PRIMARY FUNDING SOURCE: None.", "Organic food consumption and the incidence of cancer in a large prospective study of women in the United Kingdom Background: Organically produced foods are less likely than conventionally produced foods to contain pesticide residues. Methods: We examined the hypothesis that eating organic food may reduce the risk of soft tissue sarcoma, breast cancer, non-Hodgkin lymphoma and other common cancers in a large prospective study of 623\u2009080 middle-aged UK women. Women reported their consumption of organic food and were followed for cancer incidence over the next 9.3 years. Cox regression models were used to estimate adjusted relative risks for cancer incidence by the reported frequency of consumption of organic foods. Results: At baseline, 30%, 63% and 7% of women reported never, sometimes, or usually/always eating organic food, respectively. Consumption of organic food was not associated with a reduction in the incidence of all cancer (n=53\u2009769 cases in total) (RR for usually/always vs never=1.03, 95% confidence interval (CI): 0.99\u20131.07), soft tissue sarcoma (RR=1.37, 95% CI: 0.82\u20132.27), or breast cancer (RR=1.09, 95% CI: 1.02\u20131.15), but was associated for non-Hodgkin lymphoma (RR=0.79, 95% CI: 0.65\u20130.96). Conclusions: In this large prospective study there was little or no decrease in the incidence of cancer associated with consumption of organic food, except possibly for non-Hodgkin lymphoma.", "Organically Grown Food Provides Health Benefits to Drosophila melanogaster The \u201corganic food\u201d market is the fastest growing food sector, yet it is unclear whether organically raised food is nutritionally superior to conventionally grown food and whether consuming organic food bestows health benefits. In order to evaluate potential health benefits of organic foods, we used the well-characterized fruit fly Drosophila melanogaster as a model system. Fruit flies were raised on a diets consisting of extracts of either conventionally or organically raised produce (bananas, potatoes, raisins, soy beans). Flies were then subjected to a variety of tests designed to assess overall fly health. Flies raised on diets made from organically grown produce had greater fertility and longevity. On certain food sources, greater activity and greater stress resistance was additionally observed, suggesting that organic food bestows positive effects on fly health. Our data show that Drosophila can be used as a convenient model system to experimentally test potential health effects of dietary components. Using this system, we provide evidence that organically raised food may provide animals with tangible benefits to overall health.", "Choice of organic foods is related to perceived consequences for human health and to environmentally friendly behaviour. We designed a questionnaire concerned with attitudes and behaviour towards organic foods, environmentally friendly behaviour (EFB), and perceived consequences of organic food choice in terms of human health, the environment and animal welfare. It was mailed in 1998 to a random nation-wide sample of 2000 Swedish citizens, ages 18-65 years, and 1154 (58%) responded. Self-reported purchase of organic foods was most strongly related to perceived benefit for human health. Performance of EFBs such as refraining from car driving was also a good predictor of purchase frequency. The results indicate that egoistic motives are better predictors of the purchase of organic foods than are altruistic motives."], ["Fatty acids and glucolipotoxicity in the pathogenesis of Type 2 diabetes. The prevalence of Type 2 diabetes is increasing dramatically as a result of the obesity epidemic, and poses a major health and socio-economic burden. Type 2 diabetes develops in individuals who fail to compensate for insulin resistance by increasing pancreatic insulin secretion. This insulin deficiency results from pancreatic beta-cell dysfunction and death. Western diets rich in saturated fats cause obesity and insulin resistance, and increase levels of circulating NEFAs [non-esterified ('free') fatty acids]. In addition, they contribute to beta-cell failure in genetically predisposed individuals. NEFAs cause beta-cell apoptosis and may thus contribute to progressive beta-cell loss in Type 2 diabetes. The molecular pathways and regulators involved in NEFA-mediated beta-cell dysfunction and apoptosis are beginning to be understood. We have identified ER (endoplasmic reticulum) stress as one of the molecular mechanisms implicated in NEFA-induced beta-cell apoptosis. ER stress was also proposed as a mechanism linking high-fat-diet-induced obesity with insulin resistance. This cellular stress response may thus be a common molecular pathway for the two main causes of Type 2 diabetes, namely insulin resistance and beta-cell loss. A better understanding of the molecular mechanisms contributing to pancreatic beta-cell loss will pave the way for the development of novel and targeted approaches to prevent Type 2 diabetes.", "Lipotoxicity: Effects of Dietary Saturated and Transfatty Acids The ingestion of excessive amounts of saturated fatty acids (SFAs) and transfatty acids (TFAs) is considered to be a risk factor for cardiovascular diseases, insulin resistance, dyslipidemia, and obesity. The focus of this paper was to elucidate the influence of dietary SFA and TFA intake on the promotion of lipotoxicity to the liver and cardiovascular, endothelial, and gut microbiota systems, as well as on insulin resistance and endoplasmic reticulum stress. The saturated and transfatty acids favor a proinflammatory state leading to insulin resistance. These fatty acids can be involved in several inflammatory pathways, contributing to disease progression in chronic inflammation, autoimmunity, allergy, cancer, atherosclerosis, hypertension, and heart hypertrophy as well as other metabolic and degenerative diseases. As a consequence, lipotoxicity may occur in several target organs by direct effects, represented by inflammation pathways, and through indirect effects, including an important alteration in the gut microbiota associated with endotoxemia. Interactions between these pathways may perpetuate a feedback process that exacerbates an inflammatory state. The importance of lifestyle modification, including an improved diet, is recommended as a strategy for treatment of these diseases.", "Role of insulin in the pathogenesis of free fatty acid-induced insulin resistance in skeletal muscle. Insulin resistance is a pathophysiological link of obesity to type 2 diabetes. The initial cause of insulin resistance is critical for prevention and treatment of type 2 diabetes. Lipotoxicity is a well-known concept in the explanation of initiation of insulin resistance. Although there are several prevailing hypotheses about the cellular/molecular mechanisms of lipotoxicity, such as inflammation, oxidative stress, hyperinsulinemia, and ER stress, the relative importance of these hypothesized events remains to be determined. The role of hyperinsulinemia is relatively under documented in the literature for the initiation of insulin resistance. In this review, an interaction of fatty acid and beta-cells, and a synergy between free fatty acids (FFAs) and insulin are emphasized for the role of hyperinsulinemia. This article presents the evidence about FFA-induced insulin secretion in vitro and in vivo, recent advances in the molecular mechanism of FFA action in beta-cells, a role of GPR40 in the development of insulin resistance, and the negative feedback loop of the insulin receptor signal pathway. The negative feedback loop is discussed in detail with a focus on IRS-1 serine kinases. This article provides a substantial support for the role of insulin in the early stages of FFA-associated insulin resistance. The hypothesis of insulin's role in lipotoxicity is referred to as the \\\"insulin hypothesis\\\" in this review. According to this hypothesis, prevention of increased beta-cell response to glucose may be a potential approach for early intervention of metabolic syndrome.", "Relationship of dietary fat to glucose metabolism. The relationship between dietary fat and glucose metabolism has been recognized for at least 60 years. In experimental animals, high fat diets result in impaired glucose tolerance. This impairment is associated with decreased basal and insulin-stimulated glucose metabolism. Impaired insulin binding and/or glucose transporters has been related to changes in the fatty acid composition of the membrane induced by dietary fat modification. In humans, high-fat diets, independent of fatty acid profile, have been reported to result in decreased insulin sensitivity. Saturated fat, relative to monounsaturated and polyunsaturated fat, appears to be more deleterious with respect to fat-induced insulin insensitivity. Some of the adverse effects induced by fat feeding can be ameliorated with omega-3 fatty acid. Epidemiological data in humans suggest that subjects with higher intakes of fat are more prone to develop disturbances in glucose metabolism, type 2 diabetes or impaired glucose tolerance, than subjects with lower intakes of fat. Inconsistencies in the data may be attributable to clustering of high intakes of dietary fat (especially animal fat) with obesity and inactivity. Metabolic studies suggest that higher-fat diets containing a higher proportion of unsaturated fat result in better measures of glucose metabolism than high-carbohydrate diet. Clearly, the area of dietary fat and glucose metabolism has yet to be fully elucidated.", "The deadly quartet. Upper-body obesity, glucose intolerance, hypertriglyceridemia, and hypertension. The contribution of obesity to cardiovascular risk has not been adequately appreciated because of a failure to recognize the involvement of upper-body predominance of body weight with hypertension, diabetes, and hypertriglyceridemia even in the absence of significant overall obesity. This article examines the evidence that upper-body obesity, as usually induced by caloric excess in the presence of androgens, mediates these problems by way of hyperinsulinemia. Because of these interrelationships, there is a need to identify and prevent upper-body obesity or, failing that, to provide therapies that will control the associated problems without aggravating hyperinsulinemia."], ["Milk intake and risk of hip fracture in men and women: a meta-analysis of prospective cohort studies. Milk contains calcium, phosphorus, and protein and is fortified with vitamin D in the United States. All these ingredients may improve bone health. However, the potential benefit of milk on hip fracture prevention is not well established. The objective of this study was to assess the association of milk intake with risk of hip fracture based on a meta-analysis of cohort studies in middle-aged or older men and women. Data sources for this study were English and non-English publications via Medline (Ovid, PubMed) and EMBASE search up to June 2010, experts in the field, and reference lists. The idea was to compare prospective cohort studies on the same scale so that we could calculate the relative risk (RR) of hip fracture per glass of milk intake daily (approximately 300\u2009mg calcium per glass of milk). Pooled analyses were based on random effects models. The data were extracted by two independent observers. The results show that in women (6 studies, 195,102 women, 3574 hip fractures), there was no overall association between total milk intake and hip fracture risk (pooled RR per glass of milk per day\u2009=\u20090.99; 95% confidence interval [CI] 0.96-1.02; Q-test p\u2009=\u2009.37). In men (3 studies, 75,149 men, 195 hip fractures), the pooled RR per daily glass of milk was 0.91 (95% CI 0.81-1.01). Our conclusion is that in our meta-analysis of cohort studies, there was no overall association between milk intake and hip fracture risk in women but that more data are needed in men. Copyright \u00a9 2011 American Society for Bone and Mineral Research.", "Milk Consumption During Teenage Years and Risk of Hip Fractures in Older Adults Importance Milk consumption during adolescence is recommended to promote peak bone mass and thereby reduce fracture risk in later life. However, its role in hip fracture prevention is not established and high consumption may adversely influence risk by increasing height. Objective To determine whether milk consumption during teenage years influences risk of hip fracture in older adults and to investigate the role of attained height in this association. Design Prospective cohort study over 22 years of follow-up Setting United States Participants Over 96,000 Caucasian postmenopausal women from the Nurses\u2019 Health Study and men age 50 and older from the Health Professionals Follow-up Study Exposures Frequency of consumption of milk and other foods during ages 13\u201318 and attained height were reported at baseline. Current diet, weight, smoking, physical activity, medication use, and other risk factors for hip fractures were reported on biennial questionnaires. Main Outcome Measures Cox proportional hazards models were used to calculate relative risks (RR) of first incident hip fracture from low-trauma events per glass (8 fl oz or 240 mL) of milk consumed per day during teenage years. Results Over follow-up, 1226 hip fractures were identified in women and 490 in men. After controlling for known risk factors and current milk consumption, each additional glass of milk per day during teenage years was associated with a significant 9% higher risk of hip fracture in men (RR=1.09, 95% CI 1.01\u20131.17). The association was attenuated when height was added to the model (RR=1.06, 95% CI 0.98\u20131.14). Teenage milk consumption was not associated with hip fractures in women (RR=1.00, 95% CI 0.95\u20131.05 per glass per day). Conclusion and Relevance Greater milk consumption during teenage years was not associated with a lower risk of hip fracture in older adults. The positive association observed in men was partially mediated through attained height.", "Cow milk consumption, insulin-like growth factor-I, and human biology: a life history approach. OBJECTIVE: To assess the life history consequences of cow milk consumption at different stages in early life (prenatal to adolescence), especially with regard to linear growth and age at menarche and the role of insulin-like growth factor I (IGF-I) in mediating a relationship among milk, growth and development, and long-term biological outcomes. METHODS: United States National Health and Nutrition Examination Survey (NHANES) data from 1999 to 2004 and review of existing literature. RESULTS: The literature tends to support milk's role in enhancing growth early in life (prior to age 5 years), but there is less support for this relationship during middle childhood. Milk has been associated with early menarche and with acceleration of linear growth in adolescence. NHANES data show a positive relationship between milk intake and linear growth in early childhood and adolescence, but not middle childhood, a period of relatively slow growth. IGF-I is a candidate bioactive molecule linking milk consumption to more rapid growth and development, although the mechanism by which it may exert such effects is unknown. CONCLUSIONS: Routine milk consumption is an evolutionarily novel dietary behavior that has the potential to alter human life history parameters, especially vis-\u00e0-vis linear growth, which in turn may have negative long-term biological consequences. Copyright \u00a9 2011 Wiley Periodicals, Inc.", "Milk is not just food but most likely a genetic transfection system activating mTORC1 signaling for postnatal growth Milk has been recognized to represent a functionally active nutrient system promoting neonatal growth of mammals. Cell growth is regulated by the nutrient-sensitive kinase mechanistic target of rapamycin complex 1 (mTORC1). There is still a lack of information on the mechanisms of mTORC1 up-regulation by milk consumption. This review presents milk as a materno-neonatal relay system functioning by transfer of preferential amino acids, which increase plasma levels of glucose-dependent insulinotropic polypeptide (GIP), glucagon-like peptide-1 (GLP-1), insulin, growth hormone (GH) and insulin-like growth factor-1 (IGF-1) for mTORC1 activation. Importantly, milk exosomes, which regularly contain microRNA-21, most likely represent a genetic transfection system enhancing mTORC1-driven metabolic processes. Whereas human breast milk is the ideal food for infants allowing appropriate postnatal growth and species-specific metabolic programming, persistent high milk signaling during adolescence and adulthood by continued cow\u00b4s milk consumption may promote mTORC1-driven diseases of civilization.", "Milk is not just food but most likely a genetic transfection system activating mTORC1 signaling for postnatal growth Milk has been recognized to represent a functionally active nutrient system promoting neonatal growth of mammals. Cell growth is regulated by the nutrient-sensitive kinase mechanistic target of rapamycin complex 1 (mTORC1). There is still a lack of information on the mechanisms of mTORC1 up-regulation by milk consumption. This review presents milk as a materno-neonatal relay system functioning by transfer of preferential amino acids, which increase plasma levels of glucose-dependent insulinotropic polypeptide (GIP), glucagon-like peptide-1 (GLP-1), insulin, growth hormone (GH) and insulin-like growth factor-1 (IGF-1) for mTORC1 activation. Importantly, milk exosomes, which regularly contain microRNA-21, most likely represent a genetic transfection system enhancing mTORC1-driven metabolic processes. Whereas human breast milk is the ideal food for infants allowing appropriate postnatal growth and species-specific metabolic programming, persistent high milk signaling during adolescence and adulthood by continued cow\u00b4s milk consumption may promote mTORC1-driven diseases of civilization.", "Does milk increase mucus production? Excessive milk consumption has a long association with increased respiratory tract mucus production and asthma. Such an association cannot be explained using a conventional allergic paradigm and there is limited medical evidence showing causality. In the human colon, beta-casomorphin-7 (beta-CM-7), an exorphin derived from the breakdown of A1 milk, stimulates mucus production from gut MUC5AC glands. In the presence of inflammation similar mucus overproduction from respiratory tract MUC5AC glands characterises many respiratory tract diseases. beta-CM-7 from the blood stream could stimulate the production and secretion of mucus production from these respiratory glands. Such a hypothesis could be tested in vitro using quantitative RT-PCR to show that the addition of beta-CM-7 into an incubation medium of respiratory goblet cells elicits an increase in MUC5AC mRNA and by identifying beta-CM-7 in the blood of asthmatic patients. This association may not necessarily be simply cause and effect as the person has to be consuming A1 milk, beta-CM-7 must pass into the systemic circulation and the tissues have to be actively inflamed. These prerequisites could explain why only a subgroup of the population, who have increased respiratory tract mucus production, find that many of their symptoms, including asthma, improve on a dairy elimination diet. (c) 2009 Elsevier Ltd. All rights reserved."], ["Diet and risk of inflammatory bowel disease. BACKGROUND: A better understanding of the environmental factors leading to inflammatory bowel disease should help to prevent occurrence of the disease and its relapses. AIM: To review current knowledge on dietary risk factors for inflammatory bowel disease. METHODS: The PubMed, Medline and Cochrane Library were searched for studies on diet and risk of inflammatory bowel disease. RESULTS: Established non-diet risk factors include family predisposition, smoking, appendectomy, and antibiotics. Retrospective case-control studies are encumbered with methodological problems. Prospective studies on European cohorts, mainly including middle-aged adults, suggest that a diet high in protein from meat and fish is associated with a higher risk of inflammatory bowel disease. Intake of the n-6 polyunsaturated fatty acid linoleic acid may confer risk of ulcerative colitis, whereas n-3 polyunsaturated fatty acids may be protective. No effect was found of intake of dietary fibres, sugar, macronutrients, total energy, vitamin C, D, E, Carotene, or Retinol (vitamin A) on risk of ulcerative colitis. No prospective data was found on risk related to intake of fruits, vegetables or food microparticles (titanium dioxide and aluminium silicate). CONCLUSIONS: A diet high in protein, particular animal protein, may be associated with increased risk of inflammatory bowel disease and relapses. N-6 polyunsaturated fatty acids may predispose to ulcerative colitis whilst n-3 polyunsaturated fatty acid may protect. These results should be confirmed in other countries and in younger subjects before dietary counselling is recommended in high risk subjects. Copyright \u00a9 2011 Editrice Gastroenterologica Italiana S.r.l. Published by Elsevier Ltd. All rights reserved.", "Influence of dietary factors on the clinical course of ulcerative colitis: a prospective cohort study Background and aims: The causes of relapses of ulcerative colitis (UC) are unknown. Dietary factors have been implicated in the pathogenesis of UC. The aim of this study was to determine which dietary factors are associated with an increased risk of relapse of UC. Methods: A prospective cohort study was performed with UC patients in remission, recruited from two district general hospitals, who were followed for one year to determine the effect of habitual diet on relapse. Relapse was defined using a validated disease activity index. Nutrient intake was assessed using a food frequency questionnaire and categorised into tertiles. Adjusted odds ratios for relapse were determined using multivariate logistic regression, controlling for non-dietary factors. Results: A total of 191 patients were recruited and 96% completed the study. Fifty two per cent of patients relapsed. Consumption of meat (odds ratio (OR) 3.2 (95% confidence intervals (CI) 1.3\u20137.8)), particularly red and processed meat (OR 5.19 (95% CI 2.1\u201312.9)), protein (OR 3.00 (95% CI 1.25\u20137.19)), and alcohol (OR 2.71 (95% CI 1.1\u20136.67)) in the top tertile of intake increased the likelihood of relapse compared with the bottom tertile of intake. High sulphur (OR 2.76 (95% CI 1.19\u20136.4)) or sulphate (OR 2.6 (95% CI 1.08\u20136.3)) intakes were also associated with relapse and may offer an explanation for the observed increased likelihood of relapse. Conclusions: Potentially modifiable dietary factors, such as a high meat or alcoholic beverage intake, have been identified that are associated with an increased likelihood of relapse for UC patients. Further studies are needed to determine if it is the sulphur compounds within these foods that mediates the likelihood of relapse and if reducing their intake would reduce relapse frequency.", "A Prospective Study of Long-term Intake of Dietary Fiber and Risk of Crohn\u2019s Disease and Ulcerative Colitis Background & Aims Increased intake of dietary fiber has been proposed to reduce risk of inflammatory bowel diseases (Crohn\u2019s disease [CD], ulcerative colitis [UC]). However, few prospective studies have examined associations between long-term intake of dietary fiber and risk of incident CD or UC. Methods We collected and analyzed data from 170,776 women, followed over 26 y, who participated in the Nurses\u2019 Health Study, followed for 3,317,425 person-y. Dietary information was prospectively ascertained via administration of a validated semi-quantitative food frequency questionnaire every 4 y. Self-reported CD and UC were confirmed through review of medical records. Cox proportional hazards models, adjusting for potential confounders, were used to calculate hazard ratios (HRs). Results We confirmed 269 incident cases of CD (incidence 8/100,000 person-y) and 338 cases of UC (incidence 10/100,000 person-y). Compared to the lowest quintile of energy-adjusted cumulative average intake of dietary fiber, intake of the highest quintile (median of 24.3 g/day) was associated with a 40% reduction in risk of CD (multivariate HR for CD, 0.59; 95% confidence interval [CI], 0.39\u20130.90). This apparent reduction appeared to be greatest for fiber derived from fruits; fiber from cereals, whole grains, or legumes did not modify risk. In contrast, neither total intake of dietary fiber (multivariate HR, 0.82; 95% CI 0.58\u20131.17) nor intake of fiber from specific sources appeared to be significantly associated with risk of UC. Conclusion Based on data from the Nurses\u2019 Health Study, long-term intake of dietary fiber, particularly from fruit, is associated with lower risk of CD but not UC. Further studies are needed to determine the mechanisms that mediate this association.", "Dietary intake and risk of developing inflammatory bowel disease: a systematic review of the literature. OBJECTIVES: The incidence of inflammatory bowel disease (IBD) is increasing. Dietary factors such as the spread of the \\\"Western\\\" diet, high in fat and protein but low in fruits and vegetables, may be associated with the increase. Although many studies have evaluated the association between diet and IBD risk, there has been no systematic review. METHODS: We performed a systematic review using guideline-recommended methodology to evaluate the association between pre-illness intake of nutrients (fats, carbohydrates, protein) and food groups (fruits, vegetables, meats) and the risk of subsequent IBD diagnosis. Eligible studies were identified via structured keyword searches in PubMed and Google Scholar and manual searches. RESULTS: Nineteen studies were included, encompassing 2,609 IBD patients (1,269 Crohn's disease (CD) and 1,340 ulcerative colitis (UC) patients) and over 4,000 controls. Studies reported a positive association between high intake of saturated fats, monounsaturated fatty acids, total polyunsaturated fatty acids (PUFAs), total omega-3 fatty acids, omega-6 fatty acids, mono- and disaccharides, and meat and increased subsequent CD risk. Studies reported a negative association between dietary fiber and fruits and subsequent CD risk. High intakes of total fats, total PUFAs, omega-6 fatty acids, and meat were associated with an increased risk of UC. High vegetable intake was associated with a decreased risk of UC. CONCLUSIONS: High dietary intakes of total fats, PUFAs, omega-6 fatty acids, and meat were associated with an increased risk of CD and UC. High fiber and fruit intakes were associated with decreased CD risk, and high vegetable intake was associated with decreased UC risk.", "An association between dietary arachidonic acid, measured in adipose tissue, and ulcerative colitis. BACKGROUND & AIMS: Dietary arachidonic acid, an n-6 polyunsaturated fatty acid (n-6 PUFA), might be involved in the etiology of ulcerative colitis (UC). We performed a prospective cohort study to determine whether high levels of arachidonic acid in adipose tissue samples (which reflects dietary intake) are associated with UC. METHODS: We analyzed data collected from 57,053 men and women in the EPIC-Denmark Prospective Cohort Study from 1993 to 1997. Adipose tissue biopsy samples were collected from gluteal regions at the beginning of the study, the cohort was monitored over subsequent years, and participants who developed UC were identified. A subcohort of 2510 randomly selected participants were used as controls. Concentrations of arachidonic acid were measured in adipose tissue samples. In the analysis, arachidonic acid levels were divided into quartiles; relative risks (RR) were calculated and adjusted for smoking, use of aspirin and nonsteroidal anti-inflammatory drugs, and levels of n-3 PUFAs. RESULTS: A total of 34 subjects (56% men) developed incident UC at a median age of 58.8 years (range, 50.0-69.0 years). Those in the highest quartile for arachidonic acid concentrations in adipose tissue had an RR for UC of 4.16 (95% confidence interval [CI]: 1.56-11.04); a trend per 0.1% increase in arachidonic acid of 1.77 in RR was observed (95% CI: 1.38-2.27). The fraction attributed the highest levels of arachidonic acid was 40.3%. CONCLUSIONS: Individuals with the highest relative concentrations of arachidonic acid in adipose tissue have a significantly greater risk of developing UC. Dietary modifications might therefore prevent UC or reduce disease symptoms. Copyright \u00a9 2010 AGA Institute. Published by Elsevier Inc. All rights reserved."], ["Longevity and diet. Myth or pragmatism? Longevity is a very complex phenomenon, because many environmental, behavioral, socio-demographic and dietary factors influence the physiological pathways of aging and life-expectancy. Nutrition has been recognized to have an important impact on overall mortality and morbidity; and its role in extending life expectancy has been the object of extensive scientific research. This paper reviews the pathophysiological mechanisms that potentially link aging with diet and the scientific evidence supporting the anti-aging effect of the traditional Mediterranean diet, as well as of some specific foods. The diet and several of its components have additionally been shown to have beneficial effects on the co-morbidities typical of elderly populations. Furthermore, the epigenetic effects of diet on the aging process - through calorie restriction and the consumption of foods like red wine, orange juice, probiotics and prebiotics - have attracted scientific interest. Some, such as dark chocolate, red wine, nuts, beans, avocados are being promoted as anti-aging foods, due to their anti-oxidative and anti-inflammatory properties. Finally, an important moderator in the relationship between diet, longevity and human health remains the socio-economic status of individual, as a healthy diet, due to its higher cost, is closely related to higher financial and educational status. Copyright \u00a9 2013 Elsevier Ireland Ltd. All rights reserved.", "By how much does dietary salt reduction lower blood pressure? III--Analysis of data from trials of salt reduction. OBJECTIVE: To determine whether the reduction in blood pressure achieved in trials of dietary salt reduction is quantitatively consistent with estimates derived from blood pressure and sodium intake in different populations, and, if so, to estimate the impact of reducing dietary salt on mortality from stroke and ischaemic heart disease. DESIGN: Analysis of the results of 68 crossover trials and 10 randomised controlled trials of dietary salt reduction. MAIN OUTCOME MEASURE: Comparison of observed reductions in systolic blood pressure for each trial with predicted values calculated from between population analysis. RESULTS: In the 45 trials in which salt reduction lasted four weeks or less the observed reductions in blood pressure were less than those predicted, with the difference between observed and predicted reductions being greatest in the trials of shortest duration. In the 33 trials lasting five weeks or longer the predicted reductions in individual trials closely matched a wide range of observed reductions. This applied for all age groups and for people with both high and normal levels of blood pressure. In people aged 50-59 years a reduction in daily sodium intake of 50 mmol (about 3 g of salt), attainable by moderate dietary salt reduction would, after a few weeks, lower systolic blood pressure by an average of 5 mm Hg, and by 7 mm Hg in those with high blood pressure (170 mm Hg); diastolic blood pressure would be lowered by about half as much. It is estimated that such a reduction in salt intake by a whole Western population would reduce the incidence of stroke by 22% and of ischaemic heart disease by 16% [corrected]. CONCLUSIONS: The results from the trials support the estimates from the observational data in the accompanying two papers. The effect of universal moderate dietary salt reduction on mortality from stroke and ischaemic heart disease would be substantial--larger, indeed, than could be achieved by fully implementing recommended policy for treating high blood pressure with drugs. However, reduction also in the amount of salt added to processed foods would lower blood pressure by at least twice as much and prevent some 75,000 [corrected] deaths a year in Britain as well as much disability.", "Comparative effectiveness of exercise and drug interventions on mortality outcomes: metaepidemiological study Objective To determine the comparative effectiveness of exercise versus drug interventions on mortality outcomes. Design Metaepidemiological study. Eligibility criteria Meta-analyses of randomised controlled trials with mortality outcomes comparing the effectiveness of exercise and drug interventions with each other or with control (placebo or usual care). Data sources Medline and Cochrane Database of Systematic Reviews, May 2013. Main outcome measure Mortality. Data synthesis We combined study level death outcomes from exercise and drug trials using random effects network meta-analysis. Results We included 16 (four exercise and 12 drug) meta-analyses. Incorporating an additional three recent exercise trials, our review collectively included 305 randomised controlled trials with 339\u2009274 participants. Across all four conditions with evidence on the effectiveness of exercise on mortality outcomes (secondary prevention of coronary heart disease, rehabilitation of stroke, treatment of heart failure, prevention of diabetes), 14\u2009716 participants were randomised to physical activity interventions in 57 trials. No statistically detectable differences were evident between exercise and drug interventions in the secondary prevention of coronary heart disease and prediabetes. Physical activity interventions were more effective than drug treatment among patients with stroke (odds ratios, exercise v anticoagulants 0.09, 95% credible intervals 0.01 to 0.70 and exercise v antiplatelets 0.10, 0.01 to 0.62). Diuretics were more effective than exercise in heart failure (exercise v diuretics 4.11, 1.17 to 24.76). Inconsistency between direct and indirect comparisons was not significant. Conclusions Although limited in quantity, existing randomised trial evidence on exercise interventions suggests that exercise and many drug interventions are often potentially similar in terms of their mortality benefits in the secondary prevention of coronary heart disease, rehabilitation after stroke, treatment of heart failure, and prevention of diabetes.", "Diet promotes sleep duration and quality. Sleep, much like eating, is an essential part of life. The mechanisms of sleep are only partially clear and are the subject of intense research. There is increasing evidence showing that sleep has an influence on dietary choices. Both cross-sectional and epidemiologic studies have demonstrated that those who sleep less are more likely to consume energy-rich foods (such as fats or refined carbohydrates), to consume fewer portions of vegetables, and to have more irregular meal patterns. In this narrative review, we pose the opposite question: can ingested food affect sleep? The purpose of this review is to discuss the evidence linking diet and sleep and to determine whether what we eat and what kind of nutrients we obtain from the food consumed before bedtime matter. In addition, scientific evidence behind traditional sleep-promoting foods such as milk and some herbal products is briefly described. These are reviewed using data from clinical trials, mostly in healthy subjects. In addition, we discuss the possible mechanisms behind these observations. Lastly, we summarize our findings that emerging evidence confirms a link between diet and sleep. Overall, foods impacting the availability of tryptophan, as well as the synthesis of serotonin and melatonin, may be the most helpful in promoting sleep. Although there are clear physiological connections behind these effects, the clinical relevance needs to be studied further. Copyright \u00a9 2012 Elsevier Inc. All rights reserved.", "Influence of a five-day vegetarian diet on urinary levels of antibiotics and phthalate metabolites: a pilot study with \\\"Temple Stay\\\" participants. Diet is purported to be means of exposure to many environmental contaminants. The purpose of this study is to understand the influence of dietary change on the levels of exposure to several environmental chemicals - in particular, antibiotics and phthalates. For this purpose, we examined the extent to which short-term changes in diet influenced the inadvertent exposure levels to these chemicals in an adult population. We recruited participants (n=25) of a five-day 'Temple Stay' program in Korea and collected urine samples before and after the program. We also conducted a questionnaire survey on participants' dietary patterns prior to their participation. During the program, participants followed the daily routines of Buddhist monks and maintained a vegetarian diet. Urinary levels of three antibiotics and their major metabolites, metabolites of four major phthalates, and malondialdehyde (MDA) as an oxidative stress biomarker were analyzed. The frequency and levels of detection for antibiotics and phthalates noticeably decreased during the program. Urinary MDA levels were significantly lower than before program participation (0.16 versus 0.27mg/g creatinine). Although the exposure to target compounds might be influenced by other behavioral patterns, these results suggest that even short-term changes in dietary behavior may significantly decrease inadvertent exposure to antibiotics and phthalates and hence may reduce oxidative stress levels. Copyright 2010 Elsevier Inc. All rights reserved."], ["Saturated fat intake and insulin resistance in men with coronary artery disease. The Stanford Coronary Risk Intervention Project Investigators and ... BACKGROUND: To determine whether there is an association between diet and plasma insulin concentration that is independent of obesity, we studied the relation of dietary composition and caloric intake to obesity and plasma insulin concentrations in 215 nondiabetic men aged 32-74 years with angiographically proven coronary artery disease. METHODS AND RESULTS: After adjusting for age, the intake of saturated fatty acids and cholesterol were positively correlated (p less than 0.05) with body mass index (r = 0.18, r = 0.16), waist-to-hip circumference ratio (r = 0.21, r = 0.22), and fasting insulin (r = 0.26, r = 0.23). Carbohydrate intake was negatively correlated with body mass index (r = -0.21), waist-to-hip ratio (r = -0.21), and fasting insulin (r = -0.16). Intake of monounsaturated fatty acids did not correlate significantly with body mass index or waist-to-hip circumference ratio but did correlate positively with fasting insulin (r = 0.24). Intake of dietary calories was negatively correlated with body mass index (r = -0.15). In multivariate analysis, intake of saturated fatty acids was significantly related to elevated fasting insulin concentration independently of body mass index. CONCLUSIONS: These cross-sectional findings in nondiabetic men with coronary artery disease suggest that increased consumption of saturated fatty acids is associated independently with higher fasting insulin concentrations.", "Substituting dietary saturated for monounsaturated fat impairs insulin sensitivity in healthy men and women: The KANWU Study. AIMS/HYPOTHESIS: The amount and quality of fat in the diet could be of importance for development of insulin resistance and related metabolic disorders. Our aim was to determine whether a change in dietary fat quality alone could alter insulin action in humans. METHODS: The KANWU study included 162 healthy subjects chosen at random to receive a controlled, isoenergetic diet for 3 months containing either a high proportion of saturated (SAFA diet) or monounsaturated (MUFA diet) fatty acids. Within each group there was a second assignment at random to supplements with fish oil (3.6 g n-3 fatty acids/d) or placebo. RESULTS: Insulin sensitivity was significantly impaired on the saturated fatty acid diet (-10%, p = 0.03) but did not change on the monounsaturated fatty acid diet (+2%, NS) (p = 0.05 for difference between diets). Insulin secretion was not affected. The addition of n-3 fatty acids influenced neither insulin sensitivity nor insulin secretion. The favourable effects of substituting a monounsaturated fatty acid diet for a saturated fatty acid diet on insulin sensitivity were only seen at a total fat intake below median (37E%). Here, insulin sensitivity was 12.5% lower and 8.8% higher on the saturated fatty acid diet and monounsaturated fatty acid diet respectively (p = 0.03). Low density lipoprotein cholesterol (LDL) increased on the saturated fatty acid diet (+4.1%, p < 0.01) but decreased on the monounsaturated fatty acid diet (MUFA) (-5.2, p < 0.001), whereas lipoprotein (a) [Lp(a)] increased on a monounsaturated fatty acid diet by 12% (p < 0.001). CONCLUSIONS/INTERPRETATION: A change of the proportions of dietary fatty acids, decreasing saturated fatty acid and increasing monounsaturated fatty acid, improves insulin sensitivity but has no effect on insulin secretion. A beneficial impact of the fat quality on insulin sensitivity is not seen in individuals with a high fat intake (> 37E%).", "Relationship of dietary saturated fatty acids and body habitus to serum insulin concentrations: the Normative Aging Study. The purpose of this study was to examine the relationship of body mass index, abdomen-hip ratio, and dietary intake to fasting and postprandial insulin concentrations among 652 men aged 43-85 y, followed in the Normative Aging Study. Log-transformed fasting insulin was significantly associated with body mass index, abdomen-hip ratio, total fat energy, and saturated fatty acid energy, with correlation coefficients ranging from 0.14 for total fat to 0.45 for body mass index. When multivariate models were used, body mass index, abdomen-hip ratio, and saturated fatty acid intake were statistically significant independent predictors of both fasting and postprandial insulin concentrations, after age, cigarette smoking, and physical activity were adjusted for. If saturated fatty acids as a percentage of total energy were to decrease from 14% to 8%, there would be an 18% decrease in fasting insulin and a 25% decrease in postprandial insulin. These data suggest that overall adiposity, abdominal obesity, and a diet high in saturated fatty acids are independent predictors for both fasting and postprandial insulin concentrations.", "Recommended dietary reference intakes, nutritional goals and dietary guidelines for fat and fatty acids: a systematic review. Dietary fat and its effects on health and disease has attracted interest for research and Public Health. Since the 1980s many bodies and organizations have published recommendations regarding fat intake. In this paper different sets of recommendations are analyzed following a systematic review process to examine dietary reference intakes, nutritional goals and dietary guidelines for fat and fatty acids. A literature search was conducted in relevant literature databases along a search for suitable grey literature reports. Documents were included if they reported information on either recommended intake levels or dietary reference values or nutritional objectives or dietary guidelines regarding fat and/or fatty acids and/or cholesterol intake or if reported background information on the process followed to produce the recommendations. There is no standard approach for deriving nutrient recommendations. Recommendations vary between countries regarding the levels of intake advised, the process followed to set the recommendations. Recommendations on fat intake share similar figures regarding total fat intake, saturated fats and trans fats. Many sets do not include a recommendation about cholesterol intake. Most recent documents provide advice regarding specific n-3 fatty acids. Despite efforts to develop evidence based nutrient recommendations and dietary guidelines that may contribute to enhance health, there are still many gaps in research. It would be desirable that all bodies concerned remain transparent about the development of dietary recommendations. In order to achieve this, the type of evidence selected to base the recommendations should be specified and ranked. Regular updates of such recommendations should be planned.", "Diet, infection and wheezy illness: lessons from adults. An increase in asthma and atopic disease has been recorded in many countries where society has become more prosperous. We have investigated two possible explanations: a reduction in childhood infections and a change in diet. In a cohort of people followed up since 1964, originally selected as a random sample of primary school children, we have investigated the relevance of family size and the common childhood infectious diseases to development of eczema, hay fever and asthma. Although membership of a large family reduced risks of hay fever and eczema (but not asthma), this was not explained by the infections the child had suffered. Indeed, the more infections the child had had, the greater the likelihood of asthma, although measles gave a modest measure of protection. We have investigated dietary factors in two separate studies. In the first, we have shown the risks of bronchial hyper-reactivity are increased seven-fold among those with the lowest intake of vitamin C, while the lowest intake of saturated fats gave a 10-fold protection. In the second, we have shown that the risk of adult-onset wheezy illness is increased five-fold by the lowest intake of vitamin E and doubled by the lowest intake of vitamin C. These results were supported by direct measurements of the vitamins and triglycerides in plasma. We have proposed that changes in the diet of pregnant women may have reflected those observed in the population as a whole and that these may have resulted in the birth of cohorts of children predisposed to atopy and asthma. The direct test of this is to study the diet and nutritional status of a large cohort of pregnant women and to follow their offspring forward. This is our current research."], ["Coffee and endothelial function: a battle between caffeine and antioxidants? Although coffee is largely consumed by adults in Western countries, controversy exists about its impact on the cardiovascular system. We recently demonstrated that caffeinated and decaffeinated espresso coffee have different acute effects on endothelial function in healthy subjects, measured using flow-mediated dilation (FMD) of the brachial artery. In this study, we measured the anti-oxidant capacity of two coffee substances in terms of free stable radical 2,2-diphenyl-1-picryl-hydrazyl 50% inhibition (I(50) DPPH). The caffeinated coffee had a slightly higher anti-oxidant capacity than decaffeinated espresso coffee (I(50) DPPH: 1.13\u00b10.02 vs 1.30\u00b10.03\u2009\u03bcl; P<0.001). We suggest that the unfavourable effects observed after caffeinated coffee ingestion are due to caffeine and that the antioxidant activity is responsible for the increased FMD observed after decaffeinated coffee ingestion. Further clinical and epidemiological studies are needed to understand the chronic effects of coffee consumption on health.", "Effect of coffee on endothelial function in healthy subjects: the role of caffeine. Coffee is one of the most widely used pharmacologically active beverages. The present study was designed to evaluate the acute effect of coffee ingestion on endothelial function in healthy individuals, and the potential role of caffeine. We studied 17 healthy young adults (28.9+/-3.0 years old; nine men), who were regular non-heavy coffee drinkers. The endothelial performance was estimated by endothelium-dependent FMD (flow-mediated dilatation) of the brachial artery before and 30, 60, 90 and 120 min after ingestion of a cup of caffeinated coffee (80 mg of caffeine) or the corresponding decaffeinated beverage (< 2 mg of caffeine) in two separate sessions, following a randomized single-blind cross-over design. There was no difference in baseline FMD values between the two sessions [7.78 compared with 7.07% after caffeinated and decaffeinated coffee respectively; P = NS (not significant)]. Caffeinated coffee led to a decline of FMD (7.78, 2.86, 2.12, 4.44 and 4.57% at baseline, 30, 60, 90 and 120 min respectively; P < 0.001). This adverse effect was focused at 30 (P = 0.004) and 60 min (P < 0.001). No significant effect on FMD was found with the decaffeinated coffee session (7.07, 6.24, 5.21, 7.41 and 5.20%; P = NS). The composite effect of the type of coffee consumed over time on FMD was significantly different (P = 0.021). In conclusion, coffee exerts an acute unfavourable effect on the endothelial function in healthy adults, lasting for at least 1 h after intake. This effect might be attributed to caffeine, given that decaffeinated coffee was not associated with any change in the endothelial performance.", "Acute effects of coffee on endothelial function in healthy subjects. BACKGROUND/OBJECTIVES: Coffee is the most widely consumed beverage in the world, but its effect on the cardiovascular system has not been fully understood. Coffee contains caffeine and antioxidants, which may influence endothelial function, both of which have not yet been investigated. The objective of this study was to investigate the acute effects of coffee on endothelial function measured by brachial artery flow-mediated dilation (FMD). SUBJECTS/METHODS: A total of 20 (10 males and 10 females) healthy non-obese subjects underwent a double-blind, crossover study. Subjects ingested one cup of caffeinated (CC) and one cup of decaffeinated (DC) Italian espresso coffee in random order at 5- to 7-day intervals. RESULTS: Following CC ingestion, FMD decreased progressively and significantly (mean+/-s.e.m.: 0 min, 7.7+/-0.6; 30 min, 6.3+/-0.7; 60 min, 6.0+/-0.8%; ANOVA (analysis of variance), P<0.05), but it did not significantly increase after DC ingestion (0 min, 6.9+/-0.6; 30 min, 8.1+/-0.9; 60 min, 8.5+/-0.9%; P=0.115). Similarly, CC significantly increased both systolic and diastolic blood pressure; this effect was not observed after DC ingestion. Blood glucose concentrations remained unchanged after ingestion of both CC and DC, but insulin (0 min, 15.8+/-0.9; 60 min, 15.0+/-0.8 muU/ml; P<0.05) and C-peptide (0 min, 1.25+/-0.09; 60 min, 1.18+/-0.09 ng/ml; P<0.01) blood concentrations decreased significantly only after CC ingestion. CONCLUSIONS: CC acutely induced unfavorable cardiovascular effects, especially on endothelial function. In the fasting state, insulin secretion is also likely reduced after CC ingestion. Future studies will determine whether CC has detrimental clinically relevant effects, especially in unhealthy subjects.", "Impact of acute caffeine ingestion on endothelial function in subjects with and without coronary artery disease. Although coffee is a widely used, pharmacologically active beverage, its impact on the cardiovascular system is controversial. To explore the effect of acute caffeine ingestion on brachial artery flow-mediated dilation (FMD) in subjects without coronary artery disease (CAD; controls) and patients with CAD, we prospectively assessed brachial artery FMD in 40 controls and 40 age- and gender-matched patients with documented stable CAD on 2 separate mornings 1 week to 2 weeks apart. After overnight fasting, discontinuation of all medications for \u226512 hours, and absence of caffeine for >48 hours, participants received capsules with caffeine 200 mg or placebo. One hour after drug ingestion, participants underwent brachial artery FMD and nitroglycerin-mediated dilation (NTG) using high-resolution ultrasound. As expected, patients with CAD were more often diabetic, hypertensive, obese, dyslipidemic, and smoked more than controls (p <0.01 for all comparisons). Aspirin, Clopidogrel, angiotensin-converting enzyme inhibitors, \u03b2 blockers, and statins were significantly more common in patients with CAD than in controls (p <0.01 for all comparisons). At baseline, FMD, but not NTG, was significantly lower in patients with CAD compared to controls. Acute caffeine ingestion significantly increased FMD (patients with CAD 5.6 \u00b1 5.0% vs 14.6 \u00b1 5.0%, controls 8.4 \u00b1 2.9% vs 18.6 \u00b1 6.8%, p <0.001 for all comparisons) but not NTG (patients with CAD 13.0 \u00b1 5.2% vs 13.8 \u00b1 6.1%, controls 12.9 \u00b1 3.9% vs 13.9 \u00b1 5.8%, p = NS for all comparisons) and significantly decreased high-sensitivity C-reactive protein (patients with CAD 2.6 \u00b1 1.4 vs 1.4 \u00b1 1.2 mg/L, controls 3.4 \u00b1 3.0 vs 1.2 \u00b1 1.0 mg/L, p <0.001 for all comparisons) in the 2 groups compared to placebo. In conclusion, acute caffeine ingestion significantly improved endothelial function assessed by brachial artery FMD in subjects with and without CAD and was associated with lower plasma markers of inflammation. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Dose-dependent effects of decaffeinated coffee on endothelial function in healthy subjects. BACKGROUND/OBJECTIVES: Coffee is known to contain antioxidant substances whose effects may be blunted because of caffeine that may unfavorably affect the cardiovascular system. This study was designed to investigate the acute dose-dependent effects of decaffeinated coffee (DC) on endothelial function measured by the brachial artery flow-mediated dilation (FMD). SUBJECTS/METHODS: A total of 15 (8 men and 7 women) healthy nonobese subjects underwent a single-blind, crossover study. Subjects ingested one and two cups of decaffeinated Italian espresso coffee in random order at 5- to 7-day intervals. RESULTS: In the hour following the ingestion of two cups of DC, FMD increased (mean+/-s.e.m.): 0 min, 7.4+/-0.7%; 30 min, 8.0+/-0.6%; 60 min, 10.8+/-0.8%; P<0.001) as compared to consumption of one cup of DC (0 min, 6.9+/-0.7%; 30 min, 8.4+/-1.2%; 60 min, 8.5+/-1.1%; 3 x 2 repeated-measures analysis of variance: P=0.037 for time x treatment effect). Blood pressure did not differ between groups, and basal heart rate was lower in the two-cup group at baseline and 60 min. CONCLUSIONS: The present study demonstrated a significant acute favorable dose-dependent effect of decaffeinated espresso coffee on endothelial function. Further studies are needed to investigate the effects of chronic use of DC especially with respect to caffeinated coffee and in subjects with cardiovascular diseases."], ["Caloric restriction, the traditional Okinawan diet, and healthy aging: the diet of the world's longest-lived people and its potential impact on mor... Long-term caloric restriction (CR) is a robust means of reducing age-related diseases and extending life span in multiple species, but the effects in humans are unknown. The low caloric intake, long life expectancy, and the high prevalence of centenarians in Okinawa have been used as an argument to support the CR hypothesis in humans. However, no long-term, epidemiologic analysis has been conducted on traditional dietary patterns, energy balance, and potential CR phenotypes for the specific cohort of Okinawans who are purported to have had a calorically restricted diet. Nor has this cohort's subsequent mortality experience been rigorously studied. Therefore, we investigated six decades of archived population data on the elderly cohort of Okinawans (aged 65-plus) for evidence of CR. Analyses included traditional diet composition, energy intake, energy expenditure, anthropometry, plasma DHEA, mortality from age-related diseases, and current survival patterns. Findings include low caloric intake and negative energy balance at younger ages, little weight gain with age, life-long low BMI, relatively high plasma DHEA levels at older ages, low risk for mortality from age-related diseases, and survival patterns consistent with extended mean and maximum life span. This study lends epidemiologic support for phenotypic benefits of CR in humans and is consistent with the well-known literature on animals with regard to CR phenotypes and healthy aging.", "Caloric restriction in humans: potential pitfalls and health concerns. To date, the only intervention that has consistently been shown to slow the rate of aging, and to increase mean and maximum lifespan in short-lived species, is life-long calorie restriction. It is yet unclear whether long-term calorie restriction in longer lived species (i.e. primates and humans) will have a similar effect. In humans, several studies investigating short-term calorie restriction or \\\"weight loss\\\" programs suggest beneficial outcomes on parameters of cardiovascular disease. Studies on long-term calorie restriction are performed on a self-selected group of human subjects and show similar effects. However, few studies are currently investigating the quality of life and potential pitfalls of long-term calorie restriction in humans. It is likely that some of the physiological and psychological effects of caloric restriction that occur in animals may impact the human life very differently. For certain, calorie restriction has a plethora of health benefits in mammals, such as a reduction in age-related diseases such as cancer. However, despite the \\\"magic\\\" of CR, this intervention in humans may present itself with a number of health concerns, which may not be applicable to or impact the life of experimental animals, but may do so in humans. These potential pitfalls and \\\"side effects\\\" are not clearly addressed in the literature and will be a focus of this review.", "Macronutrient balance and lifespan Dietary restriction (DR) without malnutrition is widely regarded to be a universal mechanism for prolonging lifespan. It is generally believed that the benefits of DR arise from eating fewer calories (termed caloric restriction, CR). Here we argue that, rather than calories, the key determinant of the relationship between diet and longevity is the balance of protein to non-protein energy ingested. This ratio affects not only lifespan, but also total energy intake, metabolism, immunity and the likelihood of developing obesity and associated metabolic disorders. Among various possible mechanisms linking macronutrient balance to lifespan, the nexus between the TOR and AMPK signaling pathways is emerging as a central coordinator.", "Insights into the beneficial effect of caloric/ dietary restriction for a healthy and prolonged life Over the last several years, new evidence has kept pouring in about the remarkable effect of caloric restriction (CR) on the conspicuous bedfellows- aging and cancer. Through the use of various animal models, it is now well established that by reducing calorie intake one can not only increase life span but, also, lower the risk of various age related diseases such as cancer. Cancer cells are believed to be more dependent on glycolysis for their energy requirements than normal cells and, therefore, can be easily targeted by alteration in the energy-metabolic pathways, a hallmark of CR. Apart from inhibiting the growth of transplantable tumors, CR has been also shown to inhibit the development of spontaneous, radiation, and chemically induced tumors. The question regarding the potentiality of the anti-tumor effect of CR in humans has been in part answered by the resistance of a cohort of women, who had suffered from anorexia in their early life, to breast cancer. However, human research on the beneficial effect of CR is still at an early stage and needs further validation. Though the complete mechanism of the anti-tumor effect of CR is far from clear, the plausible involvement of nutrient sensing pathways or IGF-1 pathways proposed for its anti-aging action cannot be overruled. In fact, cancer cell lines, mutant for proteins involved in IGF-1 pathways, failed to respond to CR. In addition, CR decreases the levels of many growth factors, anabolic hormones, inflammatory cytokines, and oxidative markers that are deregulated in several cancers. In this review, we discuss the anti-tumor effect of CR, describing experiments done in vitro in tumor models and in vivo in mouse models in which the tumor was induced by means of radiation or chemical exposure, expressing oncogenes or deleting tumor suppression genes. We also discuss the proposed mechanisms of CR anti-tumor action. Lastly, we argue the necessity of gene expression studies in cancerous versus normal cells upon CR.", "Comparison of Nutritional Quality of the Vegan, Vegetarian, Semi-Vegetarian, Pesco-Vegetarian and Omnivorous Diet The number of studies comparing nutritional quality of restrictive diets is limited. Data on vegan subjects are especially lacking. It was the aim of the present study to compare the quality and the contributing components of vegan, vegetarian, semi-vegetarian, pesco-vegetarian and omnivorous diets. Dietary intake was estimated using a cross-sectional online survey with a 52-items food frequency questionnaire (FFQ). Healthy Eating Index 2010 (HEI-2010) and the Mediterranean Diet Score (MDS) were calculated as indicators for diet quality. After analysis of the diet questionnaire and the FFQ, 1475 participants were classified as vegans (n = 104), vegetarians (n = 573), semi-vegetarians (n = 498), pesco-vegetarians (n = 145), and omnivores (n = 155). The most restricted diet, i.e., the vegan diet, had the lowest total energy intake, better fat intake profile, lowest protein and highest dietary fiber intake in contrast to the omnivorous diet. Calcium intake was lowest for the vegans and below national dietary recommendations. The vegan diet received the highest index values and the omnivorous the lowest for HEI-2010 and MDS. Typical aspects of a vegan diet (high fruit and vegetable intake, low sodium intake, and low intake of saturated fat) contributed substantially to the total score, independent of the indexing system used. The score for the more prudent diets (vegetarians, semi-vegetarians and pesco-vegetarians) differed as a function of the used indexing system but they were mostly better in terms of nutrient quality than the omnivores."], ["Human adenovirus-36 and childhood obesity. There is increasing evidence that obesity in humans is associated with infection with human adenovirus-36 (Adv36). Infection of experimental animals with Adv36 demonstrates that this virus causes obesity. Human studies have shown a prevalence of Adv36 infection of 30% or greater in obese adult humans, but a correlation with obesity has not always been demonstrated. In contrast, three published studies and one presented study with a total of 559 children all show that there is an increase in prevalence of Adv36 infection in obese children (28%) compared to non-obese children (10%). The explanation for the apparently more robust correlation of Adv36 infection with obesity in children vs. adults is not clear. The data in animals and people suggests that Adv36 has contributed to the worldwide increase in childhood obesity. More research is needed to identify prevalences and consequences of Adv36 infection in people of all age groups and geographic locations.", "Adenovirus 36 infection and obesity. The most important factors leading to fat accumulation in children are genetic inheritance, endocrine alterations, and behavioural/environmental causes. In addition, experimental animal studies have shown that infections due to various pathogens can lead to overweight and obesity conditions, and studies of humans have found that the incidence of seroconversion against some of these may be significantly more frequent in obese adults and children than in normal subjects. However, the results of these studies are not conclusive and, in some cases, have raised more questions than answers. We reviewed the literature concerning the role of adenovirus 36 (AD-36), the most widely studied infectious agent in animals and humans, because of its potential association with childhood obesity. The available evidence suggests that more studies are needed to evaluate whether or not the association between the presence of AD-36 antibodies and obesity is simply unrelated, and to verify whether there are subjects that have greater tendency to become obese because more easily susceptible to AD-36 infection or with a predisposition to suffer from persistent viral infection more easily leading to the development of obesity. If it is demonstrated that AD-36 does play a role in obesity, it will be important to investigate possible vaccines against the infection itself or antiviral drugs capable of inhibiting disease progression. Copyright \u00a9 2012 Elsevier B.V. All rights reserved.", "Adenovirus-36 Is Associated with Obesity in Children and Adults in Sweden as Determined by Rapid ELISA Background Experimental and natural human adenovirus-36 (Adv36) infection of multiple animal species results in obesity through increasing adipogenesis and lipid accumulation in adipocytes. Presence of Adv36 antibodies detected by serum neutralization assay has previously been associated with obesity in children and adults living in the USA, South Korea and Italy, whereas no association with adult obesity was detected in Belgium/the Netherlands nor among USA military personnel. Adv36 infection has also been shown to reduce blood lipid levels, increase glucose uptake by adipose tissue and skeletal muscle biopsies, and to associate with improved glycemic control in non-diabetic individuals. Principal Findings Using a novel ELISA, 1946 clinically well-characterized individuals including 424 children and 1522 non-diabetic adults, and 89 anonymous blood donors, residing in central Sweden representing the population in Stockholm area, were studied for the presence of antibodies against Adv36 in serum. The prevalence of Adv36 positivity in lean individuals increased from \u223c7% in 1992\u20131998 to 15\u201320% in 2002\u20132009, which paralleled the increase in obesity prevalence. We found that Adv36-positive serology was associated with pediatric obesity and with severe obesity in females compared to lean and overweight/mildly obese individuals, with a 1.5 to 2-fold Adv36 positivity increase in cases. Moreover, Adv36 positivity was less common among females and males on antilipid pharmacological treatment or with high blood triglyceride level. Insulin sensitivity, measured as lower HOMA-IR, showed a higher point estimate in Adv36-positive obese females and males, although it was not statistically significant (p\u200a=\u200a0.08). Conclusion Using a novel ELISA we show that Adv36 infection is associated with pediatric obesity, severe obesity in adult females and lower risk of high blood lipid levels in non-diabetic Swedish individuals.", "Human adenovirus-36 antibody status is associated with obesity in children. BACKGROUND: Human adenovirus-36 (Ad-36) is thought to induce obesity by a direct effect of the viral E4orf1 gene on lipogenic enzymes in host adipocytes. Ad-36 prevalence is 30% in obese adults, but prevalence has not been reported in childhood obesity. OBJECTIVES: To determine the prevalence of Ad-36 infection in obese Korean children (age 14.8 +/- 1.9; range 8.3-6.3 years); correlation of infection with BMI z-score and other obesity measures. METHODS: Blood was drawn at the annual school physical exam or clinic visit; Ad-36 status was determined by serum neutralization assay; and routine serum chemistry values. RESULTS: A total of 30% of subjects were positive (N = 25) for Ad-36; 70% were negative (N = 59). Significantly higher BMI z-scores (1.92 vs. 1.65, p < 0.01) and waist circumferences (96.3 vs. 90.7 cm, p = 0.05) were found in infected versus uninfected children. Cardiovascular risk factors were not significantly different. CONCLUSIONS: Ad-36 infection is common in obese Korean children and correlates highly with obesity. Ad-36 may have played a role in the obesity and Type 2 diabetes epidemic in children.", "Association of Adenovirus 36 Infection with Obesity and Metabolic Markers in Humans: A Meta-Analysis of Observational Studies Background Several studies have shown that Adenovirus 36 (Ad36) influences the risk of obesity in humans. Clarifying the relationship between Ad36 infection and obesity could lead to more effective approaches for the management of obesity. The objective of this study was to conduct a meta-analysis to confirm the influence of Ad36 infection on obesity and metabolic markers. Methodology/Principal Findings We searched MEDLINE and the Cochrane Library for pertinent articles (including their references) published between 1951 and April 22, 2012. Only English language reports of original observational studies were included in this meta-analysis. Data extraction was performed independently by two reviewers. Weighted mean differences (WMDs) and pooled odds ratios (ORs) with 95% confidence intervals (95% CIs) were calculated using the random effects model. Of 237 potentially relevant studies, 10 cross-sectional studies (n\u200a=\u200a2,870) conformed to the selection criteria. Pooled analysis showed that the WMD for BMI of Ad36 infection compared with non-infection was 3.19 (95% CI 1.44\u20134.93; P<0.001). Sensitivity analysis restricted to studies of adults yielded a similar result of 3.18 (95% CI 0.78\u20135.57; P\u200a=\u200a0.009). The increased risk of obesity associated with Ad36 infection was also significant (OR: 1.9; 95% CI: 1.01\u20133.56; P\u200a=\u200a0.047). No significant differences were found in relation to total cholesterol (P\u200a=\u200a0.83), triglycerides (P\u200a=\u200a0.64), HDL (P\u200a=\u200a0.69), blood glucose (P\u200a=\u200a0.08), waist circumstance (P\u200a=\u200a0.09), and systolic blood pressure (P\u200a=\u200a0.25). Conclusion/Significance Ad36 infection was associated with the risk of obesity and weight gain, but was not associated with abnormal metabolic markers including waist circumstance. It suggests that Ad36 infection is more associated with accumulation of subcutaneous fat than that of visceral fat. The relationship between Ad36 and obesity should be assessed by further studies, including well-designed prospective studies, to gain a better understanding of whether Ad36 plays a role in the etiology of human obesity."], ["Cholesterol crystals cause mechanical damage to biological membranes: a proposed mechanism of plaque rupture and erosion leading to arterial thromb... BACKGROUND: Plaque rupture and/or erosion is the leading cause of cardiovascular events; however, the process is not well understood. Although certain morphologic characteristics have been associated with ruptured plaques, these observations are of static histological images and not of the dynamics of plaque rupture. To elucidate the process of plaque rupture, we investigated the transformation of cholesterol from liquid to solid crystal to determine whether growing crystals are capable of injuring the plaque cap. HYPOTHESIS: We hypothesized that during cholesterol crystallization the spatial configuration rapidly changes, causing forceful expansion of sharp-edged crystals that can damage the plaque cap. METHODS: Two experiments were performed in vitro: first, cholesterol powder was melted in graduated cylinders and allowed to crystallize at room temperature. Volume changes from liquid to solid state were measured and timed. Second, thin biological membranes (20-40 microm) were put in the path of growing crystals to determine damage during crystallization. RESULTS: As cholesterol crystallized, the peak volume increased rapidly by up to 45% over 3 min and sharp-tipped crystals cut through and tore membranes. The amount of cholesterol and peak level of crystal growth correlated directly (r = 0.98; p < 0.01), as did the amount of cholesterol and rate of crystal growth (r = 0.99; p < 0.01). CONCLUSIONS: These observations suggest that crystallization of supersaturated cholesterol in atherosclerotic plaques can induce cap rupture and/or erosion. This novel insight may help in the development of therapeutic strategies that can alter cholesterol crystallization and prevent acute cardiovascular events.", "Effect of wheat bran on serum lipids: influence of particle size and wheat protein. OBJECTIVE: Wheat fiber appears to protect from cardiovascular disease despite its lack of consistent effect on serum lipids. We therefore wished to determine whether reported inconsistencies in the effect of wheat bran resulted from differences in particle size or its high gluten content. METHODS: Two studies were conducted. In one-month metabolic diets, 24 hyperlipidemic subjects consumed breads providing an additional 19 g/d dietary fiber as medium or ultra-fine wheat bran and extra protein (10% of energy as wheat gluten). In two-week ad libitum diets, 24 predominantly normolipidemic subjects consumed breakfast cereals providing an additional 19 g/d of dietary fiber as coarse or a mixture of ultra-fine and coarse wheat bran with no change in gluten intake. Both studies followed a randomized crossover design with control periods when subjects ate low-fiber breads and cereals respectively with no added gluten. Fasting blood lipids were measured on day zero and at the end of each phase. RESULTS: Wheat bran had no effect on total, LDL or HDL cholesterol irrespective of particle size or level of gluten in the diet. However, consumption of increased gluten in the metabolic study was associated with a 13+/-4% reduction in serum triglycerides (p = 0.005) which was not seen in the normal-gluten ad libitum study. CONCLUSIONS: The protective effect of wheat fiber in cardiovascular disease cannot be explained by an effect of wheat bran in reducing serum cholesterol although in hyperlipidemic subjects displacement of carbohydrate by gluten on the high-fiber phases was associated with lower serum triglycerides.", "Maintenance of the LDL cholesterol:HDL cholesterol ratio in an elderly population given a dietary cholesterol challenge. We previously evaluated the responses to dietary cholesterol in children and young adults. In this study, the effects of dietary cholesterol on plasma lipids and LDL atherogenicity were evaluated in 42 elderly subjects (29 postmenopausal women and 13 men > 60 y old). Our exclusion criteria were diabetes, heart disease, and the use of reductase inhibitors. The study followed a randomized crossover design in which subjects were assigned to consume the equivalent of 3 large eggs (EGG) daily or the same amount of a cholesterol-free, fat-free egg substitute (SUB) for a 1-mo period. After a 3-wk washout period, subjects were assigned to the alternate treatment. The concentration of plasma cholesterol after the EGG period varied among subjects. When all subjects were evaluated, there were significant increases in LDL cholesterol (LDL-C) (P < 0.05) and HDL-C (P < 0.001) for both men and women during the EGG period, resulting in no alterations in the LDL-C:HDL-C or the total cholesterol:HDL-C ratios. In addition, the LDL peak diameter was increased during the EGG period for all subjects. In contrast, the measured parameters of LDL oxidation, conjugated diene formation, and LDL lag time did not differ between the EGG and the SUB periods. We conclude from this study that dietary cholesterol provided by eggs does not increase the risk for heart disease in a healthy elderly population.", "Rethinking dietary cholesterol. PURPOSE OF REVIEW: The perceived notion that dietary cholesterol is associated with increased risk for coronary heart disease (CHD) has led to dietary recommendations of no more than 300 \u200amg/day for healthy populations in the USA. This study will review the recent evidence that challenges the current dietary restrictions regarding cholesterol while it presents some beneficial effects of eggs (an icon for dietary cholesterol) in healthy individuals. RECENT FINDINGS: The European countries, Australia, Canada, New Zealand, Korea and India among others do not have an upper limit for cholesterol intake in their dietary guidelines. Further, existing epidemiological data have clearly demonstrated that dietary cholesterol is not correlated with increased risk for CHD. Although numerous clinical studies have shown that dietary cholesterol challenges may increase plasma LDL cholesterol in certain individuals, who are more sensitive to dietary cholesterol (about one-quarter of the population), HDL cholesterol also rises resulting in the maintenance of the LDL/HDL cholesterol ratio, a key marker of CHD risk. SUMMARY: The lines of evidence coming from current epidemiological studies and from clinical interventions utilizing different types of cholesterol challenges support the notion that the recommendations limiting dietary cholesterol should be reconsidered.", "Effects of dietary cholesterol on serum cholesterol: a meta-analysis and review. Attempts to estimate the effects of dietary cholesterol on serum cholesterol by meta-analysis have not previously included baseline together with added dietary cholesterol in a mathematical model. Mean reported changes in serum cholesterol from 27 studies in which controlled diets were supplied by a metabolic kitchen provided 76 data points, each weighted by the number of subjects in nonlinear regression. A good fit to the data (P less than 0.0005, and r = 0.617 between observed and predicted points) was given by the equation y = 1.22(e-0.00384 chi 0) (1-e-0.0136 chi) where y is the change in serum cholesterol (in mmol/L), chi is added dietary cholesterol, and chi 0 is baseline dietary cholesterol (both in mg/d). Possible reasons for the hyperbolic shape of the relationship between change in serum cholesterol and added dietary cholesterol, mechanisms for individual responsiveness to dietary cholesterol, and important implications regarding interpretation of prior studies and public health issues are discussed."], ["Barriers to providing nutrition counseling cited by physicians: a survey of primary care practitioners. In a 1995 pivotal study, Kushner described the attitudes, practice behaviors, and barriers to the delivery of nutrition counseling by primary care physicians. This article recognized nutrition and dietary counseling as key components in the delivery of preventive services by primary care physicians. Kushner called for a multifaceted approach to change physicians' counseling practices. The prevailing belief today is that little has changed. Healthy People 2010 and the U.S. Preventive Task Force identify the need for physicians to address nutrition with patients. The 2010 objective was to increase to 75% the proportion of office visits that included ordering or providing diet counseling for patients with a diagnosis of cardiovascular disease, diabetes, or hypertension. At the midcourse review, the proportion actually declined from 42% to 40%. Primary care physicians continue to believe that providing nutrition counseling is within their realm of responsibility. Yet the gap remains between the proportion of patients who physicians believe would benefit from nutrition counseling and those who receive it from their primary care physician or are referred to dietitians and other healthcare professionals. The barriers cited in recent years continue to be those listed by Kushner: lack of time and compensation and, to a lesser extent, lack of knowledge and resources. The 2010 Surgeon General's Vision for a Healthy and Fit Nation and First Lady Obama's \\\"Let's Move Campaign\\\" spotlight the need for counseling adults and children on diet and physical activity.", "Resolving the Coronary Artery Disease Epidemic Through Plant-Based Nutrition. The world's advanced countries have easy access to plentiful high-fat food; ironically, it is this rich diet that produces atherosclerosis. In the world's poorer nations, many people subsist on a primarily plant-based diet, which is far healthier, especially in terms of heart disease. To treat coronary heart disease, a century of scientific investigation has produced a device-driven, risk factor-oriented strategy. Nevertheless, many patients treated with this approach experience progressive disability and death. This strategy is a rear-guard defensive one. In contrast, compelling data from nutritional studies, population surveys, and interventional studies support the effectiveness of a plant-based diet and aggressive lipid lowering to arrest, prevent, and selectively reverse heart disease. In essence, this is an offensive strategy. The single biggest step toward adopting this strategy would be to have United States dietary guidelines support a plant-based diet. An expert committee purged of industrial and political influence is required to assure that science is the basis for dietary recommendations. (c)2001 CHF, Inc.", "Resolving the Coronary Artery Disease Epidemic Through Plant-Based Nutrition. The world's advanced countries have easy access to plentiful high-fat food; ironically, it is this rich diet that produces atherosclerosis. In the world's poorer nations, many people subsist on a primarily plant-based diet, which is far healthier, especially in terms of heart disease. To treat coronary heart disease, a century of scientific investigation has produced a device-driven, risk factor-oriented strategy. Nevertheless, many patients treated with this approach experience progressive disability and death. This strategy is a rear-guard defensive one. In contrast, compelling data from nutritional studies, population surveys, and interventional studies support the effectiveness of a plant-based diet and aggressive lipid lowering to arrest, prevent, and selectively reverse heart disease. In essence, this is an offensive strategy. The single biggest step toward adopting this strategy would be to have United States dietary guidelines support a plant-based diet. An expert committee purged of industrial and political influence is required to assure that science is the basis for dietary recommendations. (c)2001 CHF, Inc.", "Cross-analysis of dietary prescriptions and adherence in 356 hypercholesterolaemic patients. BACKGROUND: One of the major issues in controlling serum cholesterol through dietetic intervention appears to be the need to improve patient adherence. AIMS: To explore the many questions regarding barriers to, and motivators for, cholesterol-lowering diet adherence. METHODS: We surveyed French general practitioners' dietetic practices for patients with hypercholesterolaemia, and looked at their patients' attitudes towards such an approach. RESULTS: We analysed 234 doctors' personal questionnaires and 356 patient self-survey questionnaires. Patients' reasons for not complying with the prescribed diet included: 'already having satisfactory food habits' (34.7%), 'unwillingness to suffer nutritional deprivation' (33.3%), 'difficulties to conciliate a diet with family life' (27.8%) and 'taking cholesterol-lowering drugs' (22.2%). Despite a generally good understanding by patients of doctors' recommendations, some discrepancies were seen between their respective declarations. While doctors largely thought that patients needed more explanation on why and how a diet can lower cholesterol (and avoid taking drugs), only 39.4% of patients declared needing this kind of information. Other discrepancies were observed concerning barriers to, and motivators for, patient adherence. Moreover, some dietetic rules appeared to be more difficult to comply with than others, e.g. 82.6% patients remembered they should 'eat more fish' but only 51.3% actually did so. Finally, physicians, as well as patients, displayed a lack of confidence in lipid-lowering diet efficiency. CONCLUSION: Improving patient education, especially concerning their perception of risk, as well as increasing the involvement of dieticians, are motivators to explore in order to improve adherence. Copyright \u00a9 2012 Elsevier Masson SAS. All rights reserved.", "Healthy lifestyle factors in the primary prevention of coronary heart disease among men: benefits among users and nonusers of lipid-lowering and an... BACKGROUND: Healthy lifestyle choices such as eating a prudent diet, exercising regularly, managing weight, and not smoking may substantially reduce coronary heart disease (CHD) risk by improving lipids, blood pressure, and other risk factors. The burden of CHD that could be avoided through adherence to these modifiable lifestyle factors has not been assessed among middle-aged and older US men, specifically men taking medications for hypertension or hypercholesterolemia. METHODS AND RESULTS: We prospectively monitored 42 847 men in the Health Professionals Follow-up Study, 40 to 75 years of age and free of disease in 1986. Lifestyle factors were updated through self-reported questionnaires. Low risk was defined as (1) absence of smoking, (2) body mass index <25 kg/m2, (3) moderate-to-vigorous activity > or = 30 min/d, (4) moderate alcohol consumption (5 to 30 g/d), and (5) the top 40% of the distribution for a healthy diet score. Over 16 years, we documented 2183 incident cases of CHD (nonfatal myocardial infarction and fatal CHD). In multivariate-adjusted Cox proportional hazards models, men who were at low risk for 5 lifestyle factors had a lower risk of CHD (relative risk: 0.13; 95% confidence interval [CI]: 0.09, 0.19) compared with men who were at low risk for no lifestyle factors. Sixty-two percent (95% CI: 49%, 74%) of coronary events in this cohort may have been prevented with better adherence to these 5 healthy lifestyle practices. Among men taking medication for hypertension or hypercholesterolemia, 57% (95% CI: 32%, 79%) of all coronary events may have been prevented with a low-risk lifestyle. Compared with men who did not make lifestyle changes during follow-up, those who adopted > or = 2 additional low-risk lifestyle factors had a 27% (95% CI: 7%, 43%) lower risk of CHD. CONCLUSIONS: A majority of CHD events among US men may be preventable through adherence to healthy lifestyle practices, even among those taking medications for hypertension or hypercholesterolemia.", "Can noncommunicable diseases be prevented? Lessons from studies of populations and individuals. Noncommunicable diseases (NCDs)--mainly cancers, cardiovascular diseases, diabetes, and chronic respiratory diseases--are responsible for about two-thirds of deaths worldwide, mostly in low- and middle-income countries. There is an urgent need for policies and strategies that prevent NCDs by reducing their major risk factors. Effective approaches for large-scale NCD prevention include comprehensive tobacco and alcohol control through taxes and regulation of sales and advertising; reducing dietary salt, unhealthy fats, and sugars through regulation and well-designed public education; increasing the consumption of fresh fruits and vegetables, healthy fats, and whole grains by lowering prices and improving availability; and implementing a universal, effective, and equitable primary-care system that reduces NCD risk factors, including cardiometabolic risk factors and infections that are precursors to NCDs, through clinical interventions."], ["The Role of Cow's Milk Allergy in Pediatric Chronic Constipation: A Randomized Clinical Trial Objective Cow's milk allergy has different presentations in children and can cause functional bowel symptoms such as chronic constipation. The aims of this study were to investigate the role of cow's milk allergy as a cause of chronic constipation and effect of cow's milk free diet (CMFD) on its treatment in children. Methods We performed a randomized clinical study comparing CMFD with cow's milk diet (CMD) in two groups each consisting of 70 patients (age range, 1-13 years) with chronic functional constipation (defined as Rome III criteria). All subjects had been referred to a pediatric gastroenterology clinic and had previously been treated with laxatives for at least 3 months without success; also all 140 patients performed skin prick test. The case group received CMFD for 4 weeks. After that they received CMD for 2 extra weeks. The control group received CMD for whole 6 weeks. A response was defined as decreased in signs and symptoms that not fulfilled Rome III criteria after 4 weeks of CMFD and came back to Rome III criteria after 2 weeks of CMD challenge. Findings After 4 weeks 56 (80%) patients of the case group responded in comparison to 33 (47.1%) patients in the control group (P=0.0001). In the case group after 2 weeks challenge 24 out of 56 (42.8%) responders developed constipation according to Rome III criteria. With other words, the frequency of cow's milk allergy among constipated patients was 80%. Only one patient had positive skin prick test. Conclusion In children, chronic constipation can be a manifestation of cow's milk allergy. At present, although several aspects must be further investigated, a therapeutic attempt with elimination diet is advisable in all children with constipation unresponsive to correct laxative treatment.", "Cows milk consumption in constipation and anal fissure in infants and young children. OBJECTIVE: To examine daily cows milk consumption and duration of breastfeeding in infants and young children with anal fissure and constipation. METHODS: Two groups of 30 consecutive children aged between 4 months and 3 years were evaluated retrospectively. Group I comprised children with chronic constipation and anal fissure in whom surgical causes were excluded, and group II comprised normal children. The daily consumption of cows milk, duration of breastfeeding and other clinical features of the children were investigated RESULTS: The mean daily consumption of cows milk was significantly higher in group I (756 mL, range 200-1500 mL) than group II (253 mL, range 0-1000 mL) (P < 0.001). Group I children were breastfed for a significantly shorter period (5.8 months, range 0-18 months) than group II (10.1 months, range 2-24 months) (P < 0.006). The odds ratios for the two factors - children consuming more than 200 mL of cows milk per day (25 children in group I, 11 children in group II) and breastfeeding for less than 4 months (16 children in group I, 5 children in group II) - were calculated to be 8.6 (95% confidence interval [CI]: 0.23-0.74, P = 0.0005) and 5.7 (95% CI: 0.37-0.66, P = 0.007), respectively. CONCLUSIONS: Infants and young children with chronic constipation and anal fissure may consume larger amounts of cows milk than children with a normal bowel habit. Additionally, shorter duration of breastfeeding and early bottle feeding with cows milk may play a role in the development of constipation and anal fissure in infants and young children.", "Cow's milk protein intolerance and chronic constipation in children. Cow's milk protein (CMP) allergy was investigated in 25 children (age-range 3 months to 11 years) with chronic constipation. A diagnosis of constipation was made on the basis of a history of painful elimination of hard stools for at least 1 month, whether or not associated with a reduced frequency of stools or soiling. The children were evaluated using clinical parameters and the following laboratory tests: total serum immunoglobulin E (IgE); specific IgE (radioallergosorbent test [RAST]) for whole cow's milk, alpha-lactoalbumin, beta-lactoglobulin, and a food group; and skin-prick tests with whole milk, alpha-lactoalbumin, beta-lactoglobulin, and casein. Following the evaluation, the children were submitted to a CMP-free diet for a period of 4 weeks. In seven patients (28%), constipation disappeared during the CMP-free diet and reappeared within 48-72 h following challenge with cow's milk. In two infants a rectal biopsy revealed allergic colitis and they therefore did not undergo the challenge. High serum levels of total IgE were observed in five of the children who showed a clinical improvement (71%), a positive skin-test in two (29%), and detectable specific IgE in two (29%). These results suggest that CMP allergy or intolerance should be considered as a cause of chronic refractory constipation in children, although the underlying mechanism still require further investigation.", "Intolerance of cow's milk and chronic constipation in children. BACKGROUND: Chronic diarrhea is the most common gastrointestinal symptom of intolerance of cow's milk among children. On the basis of a prior open study, we hypothesized that intolerance of cow's milk can also cause severe perianal lesions with pain on defecation and consequent constipation in young children. METHODS: We performed a double-blind, crossover study comparing cow's milk with soy milk in 65 children (age range, 11 to 72 months) with chronic constipation (defined as having one bowel movement every 3 to 15 days). All had been referred to a pediatric gastroenterology clinic and had previously been treated with laxatives without success; 49 had anal fissures and perianal erythema or edema. After 15 days of observation, the patients received cow's milk or soy milk for two weeks. After a one-week washout period, the feedings were reversed. A response was defined as eight or more bowel movements during a treatment period. RESULTS: Forty-four of the 65 children (68 percent) had a response while receiving soy milk. Anal fissures and pain with defecation resolved. None of the children who received cow's milk had a response. In all 44 children with a response, the response was confirmed with a double-blind challenge with cow's milk. Children with a response had a higher frequency of coexistent rhinitis, dermatitis, or bronchospasm than those with no response (11 of 44 children vs. 1 of 21, P=0.05); they were also more likely to have anal fissures and erythema or edema at base line (40 of 44 vs. 9 of 21, P<0.001), evidence of inflammation of the rectal mucosa on biopsy (26 of 44 vs. 5 of 21, P=0.008), and signs of hypersensitivity, such as specific IgE antibodies to cow's-milk antigens (31 of 44 vs. 4 of 21, P<0.001). CONCLUSIONS: In young children, chronic constipation can be a manifestation of intolerance of cow's milk.", "Review article: Chronic constipation and food hypersensitivity--an intriguing relationship. BACKGROUND: Chronic constipation is common in the general population. Some studies have shown that in children cow's milk protein hypersensitivity can cause chronic constipation unresponsive to laxative treatment. AIMS: To review the literature and summarize the data that point to a relationship between refractory chronic constipation and food hypersensitivity, and to discuss the hypothesis that the pathogenesis of constipation due to food hypersensitivity. METHODS: A search in the U.S. National Library of Medicine was performed, matching the key words 'chronic constipation, food intolerance and allergy'. RESULTS: Thirty-three papers were found but only 19 of them were related to the topic of this review. Most of the data indicated a relationship between constipation and food allergy in a subgroup of paediatric patients with 'idiopathic' constipation unresponsive to laxative treatment. There was only one study in adults that demonstrated the resolution of chronic constipation on hypoallergenic diet in four patients. CONCLUSIONS: An increasing number of reports suggest a relationship between refractory chronic constipation and food allergy in children. Similar data in adults are scarce and need to be confirmed. Further studies should be performed to obtain firmer evidence for the role of allergy in constipation and clarify the pathogenetic mechanisms involved."], ["Effect of non-oil-seed pulses on glycaemic control: a systematic review and meta-analysis of randomised controlled experimental trials in people wi... AIMS/HYPOTHESIS: Dietary non-oil-seed pulses (chickpeas, beans, peas, lentils, etc.) are a good source of slowly digestible carbohydrate, fibre and vegetable protein and a valuable means of lowering the glycaemic-index (GI) of the diet. To assess the evidence that dietary pulses may benefit glycaemic control, we conducted a systematic review and meta-analysis of randomised controlled experimental trials investigating the effect of pulses, alone or as part of low-GI or high-fibre diets, on markers of glycaemic control in people with and without diabetes. METHODS: We searched MEDLINE, EMBASE, CINAHL, and the Cochrane Library for relevant controlled trials of >or=7 days. Two independent reviewers (A. Esfahani and J. M. W. Wong) extracted information on study design, participants, treatments and outcomes. Data were pooled using the generic inverse variance method and expressed as standardised mean differences (SMD) with 95% CIs. Heterogeneity was assessed by chi (2) and quantified by I (2). Meta-regression models identified independent predictors of effects. RESULTS: A total of 41 trials (39 reports) were included. Pulses alone (11 trials) lowered fasting blood glucose (FBG) (-0.82, 95% CI -1.36 to -0.27) and insulin (-0.49, 95% CI -0.93 to -0.04). Pulses in low-GI diets (19 trials) lowered glycosylated blood proteins (GP), measured as HbA(1c) or fructosamine (-0.28, 95% CI -0.42 to -0.14). Finally, pulses in high-fibre diets (11 trials) lowered FBG (-0.32, 95% CI -0.49 to -0.15) and GP (-0.27, 95% CI -0.45 to -0.09). Inter-study heterogeneity was high and unexplained for most outcomes, with benefits modified or predicted by diabetes status, pulse type, dose, physical form, duration of follow-up, study quality, macronutrient profile of background diets, feeding control and design. CONCLUSIONS/INTERPRETATION: Pooled analyses demonstrated that pulses, alone or in low-GI or high-fibre diets, improve markers of longer term glycaemic control in humans, with the extent of the improvements subject to significant inter-study heterogeneity. There is a need for further large, well-designed trials.", "Regular consumption of pulses for 8 weeks reduces metabolic syndrome risk factors in overweight and obese adults. Pulses are low in energy density, supporting their inclusion in the diet for the management of risk factors of the metabolic syndrome (MetSyn). The aim of the present study was to describe the effects of frequent consumption (five cups/week over 8 weeks) of pulses (yellow peas, chickpeas, navy beans and lentils), compared with counselling to reduce energy intake by 2093 kJ/d (500 kcal/d), on risk factors of the MetSyn in two groups (nineteen and twenty-one subjects, respectively) of overweight or obese (mean BMI 32\u00b78 kg/m2) adults. Body weight, waist circumference, blood pressure, fasting blood parameters and 24 h food intakes were measured at weeks 1, 4 and 8. Blood glucose, insulin, C-peptide, glucagon-like peptide-1 (GLP-1) and ghrelin were measured after a 75 g oral glucose load at weeks 1 and 8. At week 8, both groups reported reductions in energy intake, waist circumference, systolic blood pressure, glycosylated Hb (HbA1c) and glucose AUC and homeostasis model of insulin resistance (HOMA-IR) following the glucose load (P < 0\u00b705). However, HDL, fasting C-peptide and insulin AUC responses were dependent on diet (P < 0\u00b705). HDL and C-peptide increased by 4\u00b75 and 12\u00b73 %, respectively, in the pulse group, but decreased by 0\u00b78 and 7\u00b76 %, respectively, in the energy-restricted group. Insulin AUC decreased in both females and males on the energy-restricted diet by 24\u00b72 and 4\u00b78 %, respectively, but on the pulse diet it decreased by 13\u00b79 % in females and increased by 27\u00b73 % in males (P < 0\u00b705). In conclusion, frequent consumption of pulses in an ad libitum diet reduced risk factors of the MetSyn and these effects were equivalent, and in some instances stronger, than counselling for dietary energy reduction.", "First and second meal effects of pulses on blood glucose, appetite, and food intake at a later meal. Pulses are low-glycemic appetite-suppressing foods, but it is not known whether these properties persist after being consumed as part of a meal and after a second meal. The objective of this study was to determine the effects of a fixed-size pulse meal on appetite and blood glucose (BG) before and after an ad libitum test meal (pizza) and on food intake (FI) at the test meal. Males (n = 25; 21.3 \u00b1 0.5 years; 21.6 \u00b1 0.3 kg\u00b7m(-2)) randomly consumed 4 isocaloric meals: chickpea; lentil; yellow split pea; and macaroni and cheese (control). Commercially available canned pulses provided 250 kcal, and were consumed with macaroni and tomato sauce. FI was measured at a pizza meal 260 min after consumption of the isocaloric meal. BG and appetite were measured from 0 to 340 min. The lentil and yellow pea, but not chickpea, treatments led to lower appetite ratings during the 260 min prepizza meal period, and less FI at the pizza meal, compared with macaroni and cheese (p < 0.05). All pulse treatments lowered BG immediately following consumption (at 20 min) (p < 0.05), but there was no effect of treatment on prepizza meal BG AUC (p = 0.07). Immediately after the pizza meal, BG was lower following the chickpea and lentil treatments, but not the yellow pea treatment (p < 0.05). Postpizza meal BG AUC was lower following the chickpea and lentil treatments than in the yellow pea treatment (p < 0.05). The beneficial effects of consuming a pulse meal on appetite, FI at a later meal, and the BG response to a later meal are dependent on pulse type.", "Beans and diabetes: Phaseolus vulgaris preparations as antihyperglycemic agents. Bean pods (Phaseolus vulgaris) are among the most widely used traditional remedies against diabetes mellitus. Historical knowledge is summarized and compared to recent study results. Reports dating from the first half of the 20(th) century as well as recent publications show contradictory results. It seems that Phaseolus preparations should not be considered the first choice in phytopharmaceutical treatment of diabetes or lead structure research. To be effective, fairly high doses of aqueous extracts need to be given. Because of their fiber content and an alpha-amylase inhibitory effect, beans might be more useful as food components in preventing or ameliorating type 2 diabetes.", "Phaseolus beans: impact on glycaemic response and chronic disease risk in human subjects. Consumption of Phaseolus vulgaris bean species such as pinto, black, navy or kidney may be beneficial in the prevention and treatment of chronic diseases. In particular, conditions that are promoted by increased glycaemic stress (hyperglycaemia and hyperinsulinaemia) including diabetes, CVD and cancer seem to be reduced in individuals who eat more of these beans. The present paper discusses the influence of P. vulgaris species on glycaemic response and the impact that relationship may have on the risk of developing diabetes, CVD and cancer."], ["Conflicts of interest in approvals of additives to food determined to be generally recognized as safe: out of balance. IMPORTANCE: Food and Drug Administration (FDA) guidance allows food manufacturers to determine whether additives to food are \\\"generally recognized as safe\\\" (GRAS). Manufacturers are not required to notify the FDA of a GRAS determination, although in some instances they notify the agency. The individuals that companies select to make these determinations may have financial conflicts of interest. OBJECTIVE: To determine the extent to which individuals selected by manufacturers to make GRAS determinations have conflicts of interest between their obligations to ensure that the use of the additive is safe and their financial relationships to the company. DESIGN Using conflict of interest criteria developed by a committee of the Institute of Medicine, we analyzed 451 GRAS notifications that were voluntarily submitted to the FDA between 1997 and 2012. MAIN OUTCOMES AND MEASURES: Number of GRAS notices submitted to the FDA; frequency of various types of relationships between decision maker and additive manufacturer; frequency of participation on GRAS panels by individuals; and number of GRAS safety determinations identified by the FDA that were not submitted to the agency. RESULTS: For the 451 GRAS notifications, 22.4% of the safety assessments were made by an employee of an additive manufacturer, 13.3% by an employee of a consulting firm selected by the manufacturer, and 64.3% by an expert panel selected by either a consulting firm or the manufacturer. A standing expert panel selected by a third party made none of these safety assessments. The 290 panels that made GRAS determinations had an average of 3.5 members, with a maximum of 7. Ten individuals served on 27 or more panels; 1 individual served on 128 panels (44.1%). At least 1 of the 10 individuals with the most frequent service was a member of 225 panels (77.6%). CONCLUSIONS AND RELEVANCE: Between 1997 and 2012, financial conflicts of interest were ubiquitous in determinations that an additive to food was GRAS. The lack of independent review in GRAS determinations raises concerns about the integrity of the process and whether it ensures the safety of the food supply, particularly in instances where the manufacturer does not notify the FDA of the determination. The FDA should address these concerns.", "Science of weight loss supplements: Compromised by conflicts of interest? Weight loss supplements often contain powerful pharmacoactive ingredients with the potential to cause harm. Trials used to determine product safety and effectiveness, meanwhile, tend to be small, of short duration, and frequently lack financial conflict of interest disclosures. These factors could conspire to place consumers at risk, especially when published research cited in advertising cloaks products with the suggestion that their safety and effectiveness have been proven by science. Examples of current and former weight loss products backed by potentially conflicted or low quality research include Metabolife-356, Hydroxycut, Xenadrine and LeptiCore. Published research, especially in the field of weight loss supplements, needs better conflict of interest disclosure, and regulators should consider how research findings are used in marketing claims.", "The value of current nutrition information. To prevent or delay the occurrence of chronic diseases, scientific bodies from the cardiologic and oncologic disciplines have made recommendations regarding the daily dietary intake of certain macro- and micronutrients. This study assessed the knowledge of a random population of 2,305 individuals comprising members of the public, health care workers, university graduate students, and health club attendees. Segments of this population might be expected to have a greater understanding and ability to implement these dietary recommendations. We found that over 90% of the participants were unaware of the recommendations for calcium, salt, vitamin A, and fiber, and the fiber content in a high fiber cereal. Approximately 80% of the participants were unaware of the recommendations regarding fat intake and could not calculate the fat content of a food product. Almost half of the study population took a vitamin pill daily. Of the subjects who were aware of the correct unit measurement for vitamin A (IU), almost 25% of gave a response that exceeded the recommended daily intake. A majority of this study population were unaware of the dietary recommendations regarding the prevention of cardiovascular events and cancer. Subgroups of this study population that might be expected to have more information regarding these recommendations (i.e., having higher education or being a health care professional) did not display a satisfactory level of knowledge. To further compound the problems of adhering to the recommended guidelines, the labeling of many food products is misleading. The recommendations on dietary intake and the information on food product content must be transmitted to the public in a form that allows for ready application when purchasing and consuming food.", "Current perception of nutrition education in U.S. medical schools. Historically, physicians have perceived the quality of nutrition training during medical school as inadequate. A literature review suggests that this perception has not significantly changed since the 1950s. Many schools have worked to create clinical nutrition curricula for use during medical school. Interestingly, data suggest that medical students' perception of the importance of clinical nutrition can decrease during medical school. Recent data support the importance of targeted nutritional therapy to reduce morbidity and mortality, yet the number of physicians interested in nutrition appears to be declining, and fewer hours of nutrition training are occurring in medical school. One possible solution to improve both training and awareness of the problem is to implement a certification program for both students and preceptors modeled after the Cardiac Life Support training offered by the American Heart Association.", "The potential toxicity of artificial sweeteners. Since their discovery, the safety of artificial sweeteners has been controversial. Artificial sweeteners provide the sweetness of sugar without the calories. As public health attention has turned to reversing the obesity epidemic in the United States, more individuals of all ages are choosing to use these products. These choices may be beneficial for those who cannot tolerate sugar in their diets (e.g., diabetics). However, scientists disagree about the relationships between sweeteners and lymphomas, leukemias, cancers of the bladder and brain, chronic fatigue syndrome, Parkinson's disease, Alzheimer's disease, multiple sclerosis, autism, and systemic lupus. Recently these substances have received increased attention due to their effects on glucose regulation. Occupational health nurses need accurate and timely information to counsel individuals regarding the use of these substances. This article provides an overview of types of artificial sweeteners, sweetener history, chemical structure, biological fate, physiological effects, published animal and human studies, and current standards and regulations."], ["Protein dietary reference intakes may be inadequate for vegetarians if low amounts of animal protein are consumed. OBJECTIVE: The health benefits of vegetarian diets are well-recognized; however, long-term adherence to these diets may be associated with nutrient inadequacies, particularly vitamins B12 and D, calcium, iron, zinc, and protein. The dietary reference intakes (DRIs) expert panels recommended adjustments to the iron, zinc, and calcium DRIs for vegetarians to account for decreased bioavailability, but no adjustments were considered necessary for the protein DRI under the assumption that vegetarians consume about 50% of protein from animal (dairy/egg) sources. This study examined dietary protein sources in a convenience sample of 21 young adult vegetarian women who completed food logs on 4 consecutive days (3 weekdays and 1 weekend day). METHODS: The daily contribution percentages of protein consumed from cereals, legumes, nuts/seeds, fruits/vegetables, and dairy/egg were computed, and the protein digestibility corrected amino acid score of the daily diets was calculated. RESULTS: The calculated total dietary protein digestibility score for participants was 82 \u00b1 1%, which differed significantly (P < 0.001) from the DRI reference score, 88%, and the 4-d average protein digestibility corrected amino acid score for the sample was 80 \u00b1 2%, which also differed significantly (P < 0.001) from the DRI reference value, 100%. The analyses indicated that animal protein accounted for only 21% of dietary protein. CONCLUSION: This research suggests that the protein DRI for vegetarians consuming less than the expected amounts of animal protein (45% to 50% of total protein) may need to be adjusted from 0.8 to about 1.0 g/kg to account for decreased protein bioavailability. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Original Articles: Vegetarian Compared with Meat Dietary Protein Source and Phosphorus Homeostasis in Chronic Kidney Disease Summary Background and objectives Patients with advanced chronic kidney disease (CKD) are in positive phosphorus balance, but phosphorus levels are maintained in the normal range through phosphaturia induced by increases in fibroblast growth factor-23 (FGF23) and parathyroid hormone (PTH). This provides the rationale for recommendations to restrict dietary phosphate intake to 800 mg/d. However, the protein source of the phosphate may also be important. Design, setting, participants, & measurements We conducted a crossover trial in nine patients with a mean estimated GFR of 32 ml/min to directly compare vegetarian and meat diets with equivalent nutrients prepared by clinical research staff. During the last 24 hours of each 7-day diet period, subjects were hospitalized in a research center and urine and blood were frequently monitored. Results The results indicated that 1 week of a vegetarian diet led to lower serum phosphorus levels and decreased FGF23 levels. The inpatient stay demonstrated similar diurnal variation for blood phosphorus, calcium, PTH, and urine fractional excretion of phosphorus but significant differences between the vegetarian and meat diets. Finally, the 24-hour fractional excretion of phosphorus was highly correlated to a 2-hour fasting urine collection for the vegetarian diet but not the meat diet. Conclusions In summary, this study demonstrates that the source of protein has a significant effect on phosphorus homeostasis in patients with CKD. Therefore, dietary counseling of patients with CKD must include information on not only the amount of phosphate but also the source of protein from which the phosphate derives.", "Effect of the vegetarian diet on non-communicable diseases. A vegetarian diet generally includes plenty of vegetables and fruits, which are rich in phytochemicals, antioxidants, fiber, magnesium, vitamins C and E, Fe\u00b3\u207a, folic acid and n-6 polyunsaturated fatty acid (PUFA), and is low in cholesterol, total fat and saturated fatty acid, sodium, Fe\u00b2\u207a, zinc, vitamin A, B\u2081\u2082 and D, and especially n-3 PUFA. Mortality from all-cause, ischemic heart disease, and circulatory and cerebrovascular diseases was significantly lower in vegetarians than in omnivorous populations. Compared with omnivores, the incidence of cancer and type 2 diabetes was also significantly lower in vegetarians. However, vegetarians have a number of increased risk factors for non-communicable diseases such as increased plasma homocysteine, mean platelet volume and platelet aggregability compared with omnivores, which are associated with low intake of vitamin B\u2081\u2082 and n-3 PUFA. Based on the present data, it would seem appropriate for vegetarians to carefully design their diet, specifically focusing on increasing their intake of vitamin B\u2081\u2082 and n-3 PUFA to further reduce already low mortality and morbidity from non-communicable diseases. \u00a9 2013 Society of Chemical Industry.", "Should recurrent calcium oxalate stone formers become vegetarians? The hypothesis that the incidence of calcium stone disease is related to the consumption of animal protein has been examined. Within the male population, recurrent idiopathic stone formers consumed more animal protein than did normal subjects. Single stone formers had animal protein intakes intermediate between those of normal men and those of recurrent stone formers. A high animal protein intake caused a significant increase in the urinary excretion of calcium, oxalate and uric acid, 3 of the 6 main urinary risk factors for calcium stone formation. The overall relative probability of forming stones, calculated from the combination of the 6 main urinary risk factors, was markedly increased by a high animal protein diet. Conversely, a low animal protein intake, such as taken by vegetarians, was associated with a low excretion of calcium, oxalate and uric acid and a low relative probability of forming stones.", "Zinc and selenium nutritional status in vegetarians. A vegetarian diet may have beneficial effects on human health, however when it is not well-balanced may be deficient in some nutrients, as minerals for example. The aim of the present study was to assess the nutritional status of zinc and selenium in vegetarians in the city of S\u00e3o Paulo. A cross-sectional study was performed, and the inclusion criteria were age > or = 18 years, both gender, no use of food or pharmaceutical supplements. Thirty vegetarian, of both genders, mean age of 27 years and 4.5 years of vegetarianism had performed the study, and their mean BMI was 21.5. Zinc plasma concentration was 71 and 62.5 microg/dL for men and women and erythrocyte concentration was 37 microg/gHb for both genders. Selenium concentration was 73.5 and 77.3 microg/L in plasma and 51.4 and 66.9 microg/L in erythrocytes for men and women, respectively. These biochemical values show that, according to the references, selenium blood levels are adequate and zinc concentration in erythrocytes is deficient in the studied population. For this reason, vegetarians should be constantly assessed and receive nutritional support to reduce the effects of inadequate zinc status."], ["Egg consumption and endothelial function: a randomized controlled crossover trial. BACKGROUND: Because of egg cholesterol content, reduction in egg consumption is generally recommended to reduce risk of cardiovascular disease. Recently, however, evidence has been accumulating to suggest that dietary cholesterol is less relevant to cardiovascular risk than dietary saturated fat. This randomized controlled crossover trial was conducted to determine the effects of egg ingestion on endothelial function, a reliable index of cardiovascular risk. METHODS: Forty-nine healthy adults (mean age 56 years, 40% females) underwent a baseline brachial artery reactivity study (BARS), and were assigned to two eggs or oats daily for 6 weeks in random sequence with a 4-week washout. A BARS was done at the end of each treatment phase, measuring flow-mediated vasodilation (FMD) in the brachial artery using a high-frequency ultrasound. RESULTS: FMD was stable in both egg and oat groups, and between-treatment differences were not significant (egg -0.96%, oatmeal -0.79%; p value >0.05). Six weeks of egg ingestion had no effect on total cholesterol (baseline: 203.8 mg/dl; post-treatment: 205.3) or LDL (baseline: 124.8 mg/dl; post-treatment: 129.1). In contrast, 6 weeks of oats lowered total cholesterol (to 194 mg/dl; p = 0.0017) and LDL (to 116.6 mg/dl; p = 0.012). There were no differences in body mass index (BMI), triglyceride, HDL or SBP levels between egg and oat treatment assignments. CONCLUSION: Short-term egg consumption does not adversely affect endothelial function in healthy adults, supporting the view that dietary cholesterol may be less detrimental to cardiovascular health than previously thought.", "Daily egg consumption in hyperlipidemic adults - Effects on endothelial function and cardiovascular risk Background Limiting consumption of eggs, which are high in cholesterol, is generally recommended to reduce risk of cardiovascular disease. However, recent evidence suggests that dietary cholesterol has limited influence on serum cholesterol or cardiac risk. Objective To assess the effects of egg consumption on endothelial function and serum lipids in hyperlipidemic adults. Methods Randomized, placebo-controlled crossover trial of 40 hyperlipidemic adults (24 women, 16 men; average age = 59.9 \u00b1 9.6 years; weight = 76.3 \u00b1 21.8 kilograms; total cholesterol = 244 \u00b1 24 mg/dL). In the acute phase, participants were randomly assigned to one of the two sequences of a single dose of three medium hardboiled eggs and a sausage/cheese breakfast sandwich. In the sustained phase, participants were then randomly assigned to one of the two sequences of two medium hardboiled eggs and 1/2 cup of egg substitute daily for six weeks. Each treatment assignment was separated by a four-week washout period. Outcome measures of interest were endothelial function measured as flow mediated dilatation (FMD) and lipid panel. Results Single dose egg consumption had no effects on endothelial function as compared to sausage/cheese (0.4 \u00b1 1.9 vs. 0.4 \u00b1 2.4%; p = 0.99). Daily consumption of egg substitute for 6 weeks significantly improved endothelial function as compared to egg (1.0 \u00b1 1.2% vs. -0.1 \u00b1 1.5%; p < 0.01) and lowered serum total cholesterol (-18 \u00b1 18 vs. -5 \u00b1 21 mg/dL; p < 0.01) and LDL (-14 \u00b1 20 vs. -2 \u00b1 19 mg/dL; p = 0.01). Study results (positive or negative) are expressed in terms of change relative to baseline. Conclusions Egg consumption was found to be non-detrimental to endothelial function and serum lipids in hyperlipidemic adults, while egg substitute consumption was beneficial.", "Dietary cholesterol and egg yolks: Not for patients at risk of vascular disease A widespread misconception has been developing among the Canadian public and among physicians. It is increasingly believed that consumption of dietary cholesterol and egg yolks is harmless. There are good reasons for long-standing recommendations that dietary cholesterol should be limited to less than 200 mg/day; a single large egg yolk contains approximately 275 mg of cholesterol (more than a day\u2019s worth of cholesterol). Although some studies showed no harm from consumption of eggs in healthy people, this outcome may have been due to lack of power to detect clinically relevant increases in a low-risk population. Moreover, the same studies showed that among participants who became diabetic during observation, consumption of one egg a day doubled their risk compared with less than one egg a week. Diet is not just about fasting cholesterol; it is mainly about the postprandial effects of cholesterol, saturated fats, oxidative stress and inflammation. A misplaced focus on fasting lipids obscures three key issues. Dietary cholesterol increases the susceptibility of low-density lipoprotein to oxidation, increases postprandial lipemia and potentiates the adverse effects of dietary saturated fat. Dietary cholesterol, including egg yolks, is harmful to the arteries. Patients at risk of cardiovascular disease should limit their intake of cholesterol. Stopping the consumption of egg yolks after a stroke or myocardial infarction would be like quitting smoking after a diagnosis of lung cancer: a necessary action, but late. The evidence presented in the current review suggests that the widespread perception among the public and health care professionals that dietary cholesterol is benign is misplaced, and that improved education is needed to correct this misconception. R\u00e9sum\u00e9 Une id\u00e9e fausse et g\u00e9n\u00e9ralis\u00e9e se r\u00e9pand au sein du public canadien et des m\u00e9decins, qui pensent de plus en plus que la consommation de cholest\u00e9rol alimentaire et de jaunes d\u2019\u0153uf est inoffensive. Les recommandations de longue date qui pr\u00e9conisent de limiter le cholest\u00e9rol alimentaire \u00e0 moins de 200 mg/jour reposent sur de bonnes raisons. Un seul gros jaune d\u2019\u0153uf contient environ 275 mg de cholest\u00e9rol (plus que la portion quotidienne de cholest\u00e9rol). M\u00eame si certaines \u00e9tudes ont d\u00e9montr\u00e9 que la consommation d\u2019\u0153ufs n\u2019est pas nuisible chez les personnes en sant\u00e9, ce r\u00e9sultat peut d\u00e9couler de l\u2019absence de capacit\u00e9 \u00e0 d\u00e9celer des augmentations pertinentes sur le plan clinique au sein d\u2019une population \u00e0 faible risque. De plus, les m\u00eames \u00e9tudes ont r\u00e9v\u00e9l\u00e9 que chez les participants devenus diab\u00e9tiques pendant la p\u00e9riode d\u2019observation, la consommation d\u2019un \u0153uf par jour doublait leur risque par rapport \u00e0 la consommation de moins d\u2019un \u0153uf par semaine. Le r\u00e9gime ne vise pas \u00e0 \u00e9viter le cholest\u00e9rol, mais surtout les effets postprandiaux du cholest\u00e9rol, des gras satur\u00e9s, du stress oxydant et de l\u2019inflammation. Le fait de se concentrer \u00e0 tort sur les lipides \u00e0 jeun occulte trois enjeux. Le cholest\u00e9rol alimentaire accro\u00eet la susceptibilit\u00e9 des lipoprot\u00e9ines \u00e0 faible densit\u00e9 \u00e0 l\u2019oxydation, accro\u00eet la lip\u00e9mie postprandiale et potentialise les effets secondaires des graisses satur\u00e9es alimentaires. Le cholest\u00e9rol alimentaire, y compris les jaunes d\u2019\u0153uf, est nuisible pour les art\u00e8res. Les patients vuln\u00e9rables aux maladies cardiovasculaires devraient limiter leur consommation de cholest\u00e9rol. Le fait d\u2019arr\u00eater de consommer des jaunes d\u2019\u0153uf apr\u00e8s un accident vasculaire c\u00e9r\u00e9bral ou un infarctus du myocarde s\u2019apparenterait \u00e0 arr\u00eater de fumer apr\u00e8s un diagnostic de cancer du poumon : c\u2019est un geste n\u00e9cessaire, mais entrepris tardivement. D\u2019apr\u00e8s les donn\u00e9es probantes pr\u00e9sent\u00e9es dans la pr\u00e9sente analyse, la perception g\u00e9n\u00e9ralis\u00e9e du public et des professionnels de la sant\u00e9 selon laquelle le cholest\u00e9rol alimentaire est un mal b\u00e9nin est une id\u00e9e fausse, et une meilleure information s\u2019impose pour la corriger.", "Egg yolk consumption and carotid plaque. BACKGROUND: Increasingly the potential harm from high cholesterol intake, and specifically from egg yolks, is considered insignificant. We therefore assessed total plaque area (TPA) in patients attending Canadian vascular prevention clinics to determine if the atherosclerosis burden, as a marker of arterial damage, was related to egg intake. To provide perspective on the magnitude of the effect, we also analysed the effect of smoking (pack-years). METHODS: Consecutive patients attending vascular prevention clinics at University Hospital had baseline measurement of TPA by duplex ultrasound, and filled out questionnaires regarding their lifestyle and medications, including pack-years of smoking, and the number of egg yolks consumed per week times the number of years consumed (egg-yolk years). RESULTS: Data were available in 1262 patients; mean (SD) age was 61.5 (14.8) years; 47% were women. Carotid plaque area increased linearly with age after age 40, but increased exponentially with pack-years of smoking and with egg-yolk years. Plaque area in patients consuming <2 eggs per week (n = 388) was 125 \u00b1 129 mm(2), versus 132 \u00b1 142 mm(2) in those consuming 3 or more eggs per week (n = 603); (p < 0.0001 after adjustment for age). In multiple regression, egg-yolk years remained significant after adjusting for coronary risk factors. INTERPRETATION: Our findings suggest that regular consumption of egg yolk should be avoided by persons at risk of cardiovascular disease. This hypothesis should be tested in a prospective study with more detailed information about diet, and other possible confounders such as exercise and waist circumference. Copyright \u00a9 2012 Elsevier Ireland Ltd. All rights reserved.", "Consumption of eggs with meals increases the susceptibility of human plasma and low-density lipoprotein to lipid peroxidation. Consumption of eggs for a long period was shown to result in hypercholesterolemia and is generally restricted for this reason. In the present study we analyzed the effect of eggs consumption for 3 weeks on lipoprotein atherogenicity. Consumption of 2 eggs per day with the meals, for 3 weeks resulted in a minor elevation in plasma glucose and urea concentrations. Plasma cholesterol concentration increased by 11% (p < 0.05) as a result of increased plasma low-density lipoprotein (LDL) cholesterol levels. Plasma triglycerides decreased by 13% (p < 0.01), but there were no significant alterations in plasma apolipoproteins A-I or B-100 concentrations. Plasma high-density lipoprotein (HDL) cholesterol decreased by 11% (p < 0.05). There was a 13% reduction, though not significant, in the cholesterol efflux from J-774 A.1 macrophages by HDL that was derived after eggs consumption in comparison to HDL that was obtained at baseline. The susceptibility of plasma [using 100 mM of 2,2' azobis 2-amidinopropane (AAPH)] as well as that of LDL (using 10 microM of copper ions) to lipid peroxidation was increased by 42% and 34%, respectively, as measured by the thiobarbituric acid reactive substance (TBARS) assay (p < 0.01). Kinetic analysis of LDL oxidation by copper ions revealed a 37% reduction in the lag time required for the initiation of LDL oxidation after 3 weeks of eggs consumption. The total plasma fatty acids concentration increased from 2.2 +/- 0.5 to 3.2 +/- 0.6 mg/ml. The plasma antioxidants, vitamin E and carotenoids were not significantly affected by eggs consumption. We conclude that eggs consumption, in addition to its hypercholesterolemic effect, increases plasma and LDL oxidizability, a phenomenon which was shown to enhance the progression of atherosclerosis. The atherogenic properties may contribute to the accelerated atherosclerosis prevalent in populations with high cholesterol intake."], ["Manipulating antioxidant intake in asthma: a randomized controlled trial. BACKGROUND: Antioxidant-rich diets are associated with reduced asthma prevalence in epidemiologic studies. We previously showed that short-term manipulation of antioxidant defenses leads to changes in asthma outcomes. OBJECTIVE: The objective was to investigate the effects of a high-antioxidant diet compared with those of a low-antioxidant diet, with or without lycopene supplementation, in asthma. DESIGN: Asthmatic adults (n = 137) were randomly assigned to a high-antioxidant diet (5 servings of vegetables and 2 servings of fruit daily; n = 46) or a low-antioxidant diet (\u22642 servings of vegetables and 1 serving of fruit daily; n = 91) for 14 d and then commenced a parallel, randomized, controlled supplementation trial. Subjects who consumed the high-antioxidant diet received placebo. Subjects who consumed the low-antioxidant diet received placebo or tomato extract (45 mg lycopene/d). The intervention continued until week 14 or until an exacerbation occurred. RESULTS: After 14 d, subjects consuming the low-antioxidant diet had a lower percentage predicted forced expiratory volume in 1 s and percentage predicted forced vital capacity than did those consuming the high-antioxidant diet. Subjects in the low-antioxidant diet group had increased plasma C-reactive protein at week 14. At the end of the trial, time to exacerbation was greater in the high-antioxidant than in the low-antioxidant diet group, and the low-antioxidant diet group was 2.26 (95% CI: 1.04, 4.91; P = 0.039) times as likely to exacerbate. Of the subjects in the low-antioxidant diet group, no difference in airway or systemic inflammation or clinical outcomes was observed between the groups that consumed the tomato extract and those who consumed placebo. CONCLUSIONS: Modifying the dietary intake of carotenoids alters clinical asthma outcomes. Improvements were evident only after increased fruit and vegetable intake, which suggests that whole-food interventions are most effective. This trial was registered at http://www.actr.org.au as ACTRN012606000286549.", "Vegan regimen with reduced medication in the treatment of bronchial asthma. Thirty-five patients who had suffered from bronchial asthma for an average of 12 yr, all receiving long-term medication, 20 including cortisone, were subject to therapy with vegan food for 1 yr. In almost all cases, medication was withdrawn or drastically reduced. There was a significant decrease in asthma symptoms. Twenty-four patients (69%) fulfilled the treatment. Of these, 71% reported improvement at 4 months and 92% at 1 yr. There was a significant improvement in a number of clinical variables; for example, vital capacity, forced expiratory volume at one sec and physical working capacity, as well as a significant change in various biochemical indices as haptoglobin, IgM, IgE, cholesterol, and triglycerides in blood. Selected patients, with a fear of side-effects of medication, who are interested in alternative health care, might get well and replace conventional medication with this regimen.", "Lycopene-rich treatments modify noneosinophilic airway inflammation in asthma: proof of concept. Antioxidant-rich diets are associated with reduced asthma prevalence. However, direct evidence that altering intake of antioxidant-rich foods affects asthma is lacking. The objective was to investigate changes in asthma and airway inflammation resulting from a low antioxidant diet and subsequent use of lycopene-rich treatments. Asthmatic adults (n=32) consumed a low antioxidant diet for 10 days, then commenced a randomized, cross-over trial involving 3 x 7 day treatment arms (placebo, tomato extract (45 mg lycopene/day) and tomato juice (45 mg lycopene/day)). With consumption of a low antioxidant diet, plasma carotenoid concentrations decreased, Asthma Control Score worsened, %FEV(1) and %FVC decreased and %sputum neutrophils increased. Treatment with both tomato juice and extract reduced airway neutrophil influx. Treatment with tomato extract also reduced sputum neutrophil elastase activity. In conclusion, dietary antioxidant consumption modifies clinical asthma outcomes. Changing dietary antioxidant intake may be contributing to rising asthma prevalence. Lycopene-rich supplements should be further investigated as a therapeutic intervention.", "Airway and circulating levels of carotenoids in asthma and healthy controls. BACKGROUND: Elevated oxidative stress and impaired antioxidant defences are increasingly recognised features of asthma. Carotenoids are potent dietary antioxidants that may protect against asthma by reducing oxidative damage. OBJECTIVES: This study aimed firstly, to characterise circulating and airway levels of carotenoids in asthma compared to healthy controls, in relation to dietary intake. Secondly, the study aimed to test whether airway lycopene defences can be improved using oral supplements. METHODS: Induced sputum and peripheral blood samples were collected from subjects with asthma (n = 15) and healthy controls (n = 16). Dietary carotenoid intakes were estimated using the 24-hour recall method and analysed using a modified version of the Foodworks 210 Nutrient Calculation Software. Another group of healthy controls (n = 9) were supplemented with 20 mg/day lycopene for 4 weeks. Carotenoids (beta-carotene, lycopene, alpha-carotene, beta-cryptoxanthin, lutein/zeaxanthin) were measured by HPLC. RESULTS: Despite similar dietary intake, whole blood levels of total carotenoids, lycopene, lutein, beta-cryptoxanthin, alpha-carotene and beta-carotene were significantly lower in asthma than controls. However, there were no differences in plasma or sputum carotenoid levels. Induced sputum carotenoid levels were significantly lower than plasma and whole blood levels, but correlated strongly with plasma levels (r = 0.798, p < 0.001). Although there were no overall increases in either plasma or sputum lycopene levels following supplementation, changes in airway lycopene levels correlated with changes in plasma levels (r = 0.908, p < 0.002). CONCLUSIONS: Whole blood, but not plasma or sputum, carotenoid levels are deficient in asthma. Plasma carotenoid levels reflect airway carotenoid levels and when plasma levels are improved using oral supplements this is reflected in the airways.", "Association of dietary soy genistein intake with lung function and asthma control: a post-hoc analysis of patients enrolled in a prospective multicentre clinical trial Background Broad dietary patterns have been linked to asthma but the relative contribution of specific nutrients is unclear. Soy genistein has important anti-inflammatory and other biological effects that might be beneficial in asthma. A positive association was previously reported between soy genistein intake and lung function but not with asthma exacerbations. Aims To conduct a post-hoc analysis of patients with inadequately controlled asthma enrolled in a prospective multicentre clinical trial to replicate this association. Methods A total of 300 study participants were included in the analysis. Dietary soy genistein intake was measured using the Block Soy Foods Screener. The level of soy genistein intake (little or no intake, moderate intake, or high intake) was compared with baseline lung function (pre-bronchodilator forced expiratory volume in 1 second (FEV1)) and asthma control (proportion of participants with an episode of poor asthma control (EPAC) and annualised rates of EPACs over a 6-month follow-up period. Results Participants with little or no genistein intake had a lower baseline FEV1 than those with a moderate or high intake (2.26L vs. 2.53L and 2.47L, respectively; p=0.01). EPACs were more common among those with no genistein intake than in those with a moderate or high intake (54% vs. 35% vs. 40%, respectively; p<0.001). These findings remained significant after adjustment for patient demographics and body mass index. Conclusions In patients with asthma, consumption of a diet with moderate to high amounts of soy genistein is associated with better lung function and better asthma control."], ["Phytate in foods and significance for humans: food sources, intake, processing, bioavailability, protective role and analysis. The article gives an overview of phytic acid in food and of its significance for human nutrition. It summarises phytate sources in foods and discusses problems of phytic acid/phytate contents of food tables. Data on phytic acid intake are evaluated and daily phytic acid intake depending on food habits is assessed. Degradation of phytate during gastro-intestinal passage is summarised, the mechanism of phytate interacting with minerals and trace elements in the gastro-intestinal chyme described and the pathway of inositol phosphate hydrolysis in the gut presented. The present knowledge of phytate absorption is summarised and discussed. Effects of phytate on mineral and trace element bioavailability are reported and phytate degradation during processing and storage is described. Beneficial activities of dietary phytate such as its effects on calcification and kidney stone formation and on lowering blood glucose and lipids are reported. The antioxidative property of phytic acid and its potentional anticancerogenic activities are briefly surveyed. Development of the analysis of phytic acid and other inositol phosphates is described, problems of inositol phosphate determination and detection discussed and the need for standardisation of phytic acid analysis in foods argued.", "Prostate cancer and inositol hexaphosphate: efficacy and mechanisms. There are now extensive scientific data suggesting the potential role of dietary and non-dietary phytochemicals in the prevention and control of prostate cancer (PCA) growth and progression. PCA is a disease of elderly male populations with a relatively slower rate of growth and progression as compared to most other cancers and, therefore, is a candidate disease for preventive intervention. Overall, PCA growth and progression involve aberrant mitogenic and survival signaling and deregulated cell cycle progression, accompanied by gradual accumulation of genetic and epigenetic changes over a period of years. Several mechanisms, including overexpression of growth, survival and angiogenic factors and their receptors, together with a loss/decrease of tumor suppressor p53, retinoblastoma and cyclin-dependent kinase inhibitor, have been implicated in PCA growth and progression. Therefore, phytochemicals targeting these molecular events could have a promising role in PCA prevention and/or therapy. Inositol hexaphosphate (IP6) is a major constituent of most cereals, legumes, nuts, oil seeds and soybean. Taken orally as an over-the-counter dietary/nutrient supplement, and is recognised as offering several health benefits without any known toxicity. In vitro anticancer efficacy of IP6 has been observed in many human, mouse and rat prostate cancer cells. Completed studies also show that oral feeding of IP6 inhibits human PCA xenograft growth in nude mice without toxicity. In a recently completed pilot study, we observed similar preventive effects of IP6 on prostate tumorigenesis in the TRAMP model. Mechanistic studies indicate that IP6 targets mitogenic and survival signaling, as well as cell cycle progression, in PCA cells. IP6 is also shown to target molecular events associated with angiogenesis. Moreover, IP6 has pleiotropic molecular targets for its overall efficacy against PCA and, therefore, could be a suitable candidate agent for preventive intervention of this malignancy in humans.", "The role of phytic acid in legumes: antinutrient or beneficial function? This review describes the present state of knowledge about phytic acid (phytate), which is often present in legume seeds. The antinutritional effects of phytic acid primarily relate to the strong chelating associated with its six reactive phosphate groups. Its ability to complex with proteins and particularly with minerals has been a subject of investigation from chemical and nutritional viewpoints. The hydrolysis of phytate into inositol and phosphates or phosphoric acid occurs as a result of phytase or nonenzymatic cleavage. Enzymes capable of hydrolysing phytates are widely distributed in micro-organisms, plants and animals. Phytases act in a stepwise manner to catalyse the hydrolysis of phytic acid. To reduce or eliminate the chelating ability of phytate, dephosphorylation of hexa- and penta-phosphate forms is essential since a high degree of phosphorylation is necessary to bind minerals. There are several methods of decreasing the inhibitory effect of phytic acid on mineral absorption (cooking, germination, fermentation, soaking, autolysis). Nevertheless, inositol hexaphosphate is receiving increased attention owing to its role in cancer prevention and/or therapy and its hypocholesterolaemic effect.", "Protection against cancer by dietary IP6 and inositol. Inositol hexaphosphate (IP(6)) is a naturally occurring polyphosphorylated carbohydrate, abundantly present in many plant sources and in certain high-fiber diets, such as cereals and legumes. In addition to being found in plants, IP(6) is contained in almost all mammalian cells, although in much smaller amounts, where it is important in regulating vital cellular functions such as signal transduction, cell proliferation, and differentiation. For a long time IP(6) has been recognized as a natural antioxidant. Recently IP(6) has received much attention for its role in cancer prevention and control of experimental tumor growth, progression, and metastasis. In addition, IP(6) possesses other significant benefits for human health, such as the ability to enhance immune system, prevent pathological calcification and kidney stone formation, lower elevated serum cholesterol, and reduce pathological platelet activity. In this review we show the efficacy and discuss some of the molecular mechanisms that govern the action of this dietary agent. Exogenously administered IP(6) is rapidly taken up into cells and dephosphorylated to lower inositol phosphates, which further affect signal transduction pathways resulting in cell cycle arrest. A striking anticancer action of IP(6) was demonstrated in different experimental models. In addition to reducing cell proliferation, IP(6) also induces differentiation of malignant cells. Enhanced immunity and antioxidant properties also contribute to tumor cell destruction. Preliminary studies in humans show that IP(6) and inositol, the precursor molecule of IP(6), appear to enhance the anticancer effect of conventional chemotherapy, control cancer metastases, and improve quality of life. Because it is abundantly present in regular diet, efficiently absorbed from the gastrointestinal tract, and safe, IP(6) + inositol holds great promise in our strategies for cancer prevention and therapy. There is clearly enough evidence to justify the initiation of full-scale clinical trials in humans.", "Phytate levels and bone parameters: a retrospective pilot clinical trial. This study evaluated the relationship between phytate urinary levels and bone characteristics in a large population of postmenopausal women. The study population consisted of 180 postmenopausal women who participated in a descriptive cross-sectional study. A urine sample was collected from each subject to determine phytate levels and the volunteers were divided into two groups according to phytate urinary concentration (i.e., low and high levels). Bone mineral density was determined in the lumbar spine and femoral neck of groups with low and high phytate urinary levels. Urinary levels of phytate were linked to dietary phytate consumption. Hence, bone mineral density values were significantly higher in the lumbar spines and femoral necks of women who consumed high levels of phytate than in women with low urinary phytate concentrations. Higher urinary levels of phytate correlated with higher bone mineral density in the lumbar spine and femoral necks of postmenopausal women. This finding demonstrates the potential use of phytate in the treatment of bone related diseases, as it uses a mechanism of action similar to some bisphosphonates."], ["Alkylphenols--potential modulators of the allergic response. The prevalence of allergic diseases has increased in recent decades. Allergic diseases, particularly asthma, are complex diseases with strong gene-environment interactions. Epidemiological studies have identified a variety of risk factors for the development of allergic diseases. Among them, endocrine-disrupting chemicals (EDCs) play an important role in triggering or exacerbating these diseases. 4-Nonylphenol (NP) and 4-octylphenol (OP)--two major alkylphenols--have been recognized as common toxic and xenobiotic endocrine disrupters. Due to their low solubility, high hydrophobicity, and low estrogenic activity, they tend to accumulate in the human body and may be associated with the adverse effects of allergic diseases. Recently, new evidence has supported the importance of alkylphenols in the in vitro allergic response. This review focuses on the effects of alkylphenols on several key cell types in the context of allergic inflammation. Copyright \u00a9 2012. Published by Elsevier B.V.", "Endocrine-Disrupting Chemicals: Associated Disorders and Mechanisms of Action The incidence and/or prevalence of health problems associated with endocrine-disruption have increased. Many chemicals have endocrine-disrupting properties, including bisphenol A, some organochlorines, polybrominated flame retardants, perfluorinated substances, alkylphenols, phthalates, pesticides, polycyclic aromatic hydrocarbons, alkylphenols, solvents, and some household products including some cleaning products, air fresheners, hair dyes, cosmetics, and sunscreens. Even some metals were shown to have endocrine-disrupting properties. Many observations suggesting that endocrine disruptors do contribute to cancer, diabetes, obesity, the metabolic syndrome, and infertility are listed in this paper. An overview is presented of mechanisms contributing to endocrine disruption. Endocrine disruptors can act through classical nuclear receptors, but also through estrogen-related receptors, membrane-bound estrogen-receptors, and interaction with targets in the cytosol resulting in activation of the Src/Ras/Erk pathway or modulation of nitric oxide. In addition, changes in metabolism of endogenous hormones, cross-talk between genomic and nongenomic pathways, cross talk with estrogen receptors after binding on other receptors, interference with feedback regulation and neuroendocrine cells, changes in DNA methylation or histone modifications, and genomic instability by interference with the spindle figure can play a role. Also it was found that effects of receptor activation can differ in function of the ligand.", "p-Nonyl-phenol: an estrogenic xenobiotic released from \\\"modified\\\" polystyrene. Alkylphenols are widely used as plastic additives and surfactants. We report the identification of an alkylphenol, nonylphenol, as an estrogenic substance released from plastic centrifuge tubes. This compound was extracted with methanol, purified by flash chromatography and reverse-phase high performance liquid chromatography, and identified by gas chromatography-mass spectrometry. Nonylphenol induced both cell proliferation and progesterone receptor in human estrogen-sensitive MCF7 breast tumor cells. Nonylphenol also triggered mitotic activity in rat endometrium; this result confirms the reliability of the MCF7 cell proliferation bioassay. The estrogenic properties of alkylphenols, specifically nonylphenols, indicate that the use of plasticware containing these chemicals in experimental and diagnostic tests may lead to spurious results, and these compounds as well as alkylphenol polyethoxylates may also be potentially harmful to exposed humans and the environment at large.", "Inadvertent exposure to xenoestrogens. Over the last 40 years there have been constant reports concerning environmental chemicals with hormone-like effects in wildlife. An endocrine disruptor is an exogenous substance that causes adverse health effects in an intact organism or its progeny, secondary to changes in endocrine function. Endocrine disruptors of widely diverse chemical structures that have oestrogenic properties are known as oestrogenic xenobiotics or xenoestrogens. Some of these substances, such as phytoestrogens and mycoestrogens, can come from diet or from the environment. Although the oestrogenic activity of these substances is weaker than that of oestradiol, new chemicals with endocrine disrupting potential continue to be discovered, inadvertent forms of exposure are constantly being identified, and there is increasing concern about cumulative effects. Studies in the 1960s and 1970s characterized the oestrogenicity of a number of industrial compounds and the pesticides o,p-DDT, kepone, methoxychlor, phenolic derivatives and polychlorinated biphenyls (PCBs). In the last 5 years, several environmental chemicals have been added to the list of xenoestrogens, including the pesticides toxaphene, dieldrin and endosulphan, and several different compounds used in the food industry, antioxidants such a t-butylhydroxyanisole; plasticizers such as benzylbutylphthalate and 4-OH-alkylphenols; and substances used in dental restorations, such as bisphenol-A. The relevance of these newly discovered endocrine disruptors to human health is now starting to emerge. The few studies that have investigated their effect in humans point in the same direction: if there is indeed an association between exposure to substances with hormone-disruptive activity and certain disorders of endocrine organs, the incidence of such disorders would be greater in areas where exposure to agents with this activity is high. A closer scrutiny is required to determine whether these newly discovered endocrine disrupting chemicals contribute, together with oestrogenic pesticides, to the exposure of humans to xenoestrogens.", "Xeno-estrogenic compounds in precipitation. The exposure to some chemicals can lead to hormone disrupting effects. Presently, much attention is focused on so-called xeno-estrogens, synthetic compounds that interact with hormone receptors causing a number of reactions that eventually lead to effects related to reproduction and development. The current study was initiated to investigate the presence of a number of such compounds in precipitation as a follow-up on a previous study in which pesticide concentrations in air and precipitation were determined. Rainwater samples were collected at about 50 locations in The Netherlands in a four week period. The samples were analysed for bisphenol-A, alkylphenols and alkylphenol ethoxylates, phthalates, flame retardants and synthetic musk compounds. The results clearly indicated the presence of these compounds in precipitation. The concentrations ranged from the low ng l(-1) range for flame retardants to several thousands of ng l(-1) for the phthalates. Bisphenol-A was found in 30% of the samples in concentrations up to 130 ng l(-1), while alkylphenols and alkylphenol ethoxylates were found in virtually all locations in concentrations up to 920 ng l(-1) for the individual compounds. Phthalates were by far the most abundant xeno-estrogens in the precipitation samples and were found in every sample. Di-isodecyl phthalate was found in a surprisingly high concentration of almost 100 000 ng l(-1). Polybrominated flame retardants were found in the low ng l(-1) range and generally in less than 20% of the samples. Noticeable was the finding of hexabromocyclododecane, a replacement for the polybrominted diphenyl ethers at one location in a concentration of almost 2000 ng l(-1). Finally, as expected, synthetic musk compounds were detected in almost all samples. This is especially true for the polycyclic musks HHCB and AHTN. Nitro musks were found, but only on a few locations. Kriging techniques were used to calculate precipitation concentrations in between actual sampling locations to produce contour plots for a number of compounds. These plots clearly show located emission sources for a number of compounds such as bisphenol-A, nonylphenol ethoxylate, phthalates and AHTN. On the contrary, the results for HHCB and some phthalates indicated diffuse emission patterns, probably as the result of the use of consumer products containing these compounds."], ["Initial contamination of chicken parts with Salmonella at retail and cross-contamination of cooked chicken with Salmonella from raw chicken during ... The current study was undertaken to acquire data on contamination of chicken parts with Salmonella at retail and to acquire data on cross-contamination of cooked chicken with Salmonella from raw chicken during meal preparation. Whole raw chickens (n = 31) were obtained from local retail stores and cut into two wings, two breasts without skin or bones, two thighs, and two drumsticks. Data for cross-contamination were obtained by cutting up a sterile, cooked chicken breast with the same board and knife used to cut up the raw chicken. The board, knife, and latex gloves used by the food handler were not rinsed or washed before cutting up the sterile, cooked chicken breast, thus providing a worst-case scenario for cross-contamination. Standard curves for the concentration of Salmonella bacteria in 400 ml of buffered peptone water after 6 h of incubation of chicken parts as a function of the initial log number of Salmonella bacteria inoculated onto chicken parts were developed and used to enumerate Salmonella bacteria. Standard curves were not affected by the type of chicken part but did differ (P < 0.05) among the five isolates of Salmonella examined. Consequently, Salmonella bacteria were enumerated on naturally contaminated chicken parts using a standard curve developed with the serotype of Salmonella that was isolated from the original sample. The prevalence of contamination was 3 % (4 of 132), whereas the incidence of cross-contamination was 1.8 % (1 of 57). The positive chicken parts were a thigh from chicken 4, which contained 3 CFU of Salmonella enterica serotype Kentucky, and both wings, one thigh, and one cooked breast portion from chicken 15, which all contained 1 CFU of serotype 8,20:-:z(6). These results indicated that the poultry industry is providing consumers in the studied area with chicken that has a low prevalence and low number of Salmonella bacteria at retail and that has a low incidence and low level of cross-contamination of cooked chicken with Salmonella from raw chicken during meal preparation under a worst-case scenario.", "Outbreak of Salmonella Heidelberg infections linked to a single poultry producer -- 13 states, 2012-2013. In June 2012, the Oregon Health Authority and the Washington State Department of Health noted an increase in the number of Salmonella enterica serotype Heidelberg clinical isolates sharing an identical pulsed-field gel electrophoresis (PFGE) pattern. In 2004, this pattern had been linked to chicken from Foster Farms by the Washington State Department of Health; preliminary 2012 interviews with infected persons also indicated exposure to Foster Farms chicken. On August 2, 2012, CDC's PulseNet* detected a cluster of 19 Salmonella Heidelberg clinical isolates matching the outbreak pattern. This report summarizes the investigation by CDC, state and local health departments, the U.S. Department of Agriculture's Food Safety and Inspection Service (USDA-FSIS), and the Food and Drug Administration (FDA) and reinforces the importance of safe food handling to prevent illness. A total of 134 cases from 13 states were identified, including 33 patients who were hospitalized. This multifaceted investigation used standard epidemiologic and laboratory data along with patient shopper card purchase information, and PFGE data from the retail meat component of the National Antimicrobial Resistance Monitoring System (NARMS)\u2020, a relatively novel tool in outbreak investigation, to link the outbreak strain to chicken from Foster Farms.", "Estimating changes in public health following implementation of hazard analysis and critical control point in the United States broiler slaughter i... A common approach to reducing microbial contamination has been the implementation of a Hazard Analysis and Critical Control Point (HACCP) program to prevent or reduce contamination during production. One example is the Pathogen Reduction HACCP program implemented by the U.S. Department of Agriculture's Food Safety and Inspection Service (FSIS). This program consisted of a staged implementation between 1996 and 2000 to reduce microbial contamination on meat and poultry products. Of the commodities regulated by FSIS, one of the largest observed reductions was for Salmonella contamination on broiler chicken carcasses. Nevertheless, how this reduction might have influenced the total number of salmonellosis cases in the United States has not been assessed. This study incorporates information from public health surveillance and surveys of the poultry slaughter industry into a model that estimates the number of broiler-related salmonellosis cases through time. The model estimates that-following the 56% reduction in the proportion of contaminated broiler carcasses observed between 1995 and 2000-approximately 190,000 fewer annual salmonellosis cases (attributed to broilers) occurred in 2000 compared with 1995. The uncertainty bounds for this estimate range from approximately 37,000 to 500,000 illnesses. Estimated illnesses prevented, due to the more modest reduction in contamination of 13% between 2000 and 2007, were not statistically significant. An analysis relating the necessary magnitude of change in contamination required for detection via human surveillance also is provided.", "Scientific and technical factors affecting the setting of Salmonella criteria for raw poultry: a global perspective. Concerns about foodborne salmonellosis have led many countries to introduce microbiological criteria for certain food products. If such criteria are not well-grounded in science, they could be an unjustified obstacle to trade. Raw poultry products are an important part of the global food market. Import and export ambiguities and regulatory confusion resulting from different Salmonella requirements were the impetus for convening an international group of scientific experts from 16 countries to discuss the scientific and technical issues that affect the setting of a microbiological criterion for Salmonella contamination of raw chicken. A particular concern for the group was the use of criteria implying a zero tolerance for Salmonella and suggesting complete absence of the pathogen. The notion can be interpreted differently by various stakeholders and was considered inappropriate because there is neither an effective means of eliminating Salmonella from raw poultry nor any practical method for verifying its absence. Therefore, it may be more useful at present to set food safety metrics that involve reductions in hazard levels. Such terms as \\\"zero tolerance\\\" or \\\"absence of a microbe\\\" in relation to raw poultry should be avoided unless defined and explained by international agreement. Risk assessment provides a more meaningful approach than a zero tolerance philosophy, and new metrics, such as performance objectives that are linked to human health outcomes, should be utilized throughout the food chain to help define risk and identify ways to reduce adverse effects on public health.", "Application of Bayesian Techniques to Model the Burden of Human Salmonellosis Attributable to U.S. Food Commodities at the Point of Processing: Adaptation of a Danish Model Mathematical models that estimate the proportion of foodborne illnesses attributable to food commodities at specific points in the food chain may be useful to risk managers and policy makers to formulate public health goals, prioritize interventions, and document the effectiveness of mitigations aimed at reducing illness. Using human surveillance data on laboratory-confirmed Salmonella infections from the Centers for Disease Control and Prevention and Salmonella testing data from U.S. Department of Agriculture Food Safety and Inspection Service's regulatory programs, we developed a point-of-processing foodborne illness attribution model by adapting the Hald Salmonella Bayesian source attribution model. Key model outputs include estimates of the relative proportions of domestically acquired sporadic human Salmonella infections resulting from contamination of raw meat, poultry, and egg products processed in the United States from 1998 through 2003. The current model estimates the relative contribution of chicken (48%), ground beef (28%), turkey (17%), egg products (6%), intact beef (1%), and pork (<1%) across 109 Salmonella serotypes found in food commodities at point of processing. While interpretation of the attribution estimates is constrained by data inputs, the adapted model shows promise and may serve as a basis for a common approach to attribution of human salmonellosis and food safety decision-making in more than one country."], ["Curcumin: a new paradigm and therapeutic opportunity for the treatment of osteoarthritis: curcumin for osteoarthritis management The management of osteoarthritis represents a real challenge. This complex and multi-factorial disease evolves over decades and requires not only the alleviation of symptoms, i.e. pain and joint function but also the preservation of articular structure without side effects. Nutraceuticals are good candidates for the management of OA due to their safety profile and potential efficacy. However, they are not part of the treatment guidelines and published recommendations. Curcumin is the yellow pigment isolated from the rhizomes of Curcuma longa, commonly known as turmeric. Curcumin is a highly pleiotropic molecule with an excellent safety profile. Strong molecular evidence has been published for its potency to target multiple inflammatory diseases. However, naturally occurring curcumin cannot achieve its optimum therapeutic outcomes due to its low solubility and poor bioavailability. Nevertheless, curcumin presents great potential for treating OA and has been categorized as having preclinical evidence of efficacy. This review aimed at gathering most of the available information to document the potential efficacy of curcumin based on the results obtained in in vitro models of cartilage and osteoarthritis and in other diseases.", "Biological actions of curcumin on articular chondrocytes. OBJECTIVES: Curcumin (diferuloylmethane) is the principal biochemical component of the spice turmeric and has been shown to possess potent anti-catabolic, anti-inflammatory and antioxidant, properties. This article aims to provide a summary of the actions of curcumin on articular chondrocytes from the available literature with the use of a text-mining tool. We highlight both the potential benefits and drawbacks of using this chemopreventive agent for treating osteoarthritis (OA). We also explore the recent literature on the molecular mechanisms of curcumin mediated alterations in gene expression mediated via activator protein 1 (AP-1)/nuclear factor-kappa B (NF-kappaB) signalling in chondrocytes, osteoblasts and synovial fibroblasts. METHODS: A computer-aided search of the PubMed/Medline database aided by a text-mining tool to interrogate the ResNet Mammalian database 6.0. RESULTS: Recent work has shown that curcumin protects human chondrocytes from the catabolic actions of interleukin-1 beta (IL-1beta) including matrix metalloproteinase (MMP)-3 up-regulation, inhibition of collagen type II and down-regulation of beta1-integrin expression. Curcumin blocks IL-1beta-induced proteoglycan degradation, AP-1/NF-kappaB signalling, chondrocyte apoptosis and activation of caspase-3. CONCLUSIONS: The available data from published in vitro and in vivo studies suggest that curcumin may be a beneficial complementary treatment for OA in humans and companion animals. Nevertheless, before initiating extensive clinical trials, more basic research is required to improve its solubility, absorption and bioavailability and gain additional information about its safety and efficacy in different species. Once these obstacles have been overcome, curcumin and structurally related biochemicals may become safer and more suitable nutraceutical alternatives to the non-steroidal anti-inflammatory drugs that are currently used for the treatment of OA. Copyright 2009 Osteoarthritis Research Society International. All rights reserved.", "Efficacy and safety of Meriva\u00ae, a curcumin-phosphatidylcholine complex, during extended administration in osteoarthritis patients. In a previous three-month study of Meriva, a proprietary curcumin-phosphatidylcholine phytosome complex, decreased joint pain and improvement in joint function were observed in 50 osteoarthritis (OA) patients. Since OA is a chronic condition requiring prolonged treatment, the long-term efficacy and safety of Meriva were investigated in a longer (eight months) study involving 100 OA patients. The clinical end points (Western Ontario and McMaster Universities [WOMAC] score, Karnofsky Performance Scale Index, and treadmill walking performance) were complemented by the evaluation of a series of inflammatory markers (interleukin [IL]-1beta, IL-6, soluble CD40 ligand [sCD40L], soluble vascular cell adhesion molecule (sVCAM)-1, and erythrocyte sedimentation rate [ESR]). This represents the most ambitious attempt, to date, to evaluate the clinical efficacy and safety of curcumin as an anti-inflammatory agent. Significant improvements of both the clinical and biochemical end points were observed for Meriva compared to the control group. This, coupled with an excellent tolerability, suggests that Meriva is worth considering for the long-term complementary management of osteoarthritis.", "Curcumin: an orally bioavailable blocker of TNF and other pro-inflammatory biomarkers TNFs are major mediators of inflammation and inflammation-related diseases, hence, the United States Food and Drug Administration (FDA) has approved the use of blockers of the cytokine, TNF-\u03b1, for the treatment of osteoarthritis, inflammatory bowel disease, psoriasis and ankylosis. These drugs include the chimeric TNF antibody (infliximab), humanized TNF-\u03b1 antibody (Humira) and soluble TNF receptor-II (Enbrel) and are associated with a total cumulative market value of more than $20 billion a year. As well as being expensive ($15 000\u201320 000 per person per year), these drugs have to be injected and have enough adverse effects to be given a black label warning by the FDA. In the current report, we describe an alternative, curcumin (diferuloylmethane), a component of turmeric (Curcuma longa) that is very inexpensive, orally bioavailable and highly safe in humans, yet can block TNF-\u03b1 action and production in in vitro models, in animal models and in humans. In addition, we provide evidence for curcumin's activities against all of the diseases for which TNF blockers are currently being used. Mechanisms by which curcumin inhibits the production and the cell signalling pathways activated by this cytokine are also discussed. With health-care costs and safety being major issues today, this golden spice may help provide the solution. Linked Articles This article is part of a themed section on Emerging Therapeutic Aspects in Oncology. To view the other articles in this section visit http://dx.doi.org/10.1111/bph.2013.169.issue-8", "Curcumin in inflammatory diseases. Curcumin (diferuloylmethane), a yellow coloring agent extracted from turmeric is also used as a remedy for the treatment and prevention of inflammatory diseases. Acute and chronic inflammation is a major factor in the progression of obesity, type II diabetes, arthritis, pancreatitis, cardiovascular, neurodegenerative and metabolic diseases, as well as certain types of cancer. Turmeric has a long history of use in Ayurvedic medicine for the treatment of inflammatory disorders. Recent studies on the efficacy and therapeutic applicability of turmeric have suggested that the active ingredient of tumeric is curcumin. Further, compelling evidence has shown that curcumin has the ability to inhibit inflammatory cell proliferation, invasion, and angiogenesis through multiple molecular targets and mechanisms of action. Curcumin is safe, non-toxic, and mediates its anti-inflammatory effects through the down-regulation of inflammatory transcription factors, cytokines, redox status, protein kinases, and enzymes that all promote inflammation. In addition, curcumin induces apoptosis through mitochondrial and receptor-mediated pathways, as well as activation of caspase cascades. In the current study, the anti-inflammatory effects of curcumin were evaluated relative to various chronic inflammatory diseases. Based on the available pharmacological data obtained from in vitro and in vivo research, as well as clinical trials, an opportunity exists to translate curcumin into clinics for the prevention of inflammatory diseases in the near future. Copyright \u00a9 2012 International Union of Biochemistry and Molecular Biology, Inc."], ["Hair mercury levels of women of reproductive age in Ontario, Canada: implications to fetal safety and fish consumption. OBJECTIVE: To study hair mercury concentrations among women of reproductive age in relation to fish intake in Ontario, Canada. STUDY DESIGN: Three groups were studied: 22 women who had called the Motherisk Program for information on the reproductive safety of consuming fish during pregnancy, a group of Japanese residing in Toronto (n=23) consuming much larger amounts of fish, and a group of Canadian women of reproductive age (n=20) not seeking advice, were studied. Mercury concentrations in hair samples were measured using inductively coupled plasma mass spectrometry. Seafood consumption habits were recorded for each participant. Based on the types of fish consumed and consumption frequencies, the estimated monthly intake of mercury was calculated. Hair mercury concentrations were correlated to both the number of monthly seafood servings and the estimated ingested mercury dose. RESULTS: There were significant correlations between fish servings and hair mercury (Spearman r=0.73, P<.0001) and between amounts of consumed mercury and hair mercury concentrations (Spearman r=0.81, P<.0001). Nearly two thirds of the Motherisk callers, all of the Japanese women, and 15% of the Canadian women of reproductive age had hair mercury above 0.3 microg/g, which was shown recently to be the lowest observable adverse effect level in a large systematic review of all perinatal studies. CONCLUSIONS: Because of very wide variability, general recommendations for a safe number of fish servings may not be sufficient to protect the fetus. Analysis of hair mercury may be warranted before pregnancy in selected groups of women consuming more than 12 ounces of fish per week, as dietary modification can decrease body burden and ensure fetal safety. Copyright (c) 2010. Published by Mosby, Inc.", "Nowhere to hide: Chemical toxicants and the unborn child. Contemporary reproductive aged women and their offspring are facing an unprecedented onslaught of toxicant exposures from myriad sources in their day-to-day life. Public health recommendations regarding optimal diet and nutrition in pregnancy must incorporate several considerations including safety of available foodstuffs, cultural practices and lifestyle issues. Gestational consumption of contaminated seafood remains a potential source of toxicant exposure, including mercury, for the developing child. Health care professionals responsible for the care of women and their developing children need to become apprised of: a) risks associated with toxicant bioaccumulation in pregnancy; b) ongoing information emerging in the important field of reproductive toxicology; and c) strategies within the clinical setting to facilitate nutritional sufficiency and precautionary avoidance of adverse exposure among young women.", "Fish consumption during child bearing age: a quantitative risk-benefit analysis on neurodevelopment. The fish ingredient N3-docosahexaenoic acid 22:6 n-3 (DHA) stimulates brain development. On the other hand methylmercury (MeHg) in fish disturbs the developing central nervous system. In this Context the IQ score in children is considered as an aggregate measure of in utero brain development. To determine the effect of DHA exposure on prenatal neurodevelopment the maternal DHA intake during pregnancy was compared with its epidemiologically observed effect on the IQ score of children. For MeHg the maternal intake was converted into its accumulation in the maternal body. The maternal body burden then was compared with its epidemiologically observed relationship with the IQ score. Taking the MeHg and DHA content of 33 fish species the net effect of these compounds on the IQ score was quantified. For most fish species the adverse effect of MeHg on the IQ score exceeded the beneficial effect of DHA. In the case of long-living predators a negative effect up to 10 points on the IQ score was found. The results of this study indicate that food interventions aiming at the beneficial effects of fish consumption should focus on fish species with a high DHA content, while avoiding fish species with a high MeHg content. Copyright \u00a9 2011 Elsevier Ltd. All rights reserved.", "Exploration of biomarkers for total fish intake in pregnant Norwegian women. OBJECTIVE: Few biomarkers for dietary intake of various food groups have been established. The aim of the present study was to explore whether selenium (Se), iodine, mercury (Hg) or arsenic may serve as a biomarker for total fish and seafood intake in addition to the traditionally used n-3 fatty acids EPA and DHA. DESIGN: Intake of fish and seafood estimated by an FFQ was compared with intake assessed by a 4 d weighed food diary and with biomarkers in blood and urine. SETTING: Validation study in the Norwegian Mother and Child Cohort Study (MoBa). SUBJECTS: One hundred and nineteen women. RESULTS: Total fish/seafood intake (median 39 g/d) calculated with the MoBa FFQ was comparable to intake calculated by the food diary (median 30 g/d, rS = 0.37, P < 0.001). Erythrocyte DHA and blood Hg, Se and arsenic concentrations were positively correlated with intake of fish and seafood, but the association for DHA was weakened by the widespread use of supplements. The main finding was the consistent positive association between the intake of fish/seafood and blood arsenic concentration. In multivariate analyses, blood arsenic was associated with blood Hg and fish and seafood intake. In these models, arsenic turned out to be the best indicator of intake of fish and seafood, both totally and in subgroups of fish/seafood intake. CONCLUSIONS: While DHA reflected the intake of fatty fish and n-3 PUFA supplements, blood arsenic concentration also reflected the intake of lean fish and seafood. Blood arsenic appears to be a useful biomarker for total fish and seafood intake.", "A risk-benefit analysis of French high fish consumption: a QALY approach. The health risk and the nutritional benefit of a food are usually assessed separately. Toxicologists recommend limiting the consumption of certain fish because of methylmercury; while nutritionists recommend eating more oily fish because of omega 3. A common evaluation is imperative to provide coherent recommendations. In order to evaluate the risks along with the benefits related to fish consumption, a common metric based on the quality-adjusted life year (QALY) method has been used. The impact of a theoretical change from a medium n-3 PUFAs intake to a high intake is studied, in terms of the cardiovascular system (CHD mortality, stroke mortality and morbidity) and on fetal neuronal development (IQ loss or gain). This application can be considered as a sensitive analysis of the model used and looks at the impact of changing the dose-response relationships between cardiovascular diseases and n-3 PUFAs intakes. Results show that increasing fish consumption may have a beneficial impact on health. However, the confidence interval of the overall estimation has a negative lower bound, which means that this increase in fish consumption may have a negative impact due to MeHg contamination. Some limits of the QALY approach are identified. The first concerns determination of the dose-response relationships. The second concerns the economic origins of the approach and of individual preferences. Finally, since only one beneficial aspect and one risk element were studied, consideration should be given to how other beneficial and risk components may be integrated in the model."], ["Carcinogenicity and regulation of caramel colorings. 2- and 4-methylimidazoles are present as contaminants in caramel colorings manufactured with ammonia catalysts. Both contaminants have been shown to induce cancer in animals and may be present in caramel colorings in amounts that exceed federal guidelines. California requires warning notices on products that could lead to consumption of more than 30 micrograms per day. The US Food and Drug Administration should bar the use of excessively contaminated caramel coloring in food.", "Toxicology of food dyes. BACKGROUND: Food dyes, synthesized originally from coal tar and now petroleum, have long been controversial because of safety concerns. Many dyes have been banned because of their adverse effects on laboratory animals or inadequate testing. CONCLUSIONS: This review finds that all of the nine currently US-approved dyes raise health concerns of varying degrees. Red 3 causes cancer in animals, and there is evidence that several other dyes also are carcinogenic. Three dyes (Red 40, Yellow 5, and Yellow 6) have been found to be contaminated with benzidine or other carcinogens. At least four dyes (Blue 1, Red 40, Yellow 5, and Yellow 6) cause hypersensitivity reactions. Numerous microbiological and rodent studies of Yellow 5 were positive for genotoxicity. Toxicity tests on two dyes (Citrus Red 2 and Orange B) also suggest safety concerns, but Citrus Red 2 is used at low levels and only on some Florida oranges and Orange B has not been used for several years. The inadequacy of much of the testing and the evidence for carcinogenicity, genotoxicity, and hypersensitivity, coupled with the fact that dyes do not improve the safety or nutritional quality of foods, indicates that all of the currently used dyes should be removed from the food supply and replaced, if at all, by safer colorings. It is recommended that regulatory authorities require better and independent toxicity testing, exercise greater caution regarding continued approval of these dyes, and in the future approve only well-tested, safe dyes.", "The significance of azo-reduction in the mutagenesis and carcinogenesis of azo dyes. Azo dyes are widely used in textile, printing, cosmetic, drug and food-processing industries. They are also used extensively in laboratories as either biological stains or pH indicators. The extent of such use is related to the degree of industrialization. Since intestinal cancer is more common in highly industrialized countries, a possible connection may exist between the increase in the number of cancer cases and the use of azo dyes. Azo dyes can be reduced to aromatic amines by the intestinal microflora. The mutagenicity of a number of azo dyes is reviewed in this paper. They include Trypan Blue, Ponceau 3R, Pinceau 2R, Methyl Red, Methyl Yellow, Methyl Orange, Lithol Red, Orange I, Orange II, 4-Phenylazo-Naphthylamine, Sudan I, Sudan IV, Acid Alizarin Violet N, Fast Garnet GBC, Allura Red, Ponceau SX, Sunset Yellow, Tartrazine, Citrus Red No. 2, Orange B, Yellow AB, Carmoisine, Mercury Orange, Ponceau S, Versatint Blue, Phenylazophenol, Evan's Blue and their degraded aromatic amines. The significance of azo reduction in the mutagenesis and carcinogenesis of azo dyes is discussed.", "Bile acids as carcinogens in human gastrointestinal cancers. Bile acids were first proposed to be carcinogens in 1939 and 1940. On the basis of later work with rodent models, bile acids came to be regarded as cancer promoters rather than carcinogens. However, considerable indirect evidence, obtained more recently, supports the view that bile acids are carcinogens in humans. At least 15 reports, from 1980 through 2003, indicate that bile acids cause DNA damage. The mechanism is probably indirect, involving induction of oxidative stress and production of reactive oxygen species that then damage DNA. Repeated DNA damage likely increases the mutation rate, including the mutation rate of tumor suppressor genes and oncogenes. Additional reports, from 1994 through 2002, indicate that bile acids, at the increased concentrations accompanying a high fat diet, induce frequent apoptosis. Those cells within the exposed population with reduced apoptosis capability tend to survive and selectively proliferate. That bile acids cause DNA damage and may select for apoptosis-resistant cells (both leading to increased mutation), indicates that bile acids are likely carcinogens. In humans, an increased incidence of cancer of the laryngopharyngeal tract, esophagus, stomach, pancreas, the small intestine (near the Ampulla of Vater) and the colon are associated with high levels of bile acids. The much larger number of cell generations in the colonic (and, likely, other gastrointestinal) epithelia of humans compared to rodents may allow time for induction and selection of mutations leading to cancer in humans, although not in rodents.", "Aspartame bioassay findings portend human cancer hazards. The U.S. Food and Drug Administration (FDA) should reevaluate its position on aspartame as being safe under all conditions. Animal bioassay results predict human cancer risks, and a recent animal study confirms that there is a potential aspartame risk to humans. Aspartame is produced and packaged in China for domestic use and global distribution. Japan, France, and the United States are also major producers. No study of long-term adverse occupational health effects on aspartame workers have been conducted. The FDA should consider sponsoring a prospective epidemiologic study of aspartame workers."], ["Reducing exposure to dioxins and related compounds through foods in the next generation. Dioxins and related compounds are undesirable and unintended contaminants in the food supply, and dietary intake is the major route of exposure. Reducing dietary exposure to dioxins among the most vulnerable segments of the population (i.e., pregnant women, infants, and young girls) is an effective strategy for reducing body burdens in future generations. Exposure to dioxins through foods can be minimized by selecting lower-fat versions of meats, poultry, and dairy products. Consuming all foods, including fatty fish, in recommended amounts is congruent with the goal of reducing dioxin intake exposure and maintaining good health.", "Flavones and flavonols at dietary levels inhibit a transformation of aryl hydrocarbon receptor induced by dioxin. Dioxins invade the body mainly through the diet, and produce toxicity through the transformation of aryl hydrocarbon receptor (AhR). An inhibitor of the transformation should therefore protect against the toxicity and ideally be part of the diet. We examined flavonoids ubiquitously expressed in plant foods as one of the best candidates, and found that the subclasses flavones and flavonols suppressed antagonistically the transformation of AhR induced by 1 nM of 2,3,7,8-tetrachlorodibenzo-p-dioxin, without exhibiting agonistic effects that transform AhR. The antagonistic IC(50) values ranged from 0.14 to 10 microM, close to the physiological levels in human.", "An update on the dietary ligands of the AhR. BACKGROUND: Halogenated aromatic hydrocarbons including dioxins and non-halogenated polycyclic aromatic hydrocarbons are ligands of an aryl hydrocarbon receptor (AhR) and stimulate its transformation. Exposure to these environmental contaminants occurs mainly through diet. Recent articles demonstrated that certain food factors regulate the AhR transformation and expression of downstream drug-metabolizing enzymes. OBJECTIVE: To explain the actions of these food factors on the AhR transformation, as the mechanisms underlying are not fully understood. METHODS: This review introduces recent articles that have demonstrated the molecular mechanisms by which food factors regulate the AhR transformation and downstream drug-metabolizing enzymes. RESULTS/CONCLUSION: The role of classical ligands including dioxins as agonists of the receptor is well documented. As to the food factors, they act as antagonists because they basically suppress the AhR transformation by different mechanisms. Moreover, the fate and metabolism of food factors are important to understand their mechanisms.", "Dioxins (PCDD/Fs) and PCBs in offal: occurrence and dietary exposure. Offals are widely consumed in different cuisines, but information on the occurrence of dibenzo-p-dioxins, dibenzofurans (PCDD/Fs) and polychlorinated biphenyls (PCBs) in these foods is sparse. In the first structured investigation of its kind, this study reports levels of these contaminants in commonly consumed offals (n=173) such as lamb, ox, deer and pig's liver, kidneys, tongue and heart, and offal products such as p\u00e2t\u00e9, haggis, tripe and black pudding. The results support literature observations on the preferential accumulation of contaminants in liver tissue, as the highest concentrations of PCDD/Fs were observed in liver, relative to the other organs (e.g. 8.4 ng WHO-TEQ kg(-1) lamb liver compared to 1.1 ng WHO-TEQ kg(-1) lamb kidney and 1.27 ng WHO-TEQ kg(-1) lamb heart). Offal products generally showed lower contaminant levels which may be a result of processing or dilution. For most samples, the main contribution to WHO-TEQ arose from PCDD/Fs rather than PCBs. Just under half of the lamb liver samples showed PCDD/F concentrations that exceeded the EU maximum limit of 6 ng kg(-1) fat weight (although deer liver which is not subject to the regulation, generally showed higher levels). Dietary exposure estimates indicate that the weekly consumption of up to two 100g portions of lamb, ox, calf or pig liver or one portion of deer liver would not breach the tolerable daily intake (TDI) level even when the rest of the diet was included. However, the consumption of more than one portion of deer liver per week may lead to the TDI being exceeded. Crown Copyright \u00a9 2010. Published by Elsevier Ltd. All rights reserved.", "Impact of adopting a vegan diet or an olestra supplementation on plasma organochlorine concentrations: results from two pilot studies. The aim of these studies was to evaluate the potential of some nutritional approaches to prevent or reduce the body load of organochlorines (OC) in humans. Study 1 compared plasma OC concentrations between vegans and omnivores while study 2 verified if the dietary fat substitute olestra could prevent the increase in OC concentrations that is generally observed in response to a weight-reducing programme. In study 1, nine vegans and fifteen omnivores were recruited and the concentrations of twenty-six OC (beta-hexachlorocyclohexane (beta-HCH), p, p'-dichlorodiphenyldichloroethane (p, p'-DDE), p, p'-dichlorodiphenyltrichloroethane (p, p'-DDT), hexachlorobenzene, mirex, aldrin, alpha-chlordane, gamma-chlordane, oxychlordane, cis-nonachlor, trans-nonachlor, polychlorinated biphenyl (PCB) nos. 28, 52, 99, 101, 105, 118, 128, 138, 153, 156, 170, 180, 183 and 187, and aroclor 1260) were determined. In study 2, the concentrations of these twenty-six OC were measured before and after weight loss over 3 months in thirty-seven obese men assigned to one of the following treatments: standard group (33 % fat diet; n 13), fat-reduced group (25 % fat diet; n 14) or fat-substituted group (1/3 of dietary lipids substituted by olestra; n 10). In study 1, plasma concentrations of five OC compounds (aroclor 1260 and PCB 99, PCB 138, PCB 153 and PCB 180) were significantly lower in vegans compared with omnivores. In study 2, beta-HCH was the only OC which decreased in the fat-substituted group while increasing in the other two groups (P = 0.045). In conclusion, there was a trend toward lesser contamination in vegans than in omnivores, and olestra had a favourable influence on beta-HCH but did not prevent plasma hyperconcentration of the other OC during ongoing weight loss."], ["Neurocysticercosis in pregnancy: not just another headache. Infection with pork tapeworm, or Taenia solium, affects approximately 50 million people worldwide. The most important and potentially devastating form of the infestation, neurocysticercosis, occurs when the parasite invades the central nervous system. There has been a significant increase in the number of cases in the United States due to immigration from endemic areas. This case study of a pregnant woman in the 35th week of gestation exemplifies the serious consequences of this infection in pregnancy, and discusses an evidence-based approach to the diagnosis, treatment and eradication of this preventable disease. \u00a9 2012 AWHONN.", "Calcified neurocysticercosis among patients with primary headache. BACKGROUND: Anecdotal reports and a single case-control epidemiological survey have suggested an association between the helminthic disease neurocysticercosis and primary headache. The present study was undertaken to determine whether neurocysticercosis is more common among patients with primary headaches than in other neurological disorders. METHODS: We determined the prevalence of neurocysticercosis in a cohort of patients with primary headache who were seen at our institution over a 20-year period. We used as controls all people from the same cohort with four major different categories of neurological disorders, including cerebrovascular disease, degenerative disorders of the CNS, head trauma, and primary brain tumors. We evaluated differences in the prevalence of neurocysticercosis between patients and controls. RESULTS: Forty-eight of 1017 patients with primary headache and 31 of 1687 controls had neurocysticercosis (4.7% vs 1.8%, p\u2009<\u20090.0001). Calcified parenchymal brain cysticerci were more frequent among patients with primary headache than in those with cerebrovascular disease (4.7% vs 1%, p\u2009<\u20090.001), degenerative disorders of the CNS (4.7% vs 2.4%, p\u2009<\u20090.05), and head trauma (4.7% vs 2.3%, p\u2009<\u20090.05). There were no significant differences, however, for the subset of controls with primary brain tumors (4.7% vs 3.5%), a condition that has also been associated with neurocysticercosis. CONCLUSIONS: There is a relationship between calcified neurocysticercosis and primary headache disorders. It is possible that periodic remodeling of cysticercotic calcifications, with liberation of antigens to the brain parenchyma, contributes to the occurrence of headache in these patients.", "Freezing of infested pork muscle kills cysticerci. A method for culturing cysticerci that allows successful evagination and growth of scolexes from metacestodes of Taenia solium was used to study the survival of cysticerci subjected to low temperatures. Refrigeration of pork muscle infested with cysticerci at temperatures above 0 degrees C did not affect the parasites' survival in culture. Conversely, freezing of meat prevented survival of cysts. A practical procedure to kill cysticerci is the storage of pork muscle for four days at -5 degrees C, three days at -15 degrees C, or one day at -24 degrees C. These simple measures would help prevent the most frequent parasitosis of man's central nervous system.", "An outbreak of neurological autoimmunity with polyradiculoneuropathy in workers exposed to aerosolised porcine neural tissue: a descriptive study. BACKGROUND: Between November, 2006, and May, 2008, a subacute neurological syndrome affected workers from two swine abattoirs in Minnesota and Indiana who had occupational exposure to aerosolised porcine brain. We aimed to describe the pathogenic and immunological characteristics of this illness. METHODS: All patients from two abattoirs who presented or were referred to the Mayo Clinic (Rochester, MN, USA) with neurological symptoms were included. We recorded details of exposure to aerosolised brain tissue and did comprehensive neurological, laboratory, neuroimaging, electrophysiological, pathological, and autoimmune serological assessments. Healthy controls were recruited from the community and from workers at the plant in Minnesota. FINDINGS: 24 patients were identified (21 from Minnesota, three from Indiana). The shortest duration from first exposure to symptom onset was 4 weeks. No infectious agent that could trigger disease was identified. All patients developed polyradiculoneuropathy, which was usually sensory predominant and painful. Two patients had initial CNS manifestations: transverse myelitis and meningoencephalitis. Nerve conduction studies localised abnormalities to the most proximal and distal nerve segments. Quantitative sensory and autonomic testing revealed involvement of large and small sensory fibres and sweat fibres. MRI showed prominent abnormalities of roots and ganglia. Nerve biopsies identified mild demyelination, axonal degeneration, and perivascular inflammation. Protein concentrations were high in the CSF of 18 (86%) of 21 patients. Sera from all patients and 29 (34%) of 85 unaffected workplace controls (but none of 178 community controls) had a distinctive neural-reactive IgG; 75% of patients' sera contained an IgG specific to myelin basic protein. Seropositivity correlated directly with exposure risk in patients and controls. 17 patients required immunomodulatory therapies, six improved spontaneously, and one was lost to follow-up after exposure stopped. INTERPRETATION: The neurological disorder described is autoimmune in origin and is related to occupational exposure to multiple aerosolised porcine brain tissue antigens. The pattern of nerve involvement suggests vulnerability of nerve roots and terminals where the blood-nerve barrier is most permeable. FUNDING: Mayo Clinic Foundation; Minnesota Department of Health; Centers for Disease Control and Prevention. Copyright 2010 Elsevier Ltd. All rights reserved.", "Outbreak of progressive inflammatory neuropathy following exposure to aerosolized porcine neural tissue. In the fall of 2007, the Minnesota Department of Health was notified of 11 cases of an unexplained neurological illness, all linked to a pork processing plant, Quality Pork Processors, Inc., in Austin, MN. The cluster of workers had been experiencing similar symptoms, including fatigue, pain, numbness, and tingling in their extremities as well as weakness. The symptoms were described as more sensory than motor, and all patients had evidence of polyradiculoneuropathy with signs of nerve root irritation. An epidemiological investigation revealed that the only commonality between cases was their exposure to a pork brain extraction procedure involving compressed air. As relatives of the cases remained asymptomatic and all cultures for known pathogens were negative, the etiology of the syndrome seemed not to be infectious. Clinically, the syndrome was most akin to chronic inflammatory demyelinating polyneuropathy. Laboratory tests corroborated the clinical findings, revealing inflammation of peripheral nerves and nerve roots; however, these cases also had features clinically distinct from chronic inflammatory demyelinating polyneuropathy as well as laboratory testing revealing a novel immunoglobulin G immunostaining pattern. This suggested that the observed inflammation was the result of 1 or more unidentified antigens. This syndrome was ultimately dubbed progressive inflammatory neuropathy and was theorized to be an autoimmune reaction to aerosolized porcine neural tissue. Since the investigation's outset, 18 cases of progressive inflammatory neuropathy have been identified at the Minnesota pork processing plant, with 5 similar cases at an Indiana plant and 1 case at a Nebraskan plant. The plants in which cases have been identified have since stopped the use of compressed air in removing pork brains. All cases have stabilized or improved, with some requiring immunosuppressive and analgesic treatment. The study of progressive inflammatory neuropathy is ongoing, and the details of this investigation highlight the value of epidemiological principles in the identification and containment of outbreaks while researchers attempt to uncover the unique pathophysiology and potential etiology of the illness. Mt Sinai J Med 76:442-447, 2009. (c) 2009 Mount Sinai School of Medicine."], ["Pathobiological determinants of atherosclerosis in youth risk scores are associated with early and advanced atherosclerosis. OBJECTIVES: Atherosclerosis begins in childhood and progresses during adolescence and young adulthood. The Pathobiological Determinants of Atherosclerosis in Youth Study previously reported risk scores to estimate the probability of advanced atherosclerotic lesions in young individuals aged 15 to 34 years using the coronary heart disease risk factors (gender, age, serum lipoprotein concentrations, smoking, hypertension, obesity, and hyperglycemia). In this study we investigated the relation of these risk scores to the early atherosclerotic lesions. METHODS: We measured atherosclerotic lesions in the left anterior descending coronary artery, right coronary artery, and abdominal aorta and the coronary heart disease risk factors in persons 15 to 34 years of age who died as a result of external causes and were autopsied in forensic laboratories. RESULTS: Risk scores computed from the modifiable risk factors were associated with prevalence of microscopically demonstrable lesions of atherosclerosis (American Heart Association grade 1) in the left anterior descending coronary artery and with the extent of the earliest detectable gross lesion (fatty streaks) in the right coronary artery and abdominal aorta. Risk scores computed from the modifiable risk factors also were associated with prevalence of lesions of higher degrees of microscopic severity (intermediate as well as advanced) in the left anterior descending coronary artery and with extent of lesions of higher degrees of severity (intermediate and raised lesions) in the right coronary artery and abdominal aorta. CONCLUSIONS: Risk scores calculated from traditional coronary heart disease risk factors to identify individual young persons with high probability of having advanced atherosclerotic lesions also are associated with earlier atherosclerotic lesions, including the earliest anatomically demonstrable atherosclerotic lesion. These results support lifestyle modification in youth to prevent development of the initial lesions and the subsequent progression to advanced lesions and, thereafter, to prevent or delay coronary heart disease.", "Does childhood meat eating contribute to sex differences in risk factors for ischaemic heart disease in a developing population? BACKGROUND: A male epidemic of ischaemic heart disease (IHD) emerges with economic development. It has previously been hypothesised that this epidemic is due to nutritionally driven levels of pubertal sex steroids, which lead to a more atherogenic body shape and lipid profile in boys but not girls, without any sex-specific effects on glucose metabolism. This study tests this hypothesis by examining the association of childhood meat eating with IHD risk in a developing Chinese population. METHODS: Multivariable linear and censored regression was used in a cross-sectional study of 19,418 Chinese older (\u2265 50 years) men and women from the Guangzhou Biobank Cohort Study (phases 2 and 3) to assess the adjusted associations of childhood meat eating with waist to hip ratio (WHR), high-density lipoprotein cholesterol and fasting plasma glucose. RESULTS: Adjusted for age, childhood hunger, life-course socioeconomic position and current lifestyle childhood almost daily meat eating compared with less than weekly meat eating was associated with higher WHR (0.007, 95% CI 0.0003 to 0.01) in men but not women. No association with fasting glucose was observed. CONCLUSIONS: Given the potential limitations of this study, especially the crude nature of the exposure and modest findings, the results should be considered as preliminary. However, they do lend support to the hypothesis that the male epidemic of premature IHD and sexual divergence in IHD rates that occur with economic development may be nutritionally driven in childhood. In elucidating the developmental origins of non-communicable chronic diseases, more attention should be focused on the sociohistorical context and the role of puberty.", "Relation of serum lipoprotein levels and systolic blood pressure to early atherosclerosis. The Bogalusa Heart Study. We assessed the relation of risk factors for cardiovascular disease to early atherosclerotic lesions in the aorta and coronary arteries in 35 persons (mean age at death, 18 years). Aortic involvement with fatty streaks was greater in blacks than in whites (37 vs. 17 percent, P less than 0.01). However, aortic fatty streaks were strongly related to antemortem levels of both total and low-density lipoprotein cholesterol (r = 0.67, P less than 0.0001 for each association), independently of race, sex, and age, and were inversely correlated with the ratio of high-density lipoprotein cholesterol to low-density plus very-low-density lipoprotein cholesterol (r = -0.35, P = 0.06). Coronary-artery fatty streaks were correlated with very-low-density lipoprotein cholesterol (r = 0.41, P = 0.04). Mean systolic blood-pressure levels also tended to be higher in the four subjects with coronary-artery fibrous plaques than in those without them: 112 mm Hg as compared with 104 (P = 0.09). These results document the importance of risk-factor levels to early anatomical changes in the aorta and coronary arteries. The progression of fatty streaks to fibrous plaques is uncertain, but these data suggest that a rational approach to the prevention of cardiovascular disease should begin early in life.", "High high-density-lipoprotein cholesterol in African children and adults in a population free of coronary heart diseae. The serum concentration of high-density lipoprotein cholesterol and the proportion it constitutes of total serum cholesterol are high in children and low in sufferers from coronary heart disease (CHD). Studies in elderly black Africans in Western Transvaal showed them to be free of CHD. HDL concentrations measured at birth and in groups of 10- to 12-year-olds, 16- to 18-year olds, and 60- to 69-year-olds showed mean values of 0.96, 1.71, 1.58, and 1.94 mmol/l (36, 66, 61, and 65 mg/100 ml) respectively; these concentrations constitued about 56%, 54%, and 45%, and 47%, of total cholesterol. Values thus did not fall from youth to age as they did in whites. Rural South African blacks live on a diet high in fibre and low in animal protein and fat; children are active; and adults remain active even when old. These high values of HDL may well be representative for a population that is active, used to a frugal traditional diet, and free from CHD.", "Is very preterm birth a risk factor for adult cardiometabolic disease? The first infants to experience modern pre- and neonatal care are now in their thirties, an age at which the incidence of cardiometabolic disease is low. However, data from cohorts born preterm prior to the introduction of modern care suggest an increased risk of type 2 diabetes. For young adult cohorts of former very small or very preterm infants, there is accumulating evidence of increased risk factors for later cardiovascular disease, including higher blood pressure, lower lean body mass, impaired glucose regulation, and perhaps a more atherogenic lipid profile. Regarding lifestyle, adults born very small or very preterm undertake less non-conditioning physical activity and may have a lower intake of fruit and milk products. Any intervention reducing risk factors, in particular blood pressure and low physical activity, would have a substantial potential to reduce the lifetime disease burden in small preterm infants. There are now enough data to warrant an expert evaluation of the level of evidence for cardiometabolic disease in individuals born very small or very preterm, which has possible public health implications. Copyright \u00a9 2013 Elsevier Ltd. All rights reserved."], ["Artificial food dyes and attention deficit hyperactivity disorder. Attention deficit hyperactivity disorder (ADHD) is one of the most common behavioral disorders in children. Symptoms of ADHD include hyperactivity, low frustration tolerance, impulsivity, and inattention. While the biological pathways leading to ADHD are not clearly delineated, a number of genetic and environmental risk factors for the disorder are recognized. In the early 1970s, research conducted by Dr. Benjamin Feingold found that when hyperactive children were given a diet free of artificial food additives and dyes, symptoms of hyperactivity were reduced. While some clinical studies supported these findings, more rigorous empirical studies conducted over the next 20 years were less positive. As a result, research on the role of food additives in contributing to ADHD waned. In recent years, however, interest in this area has revived. In response to more recent research and public petitions, in December 2009 the British government requested that food manufacturers remove most artificial food dyes from their products. While these strictures could have positive effects on behavior, the removal of food dyes is not a panacea for ADHD, which is a multifaceted disorder with both biological and environmental underpinnings. \u00a9 2011 International Life Sciences Institute.", "Dietary sensitivities and ADHD symptoms: thirty-five years of research. Artificial food colors (AFCs) have not been established as the main cause of attention-deficit hyperactivity disorder (ADHD), but accumulated evidence suggests that a subgroup shows significant symptom improvement when consuming an AFC-free diet and reacts with ADHD-type symptoms on challenge with AFCs. Of children with suspected sensitivities, 65% to 89% reacted when challenged with at least 100 mg of AFC. Oligoantigenic diet studies suggested that some children in addition to being sensitive to AFCs are also sensitive to common nonsalicylate foods (milk, chocolate, soy, eggs, wheat, corn, legumes) as well as salicylate-containing grapes, tomatoes, and orange. Some studies found \\\"cosensitivity\\\" to be more the rule than the exception. Recently, 2 large studies demonstrated behavioral sensitivity to AFCs and benzoate in children both with and without ADHD. A trial elimination diet is appropriate for children who have not responded satisfactorily to conventional treatment or whose parents wish to pursue a dietary investigation.", "Synthetic Food Colors and Neurobehavioral Hazards: The View from Environmental Health Research Background: The proposition that synthetic food colors can induce adverse behavioral effects in children was first enunciated in 1975 by Feingold [Why Your Child Is Hyperactive. New York:Random House (1975)], who asserted that elevated sensitivity to food additives underlies the signs of hyperactivity observed in some children. Although the evidence suggested that some unknown proportion of children did respond to synthetic food colors, the U.S. Food and Drug Administration (FDA) interpreted the evidence as inconclusive. A study published in 2007 [McCann et al. Food additives and hyperactive behaviour in 3-year-old and 8/9-year-old children in the community: a randomised, double-blinded, placebo-controlled trial. Lancet 370:1560\u20131567 (2007)] drew renewed attention to the hypothesis because of the study\u2019s size and scope. It led the FDA to review the evidence, hold a public hearing, and seek the advice of its Food Advisory Committee. In preparation for the hearing, the FDA reviewed the available evidence and concluded that it did not warrant further agency action. Objectives: In this commentary I examine the basis of the FDA\u2019s position, the elements of the review that led to its decision and that of the Food Advisory Committee, and the reasons that this is an environmental health issue. Discussion: The FDA review confined itself, in essence, to the clinical diagnosis of hyperactivity, as did the charge to the committee, rather than asking the broader environmental question of behavioral effects in the general population; it failed to recognize the significance of vulnerable subpopulations; and it misinterpreted the meaning of effect size as a criterion of risk. The FDA\u2019s response would have benefited from adopting the viewpoints and perspectives common to environmental health research. At the same time, the food color debate offers a lesson to environmental health researchers; namely, too narrow a focus on a single outcome or criterion can be misleading.", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "Food additives and hyperactive behaviour in 3-year-old and 8/9-year-old children in the community: a randomised, double-blinded, placebo-controlled... BACKGROUND: We undertook a randomised, double-blinded, placebo-controlled, crossover trial to test whether intake of artificial food colour and additives (AFCA) affected childhood behaviour. METHODS: 153 3-year-old and 144 8/9-year-old children were included in the study. The challenge drink contained sodium benzoate and one of two AFCA mixes (A or B) or a placebo mix. The main outcome measure was a global hyperactivity aggregate (GHA), based on aggregated z-scores of observed behaviours and ratings by teachers and parents, plus, for 8/9-year-old children, a computerised test of attention. This clinical trial is registered with Current Controlled Trials (registration number ISRCTN74481308). Analysis was per protocol. FINDINGS: 16 3-year-old children and 14 8/9-year-old children did not complete the study, for reasons unrelated to childhood behaviour. Mix A had a significantly adverse effect compared with placebo in GHA for all 3-year-old children (effect size 0.20 [95% CI 0.01-0.39], p=0.044) but not mix B versus placebo. This result persisted when analysis was restricted to 3-year-old children who consumed more than 85% of juice and had no missing data (0.32 [0.05-0.60], p=0.02). 8/9-year-old children showed a significantly adverse effect when given mix A (0.12 [0.02-0.23], p=0.023) or mix B (0.17 [0.07-0.28], p=0.001) when analysis was restricted to those children consuming at least 85% of drinks with no missing data. INTERPRETATION: Artificial colours or a sodium benzoate preservative (or both) in the diet result in increased hyperactivity in 3-year-old and 8/9-year-old children in the general population."], ["Ambient odor of orange in a dental office reduces anxiety and improves mood in female patients. Essential oils have been used as remedies for a long time in different cultures across the world. However, scientific proof of such application is scarce. We included 72 patients between the ages of 22 and 57 while waiting for dental treatment in our study. The participants were assigned to either a control group (14 men, 23 women) or to an odor group (18 men and 17 women). Ambient odor of orange was diffused in the waiting room through an electrical dispenser in the odor group whereas in the control group no odor was in the air. We assessed by means of self-report demographic and cognitive variables, trait and state anxiety, and current pain, mood, alertness, and calmness. In this study, we report that exposure to ambient odor of orange has a relaxant effect. Specifically, compared to the controls, women who were exposed to orange odor had a lower level of state anxiety, a more positive mood, and a higher level of calmness. Our data support the previous notion of sedative properties of the natural essential oil of orange (Citrus sinensis).", "TRP channel blamed for burning cold after a tropical fish meal EMBO J (2012) 31 19, 3795\u20133808 doi:10.1038/emboj.2012.207; published online July312012 Ciguatera is one of the most common forms of food poisoning, occurring after consumption of fish contaminated with ciguatoxins. New work by Vetter et al (2012) reveals the key molecular players that underlie the altered temperature sensation associated with ciguatera. In particular, they show that ciguatoxins act on sensory neurons that express TRPA1, an ion channel implicated in the detection of noxious cold.", "Dietary citric acid enhances absorption of aluminum in antacids. Ten healthy men ingested, twice daily between meals, during each of the seven-day experimental periods: (a) citric acid (as lemon juice), (b) Al(OH)3, or (c) Al(OH)3 + citric acid. Whole blood sampled after each dietary period was analyzed electrothermally after digestion with nitric acid. Moderate, but significant, increases in mean Al concentrations as compared with pretreatment values [5 (SD 3) micrograms of Al per liter] were seen after ingestion of either citric acid or Al(OH)3: 9 (SD 4) and 12 (SD 3) micrograms/L, respectively. Ingestion of both Al(OH)3 and citric acid resulted in a more pronounced, highly significant (p less than 0.001) increase in Al concentrations, to 23 (SD 2) micrograms Al/L, probably owing to formation and absorption of Al-citrate complexes.", "Gargling for Oral Hygiene and the Development of Fever in Childhood: A Population Study in Japan Background Fever is one of the most common symptoms among children and is usually caused by respiratory infections. Although Japanese health authorities have long recommended gargling to prevent respiratory infections, its effectiveness among children is not clear. Methods The children in this observational study were enrolled from 145 nursery schools in Fukuoka City, Japan. Children in the exposure group were instructed to gargle at least once a day. The endpoints of this study were incidence of fever during the daytime and incidence of sickness absence. Differences among gargling agents for each endpoint were also analyzed. Results A total of 19 595 children aged 2 to 6 years were observed for 20 days (391 900 person-days). In multivariate logistic regression, the overall odds ratio (OR) for fever onset in the gargling group was significantly lower (OR = 0.68). In age-stratified analysis, ORs were significantly lower at age 2 (OR = 0.67), 4 (OR = 0.46), and 5 (OR = 0.41) years. Regarding sickness absence, the overall OR was 0.92 (not significant) in the gargling group. In age-stratified analysis, ORs were significantly lower at age 4 (OR = 0.68), 5 (OR = 0.59), and 6 (OR = 0.63) years. In subgroup analysis, significantly lower ORs for fever onset were observed for children who gargled with green tea (OR = 0.32), functional water (OR = 0.46), or tap water (OR = 0.70). However, the ORs were not significant for sickness absence. Conclusions Gargling might be effective in preventing febrile diseases in children.", "Strawberry fields forever? On the basis of copious preclinical data supporting the preventive efficacy of small fruits such as berries and grapes, Chen and colleagues conducted a randomized (noncomparative) phase II trial evaluating two doses of strawberry powder (60 g/d or 30 g/d for six months) to prevent esophageal cancer in China (reported in this issue of the journal, beginning on page 41); 60 g/d reduced the histologic grade of dysplastic lesions and reduced localized biomarkers, whereas 30 g/d was not effective. Fundamental questions remain such as the best formulation of strawberry powder, the active components associated with powder, and the actual mechanism of action, and standardized preparations will be required to permit the widespread use of strawberry powder with a predicable outcome. Clearly, however, this work is a good example of proof-of-principle and highlights the important role of diet, nutrition, and natural products in cancer prevention. \u00a92012 AACR."], ["Tumor Angiogenesis as a Target for Dietary Cancer Prevention Between 2000 and 2050, the number of new cancer patients diagnosed annually is expected to double, with an accompanying increase in treatment costs of more than $80 billion over just the next decade. Efficacious strategies for cancer prevention will therefore be vital for improving patients' quality of life and reducing healthcare costs. Judah Folkman first proposed antiangiogenesis as a strategy for preventing dormant microtumors from progressing to invasive cancer. Although antiangiogenic drugs are now available for many advanced malignancies (colorectal, lung, breast, kidney, liver, brain, thyroid, neuroendocrine, multiple myeloma, myelodysplastic syndrome), cost and toxicity considerations preclude their broad use for cancer prevention. Potent antiangiogenic molecules have now been identified in dietary sources, suggesting that a rationally designed antiangiogenic diet could provide a safe, widely available, and novel strategy for preventing cancer. This paper presents the scientific, epidemiologic, and clinical evidence supporting the role of an antiangiogenic diet for cancer prevention.", "A wholly nutritional 'multifocal angiostatic therapy' for control of disseminated cancer. A great deal of effort is now being devoted to the development of new drugs that hopefully will control the spread of inoperable cancer by safely inhibiting tumor-evoked angiogenesis. However, there is growing evidence that certain practical nutritional measures have the potential to slow tumor angiogenesis, and it is reasonable to anticipate that, by combining several measures that work in distinct but complementary ways to impede the angiogenic process, a clinically useful 'multifocal angiostatic therapy' (MAT) might be devised. Several measures which might reasonably be included in such a protocol are discussed below, and include: a low-fat, low-glycemic index vegan diet, which may down-regulate the systemic IGF-I activity that supports angiogenesis; supplemental omega-3-rich fish oil, which has been shown to inhibit endothelial expression of Flk-1, a functionally crucial receptor for VEGF, and also can suppress tumor production of pro-angiogenic eicosanoids; high-dose selenium, which has recently been shown to inhibit tumor production of VEGF; green tea polyphenols, which can suppress endothelial responsiveness to both VEGF and fibroblast growth factor; and high-dose glycine, whose recently reported angiostatic activity may reflect inhibition of endothelial cell mitosis, possibly mediated by activation of glycine-gated chloride channels. In light of evidence that tumor-evoked angiogenesis has a high requirement for copper, copper depletion may have exceptional potential as an angiostatic measure, and is most efficiently achieved with the copper-chelating drug tetrathiomolybdate. If logistical difficulties make it difficult to acquire this experimental drug, high-dose zinc supplementation can achieve a slower depletion of the body's copper pool, and in any case can be used as maintenance therapy to maintain an adequate level of copper depletion. A provisional protocol is offered for a nutritionally based MAT entailing a vegan diet and supplemental intakes of fish oil, selenium, green tea polyphenols, glycine, and zinc. Inasmuch as cox-2 is overexpressed in many cancers, and cAMP can boost tumor production of various angiogenic factors as well as autogenous growth factors, adjunctive use of cox-2-specific NSAIDS may be warranted in some cases.", "Anti-angiogenic activity of inositol hexaphosphate (IP6). A significant anticancer activity of the naturally occurring carbohydrate inositol hexaphosphate (IP(6)) has been reported against numerous cancer models. Since tumors require angiogenesis for growth and metastasis, we hypothesize that IP(6) reduces tumor growth by inhibiting angiogenesis. Because angiogenesis depends on the interaction between endothelial and tumor cells, we investigated the effect of IP(6) on both. IP(6) inhibited the proliferation and induced the differentiation of endothelial cells in vitro; the growth of bovine aortic endothelial cells (BAECs) evaluated by MTT proliferation assay was inhibited in a dose-dependent manner (IC(50) = 0.74 mM). The combination of IP(6) and vasostatin, a calreticulin fragment with anti-angiogenic activity, was synergistically superior in growth inhibition than either compound. IP(6) inhibited human umbilical vein endothelial cell (HUVEC) tube formation (in vitro capillary differentiation) on a reconstituted extracellular matrix, Matrigel, and disrupted pre-formed tubes. IP(6) significantly reduced basic fibroblast growth factor (bFGF)-induced vessel formation (P < 0.01) in vivo in Matrigel plug assay. Exposure of HepG2, a human hepatoma cell line, to IP(6) for 8 h, resulted in a dose-dependent decrease in the mRNA levels of vascular endothelial growth factor (VEGF), as assessed by RT-PCR. IP(6) treatment of HepG2 cells for 24 h also significantly reduced the VEGF protein levels in conditioned medium, in a concentration-dependent manner (P = 0.012). Thus, IP(6) has an inhibitory effect on induced angiogenesis.", "Diet-derived polyphenols inhibit angiogenesis by modulating the interleukin-6/STAT3 pathway. Several epidemiological studies have indicated that abundant consumption of foods from plant origin is associated with a reduced risk of developing several types of cancers. This chemopreventive effect is related to the high content of these foods in phytochemicals, such as polyphenols, that interfere with several processes involved in cancer progression including tumor cell growth, survival and angiogenesis. In addition to the low intake of plant-based foods, increased body mass and physical inactivity have recently emerged as other important lifestyle factors influencing cancer risk, leading to the generation of low-grade chronic inflammatory conditions which are a key process involved in tumor progression. The objectives of the current study are to investigate the inhibitory effects of these polyphenols on angiogenesis triggered by an inflammatory cytokine (IL-6) and to determine the mechanisms underlying this action. We found that, among the tested polyphenols, apigenin and luteolin were the most potent angiogenesis inhibitors through their inhibitory effect on the inflammatory cytokine IL-6/STAT3 pathway. These effects resulted in modulation of the activation of extracellular signal-regulated kinase-1/2 signaling triggered by IL-6, as well as in a marked reduction in the proliferation, migration and morphogenic differentiation of endothelial cells. Interestingly, these polyphenols also modulated the expression of IL-6 signal transducing receptor (IL-6R\u03b1) and the secretion of the extracellular matrix degrading enzyme MMP-2 as well as the expression of suppressor of cytokine signaling (SOCS3) protein. Overall, these results may provide important new information on the role of diet in cancer prevention. Copyright \u00a9 2012 Elsevier Inc. All rights reserved.", "The flip side of immune surveillance: immune dependency. The growths of many and perhaps all tumors may be stimulated rather than inhibited by a quantitatively low level of immunity. The reason tumors have antigens may be that tumors do not develop in vivo in the absence of at least a minimal immune reaction; in this sense, cancer may be considered an autoimmune disease. This review, based largely on the work of our own laboratory, outlines the data showing that the titration of anti-tumor immunity exhibits the phenomenon of hormesis, i.e. the dose-response curve is non-linear such that low levels of immunity are generally stimulatory but larger quantities of the same immune reactants may inhibit tumor growth. Evidence is also reviewed that suggests that the immune response may vary qualitatively and quantitatively during progression, such that there seems to be, during oncogenesis, a very low level of immune reaction that aids initial tumor growth, followed by a larger reaction that may cause remission of early neoplasms, followed, if the neoplasm survives, by a relative immunologic tolerance to the tumor that may be dependent, at least in part, on suppressor cells. This knowledge may help to explain some clinical observations concerning the relationships among tumor types and the organ distribution of metastases."], ["Projected cancer risks from computed tomographic scans performed in the United States in 2007. BACKGROUND: The use of computed tomographic (CT) scans in the United States (US) has increased more than 3-fold since 1993 to approximately 70 million scans annually. Despite the great medical benefits, there is concern about the potential radiation-related cancer risk. We conducted detailed estimates of the future cancer risks from current CT scan use in the US according to age, sex, and scan type. METHODS: Risk models based on the National Research Council's \\\"Biological Effects of Ionizing Radiation\\\" report and organ-specific radiation doses derived from a national survey were used to estimate age-specific cancer risks for each scan type. These models were combined with age- and sex-specific scan frequencies for the US in 2007 obtained from survey and insurance claims data. We estimated the mean number of radiation-related incident cancers with 95% uncertainty limits (UL) using Monte Carlo simulations. RESULTS: Overall, we estimated that approximately 29 000 (95% UL, 15 000-45 000) future cancers could be related to CT scans performed in the US in 2007. The largest contributions were from scans of the abdomen and pelvis (n = 14 000) (95% UL, 6900-25 000), chest (n = 4100) (95% UL, 1900-8100), and head (n = 4000) (95% UL, 1100-8700), as well as from chest CT angiography (n = 2700) (95% UL, 1300-5000). One-third of the projected cancers were due to scans performed at the ages of 35 to 54 years compared with 15% due to scans performed at ages younger than 18 years, and 66% were in females. CONCLUSIONS: These detailed estimates highlight several areas of CT scan use that make large contributions to the total cancer risk, including several scan types and age groups with a high frequency of use or scans involving relatively high doses, in which risk-reduction efforts may be warranted.", "Radiation and chest CT scan examinations: what do we know? In the past 3 decades, the total number of CT scans performed has grown exponentially. In 2007, > 70 million CT scans were performed in the United States. CT scan studies of the chest comprise a large portion of the CT scans performed today because the technology has transformed the management of common chest diseases, including pulmonary embolism and coronary artery disease. As the number of studies performed yearly increases, a growing fraction of the population is exposed to low-dose ionizing radiation from CT scan. Data extrapolated from atomic bomb survivors and other populations exposed to low-dose ionizing radiation suggest that CT scan-associated radiation may increase an individual's lifetime risk of developing cancer. This finding, however, is not incontrovertible. Because this topic has recently attracted the attention of both the scientific community and the general public, it has become increasingly important for physicians to understand the cancer risk associated with CT scan and be capable of engaging in productive dialogue with patients. This article reviews the current literature on the public health debate surrounding CT scan and cancer risk, quantifies radiation doses associated with specific studies, and describes efforts to reduce population-wide CT scan-associated radiation exposure. CT scan examinations of the chest, including CT scan pulmonary and coronary angiography, high-resolution CT scan, low-dose lung cancer screening, and triple rule-out CT scan, are specifically considered.", "Estimated risks of radiation-induced fatal cancer from pediatric CT. OBJECTIVE: In light of the rapidly increasing frequency of pediatric CT examinations, the purpose of our study was to assess the lifetime cancer mortality risks attributable to radiation from pediatric CT. MATERIALS AND METHODS: Organ doses as a function of age-at-diagnosis were estimated for common CT examinations, and estimated attributable lifetime cancer mortality risks (per unit dose) for different organ sites were applied. Standard models that assume a linear extrapolation of risks from intermediate to low doses were applied. On the basis of current standard practice, the same exposures (milliampere-seconds) were assumed, independent of age. RESULTS: The larger doses and increased lifetime radiation risks in children produce a sharp increase, relative to adults, in estimated risk from CT. Estimated lifetime cancer mortality risks attributable to the radiation exposure from a CT in a 1-year-old are 0.18% (abdominal) and 0.07% (head)-an order of magnitude higher than for adults-although those figures still represent a small increase in cancer mortality over the natrual background rate. In the United States, of approximately 600,000 abdominal and head CT examinations annually performed in children under the age of 15 years, a rough estimate is that 500 of these individuals might ultimately die from cancer attributable to the CT radiation. CONCLUSION: The best available risk estimates suggest that pediatric CT will result in significantly increased lifetime radiation risk over adult CT, both because of the increased dose per milliampere-second, and the increased lifetime risk per unit dose. Lower milliampere-second settings can be used for children without significant loss of information. Although the risk-benefit balance is still strongly tilted toward benefit, because the frequency of pediatric CT examinations is rapidly increasing, estimates that quantitative lifetime radiation risks for children undergoing CT are not negligible may stimulate more active reduction of CT exposure settings in pediatric patients.", "Radiation dose from contemporary cardiothoracic multidetector CT protocols with an anthropomorphic female phantom: implications for cancer induction. PURPOSE: To measure prospectively and directly both organ dose and effective dose (ED) for adult cardiac and pulmonary computed tomographic (CT) angiography by using current clinical protocols for 64-detector CT in an anthropomorphic female phantom and to estimate lifetime attributable risk of breast and lung cancer incidence on the basis of measured ED and organ dose. MATERIALS AND METHODS: Cardiac and pulmonary 64-detector CT angiography was performed by using current clinical protocols to evaluate the pulmonary veins (electrocardiographically [ECG] gated, 64 sections at 0.625-mm collimation, 120 kVp, 300 mA, 0.35-second tube rotation), native coronary arteries (ECG gated; 64 sections at 0.625 mm; 120 kVp; maximum current, 500-750 mA; minimum, 100-350 mA; 0.35-second tube rotation) and pulmonary embolus (64 sections at 1.25 mm, 140 kVp, 645 mA, 0.5-second tube rotation). Absorbed organ doses were measured by using an anthropomorphic female phantom and metal oxide semiconductor field effect transistor detectors. ED was calculated from measured organ doses and the dose-length product. RESULTS: ED for current adult cardiac and pulmonary 64-detector CT angiography protocols were 12.4-31.8 mSv. Overall, skin, breast, and esophagus and heart had the highest recorded absorbed organ doses. Relative risk for breast cancer incidence for girls and women was 1.004-1.042 for a single examination. Relative risk for lung cancer incidence for men and women was 1.005-1.076 from a single examination. CONCLUSION: EDs and organ doses from 64-detector CT are higher than those previously reported for adult cardiac and pulmonary CT angiography protocols. Risk for breast and lung cancer induction from these studies is greatest for the younger patient population. (c) RSNA, 2007.", "Pediatric CT research elevates public health concerns: low-dose radiation issues are highly politicized. This article presents an analysis of issues related to low-dose radiation, with a focus on pediatric computed tomography (CT). It references several early studies that are seldom quoted in radiation research papers, then quantifies the excess lifetime fatal cancer yield attributable to an estimated 6.5 million pediatric abdominal CT scans. The authors highlight an important policy document issued jointly by the National Cancer Institute and the Society for Pediatric Radiology--specifically, its conclusion that a small dose from CT represents \\\"a public health concern.\\\" Finally, the article identifies several contentious issues and proposes policy initiatives that, if implemented, could result in significant reductions of future radiogenic cancers and chronic injuries. The authors call for discussions between professional radiology societies and public interest health organizations, thereby involving all stakeholders."], ["Randomised, double-blind and placebo-controlled study using new probiotic lactobacilli for strengthening the body immune defence against viral infe... BACKGROUND: The aim of this study was to investigate whether consumption of Lactobacillus plantarum HEAL 9 (DSM 15312) and Lactobacillus paracasei 8700:2 (DSM 13434) could affect naturally acquired common cold infections in healthy subjects. METHODS: A randomised, parallel, double-blind placebo-controlled study was performed to investigate whether intake of this probiotic mixture could reduce the risk of common cold episodes, number of days with common cold symptoms, frequency and severity of symptoms, and cellular immune response in common cold infections. A total of 272 subjects were supplemented daily with either 10(9) cfu (colony forming units) of probiotics (N = 135) or control (N = 137) for a 12-week period. RESULTS: The incidence of acquiring one or more common cold episode was reduced from 67% in the control group to 55% in the probiotic group (p < 0.05). Also, the number of days with common cold symptoms were significantly (p < 0.05) reduced from 8.6 days in the control group to 6.2 days, in the probiotic group, during the 12-week period. The total symptom score was reduced during the study period from a mean of 44.4 for the control group to 33.6 for the probiotic group. The reduction in pharyngeal symptoms was significant (p < 0.05). In addition, the proliferation of B lymphocytes was significantly counteracted in the probiotic group (p < 0.05) in comparison with the control group. CONCLUSION: In conclusion, intake of the probiotic strains Lactobacillus plantarum HEAL 9 (DSM 15312) and Lactobacillus paracasei 8700:2 (DSM 13434) reduces the risk of acquiring common cold infections.", "Probiotics for preventing acute upper respiratory tract infections. BACKGROUND: Probiotics may improve a person's health by regulating their immune function. Some studies show that probiotic strains can prevent respiratory infections. However, no evidence of the benefits of probiotics for acute upper respiratory tract infections (URTIs) and related potential adverse effects has been published. OBJECTIVES: To assess the effectiveness and safety of probiotics for preventing acute URTIs. SEARCH STRATEGY: We searched the Cochrane Central Register of Controlled Trials (CENTRAL) (The Cochrane Library 2011, Issue 2), which includes the Cochrane Acute Respiratory Infections Group's Specialised Register, MEDLINE (Ovid) (1950 to May week 1, 2011), EMBASE (1974 to May 2011), Web of Science which includes Science Citation Index (from 1900 to May 2011) and Conference Proceedings Citation Index (from 1991 to May 2011), the Chinese Biomedical Literature Database, which includes the China Biological Medicine Database (from 1978 to May 2011), the Chinese Medicine Popular Science Literature Database (from 2000 to May 2011) and the Masters Degree Dissertation of Beijing Union Medical College Database (from 1981 to May 2011). SELECTION CRITERIA: Randomised controlled trials (RCTs) comparing probiotics with placebo to prevent acute URTIs. DATA COLLECTION AND ANALYSIS: Two review authors independently assessed eligibility, quality of trials and extracted data. MAIN RESULTS: We included 14 RCTs, although we could only extract available data to meta-analyse in 10 trials which involved 3451 participants. We found that probiotics were better than placebo when measuring the number of participants experiencing episodes of acute URTI: at least one episode: odds ratio (OR) 0.58; 95% confidence interval (CI) 0.36 to 0.92; at least three episodes: OR 0.53; 95% CI 0.36 to 0.80; rate ratio of episodes of acute URTI: rate ratio 0.88; 95% CI 0.81 to 0.96; and reduced antibiotic prescription rates for acute URTIs: OR 0.67; 95% CI 0.45 to 0.98. Probiotics and placebo were similar when measuring the mean duration (MD) of an episode of acute URTI: MD -0.29; 95% CI -3.71 to 3.13 and adverse events: OR 0.92; 95% CI 0.37 to 2.28. Side effects of probiotics were minor and gastrointestinal symptoms were the most common. We found that some subgroups had a high level of heterogeneity when conducting pooled analyses. AUTHORS' CONCLUSIONS: Probiotics were better than placebo in reducing the number of participants experiencing episodes of acute URTIs, the rate ratio of episodes of acute URTI and reducing antibiotic use. This indicates that probiotics may be more beneficial than placebo for preventing acute URTIs. However, the results have some limitations and there were no data for older people.", "Probiotic effects on cold and influenza-like symptom incidence and duration in children. OBJECTIVE: Probiotic consumption effects on cold and influenza-like symptom incidence and duration were evaluated in healthy children during the winter season. METHODS: In this double-blind, placebo-controlled study, 326 eligible children (3-5 years of age) were assigned randomly to receive placebo (N = 104), Lactobacillus acidophilus NCFM (N = 110), or L acidophilus NCFM in combination with Bifidobacterium animalis subsp lactis Bi-07 (N = 112). Children were treated twice daily for 6 months. RESULTS: Relative to the placebo group, single and combination probiotics reduced fever incidence by 53.0% (P = .0085) and 72.7% (P = .0009), coughing incidence by 41.4% (P = .027) and 62.1% (P = .005), and rhinorrhea incidence by 28.2% (P = .68) and 58.8% (P = .03), respectively. Fever, coughing, and rhinorrhea duration was decreased significantly, relative to placebo, by 32% (single strain; P = .0023) and 48% (strain combination; P < .001). Antibiotic use incidence was reduced, relative to placebo, by 68.4% (single strain; P = .0002) and 84.2% (strain combination; P < .0001). Subjects receiving probiotic products had significant reductions in days absent from group child care, by 31.8% (single strain; P = .002) and 27.7% (strain combination; P < .001), compared with subjects receiving placebo treatment. CONCLUSION: Daily dietary probiotic supplementation for 6 months was a safe effective way to reduce fever, rhinorrhea, and cough incidence and duration and antibiotic prescription incidence, as well as the number of missed school days attributable to illness, for children 3 to 5 years of age.", "Yeast (1,3)-(1,6)-beta-glucan helps to maintain the body\u2019s defence against pathogens: a double-blind, randomized, placebo-controlled, multicentric study in healthy subjects Purpose The effect of brewers\u2019 yeast (1,3)-(1,6)-beta-d-glucan consumption on the number of common cold episodes in healthy subject was investigated. Methods In a placebo-controlled, double-blind, randomized, multicentric clinical trial, 162 healthy participants with recurring infections received 900\u00a0mg of either placebo (n\u00a0=\u00a081) or an insoluble yeast (1,3)-(1,6)-beta-d-glucan preparation (n\u00a0=\u00a081) per day over a course of 16\u00a0weeks. Subjects were instructed to document each occurring common cold episode in a diary and to rate ten predefined infection symptoms during an infections period, resulting in a symptom score. The subjects were examined by the investigator during the episode visit on the 5th day of each cold episode. Results In the per protocol population, supplementation with insoluble yeast (1,3)-(1,6)-beta-glucan reduced the number of symptomatic common cold infections by 25\u00a0% as compared to placebo (p\u00a0=\u00a00.041). The mean symptom score was 15\u00a0% lower in the beta-glucan as opposed to the placebo group (p\u00a0=\u00a00.125). Beta-glucan significantly reduced sleep difficulties caused by cold episode as compared to placebo (p\u00a0=\u00a00.028). Efficacy of yeast beta-glucan was rated better than the placebo both by physicians (p\u00a0=\u00a00.004) participants (p\u00a0=\u00a00.012). Conclusion The present study demonstrated that yeast beta-glucan preparation increased the body\u2019s potential to defend against invading pathogens.", "Effects of intestinal microflora and the environment on the development of asthma and allergy. The aim of previous research into the causes of allergic diseases, including asthma was mostly to identify potential risk factors in the environment. No major risk factors have been identified, however. Over the past 10 years, focus has, therefore, more been directed towards protective factors that could enhance the development of tolerance to allergens which were previously encountered early in life, but are now lost in modern affluent societies. In particular, the role of childhood infections has been discussed, but so far these studies have not been conclusive. Recent epidemiological studies and experimental research suggest that the microbial environment and exposure to microbial products in infancy modifies immune responses and enhances the development of tolerance to ubiquitous allergens. The intestinal microflora may play a particular role in this respect, as it is the major external driving force in the maturation of the immune system after birth, and animal experiments have shown it to be a prerequisite for normal development of oral tolerance. Recent studies have shown differences in the composition of the microflora between healthy and allergic infants in countries with a high and low prevalence of allergies and between healthy and allergic infants within such countries. These differences are apparent within the first week of life and thus precede clinical symptoms. The use of live microorganisms that might be beneficial to health has a long tradition and the safety is well documented. Very recently, several prospective intervention studies, modifying the gut flora from birth have yielded encouraging results and may suggest a new mode of primary prevention of allergy in the future."], ["New metrics of affordable nutrition: which vegetables provide most nutrients for least cost? Measuring food prices per gram, rather than per calorie, is one way to make healthful vegetables appear less expensive. However, a better measure of affordability would take the nutrient content of vegetables into account. This study, based on analyses of US Department of Agriculture datasets, aimed to identify which vegetables, including juices and soups, provided the most nutrients per unit cost. Nutrient density was measured using the Nutrient Rich Foods (NRF) index, based on nine nutrients to encourage: protein; fiber; vitamins A, C, and E; calcium; iron; magnesium; and potassium; and on three nutrients to limit: saturated fat, added sugar, and sodium. Food cost in dollars was calculated per 100 g, per 100 kcal, per serving, and per nutrient content. One-way analyses of variance with post hoc tests were used to determine statistical significance. Results showed that tomato juices and tomato soups, dark green leafy and nonleafy vegetables, and deep yellow vegetables, including sweet potatoes, had the highest NRF scores overall. Highest NRF scores per dollar were obtained for sweet potatoes, white potatoes, tomato juices and tomato soups, carrots, and broccoli. Tomato sauces, raw tomatoes, and potato chips were eaten more frequently than were many other vegetables that were both more affordable and more nutrient-rich. These new measures of affordable nutrition can help foodservice and health professionals identify those vegetables that provide the highest nutrient density per unit cost. Processed vegetables, including soups and juices, can contribute to the quality and the affordability of the diet. Copyright \u00a9 2013 Academy of Nutrition and Dietetics. Published by Elsevier Inc. All rights reserved.", "Energy density, nutrient adequacy, and cost per serving can provide insight into food choices in the lower Mississippi Delta. OBJECTIVE: To compare differences across food groups for food cost, energy, and nutrient profiles of 100 items from a cross-sectional survey of 225 stores in 18 counties across the Lower Mississippi Delta of Arkansas, Louisiana, and Mississippi. METHODS: Energy, nutrient, and cost profiles for food items were calculated by using Naturally Nutrient Rich methodology and converting price per 100 g edible portion to price per serving. Foods were grouped into 6 food groups. Mean differences were compared with ANOVA. RESULTS: Significant differences existed by food group for each measure. Energy density was highest for fats/oils/sweets, whereas nutrient density was highest for vegetables. Price per serving was lowest for fats/oils/sweets and highest for meats. CONCLUSIONS AND IMPLICATIONS: Educational messages focusing on a complete diet should consider the role of food costs and provide specific recommendations for increasing nutrient-dense foods by replacing a portion of the meat serving at meals with culturally acceptable lower-cost nutrient-dense foods. Copyright \u00c2\u00a9 2012 Society for Nutrition Education and Behavior. Published by Elsevier Inc. All rights reserved.", "Essentials of Healthy Eating: A Guide Enough solid evidence now exists to offer women several fundamental strategies for healthy eating. They include emphasizing healthful unsaturated fats, whole grains, good protein \u201cpackages,\u201d and fruits and vegetables; limiting consumption of trans and saturated fats, highly refined grains, and sugary beverages; and taking a multivitamin with folic acid and extra vitamin D as a nutritional safety net. A diet based on these principles is healthy through virtually all life stages, from young adulthood through planning for pregnancy, pregnancy, and on into old age.", "Food prices and blood cholesterol. Cardiovascular diseases (CVD) cost Americans billions of dollars per year. High cholesterol levels, which are closely related to dietary habits, are a major contributor to CVD. In this article, we study whether changes in food prices are related to cholesterol levels and whether taxes or subsidies on particular foods would be effective in lowering cholesterol levels and, consequently, CVD costs. We find that prices of vegetables, processed foods, whole milk and whole grains are significantly associated with blood cholesterol levels. Having analyzed the costs and benefits of government interventions, we find that a subsidy of vegetables and whole grains would be an efficient way to reduce CVD expenditures. Published by Elsevier B.V.", "\\\"Split them!\\\" smaller item sizes of cookies lead to a decrease in energy intake in children. OBJECTIVE: Examine the influence of altering the size of snack food (ie, small vs large cookies) on short-term energy intake. METHODS: First- and sixth-graders (n = 77) participated in a between-subjects experimental design. All participants were offered the same gram weight of cookies during an afternoon tea at their school. For half of the participants, food was cut in 2 to make the small item size. Food intake (number of cookies, gram weight, and energy intake) was examined using ANOVA. RESULTS: Decreasing the item size of food led to a decrease of 25% in gram weight intake, corresponding to 68 kcal. Appetitive ratings and subject and food characteristics had no moderating effect. CONCLUSIONS AND IMPLICATIONS: Reducing the item size of food could prove a useful dietary prevention strategy based on decreased consumption, aimed at countering obesity-promoting eating behaviors favored by the easy availability of large food portions. Copyright \u00a9 2012 Society for Nutrition Education and Behavior. Published by Elsevier Inc. All rights reserved."], ["Flax and Breast Cancer: A Systematic Review. Background. Flax is a food and dietary supplement commonly used for menopausal symptoms. Flax is known for its lignan, \u03b1-linolenic acid, and fiber content, components that may possess phytogestrogenic, anti-inflammatory, and hormone modulating effects, respectively. We conducted a systematic review of flax for efficacy in improving menopausal symptoms in women living with breast cancer and for potential impact on risk of breast cancer incidence or recurrence. Methods. We searched MEDLINE, Embase, the Cochrane Library, and AMED from inception to January 2013 for human interventional or observational data pertaining to flax and breast cancer. Results. Of 1892 records, we included a total of 10 studies: 2 randomized controlled trials, 2 uncontrolled trials, 1 biomarker study, and 5 observational studies. Nonsignificant (NS) decreases in hot flash symptomatology were seen with flax ingestion (7.5 g/d). Flax (25 g/d) increased tumor apoptotic index (P < .05) and decreased HER2 expression (P < .05) and cell proliferation (Ki-67 index; NS) among newly diagnosed breast cancer patients when compared with placebo. Uncontrolled and biomarker studies suggest beneficial effects on hot flashes, cell proliferation, atypical cytomorphology, and mammographic density, as well as possible anti-angiogenic activity at doses of 25 g ground flax or 50 mg secoisolariciresinol diglycoside daily. Observational data suggests associations between flax and decreased risk of primary breast cancer (adjusted odds ratio [AOR] = 0.82; 95% confidence interval [CI] = 0.69-0.97), better mental health (AOR = 1.76; 95% CI = 1.05-2.94), and lower mortality (multivariate hazard ratio = 0.69; 95% CI = 0.50-0.95) among breast cancer patients. Conclusions. Current evidence suggests that flax may be associated with decreased risk of breast cancer. Flax demonstrates antiproliferative effects in breast tissue of women at risk of breast cancer and may protect against primary breast cancer. Mortality risk may also be reduced among those living with breast cancer. \u00a9 The Author(s) 2013.", "Dietary flaxseed alters tumor biological markers in postmenopausal breast cancer. PURPOSE: Flaxseed, the richest source of mammalian lignan precursors, has previously been shown to reduce the growth of tumors in rats. This study examined, in a randomized double-blind placebo-controlled clinical trial, the effects of dietary flaxseed on tumor biological markers and urinary lignan excretion in postmenopausal patients with newly diagnosed breast cancer. EXPERIMENTAL DESIGN: Patients were randomized to daily intake of either a 25 g flaxseed-containing muffin (n = 19) or a control (placebo) muffin (n = 13). At the time of diagnosis and again at definitive surgery, tumor tissue was analyzed for the rate of tumor cell proliferation (Ki-67 labeling index, primary end point), apoptosis, c-erbB2 expression, and estrogen and progesterone receptor levels. Twenty-four-hour urine samples were analyzed for lignans, and 3-day diet records were evaluated for macronutrient and caloric intake. Mean treatment times were 39 and 32 days in the placebo and flaxseed groups, respectively. RESULTS: Reductions in Ki-67 labeling index (34.2%; P = 0.001) and in c-erbB2 expression (71.0%; P = 0.003) and an increase in apoptosis (30.7%; P = 0.007) were observed in the flaxseed, but not in the placebo group. No significant differences in caloric and macronutrient intake were seen between groups and between pre- and posttreatment periods. A significant increase in mean urinary lignan excretion was observed in the flaxseed group (1,300%; P < 0.01) compared with placebo controls. The total intake of flaxseed was correlated with changes in c-erbB2 score (r = -0.373; P = 0.036) and apoptotic index (r = 0.495; P < 0.004). CONCLUSION: Dietary flaxseed has the potential to reduce tumor growth in patients with breast cancer.", "Consumption of flaxseed, a rich source of lignans, is associated with reduced breast cancer risk. PURPOSE: To investigate the association between intake of flaxseed-the richest source of dietary lignans (a class of phytoestrogens)-and breast cancer risk. METHODS: A food frequency questionnaire was used to measure the consumption of flaxseed and flax bread by 2,999 women with breast cancer and 3,370 healthy control women who participated in the Ontario Women's Diet and Health Study (2002-2003). Logistic regression was used to investigate associations between consumption of flaxseed and flax bread and breast cancer risk. Confounding by established and suspected breast cancer risk factors, as well as dietary factors, was assessed. RESULTS: Flaxseed or flax bread was consumed at least weekly by 21 % of control women. None of the 19 variables assessed were identified as confounders of the associations between flaxseed or flax bread and breast cancer risk. Consumption of flaxseed was associated with a significant reduction in breast cancer risk (odds ratio (OR) = 0.82, 95 % confidence interval (CI) 0.69-0.97), as was consumption of flax bread (OR = 0.77, 95 % CI 0.67-0.89). CONCLUSIONS: This Canadian study is, to our knowledge, the first to report on the association between flaxseed alone and breast cancer risk and has found that flaxseed intake is associated with a reduction in breast cancer risk. As dietary intake of flaxseed is modifiable, this finding may be of public health importance with respect to breast cancer prevention.", "Flaxseed Supplementation (not Dietary Fat Restriction) Reduces Prostate Cancer Proliferation Rates in Men Presurgery Background Prostate cancer affects one-out-of-six men during their lifetime. Dietary factors are postulated to influence the development and progression of prostate cancer. Low-fat diets and flaxseed supplementation may offer potentially protective strategies. Methods We undertook a multi-site, randomized controlled trial to test the effects of low-fat and/or flaxseed-supplemented diets on the biology of the prostate and other biomarkers. Prostate cancer patients (n=161) scheduled at least 21 days before prostatectomy were randomly assigned to one of the following arms: 1) control (usual diet); 2) flaxseed-supplemented diet (30 g/day); 2) low-fat diet (<20% total energy); or 4) flaxseed-supplemented, low-fat diet. Blood was drawn at baseline and prior to surgery and analyzed for prostate specific antigen (PSA), sex hormone binding globulin, testosterone, insulin-like growth factor-1 and binding protein-3, c-reactive protein, and total and low density lipoprotein cholesterol. Tumors were assessed for proliferation (Ki-67, the primary endpoint) and apoptosis. Results Men were on protocol an average of 30 days. Proliferation rates were significantly lower (P < 0.002) among men assigned to the flaxseed arms. Median Ki-67 positive cells/total nuclei ratios (x100) were 1.66 (flaxseed-supplemented diet) and 1.50 (flaxseed-supplemented, low-fat diet) vs. 3.23 (control) and 2.56 (low-fat diet). No differences were observed between arms with regard to side effects, apoptosis, and most serological endpoints; however, men on low-fat diets experienced significant decreases in serum cholesterol (P=0.048). Conclusions Findings suggest that flaxseed is safe, and associated with biologic alterations that may be protective for prostate cancer. Data also further support low-fat diets to manage serum cholesterol.", "Flaxseed Supplementation (not Dietary Fat Restriction) Reduces Prostate Cancer Proliferation Rates in Men Presurgery Background Prostate cancer affects one-out-of-six men during their lifetime. Dietary factors are postulated to influence the development and progression of prostate cancer. Low-fat diets and flaxseed supplementation may offer potentially protective strategies. Methods We undertook a multi-site, randomized controlled trial to test the effects of low-fat and/or flaxseed-supplemented diets on the biology of the prostate and other biomarkers. Prostate cancer patients (n=161) scheduled at least 21 days before prostatectomy were randomly assigned to one of the following arms: 1) control (usual diet); 2) flaxseed-supplemented diet (30 g/day); 2) low-fat diet (<20% total energy); or 4) flaxseed-supplemented, low-fat diet. Blood was drawn at baseline and prior to surgery and analyzed for prostate specific antigen (PSA), sex hormone binding globulin, testosterone, insulin-like growth factor-1 and binding protein-3, c-reactive protein, and total and low density lipoprotein cholesterol. Tumors were assessed for proliferation (Ki-67, the primary endpoint) and apoptosis. Results Men were on protocol an average of 30 days. Proliferation rates were significantly lower (P < 0.002) among men assigned to the flaxseed arms. Median Ki-67 positive cells/total nuclei ratios (x100) were 1.66 (flaxseed-supplemented diet) and 1.50 (flaxseed-supplemented, low-fat diet) vs. 3.23 (control) and 2.56 (low-fat diet). No differences were observed between arms with regard to side effects, apoptosis, and most serological endpoints; however, men on low-fat diets experienced significant decreases in serum cholesterol (P=0.048). Conclusions Findings suggest that flaxseed is safe, and associated with biologic alterations that may be protective for prostate cancer. Data also further support low-fat diets to manage serum cholesterol."], ["The effect of the addition of daily fruit and nut bars to diet on weight, and cardiac risk profile, in overweight adults. BACKGROUND: The frequency of unhealthful snacking has increased dramatically over the last three decades. Fruits and nuts have been shown to have positive health effects. No study has investigated the aggregate effects of various fruits combined with nuts in the form of snack bars on cardiovascular risk factors. The aim of this randomised trial was to investigate the effects of a fruit and nut snack bar on anthropomorphic measures, lipid panel and blood pressure in overweight adults. METHODS: Ninety-four overweight adults (body mass index > 25 kg m(-2)) were randomly assigned to add two fruit and nut bars totalling 1421.9 kJ (340 kcal) to their ad libitum diet (intervention group) or to continue with their ad libitum diet (control group). Subjects underwent assessment for weight (primary outcome measure), as well as waist circumference, lipid panel and blood pressure (secondary outcome measures), before and at the end of the 8-week treatment. RESULTS: Weight did not change from baseline after snack bar addition compared to controls (P = 0.44). Waist circumference (P = 0.69), blood pressure (systolic, P = 0.83; diastolic, P = 0.79) and blood lipid panel (total cholesterol, P = 0.72; high-density lipoprotein, P = 0.11; total cholesterol/high-density lipoprotein, P = 0.37; triglycerides, P = 0.89; low-density lipoprotein, P = 0.81) also did not change from baseline compared to controls. CONCLUSIONS: Two daily fruit and nut bars, totalling 1421.9 kJ (340 kcal), did not cause weight gain. The role of habitual snacking on nutrient dense and satiating foods on both weight over time, and diet quality, warrants further study. Satiating snacks rich in fibre may provide a means to weight stabilisation. \u00a9 2011 The Authors. Journal of Human Nutrition and Dietetics \u00a9 2011 The British Dietetic Association Ltd.", "A review of the evidence: nuts and body weight. There is currently no single dietary or lifestyle intervention that is effective in long-term weight loss. Traditional weight loss diets tend to be low in total fat and therefore often restrict nut consumption. However, nuts are an important source of many vitamins, minerals, monounsaturated and polyunsaturated fatty acids. This paper reviewed all the available evidence from the literature in relation to nut consumption and body weight. The findings show that the role of nut consumption in body weight management is varied. Nuts, when included as part of an energy-controlled diet, were found in some instances to assist with weight loss. However, when nuts were added to an existing diet without controlling for energy intake, body weight increased, although to a lesser extent than theoretically predicted. There is limited evidence on the effect nut consumption has on type 2 diabetes, although available evidence indicates that nuts as part of a healthy diet do not cause weight gain and can have a positive influence on the fatty acid profile of a person with diabetes. This review shows there is a lack of evidence to support the restriction of nut consumption in weight management, indicating that further research is needed to assess the role of nuts in weight management.", "Nuts and healthy body weight maintenance mechanisms. Nuts are rich sources of multiple nutrients and phytochemicals associated with health benefits, including reduced cardiovascular disease risk. This has prompted recommendations to increase their consumption. However, they are also high in fat and are energy dense. The associations between these properties, positive energy balance and body weight raise questions about such recommendations. Numerous epidemiological and clinical studies show that nuts are not associated with weight gain. Mechanistic studies indicate this is largely attributable to the high satiety and low metabolizable energy (poor bioaccessibility leading to inefficient energy absorption) properties of nuts. Compensatory dietary responses account for 55-75% of the energy provided by nuts. Limited data suggest that routine nut consumption is associated with elevated resting energy expenditure and the thermogenic effect of feeding, resulting in dissipation of another portion of the energy they provide. Additionally, trials contrasting weight loss through regimens that include or exclude nuts indicate improved compliance and greater weight loss when nuts are permitted. Nuts may be included in the diet, in moderation, to enhance palatability, nutrient quality, and chronic disease risk reduction without compromising weight loss or maintenance.", "Nut intake and adiposity: meta-analysis of clinical trials. BACKGROUND: Epidemiologic studies have shown an inverse association between the frequency of nut consumption and body mass index (BMI) and risk of obesity. However, clinical trials that evaluated nut consumption on adiposity have been scarce and inconclusive. OBJECTIVE: We performed a systematic review and meta-analysis of published, randomized nut-feeding trials to estimate the effect of nut consumption on adiposity measures. DESIGN: MEDLINE and the Cochrane Central Register of Controlled Trials databases were searched for relevant clinical trials of nut intake that provided outcomes of body weight, BMI (in kg/m(2)), or waist-circumference measures and were published before December 2012. There were no language restrictions. Two investigators independently selected and reviewed eligible studies. The weighted mean difference (WMD) between nut or control diets was estimated by using a random-effects meta-analysis with 95% CIs. RESULTS: Thirty-three clinical trials met our inclusion criteria. Pooled results indicated a nonsignificant effect on body weight (WMD: -0.47 kg; 95% CI: -1.17, 0.22 kg; I(2) = 7%), BMI (WMD: -0.40 kg/m(2); 95% CI: -0.97, 0.17 kg/m(2); I(2) = 49%), or waist circumference (WMD: -1.25 cm; 95% CI: -2.82, 0.31 cm; I(2) = 28%) of diets including nuts compared with control diets. These findings were remarkably robust in the sensitivity analysis. No publication bias was shown. CONCLUSION: Compared with control diets, diets enriched with nuts did not increase body weight, body mass index, or waist circumference in controlled clinical trials.", "Health benefits of nut consumption with special reference to body weight control. Nuts are an integral part of the Mediterranean food patterns, and their incorporation into the regular diets of human beings is believed to provide many health benefits. The recent recognition of nuts as \\\"heart-healthy\\\" foods by the U.S. Food and Drug Administration has given a major boost to the positive image of nuts. Nut consumption has been associated with several health benefits, such as antioxidant, hypocholesterolemic, cardioprotective, anticancer, anti-inflammatory, and antidiabetic benefits, among other functional properties. However, although nuts possess these many health benefits, their consumption has been hampered by a lack of adequate information regarding those benefits. In addition, because nuts are energy-dense foods with high-fat content, there is a misconception among consumers that increased consumption may lead to unwanted gain in body weight with the risk of developing overweight/obesity. Nonetheless, available epidemiologic studies and short-term controlled feeding trials have supported the theory that the inclusion of nuts in the typical diet does not induce weight gain, despite an expected increase in total caloric intake. To address the misperception about nuts and body weight gain, the present review focuses mainly on the relation between nut consumption and body weight gain, in the context of the many health benefits of nuts. Copyright \u00a9 2012 Elsevier Inc. All rights reserved."], ["Immune potentiation of ultrafine dietary particles in normal subjects and patients with inflammatory bowel disease. Various specific and non-specific environmental factors have been associated with the induction and/or exacerbation of disease activity in patients with Crohn's disease and ulcerative colitis. One such factor is the potential role of ingested ultrafine particles. In fact, based on a Western diet, recent data suggest that more than 10(12)ultrafine particles are ingested per person every day. These microparticles have been considered inert although they adsorb endogenous constituents of the intestinal lumen and are taken up by human intestinal lymphoid aggregates. Based on these observations, we determined whether one such dietary microparticle, titanium dioxide (TiO(2)), alters intestinal cell responsiveness to lipopolysaccharide (LPS) using colonic biopsy specimens from 28 patients with ulcerative colitis, 21 with Crohn's disease, and 36 healthy controls. These samples, as well as peripheral blood mononuclear cells when available, were incubated alone (control), or with either (a) LPS (1-2,000 ng/ml), (b) TiO(2)(5 microg/ml) or (c) LPS (1 ng/ml) adsorbed to TiO(2)(5 microg/ml). In each case, the levels of interleukin 1 (IL-1) produced in these assays were quantitated by bioassay and by ELISA. Interestingly, there was dramatic stimulation of peripheral blood mononuclear cells using the TiO(2)-LPS conjugate, with values 30-60-fold above controls and only minor stimulation with LPS or TiO(2)alone. In intestinal organ cultures there was no increase in IL-1 secretion when challenged with TiO(2)alone or with up to 2,000 ng/ml LPS. However, the TiO(2)-LPS conjugate produced a two-to-three-fold, significant increase in the intestinal secretion of IL-1. Our data demonstrate that ultrafine dietary particles are not immunologically inert and may be important adjuncts in overcoming normal gut cell hyporesponsiveness to endogenous luminal molecules. This may be particularly relevant to patients with inflammatory bowel disease where there is abnormal intestinal permeability. Copyright 2000 Academic Press.", "Dietary sources of inorganic microparticles and their intake in healthy subjects and patients with Crohn's disease. Dietary microparticles are non-biological, bacterial-sized particles. Endogenous sources are derived from intestinal Ca and phosphate secretion. Exogenous sources are mainly titanium dioxide (TiO2) and mixed silicates (Psil); they are resistant to degradation and accumulate in human Peyer's patch macrophages and there is some evidence that they exacerbate inflammation in Crohn's disease (CD). However, whether their intake differs between those with and without CD has not been studied. We aimed to identify dietary microparticle sources and intakes in subjects with and without CD. Patients with inactive CD and matched general practice-based controls (ninety-one per group) completed 7 d food diaries. Intake data for dietary fibre and sucrose were compared as positive controls. All foods, pharmaceuticals and toothpastes were examined for microparticle content, and intakes of Ca and exogenous microparticles were compared between the two groups. Dietary intakes were significantly different between cases and controls for dietary fibre (12 (SD 5) v. 14 (SD 5) g/d; P=0.001) and sucrose (52 (SD 27) v. 45 (SD 18) g/d; P=0.04) but not for Ca. Estimated median TiO2 and Psil intakes (2.5 and 35 mg/individual per d respectively, totalling 10(12)-10(13) microparticles/individual per d) were broadly similar to per capita estimates and while there was wide variation in intakes between individuals there was no significant difference between subjects with CD and controls. Hence, if exposure to microparticles is associated with the inflammation of CD, then the present study rules out excess intake as the problem. Nonetheless, microparticle-containing foods have now been identified which allows a low-microparticle diet to be further assessed in CD.", "Fine and ultrafine particles of the diet: influence on the mucosal immune response and association with Crohn's disease. Crohn's disease is a modern Western disease characterised by transmural inflammation of the gastrointestinal tract. It is of unknown aetiology, but evidence suggests that it results from a combination of genetic predisposition and environmental factors. Bacterial-sized microparticles (0.1-1.0 microm) are potent adjuvants in model antigen-mediated immune responses and are increasingly associated with disease. Microparticles of TiO2 and aluminosilicate accumulate in macrophages of human gut-associated lymphoid tissue where the earliest signs of lesions in Crohn's disease are observed. Dietary microparticles are of endogenous or exogenous origin. Endogenous microparticles dominate and are calcium phosphate (most probably hydroxyapatite), which precipitates in the lumen of the mid-distal gastrointestinal tract due to secretion of Ca and phosphate in the succus entericus. Exogenous dietary microparticles are contaminants (soil and/or dust) and food additives. TiO2, for example, is a food colourant, and aluminosilicates are anti-caking agents, although some aluminosilicates occur as natural contaminants. Food additives alone account for ingestion of approximately 10(12) particles/person per d. Possible mechanisms for the role of exogenous and endogenous dietary microparticles in promoting toleragenic or immune responses of gastrointestinal mucosal phagocytosis are discussed. In a double-blind randomised pilot study we have shown that a diet low in Ca and exogenous microparticles appears to alleviate the symptoms of ileal Crohn's disease, with a significant (P= 0.002) improvement in the Crohn's disease activity index. A multi-centre trial and further mechanistic studies at the cellular level are underway.", "Diet and risk of inflammatory bowel disease. BACKGROUND: A better understanding of the environmental factors leading to inflammatory bowel disease should help to prevent occurrence of the disease and its relapses. AIM: To review current knowledge on dietary risk factors for inflammatory bowel disease. METHODS: The PubMed, Medline and Cochrane Library were searched for studies on diet and risk of inflammatory bowel disease. RESULTS: Established non-diet risk factors include family predisposition, smoking, appendectomy, and antibiotics. Retrospective case-control studies are encumbered with methodological problems. Prospective studies on European cohorts, mainly including middle-aged adults, suggest that a diet high in protein from meat and fish is associated with a higher risk of inflammatory bowel disease. Intake of the n-6 polyunsaturated fatty acid linoleic acid may confer risk of ulcerative colitis, whereas n-3 polyunsaturated fatty acids may be protective. No effect was found of intake of dietary fibres, sugar, macronutrients, total energy, vitamin C, D, E, Carotene, or Retinol (vitamin A) on risk of ulcerative colitis. No prospective data was found on risk related to intake of fruits, vegetables or food microparticles (titanium dioxide and aluminium silicate). CONCLUSIONS: A diet high in protein, particular animal protein, may be associated with increased risk of inflammatory bowel disease and relapses. N-6 polyunsaturated fatty acids may predispose to ulcerative colitis whilst n-3 polyunsaturated fatty acid may protect. These results should be confirmed in other countries and in younger subjects before dietary counselling is recommended in high risk subjects. Copyright \u00a9 2011 Editrice Gastroenterologica Italiana S.r.l. Published by Elsevier Ltd. All rights reserved.", "Titanium Dioxide Nanoparticles in Food and Personal Care Products Titanium dioxide is a common additive in many food, personal care, and other consumer products used by people, which after use can enter the sewage system, and subsequently enter the environment as treated effluent discharged to surface waters or biosolids applied to agricultural land, incinerated wastes, or landfill solids. This study quantifies the amount of titanium in common food products, derives estimates of human exposure to dietary (nano-) TiO2, and discusses the impact of the nanoscale fraction of TiO2 entering the environment. The foods with the highest content of TiO2 included candies, sweets and chewing gums. Among personal care products, toothpastes and select sunscreens contained 1% to >10% titanium by weight. While some other cr\u00e8mes contained titanium, despite being colored white, most shampoos, deodorants, and shaving creams contained the lowest levels of titanium (<0.01 \u03bcg/mg). For several high-consumption pharmaceuticals, the titanium content ranged from below the instrument detection limit (0.0001 \u03bcg Ti/mg) to a high of 0.014 \u03bcg Ti/mg. Electron microscopy and stability testing of food-grade TiO2 (E171) suggests that approximately 36% of the particles are less than 100 nm in at least one dimension and that it readily disperses in water as fairly stable colloids. However, filtration of water solubilized consumer products and personal care products indicated that less than 5% of the titanium was able to pass through 0.45 or 0.7 \u03bcm pores. Two white paints contained 110 \u03bcg Ti/mg while three sealants (i.e., prime coat paint) contained less titanium (25 to 40 \u03bcg Ti/mg). This research showed that while many white-colored products contained titanium, it was not a prerequisite. Although several of these product classes contained low amounts of titanium, their widespread use and disposal down the drain and eventually to WWTPs deserves attention. A Monte Carlo human exposure analysis to TiO2 through foods identified children as having the highest exposures because TiO2 content of sweets is higher than other food products, and that a typical exposure for a US adult may be on the order of 1 mg Ti per kilogram body weight per day. Thus, because of the millions of tons of titanium based white pigment used annually, testing should focus on food-grade TiO2 (E171) rather than that adopted in many environmental health and safety tests (i.e., P25), which is used in much lower amounts in products less likely to enter the environment (e.g., catalyst supports, photocatalytic coatings)."], ["Broccoli sprouts: An exceptionally rich source of inducers of enzymes that protect against\u2009chemical\u2009carcinogens Induction of phase 2 detoxication enzymes [e.g., glutathione transferases, epoxide hydrolase, NAD(P)H: quinone reductase, and glucuronosyltransferases] is a powerful strategy for achieving protection against carcinogenesis, mutagenesis, and other forms of toxicity of electrophiles and reactive forms of oxygen. Since consumption of large quantities of fruit and vegetables is associated with a striking reduction in the risk of developing a variety of malignancies, it is of interest that a number of edible plants contain substantial quantities of compounds that regulate mammalian enzymes of xenobiotic metabolism. Thus, edible plants belonging to the family Cruciferae and genus Brassica (e.g., broccoli and cauliflower) contain substantial quantities of isothiocyanates (mostly in the form of their glucosinolate precursors) some of which (e.g., sulforaphane or 4-methylsulfinylbutyl isothiocyanate) are very potent inducers of phase 2 enzymes. Unexpectedly, 3-day-old sprouts of cultivars of certain crucifers including broccoli and cauliflower contain 10\u2013100 times higher levels of glucoraphanin (the glucosinolate of sulforaphane) than do the corresponding mature plants. Glucosinolates and isothiocyanates can be efficiently extracted from plants, without hydrolysis of glucosinolates by myrosinase, by homogenization in a mixture of equal volumes of dimethyl sulfoxide, dimethylformamide, and acetonitrile at \u221250\u00b0C. Extracts of 3-day-old broccoli sprouts (containing either glucoraphanin or sulforaphane as the principal enzyme inducer) were highly effective in reducing the incidence, multiplicity, and rate of development of mammary tumors in dimethylbenz(a)anthracene-treated rats. Notably, sprouts of many broccoli cultivars contain negligible quantities of indole glucosinolates, which predominate in the mature vegetable and may give rise to degradation products (e.g., indole-3-carbinol) that can enhance tumorigenesis. Hence, small quantities of crucifer sprouts may protect against the risk of cancer as effectively as much larger quantities of mature vegetables of the same variety.", "Bioavailability and inter-conversion of sulforaphane and erucin in human subjects consuming broccoli sprouts or broccoli supplement in a cross-over study design Broccoli consumption may reduce the risk of various cancers and many broccoli supplements are now available. The bioavailability and excretion of the mercapturic acid pathway metabolites isothiocyanates after human consumption of broccoli supplements has not been tested. Two important isothiocyanates from broccoli are sulforaphane and erucin. We employed a cross-over study design in which 12 subjects consumed 40 grams of fresh broccoli sprouts followed by a 1 month washout period and then the same 12 subjects consumed 6 pills of a broccoli supplement. As negative controls for isothiocyanate consumption four additional subjects consumed alfalfa sprouts during the first phase and placebo pills during the second. Blood and urine samples were collected for 48 hours during each phase and analyzed for sulforaphane and erucin metabolites using LC-MS/MS. The bioavailability of sulforaphane and erucin is dramatically lower when subjects consume broccoli supplements compared to fresh broccoli sprouts. The peaks in plasma concentrations and urinary excretion were also delayed when subjects consumed the broccoli supplement. GSTP1 polymorphisms did not affect the metabolism or excretion of sulforaphane or erucin. Sulforaphane and erucin are able to interconvert in vivo and this interconversion is consistent within each subject but variable between subjects. This study confirms that consumption of broccoli supplements devoid of myrosinase activity does not produce equivalent plasma concentrations of the bioactive isothiocyanate metabolites compared to broccoli sprouts. This has implications for people who consume the recommended serving size (1 pill) of a broccoli supplement and believe they are getting equivalent doses of isothiocyanates.", "Isothiocyanate concentrations and interconversion of sulforaphane to erucin in human subjects after consumption of commercial frozen broccoli compa... SCOPE: Sulforaphane (a potent anticarcinogenic isothiocyanate derived from glucoraphanin) is widely considered responsible for the protective effects of broccoli consumption. Broccoli is typically purchased fresh or frozen and cooked before consumption. We compared the bioavailability and metabolism of sulforaphane from portions of lightly cooked fresh or frozen broccoli, and investigated the bioconversion of sulforaphane to erucin. METHODS AND RESULTS: Eighteen healthy volunteers consumed broccoli soups produced from fresh or frozen broccoli florets that had been lightly cooked and sulforaphane thio-conjugates quantified in plasma and urine. Sulforaphane bioavailability was about tenfold higher for the soups made from fresh compared to frozen broccoli, and the reduction was shown to be due to destruction of myrosinase activity by the commercial blanching-freezing process. Sulforaphane appeared in plasma and urine in its free form and as several thio-conjugates forms. Erucin N-acetyl-cysteine conjugate was a significant urinary metabolite, and it was shown that human gut microflora can produce sulforaphane, erucin, and their nitriles from glucoraphanin. CONCLUSION: The short period of blanching used to produce commercial frozen broccoli destroys myrosinase and substantially reduces sulforaphane bioavailability. Sulforaphane was converted to erucin and excreted in urine, and it was shown that human colonic flora were capable of this conversion. \u00a9 2012 WILEY-VCH Verlag GmbH & Co. KGaA, Weinheim.", "Potential efficacy of broccoli sprouts as a unique supplement for management of type 2 diabetes and its complications. Functional foods and their nutraceutical components are now considered as supplementary treatments in type 2 diabetes and prevention of its long-term complications. Young broccoli sprouts as a functional food contain many bioactive compounds specially sulforaphane. In hyperglycemic and oxidative conditions, sulforaphane has the potential to activate the NF-E2-related factor-2 (Nrf2)-dependent antioxidant response-signaling pathway, induces phase 2 enzymes, attenuates oxidative stress, and inactivates nuclear factor kappa-B (NF-\u03baB), a key modulator of inflammatory pathways. Interestingly, sulforaphane induces some peroxisome proliferator-activated receptors, which contribute to lipid metabolism and glucose homeostasis. In animal and in vitro models, sulforaphane also shows antihypertensive, anticancer, cardioprotective, and hypocholesterolemic capacity, and has bactericidal properties against Helicobacter pylori. Supplementation of type 2 diabetics with high sulforaphane content broccoli sprouts resulted in increased total antioxidant capacity of plasma and in decreased oxidative stress index, lipid peroxidation, serum triglycerides, oxidized low-density lipoprotein (LDL)/LDL-cholesterol ratio, serum insulin, insulin resistance, and serum high-sensitive C-reactive protein. Sulforaphane could prevent nephropathy, diabetes-induced fibrosis, and vascular complications. Potential efficacy of sulforaphane and probably other bioactive components of young broccoli sprouts makes it as an excellent choice for supplementary treatment in type 2 diabetes.", "Safety, tolerance, and metabolism of broccoli sprout glucosinolates and isothiocyanates: a clinical phase I study. Broccoli sprouts are widely consumed in many parts of the world. There have been no reported concerns with respect to their tolerance and safety in humans. A formal phase I study of safety, tolerance, and pharmacokinetics appeared justified because these sprouts are being used as vehicles for the delivery of the glucosinolate glucoraphanin and its cognate isothiocyanate sulforaphane [1-isothiocyanato-(4R)-(methylsulfinyl)butane] in clinical trials. Such trials have been designed to evaluate protective efficacy against development of neoplastic and other diseases. A placebo-controlled, double-blind, randomized clinical study of sprout extracts containing either glucosinolates (principally glucoraphanin, the precursor of sulforaphane) or isothiocyanates (principally sulforaphane) was conducted on healthy volunteers who were in-patients on our clinical research unit. The subjects were studied in three cohorts, each comprising three treated individuals and one placebo recipient. Following a 5-day acclimatization period on a crucifer-free diet, the broccoli sprout extracts were administered orally at 8-h intervals for 7 days (21 doses), and the subjects were monitored during this period and for 3 days after the last treatment. Doses were 25 micromol of glucosinolate (cohort A), 100 micromol of glucosinolate (cohort B), or 25 micromol of isothiocyanate (cohort C). The mean cumulative excretion of dithiocarbamates as a fraction of dose was very similar in cohorts A and B (17.8 +/- 8.6% and 19.6 +/- 11.7% of dose, respectively) and very much higher and more consistent in cohort C (70.6 +/- 2.0% of dose). Thirty-two types of hematology or chemistry tests were done before, during, and after the treatment period. Indicators of liver (transaminases) and thyroid [thyroid-stimulating hormone, total triiodothyronine (T3), and free thyroxine (T4)] function were examined in detail. No significant or consistent subjective or objective abnormal events (toxicities) associated with any of the sprout extract ingestions were observed."], ["Arsenic and lead in juice: apple, citrus, and apple-base. Exposure limits for arsenic and lead in drinking water have long been established by the U.S. Environmental Protection Agency and new regulations regarding the presence of these contaminants in bottled water went into effect in California in 2009. No comparable exposure limits or regulations are available, however, for juices and other beverages that may contain arsenic and lead. In the study described in this article, 20 apple juices (or ciders), 15 apple-containing juices, one grape, and one citrus juice were analyzed for arsenic and lead. Arsenic was detected in all juices while lead was detected in more than 94% of juices analyzed. Twelve samples (32%) demonstrated arsenic levels nearly at or above the drinking water exposure limit of 10 parts per billion. No juices contained lead above drinking water exposure limits. Expanding drinking water limits to include juices (and other frequently consumed beverages) would better protect consumers while regular testing of these juices would better inform consumers of the risks posed by specific juices and brands.", "Reducing Childhood Obesity by Eliminating 100% Fruit Juice The Healthy Hunger-Free Kids Act of 2010 presents an opportunity to change the nutritional quality of foods served in low-income childcare centers, including Head Start centers. Excessive fruit juice consumption is associated with increased risk for obesity. Moreover, there is recent scientific evidence that sucrose consumption without the corresponding fiber, as is commonly present in fruit juice, is associated with the metabolic syndrome, liver injury, and obesity. Given the increasing risk of obesity among preschool children, we recommend that the US Department of Agriculture\u2019s Child and Adult Food Care Program, which manages the meal patterns in childcare centers such as Head Start, promote the elimination of fruit juice in favor of whole fruit for children.", "Dietary sugar and body weight: have we reached a crisis in the epidemic of obesity and diabetes?: health be damned! Pour on the sugar. Sugar-sweetened drinks have been associated with several health problems. In the point narrative as presented below, we provide our opinion and review of the data to date that we need to reconsider consumption of dietary sugar based on the growing concern of obesity and type 2 diabetes. In the counterpoint narrative following our contribution, Drs. Kahn and Sievenpiper provide a defense and suggest that dietary sugar is not the culprit. Data from the National Health and Nutrition Examination Survey and U.S. Department of Agriculture dietary surveys along with commercial Homescan data on household purchases were used to understand changes in sugar and fructose consumption. Meta-analyses and randomized clinical trials were used to evaluate outcomes of beverage and fructose intake. About 75% of all foods and beverages contain added sugar in a large array of forms. Consumption of soft drinks has increased fivefold since 1950. Meta-analyses suggest that consumption of sugar-sweetened beverages (SSBs) is related to the risk of diabetes, the metabolic syndrome, and cardiovascular disease. Drinking two 16-ounce SSBs per day for 6 months induced features of the metabolic syndrome and fatty liver. Randomized controlled trials in children and adults lasting 6 months to 2 years have shown that lowering the intake of soft drinks reduced weight gain. Recent studies suggest a gene-SSB potential relationship. Consumption of calorie-sweetened beverages has continued to increase and plays a role in the epidemic of obesity, the metabolic syndrome, and fatty liver disease. Reducing intake of soft drinks is associated with less weight gain.", "Dietary sugars intake and cardiovascular health: a scientific statement from the American Heart Association. High intakes of dietary sugars in the setting of a worldwide pandemic of obesity and cardiovascular disease have heightened concerns about the adverse effects of excessive consumption of sugars. In 2001 to 2004, the usual intake of added sugars for Americans was 22.2 teaspoons per day (355 calories per day). Between 1970 and 2005, average annual availability of sugars/added sugars increased by 19%, which added 76 calories to Americans' average daily energy intake. Soft drinks and other sugar-sweetened beverages are the primary source of added sugars in Americans' diets. Excessive consumption of sugars has been linked with several metabolic abnormalities and adverse health conditions, as well as shortfalls of essential nutrients. Although trial data are limited, evidence from observational studies indicates that a higher intake of soft drinks is associated with greater energy intake, higher body weight, and lower intake of essential nutrients. National survey data also indicate that excessive consumption of added sugars is contributing to overconsumption of discretionary calories by Americans. On the basis of the 2005 US Dietary Guidelines, intake of added sugars greatly exceeds discretionary calorie allowances, regardless of energy needs. In view of these considerations, the American Heart Association recommends reductions in the intake of added sugars. A prudent upper limit of intake is half of the discretionary calorie allowance, which for most American women is no more than 100 calories per day and for most American men is no more than 150 calories per day from added sugars.", "Sugar substitutes: Health controversy over perceived benefits Sugar is an inseparable part of the food we consume. But too much sugar is not ideal for our teeth and waistline. There have been some controversial suggestions that excessive sugar may play an important role in certain degenerative diseases. So artificial sweeteners or artificially sweetened products continue to attract consumers. A sugar substitute (artificial sweetener) is a food additive that duplicates the effect of sugar in taste, but usually has less food energy. Besides its benefits, animal studies have convincingly proven that artificial sweeteners cause weight gain, brain tumors, bladder cancer and many other health hazards. Some kind of health related side effects including carcinogenicity are also noted in humans. A large number of studies have been carried out on these substances with conclusions ranging from \u201csafe under all conditions\u201d to \u201cunsafe at any dose\u201d. Scientists are divided in their views on the issue of artificial sweetener safety. In scientific as well as in lay publications, supporting studies are often widely referenced while the opposing results are de-emphasized or dismissed. So this review aims to explore the health controversy over perceived benefits of sugar substitutes."], ["High dietary fiber intake prevents stroke at a population level. BACKGROUND & AIMS: This research was aimed at clarifying whether high dietary fiber intake has an impact on incidence and risk of stroke at a population level. METHODS: In 1647 unselected subjects, dietary fiber intake (DFI) was detected in a 12-year population-based study, using other dietary variables, anagraphics, biometrics, blood pressure, heart rate, blood lipids, glucose, insulin, uricaemia, fibrinogenaemia, erytrosedimentation rate, diabetes, insulin resistance, smoking, pulmonary disease and left ventricular hypertrophy as covariables. RESULTS: In adjusted Cox models, high DFI reduced the risk of stroke. In analysis based on quintiles of fiber intake adjusted for confounders, HR for incidence of stroke was lower when the daily intake of soluble fiber was >25\u00a0g or that of insoluble fiber was >47\u00a0g. In multivariate analyses, using these values as cut-off of DFI, the risk of stroke was lower in those intaking more that the cut-off of soluble (HR 0.31, 0.17-0.55) or insoluble (HR 0.35, 0.19-0.63) fiber. Incidence of stroke was also lower (-50%, p\u00a0<\u00a00.003 and\u00a0-46%, p\u00a0<\u00a00.01, respectively). CONCLUSIONS: Higher dietary DFI is inversely and independently associated to incidence and risk of stroke in general population. Copyright \u00a9 2012 Elsevier Ltd and European Society for Clinical Nutrition and Metabolism. All rights reserved.", "Primary prevention of stroke by healthy lifestyle Background The combination of healthy lifestyle factors is associated with lower risk of coronary heart disease, diabetes and total cardiovascular disease. Little is known about the impact of multiple lifestyle factors on risk of stroke. Methods and results We conducted a prospective cohort study among 43,685 men from Health Professionals Follow-up Study and 71,243 women from the Nurses' Health Study. Diet and other lifestyle factors were updated from self-reported questionnaires. We defined a low-risk lifestyle as not smoking, a body mass index <25 kg/m 2, \u226530 minutes/day of moderate activity, consuming alcohol modestly (men:5\u201330g; women:5\u201315g alcohol/day), and scoring within the top 40% of a healthy diet score. We documented 1559 strokes (853 ischemic, 278 hemorrhagic) among women and 994 strokes (600 ischemic, 161 hemorrhagic) among men during follow-up. Women with all five low-risk factors had a relative risk of 0.21 (95%CI:0.12, 0.36) for total and 0.19 (95%CI:0.09, 0.40) for ischemic stroke, compared to women who had none of these factors. Among men, the relative risks were 0.31 (95%CI:0.19, 0.53) for total and 0.20 (95%CI: 0.10, 0.42) for ischemic stroke for the same comparison. Among the women, 47% (95%CI:18%, 69%) of total and 54% (95%CI:15%, 78%) of ischemic stroke cases were attributable to lack of adherence to a low-risk lifestyle; among the men, 35% (95%CI:7%, 58%) of total and 52% (95%CI:19%, 75%) of ischemic stroke may have been prevented. Conclusions A low-risk lifestyle that is associated with a reduced risk of multiple chronic diseases may also be beneficial in the prevention of stroke, especially ischemic stroke.", "Total antioxidant capacity of diet and risk of stroke: a population-based prospective cohort of women. BACKGROUND AND PURPOSE: Consumption of antioxidant-rich foods may reduce the risk of stroke by inhibition of oxidative stress and inflammation. Total antioxidant capacity (TAC) takes into account all antioxidants and the synergistic effects between them. We examined the association between dietary TAC and stroke incidence in cardiovascular disease (CVD)-free women and in women with CVD history at baseline. METHODS: The study included women (31,035 CVD-free and 5680 with CVD history at baseline), aged 49 to 83 years, from the Swedish Mammography Cohort. Diet was assessed with a food frequency questionnaire. Dietary TAC was calculated using oxygen radical absorbance capacity values. Stroke cases were ascertained by linkage with the Swedish Hospital Discharge Registry. RESULTS: During follow-up (September 1997 to December 2009), we identified 1322 stroke cases (988 cerebral infarctions, 226 hemorrhagic strokes, and 108 unspecified strokes) among CVD-free women and 1007 stroke cases (796 cerebral infarctions, 100 hemorrhagic strokes, and 111 unspecified strokes) among women with a CVD history. The multivariable hazard ratio of total stroke comparing the highest with the lowest quintile of dietary TAC was 0.83 (95% CI, 0.70-0.99; P for trend=0.04) in CVD-free women. Among women with a CVD history, the hazard ratios for the highest versus lowest quartile of TAC were 0.90 (95% CI, 0.75-1.07; P for trend=0.30) for total stroke and 0.55 (95% CI, 0.32-0.95; P for trend=0.03) for hemorrhagic stroke. CONCLUSIONS: These findings suggest that dietary TAC is inversely associated with total stroke among CVD-free women and hemorrhagic stroke among women with CVD history.", "Plant foods and the risk of cerebrovascular diseases: a potential protection of fruit consumption. Studies on the association between plant foods and cerebrovascular diseases have given contradictory results suggesting the existence of some effect-modifying factors. The present study determines whether the consumption of plant foods (i.e. fruits and berries, vegetables, and cereals) predicts a decreased cerebrovascular disease incidence in a population with low fruit and vegetable and high wholegrain intake. This cohort study on 3932 men and women was based on data from the Finnish Mobile Clinic Health Examination Survey, conducted in 1968-72. The participants were 40-74 years of age and free of cardiovascular diseases at baseline. Data on the plant food consumption were derived from a 1-year dietary history interview. During a 24-year follow-up 625 cases of cerebrovascular diseases occurred, leading to either hospitalisation or death. An inverse association was found between fruit consumption and the incidence of cerebrovascular diseases, ischaemic stroke and intracerebral haemorrhage. The adjusted relative risks (RR) between the highest and lowest quartiles of intake of any cerebrovascular disease, ischaemic stroke and intracerebral haemorrhage were 0.75 (95 % CI 0.59, 0.94), 0.73 (95 % CI 0.54, 1.00) and 0.47 (95 % CI 0.24, 0.92), respectively. These associations were primarily due to the consumption of citrus fruits and occurred only in men. Total consumption of vegetables or cereals was not associated with the cerebrovascular disease incidence. The consumption of cruciferous vegetables, however, predicted a reduced risk of cerebrovascular diseases (RR 0.79; 95 % CI 0.63, 0.99), ischaemic stroke (RR 0.67; 95 % CI 0.49, 0.92) and intracerebral haemorrhage (RR 0.49; 95 % CI 0.25, 0.98). In conclusion, the consumption of fruits, especially citrus, and cruciferous vegetables may protect against cerebrovascular diseases.", "Fruit and vegetable intake in relation to risk of ischemic stroke. CONTEXT: Few studies have evaluated the relationship between fruit and vegetable intake and cardiovascular disease. OBJECTIVE: To examine the associations between fruit and vegetable intake and ischemic stroke. DESIGN, SETTING, AND SUBJECTS: Prospective cohort studies, including 75 596 women aged 34 to 59 years in the Nurses' Health Study with 14 years of follow-up (1980-1994), and 38683 men aged 40 to 75 years in the Health Professionals' Follow-up Study with 8 years of follow-up (1986-1994). All individuals were free of cardiovascular disease, cancer, and diabetes at baseline. MAIN OUTCOME MEASURE: Incidence of ischemic stroke by quintile of fruit and vegetable intake. RESULTS: A total of 366 women and 204 men had an ischemic stroke. After controlling for standard cardiovascular risk factors, persons in the highest quintile of fruit and vegetable intake (median of 5.1 servings per day among men and 5.8 servings per day among women) had a relative risk (RR) of 0.69 (95% confidence interval [CI], 0.52-0.92) compared with those in the lowest quintile. An increment of 1 serving per day of fruits or vegetables was associated with a 6% lower risk of ischemic stroke (RR, 0.94; 95 % CI, 0.90-0.99; P =.01, test for trend). Cruciferous vegetables (RR, 0.68 for an increment of 1 serving per day; 95% CI, 0.49-0.94), green leafy vegetables (RR, 0.79; 95% CI, 0.62-0.99), citrus fruit including juice (RR, 0.81; 95% CI, 0.68-0.96), and citrus fruit juice (RR, 0.75; 95% CI, 0.61-0.93) contributed most to the apparent protective effect of total fruits and vegetables. Legumes or potatoes were not associated with lower ischemic stroke risk. The multivariate pooled RR for total stroke was 0.96 (95% CI, 0.93-1.00) for each increment of 2 servings per day. CONCLUSIONS: These data support a protective relationship between consumption of fruit and vegetables-particularly cruciferous and green leafy vegetables and citrus fruit and juice-and ischemic stroke risk."], ["Sucrose activates human taste pathways differently from artificial sweetener. Animal models suggest that sucrose activates taste afferents differently than non-caloric sweeteners. Little information exists how artificial sweeteners engage central taste pathways in the human brain. We assessed sucrose and sucralose taste pleasantness across a concentration gradient in 12 healthy control women and applied 10% sucrose and matched sucralose during functional magnet resonance imaging. The results indicate that (1) both sucrose and sucralose activate functionally connected primary taste pathways; (2) taste pleasantness predicts left insula response; (3) sucrose elicits a stronger brain response in the anterior insula, frontal operculum, striatum and anterior cingulate, compared to sucralose; (4) only sucrose, but not sucralose, stimulation engages dopaminergic midbrain areas in relation to the behavioral pleasantness response. Thus, brain response distinguishes the caloric from the non-caloric sweetener, although the conscious mind could not. This could have important implications on how effective artificial sweeteners are in their ability to substitute sugar intake.", "Possible neurologic effects of aspartame, a widely used food additive. The artificial sweetener aspartame (L-aspartyl-L-phenylalanyl-methyl ester), is consumed, primarily in beverages, by a very large number of Americans, causing significant elevations in plasma and, probably, brain phenylalanine levels. Anecdotal reports suggest that some people suffer neurologic or behavioral reactions in association with aspartame consumption. Since phenylalanine can be neurotoxic and can affect the synthesis of inhibitory monoamine neurotransmitters, the phenylalanine in aspartame could conceiveably mediate neurologic effects. If mice are given aspartame in doses that elevate plasma phenylalanine levels more than those of tyrosine (which probably occurs after any aspartame dose in humans), the frequency of seizures following the administration of an epileptogenic drug, pentylenetetrazole, is enhanced. This effect is simulated by equimolar phenylalanine and blocked by concurrent administration of valine, which blocks phenylalanine's entry into the brain. Aspartame also potentiates the induction of seizures by inhaled fluorothyl or by electroconvulsive shock. Perhaps regulations concerning the sale of food additives should be modified to require the reporting of adverse reactions and the continuing conduct of mandated safety research.", "Direct and indirect cellular effects of aspartame on the brain. The use of the artificial sweetener, aspartame, has long been contemplated and studied by various researchers, and people are concerned about its negative effects. Aspartame is composed of phenylalanine (50%), aspartic acid (40%) and methanol (10%). Phenylalanine plays an important role in neurotransmitter regulation, whereas aspartic acid is also thought to play a role as an excitatory neurotransmitter in the central nervous system. Glutamate, asparagines and glutamine are formed from their precursor, aspartic acid. Methanol, which forms 10% of the broken down product, is converted in the body to formate, which can either be excreted or can give rise to formaldehyde, diketopiperazine (a carcinogen) and a number of other highly toxic derivatives. Previously, it has been reported that consumption of aspartame could cause neurological and behavioural disturbances in sensitive individuals. Headaches, insomnia and seizures are also some of the neurological effects that have been encountered, and these may be accredited to changes in regional brain concentrations of catecholamines, which include norepinephrine, epinephrine and dopamine. The aim of this study was to discuss the direct and indirect cellular effects of aspartame on the brain, and we propose that excessive aspartame ingestion might be involved in the pathogenesis of certain mental disorders (DSM-IV-TR 2000) and also in compromised learning and emotional functioning.", "The potential toxicity of artificial sweeteners. Since their discovery, the safety of artificial sweeteners has been controversial. Artificial sweeteners provide the sweetness of sugar without the calories. As public health attention has turned to reversing the obesity epidemic in the United States, more individuals of all ages are choosing to use these products. These choices may be beneficial for those who cannot tolerate sugar in their diets (e.g., diabetics). However, scientists disagree about the relationships between sweeteners and lymphomas, leukemias, cancers of the bladder and brain, chronic fatigue syndrome, Parkinson's disease, Alzheimer's disease, multiple sclerosis, autism, and systemic lupus. Recently these substances have received increased attention due to their effects on glucose regulation. Occupational health nurses need accurate and timely information to counsel individuals regarding the use of these substances. This article provides an overview of types of artificial sweeteners, sweetener history, chemical structure, biological fate, physiological effects, published animal and human studies, and current standards and regulations.", "Sugar substitutes: Health controversy over perceived benefits Sugar is an inseparable part of the food we consume. But too much sugar is not ideal for our teeth and waistline. There have been some controversial suggestions that excessive sugar may play an important role in certain degenerative diseases. So artificial sweeteners or artificially sweetened products continue to attract consumers. A sugar substitute (artificial sweetener) is a food additive that duplicates the effect of sugar in taste, but usually has less food energy. Besides its benefits, animal studies have convincingly proven that artificial sweeteners cause weight gain, brain tumors, bladder cancer and many other health hazards. Some kind of health related side effects including carcinogenicity are also noted in humans. A large number of studies have been carried out on these substances with conclusions ranging from \u201csafe under all conditions\u201d to \u201cunsafe at any dose\u201d. Scientists are divided in their views on the issue of artificial sweetener safety. In scientific as well as in lay publications, supporting studies are often widely referenced while the opposing results are de-emphasized or dismissed. So this review aims to explore the health controversy over perceived benefits of sugar substitutes."], ["Flaxseed - a miraculous defense against some critical maladies. Presence of omega-3, omega-6 rich oil, alpha-linoleic acid, dietary fibers, secoisolariciresinol diglucoside, protein and minerals in flaxseed constitute a very strong basis for the utilization of flaxseed in various food preparations as a curative agent. An extensive body of literature illustrates that flaxseed has gained a significant position in the domain of nutritional sciences owing to its pivotal role as an antioxidant agent. The review discusses at length, numerous health benefits of flaxseed typically focusing its preventive role against cardiovascular diseases, cancer, diabetes and enhancement of spatial memory. Massive increase in the size of population with a special emphasize to the developing countries, there is an urge for exploration of the alternative dietary resources that can meet the dietary and nutritional needs of forthcoming generations. With respect to its remarkable nutritional importance, the review in question enables researchers engaged in nutritional sciences to further investigate the therapeutic value of flaxseed functional components and their dietary application in various food products and availability in processed foods as well as in the human cell line.", "Nutritional quality and health benefits of chickpea (Cicer arietinum L.): a review. Chickpea (Cicer arietinum L.) is an important pulse crop grown and consumed all over the world, especially in the Afro-Asian countries. It is a good source of carbohydrates and protein, and protein quality is considered to be better than other pulses. Chickpea has significant amounts of all the essential amino acids except sulphur-containing amino acids, which can be complemented by adding cereals to the daily diet. Starch is the major storage carbohydrate followed by dietary fibre, oligosaccharides and simple sugars such as glucose and sucrose. Although lipids are present in low amounts, chickpea is rich in nutritionally important unsaturated fatty acids such as linoleic and oleic acids. \u03b2-Sitosterol, campesterol and stigmasterol are important sterols present in chickpea oil. Ca, Mg, P and, especially, K are also present in chickpea seeds. Chickpea is a good source of important vitamins such as riboflavin, niacin, thiamin, folate and the vitamin A precursor \u03b2-carotene. As with other pulses, chickpea seeds also contain anti-nutritional factors which can be reduced or eliminated by different cooking techniques. Chickpea has several potential health benefits, and, in combination with other pulses and cereals, it could have beneficial effects on some of the important human diseases such as CVD, type 2 diabetes, digestive diseases and some cancers. Overall, chickpea is an important pulse crop with a diverse array of potential nutritional and health benefits.", "Xenohormesis: health benefits from an eon of plant stress response evolution Xenohormesis is a biological principle that explains how environmentally stressed plants produce bioactive compounds that can confer stress resistance and survival benefits to animals that consume them. Animals can piggyback off products of plants' sophisticated stress response which has evolved as a result of their stationary lifestyle. Factors eliciting the plant stress response can judiciously be employed to maximize yield of health-promoting plant compounds. The xenohormetic plant compounds can, when ingested, improve longevity and fitness by activating the animal's cellular stress response and can be applied in drug discovery, drug production, and nutritional enhancement of diet.", "Maternal consumption of a docosahexaenoic acid-containing functional food during pregnancy: benefit for infant performance on problem-solving but n... BACKGROUND: There are few studies reporting on docosahexaenoic acid (DHA, 22:6n-3) supplementation during pregnancy and infant cognitive function. DHA supplementation in pregnancy and infant problem solving in the first year have not been investigated. OBJECTIVE: We tested the hypothesis that infants born to women who consumed a DHA-containing functional food during pregnancy would demonstrate better problem-solving abilities and recognition memory than would infants born to women who consumed the placebo during pregnancy. DESIGN: In a double-blind, placebo-controlled, randomized trial, pregnant women consumed a DHA-containing functional food or a placebo from gestation week 24 until delivery. Study groups received DHA-containing cereal-based bars (300 mg DHA/92-kcal bar; average consumption: 5 bars/wk; n = 14) or cereal-based placebo bars (n = 15). The Infant Planning Test and Fagan Test of Infant Intelligence were administered to infants at age 9 mo. The problem-solving trial included a support step and a search step. The procedure was scored on the basis of the infant's performance on each step and on the entire problem (intention score and total intentional solutions). Scores were generated on the basis of the cumulative performance of the infant on 5 trials. RESULTS: Treatment had significant effects on the performance of problem-solving tasks: total intention score (P = 0.017), total intentional solutions (P = 0.011), and number of intentional solutions on both cloth (P = 0.008) and cover (P = 0.004) steps. There were no significant differences between groups in any measure of Fagan Test of Infant Intelligence. CONCLUSION: These data point to a benefit for problem solving but not for recognition memory at age 9 mo in infants of mothers who consumed a DHA-containing functional food during pregnancy.", "The fruit of the date palm: its possible use as the best food for the future? The fruits (dates) of the date palm (Phoenix dactylifera L.) contain a high percentage of carbohydrate (total sugars, 44-88%), fat (0.2-0.5%), 15 salts and minerals, protein (2.3-5.6%), vitamins and a high percentage of dietary fibre (6.4-11.5%). The flesh of dates contains 0.2-0.5% oil, whereas the seed contains 7.7-9.7% oil. The weight of the seed is 5.6-14.2% of the date. The fatty acids occur in both flesh and seed as a range of saturated and unsaturated acids, the seeds containing 14 types of fatty acids, but only eight of these fatty acids occur in very low concentration in the flesh. Unsaturated fatty acids include palmitoleic, oleic, linoleic and linolenic acids. The oleic acid content of the seeds varies from 41.1 to 58.8%, which suggests that the seeds of date could be used as a source of oleic acid. There are at least 15 minerals in dates. The percentage of each mineral in dried dates varies from 0.1 to 916 mg/100 g date depending on the type of mineral. In many varieties, potassium can be found at a concentration as high as 0.9% in the flesh while it is as high as 0.5% in some seeds. Other minerals and salts that are found in various proportions include boron, calcium, cobalt, copper, fluorine, iron, magnesium, manganese, potassium, phosphorous, sodium and zinc. Additionally, the seeds contain aluminum, cadmium, chloride, lead and sulphur in various proportions. Dates contain elemental fluorine that is useful in protecting teeth against decay. Selenium, another element believed to help prevent cancer and important in immune function, is also found in dates. The protein in dates contains 23 types of amino acids, some of which are not present in the most popular fruits such as oranges, apples and bananas. Dates contain at least six vitamins including a small amount of vitamin C, and vitamins B(1) thiamine, B(2) riboflavin, nicotinic acid (niacin) and vitamin A. The dietary fibre of 14 varieties of dates has been shown to be as high as 6.4-11.5% depending on variety and degree of ripeness. Dates contain 0.5-3.9% pectin, which may have important health benefits. The world production of dates has increased 2.9 times over 40 years, whereas the world population has doubled. The total world export of dates increased by 1.71% over 40 years. In many ways, dates may be considered as an almost ideal food, providing a wide range of essential nutrients and potential health benefits."], ["Concentrations of antibiotic residues vary between different edible muscle tissues in poultry. Antibiotics are used by veterinarians and producers to treat disease and improve animal production. The federal government, to ensure the safety of the food supply, establishes antibiotic residue tolerances in edible animal tissues and determines the target tissues (e.g., muscle) for residue monitoring. However, when muscle is selected as the target tissue, the federal government does not specify which type of muscle tissue is used for monitoring (e.g., breast versus thigh). If specific muscle tissues incorporate residues at higher concentrations, these tissues should be selected for residue monitoring. To evaluate this possibility in poultry, chickens were divided into four groups and at 33 days of age were dosed with enrofloxacin (Baytril), as per label directions, at either 25 ppm for 3 days, 25 ppm for 7 days, 50 ppm for 3 days, or 50 ppm for 7 days. Breast and thigh muscle tissues were collected from each bird (n = 5 birds per day per group) during the dosing and withdrawal period, and fluoroquinolone concentrations were determined. The results indicate higher overall enrofloxacin concentrations in breast versus thigh muscle for each treatment group (P < 0.05). These data indicate, at least for enrofloxacin, that not all muscle tissues incorporate antibiotics at the same concentrations. These results may be helpful to regulatory agencies as they determine what tissues are to be monitored to ensure that the established residue safety tolerance levels are not exceeded.", "Comparison of the Prevalences and Antimicrobial Resistances of Escherichia coli Isolates from Different Retail Meats in the United States, 2002 to 2008 Escherichia coli isolates were recovered from the National Antimicrobial Resistance Monitoring System retail meat program and examined for antimicrobial susceptibility. Retail meat samples (n = 11,921) from four U.S. states collected during 2002 to 2008, consisting of 2,988 chicken breast, 2,942 ground turkey, 2,991 ground beef, and 3,000 pork chop samples, were analyzed. A total of 8,286 E. coli isolates were recovered. The greatest numbers of samples contaminated with the organism were chicken (83.5%) and turkey (82.0%), followed by beef (68.9%) and pork (44.0%). Resistance was most common to tetracycline (50.3%), followed by streptomycin (34.6%), sulfamethoxazole-sulfisoxazole (31.6%), ampicillin (22.5%), gentamicin (18.6%), kanamycin (8.4%), amoxicillin-clavulanic acid (6.4%), and cefoxitin (5.2%). Less than 5% of the isolates had resistance to trimethoprim, ceftriaxone, ceftiofur, nalidixic acid, chloramphenicol, and ciprofloxacin. All isolates were susceptible to amikacin. Compared to beef and pork isolates, the poultry meat isolates had a greater percentage of resistance to all tested drugs, with the exception of chloramphenicol, to which pork isolates had the most resistance. More than half of the turkey isolates (56%) were resistant to multidrugs (\u22653 classes) compared to 38.9% of chicken, 17.3% of pork, and 9.3% of beef isolates. The blaCMY gene was present in all ceftriaxone- and ceftiofur-resistant isolates. The cmlA, flo, and catI genes were present in 45%, 43%, and 40% of chloramphenicol-resistant isolates, respectively. Most nalidixic acid-resistant isolates (98.5%) had a gyrA mutation in S83 or D87 or both, whereas only 6.7% had a parC mutation in either S80 or E84. The results showed that E. coli was commonly present in the retail meats, and antimicrobial resistance profiles differed according to the animal origin of the isolates.", "Comparison of ESBL contamination in organic and conventional retail chicken meat. Contamination of retail chicken meat by Extended Spectrum Beta-Lactamase (ESBL) producing bacteria likely contributes to the increasing incidence of infections with these bacteria in humans. This study aimed to compare the prevalence and load of ESBL positive isolates between organic and conventional retail chicken meat samples, and to compare the distribution of ESBL genes, strain genotypes and co-resistance. In 2010, 98 raw chicken breasts (n=60 conventional; n=38 organic) were collected from 12 local stores in the Netherlands. Prevalence of ESBL producing micro-organisms was 100% on conventional and 84% on organic samples (p<0.001). Median loads of ESBL producing micro-organisms were 80 (range <20-1360) in conventional, and <20 (range 0-260) CFU/25 g in organic samples (p=0.001). The distribution of ESBL genes in conventional samples and organic samples was 42% versus 56%, respectively (N.S.), for CTX-M-1, 20% versus 42% (N.S.) for TEM-52, and 23% versus 3% (p<0.001) for SHV-12. CTX-M-2 (7%), SHV-2 (5%) and TEM-20 (3%) were exclusively found in conventional samples. Co-resistance rates of ESBL positive isolates were not different between conventional and organic samples (co-trimoxazole 56%, ciprofloxacin 14%, and tobramycin 2%), except for tetracycline, 73% and 46%, respectively, p<0.001). Six of 14 conventional meat samples harbored 4 MLST types also reported in humans and 5 of 10 organic samples harbored 3 MLST types also reported in humans (2 ST10, 2 ST23, ST354). In conclusion, the majority of organic chicken meat samples were also contaminated with ESBL producing E. coli, and the ESBL genes and strain types were largely the same as in conventional meat samples. Copyright \u00a9 2011 Elsevier B.V. All rights reserved.", "Survey of naturally and conventionally cured commercial frankfurters, ham, and bacon for physio-chemical characteristics that affect bacterial growth. Natural and organic food regulations preclude the use of sodium nitrite/nitrate and other antimicrobials for processed meat products. Consequently, processors have begun to use natural nitrate/nitrite sources, such as celery juice/powder, sea salt, and turbinado sugar, to manufacture natural and organic products with cured meat characteristics but without sodium nitrite. The objective of this study was to compare physio-chemical characteristics that affect Clostridium perfringens and Listeria monocytogenes growth in naturally cured and traditionally cured commercial frankfurters, hams, and bacon. Correlations of specific product characteristics to pathogen growth varied between products and pathogens, though water activity, salt concentration, and product composition (moisture, protein and fat) were common intrinsic factors correlated to pathogen growth across products. Other frequently correlated traits were related to curing reactions such as % cured pigment. Residual nitrite and nitrate were significantly correlated to C. perfringens growth but only for the ham products. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Beyond celery and starter culture: advances in natural/organic curing processes in the United States. Over the past 10years there has been ongoing development of curing processes with natural ingredients designed to meet consumer demand and regulatory requirements for natural and organic processed meats. Initially, these processes utilized celery concentrates with a high nitrate content combined with a nitrate-reducing starter culture. Subsequent advances included celery concentrates with the nitrate converted to nitrite by suppliers. Further, as questions developed concerning reduced concentration of preservatives and the microbiological safety of these processed meats, additional advances have resulted in a wide variety of ingredients and processes designed to provide supplementary antimicrobial effects for improved product safety. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved."], ["Relationship between urine bisphenol-A level and declining male sexual function. The adverse effect of bisphenol-A (BPA) on the male reproductive system observed in animal studies has not been well examined in human populations. BPA is potentially a serious public health problem because of its widely detected presence in the human body. This study was conducted among 427 male workers in regions where high levels of BPA exposure existed. All participants provided urine samples, which were tested for BPA concentration using high-performance liquid chromatography. Male sexual dysfunction was ascertained using standard male sexual function inventories. Male sexual dysfunction was measured in 4 domains using 7 indices. After controlling for potential confounders using linear regression, increasing urine BPA level was associated with worsening male sexual function on a continuous scale. All 7 indices demonstrated this negative linear correlation. Increasing urine BPA level was associated with decreased sexual desire (P < .001), more difficulty having an erection (P < .001), lower ejaculation strength (P < .001), and lower level of overall satisfaction with sex life (P < .01). A similar negative correlation was also observed among participants exposed to BPA from only environmental sources (no occupational exposure to BPA), although the estimates in this group were less stable because of a smaller sample size. Our results reveal a correlation between a biological measure of urine BPA level and declining male sexual function. This finding may enhance the understanding of the BPA effect in human populations, and may have important public health implications given the widespread human exposure to BPA.", "Bisphenol A (BPA) in U.S. food. Bisphenol A (BPA) is a chemical used for lining metal cans and in polycarbonate plastics, such as baby bottles. In rodents, BPA is associated with early sexual maturation, altered behavior, and effects on prostate and mammary glands. In humans, BPA is associated with cardiovascular disease, diabetes, and male sexual dysfunction in exposed workers. Food is a major exposure source. We know of no studies reporting BPA in U.S. fresh food, canned food, and food in plastic packaging in peer reviewed journals. We measured BPA levels in 105 fresh and canned foods, foods sold in plastic packaging, and in cat and dog foods in cans and plastic packaging. We detected BPA in 63 of 105 samples, including fresh turkey, canned green beans, and canned infant formula. Ninety-three of these samples were triplicates which had similar detected levels. Detected levels ranged from 0.23 to 65.0 ng/g ww and were not associated with type of food or packaging but did vary with pH. BPA levels were higher for foods of pH 5 compared to more acidic and alkaline foods. Detected levels were comparable to those found by others. Further research is indicated to determine BPA levels in U.S. food in larger, representative sampling.", "Male reproductive organs are at risk from environmental hazards Male reproductive disorders that are of interest from an environmental point of view include sexual dysfunction, infertility, cryptorchidism, hypospadias and testicular cancer. Several reports suggest declining sperm counts and increase of these reproductive disorders in some areas during some time periods past 50 years. Except for testicular cancer this evidence is circumstantial and needs cautious interpretation. However, the male germ line is one of the most sensitive tissues to the damaging effects of ionizing radiation, radiant heat and a number of known toxicants. So far occupational hazards are the best documented risk factors for impaired male reproductive function and include physical exposures (radiant heat, ionizing radiation, high frequency electromagnetic radiation), chemical exposures (some solvents as carbon disulfide and ethylene glycol ethers, some pesticides as dibromochloropropane, ethylendibromide and DDT/DDE, some heavy metals as inorganic lead and mercury) and work processes such as metal welding. Improved working conditions in affluent countries have dramatically decreased known hazardous workplace exposures, but millions of workers in less affluent countries are at risk from reproductive toxicants. New data show that environmental low-level exposure to biopersistent pollutants in the diet may pose a risk to people in all parts of the world. For other toxicants the evidence is only suggestive and further evaluation is needed before conclusions can be drawn. Whether compounds as phthalates, bisphenol A and boron that are present in a large number of industrial and consumer products entails a risk remains to be established. The same applies to psychosocial stressors and use of mobile phones. Finally, there are data indicating a particular vulnerability of the fetal testis to toxicants\u2014for instance maternal tobacco smoking. Time has come where male reproductive toxicity should be addressed form entirely new angles including exposures very early in life.", "Inadvertent exposure to xenoestrogens. Over the last 40 years there have been constant reports concerning environmental chemicals with hormone-like effects in wildlife. An endocrine disruptor is an exogenous substance that causes adverse health effects in an intact organism or its progeny, secondary to changes in endocrine function. Endocrine disruptors of widely diverse chemical structures that have oestrogenic properties are known as oestrogenic xenobiotics or xenoestrogens. Some of these substances, such as phytoestrogens and mycoestrogens, can come from diet or from the environment. Although the oestrogenic activity of these substances is weaker than that of oestradiol, new chemicals with endocrine disrupting potential continue to be discovered, inadvertent forms of exposure are constantly being identified, and there is increasing concern about cumulative effects. Studies in the 1960s and 1970s characterized the oestrogenicity of a number of industrial compounds and the pesticides o,p-DDT, kepone, methoxychlor, phenolic derivatives and polychlorinated biphenyls (PCBs). In the last 5 years, several environmental chemicals have been added to the list of xenoestrogens, including the pesticides toxaphene, dieldrin and endosulphan, and several different compounds used in the food industry, antioxidants such a t-butylhydroxyanisole; plasticizers such as benzylbutylphthalate and 4-OH-alkylphenols; and substances used in dental restorations, such as bisphenol-A. The relevance of these newly discovered endocrine disruptors to human health is now starting to emerge. The few studies that have investigated their effect in humans point in the same direction: if there is indeed an association between exposure to substances with hormone-disruptive activity and certain disorders of endocrine organs, the incidence of such disorders would be greater in areas where exposure to agents with this activity is high. A closer scrutiny is required to determine whether these newly discovered endocrine disrupting chemicals contribute, together with oestrogenic pesticides, to the exposure of humans to xenoestrogens.", "Reduction in penis size and plasma testosterone concentrations in juvenile alligators living in a contaminated environment. The development of the male reproductive ducts and external genitalia in vertebrates is dependent on elevated androgen concentrations during embryonic development and the period of postnatal growth. We have observed that a population of juvenile alligators living on Lake Apopka exhibit significantly smaller penis size (24% average decrease) and lower plasma concentrations of testosterone (70% lower concentrations) when compared to animals of similar size on Lake Woodruff. In addition to smaller phalli, no relationship exists between plasma testosterone concentrations and penile size in males from Lake Apopka, whereas a positive relationship exists for males from Lake Woodruff. The alligators on Lake Apopka are known to have elevated concentrations of the antiandrogenic DDT breakdown product p.p'-DDE stored in their fat. We suggest a number of hypotheses that could explain the modification in the phenotype of the juvenile male living in Lake Apopka. These modifications in phenotype include a smaller penis size, lower plasma androgen concentrations, and lack of responsiveness of the penis to the plasma androgens present."], ["The urban rise and fall of air lead (Pb) and the latent surge and retreat of societal violence. We evaluate air Pb emissions and latent aggravated assault behavior at the scale of the city. We accomplish this by regressing annual Federal Bureau of Investigation aggravated assault rate records against the rise and fall of annual vehicle Pb emissions in Chicago (Illinois), Indianapolis (Indiana), Minneapolis (Minnesota), San Diego (California), Atlanta (Georgia), and New Orleans (Louisiana). Other things held equal, a 1% increase in tonnages of air Pb released 22 years prior raises the present period aggravated assault rate by 0.46% (95% CI, 0.28 to 0.64). Overall our model explains 90% of the variation in aggravated assault across the cities examined. In the case of New Orleans, 85% of temporal variation in the aggravated assault rate is explained by the annual rise and fall of air Pb (total=10,179 metric tons) released on the population of New Orleans 22 years earlier. For every metric ton of Pb released 22 years prior, a latent increase of 1.59 (95% CI, 1.36 to 1.83, p<0.001) aggravated assaults per 100,000 were reported. Vehicles consuming fuel containing Pb additives contributed much larger quantities of Pb dust than generally recognized. Our findings along with others predict that prevention of children's lead exposure from lead dust now will realize numerous societal benefits two decades into the future, including lower rates of aggravated assault. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Faecal elimination of lead and cadmium in subjects on a mixed and a lactovegetarian diet. Faecal elimination of lead and cadmium in 16 subjects who changed from a mixed diet to a lactovegetarian diet has been studied. The faecal weight increased significantly following the change to the vegetarian diet, partly because of increased water content. There was a large inter-individual variation in faecal elimination of lead and cadmium during both the mixed-diet period (range 14 to 118, median 31 micrograms Pb/day; range 4.5 to 21, median 12 micrograms Cd/day) and the vegetarian diet period (range 19 to 136, median 42 micrograms Pb/day; range 6.1 to 24, median 14 micrograms Cd/day). There was a tendency towards increased faecal elimination of lead and cadmium following the change to the vegetarian diet, but the differences were not statistically significant.", "Arsenic and lead in juice: apple, citrus, and apple-base. Exposure limits for arsenic and lead in drinking water have long been established by the U.S. Environmental Protection Agency and new regulations regarding the presence of these contaminants in bottled water went into effect in California in 2009. No comparable exposure limits or regulations are available, however, for juices and other beverages that may contain arsenic and lead. In the study described in this article, 20 apple juices (or ciders), 15 apple-containing juices, one grape, and one citrus juice were analyzed for arsenic and lead. Arsenic was detected in all juices while lead was detected in more than 94% of juices analyzed. Twelve samples (32%) demonstrated arsenic levels nearly at or above the drinking water exposure limit of 10 parts per billion. No juices contained lead above drinking water exposure limits. Expanding drinking water limits to include juices (and other frequently consumed beverages) would better protect consumers while regular testing of these juices would better inform consumers of the risks posed by specific juices and brands.", "Correlation of lead, cadmium and mercury levels in tissue and liver samples with age in cattle. The aim of this study was to determine the accumulation of selected heavy metals (Pb, Cd, Hg, As) in meat and liver of cattle. The animals were divided into four age-groups which allowed the analysis of statistical-mathematical correlations between the age of the animals and contamination of meat. The research material for determination of heavy metal levels was taken from the longissimus back muscle (m. longissimus dorsi) and samples from the tail lobe of the liver. Analysis showed that contamination by Cd and Pb is clearly dependent on the age of the animal.", "Brain cancer associated with environmental lead exposure: evidence from implementation of a National Petrol-Lead Phase-Out Program (PLPOP) in Taiwa... BACKGROUND AND OBJECTIVE: In 1981, a Petrol-Lead Phase-Out Program (PLPOP) was launched in Taiwan for the abatement of environmental lead emissions. The present study was intended to examine whether the high Petrol-Lead Emission Areas (PLEA) would result in an increase in the incidence rate of brain cancer based on a national data bank. METHODS: The national brain cancer incidence data was obtained from the Taiwan National Cancer Registry. Age standardized incidence rates were calculated based on the 2000 WHO world standard population, and gasoline consumption data was obtained from the Bureau of Energy. The differences in the trend tests for age-standardized incidence rates of brain cancer between high, median, low, and small PLEA were analyzed. RESULTS: A significant increase was found from small to high PLEA in age-standardized incidence rates of brain cancer. By taking six possible confounders into account, the age-standardized incidence rates for brain cancer were highly correlated with the median and high PLEA by reference to the small PLEA. CONCLUSION: After being adjusted for a number of relevant confounders, it could be concluded that high PLEA might result in an increase in the incidence rate of brain cancer resulting from high lead exposures. Copyright \u00a9 2011 Elsevier Ltd. All rights reserved."], ["A wholly nutritional 'multifocal angiostatic therapy' for control of disseminated cancer. A great deal of effort is now being devoted to the development of new drugs that hopefully will control the spread of inoperable cancer by safely inhibiting tumor-evoked angiogenesis. However, there is growing evidence that certain practical nutritional measures have the potential to slow tumor angiogenesis, and it is reasonable to anticipate that, by combining several measures that work in distinct but complementary ways to impede the angiogenic process, a clinically useful 'multifocal angiostatic therapy' (MAT) might be devised. Several measures which might reasonably be included in such a protocol are discussed below, and include: a low-fat, low-glycemic index vegan diet, which may down-regulate the systemic IGF-I activity that supports angiogenesis; supplemental omega-3-rich fish oil, which has been shown to inhibit endothelial expression of Flk-1, a functionally crucial receptor for VEGF, and also can suppress tumor production of pro-angiogenic eicosanoids; high-dose selenium, which has recently been shown to inhibit tumor production of VEGF; green tea polyphenols, which can suppress endothelial responsiveness to both VEGF and fibroblast growth factor; and high-dose glycine, whose recently reported angiostatic activity may reflect inhibition of endothelial cell mitosis, possibly mediated by activation of glycine-gated chloride channels. In light of evidence that tumor-evoked angiogenesis has a high requirement for copper, copper depletion may have exceptional potential as an angiostatic measure, and is most efficiently achieved with the copper-chelating drug tetrathiomolybdate. If logistical difficulties make it difficult to acquire this experimental drug, high-dose zinc supplementation can achieve a slower depletion of the body's copper pool, and in any case can be used as maintenance therapy to maintain an adequate level of copper depletion. A provisional protocol is offered for a nutritionally based MAT entailing a vegan diet and supplemental intakes of fish oil, selenium, green tea polyphenols, glycine, and zinc. Inasmuch as cox-2 is overexpressed in many cancers, and cAMP can boost tumor production of various angiogenic factors as well as autogenous growth factors, adjunctive use of cox-2-specific NSAIDS may be warranted in some cases.", "Sick individuals and sick populations. Rose G (Department of Epidemiology, London School of Hygiene and Tropical Medicine, Keppel Street, London WC1E 7HT, UK). Sick individuals and sick populations. International Journal of Epidemiology 1985;14:32--38. Aetiology confronts two distinct issues: the determinants of individual cases, and the determinants of incidence rate. If exposure to a necessary agent is homogeneous within a population, then case/control and cohort methods will fail to detect it: they will only identify markers of susceptibility. The corresponding strategies in control are the 'high-risk' approach, which seeks to protect susceptible individuals, and the population approach, which seeks to control the causes of incidence. The two approaches are not usually in competition, but the prior concern should always be to discover and control the causes of incidence.", "Cancer and aging: from the kinetics of biological parameters to the kinetics of cancer incidence and mortality. Epidemiologic and biological data strongly support the existence of a strict link between cancer and aging. In spite of the relevance of the problem, there were numerous pitfalls in epidemiologic investigation until a few years ago. An apparent decrease of cancer incidence in old age was revealed to be a misconception based on lack of sufficient appreciation for changing population size. But not all problems are solved by using age-specific cancer incidence, as recently stressed by some authors. At very advanced ages a slowing of the rate of increase of age-specific cancer incidence is clearly demonstrated. These findings apparently clash with the majority of biological data and suggest that some mechanism may develop at advanced ages capable of decreasing cancer susceptibility. In this paper, it will be shown that just a slowing-down kinetics is predicted for cancer incidence by using a mathematical model of mortality kinetics recently proposed in the gerontologic field. The slowing of the increasing rate or even a decreasing trend of cancer incidence of an aging population is compatible with a continuously accelerating pace of loss of physiological capacity of the single subjects, as with advancing age there is a selection of individuals with better physiological functions.", "Identification of peptide hormones of the amphipathic helix class using the helical hydrophobic moment algorithm. Eisenberg's helical hydrophobic moment (less than mu H greater than) algorithm was applied to the analysis of the primary structure of amphipathic alpha-helical peptide hormones and an optimal method for identifying other peptides of this class determined. We quantitate and compare known amphipathic helical peptide hormones with a second group of peptides with proven nonamphipathic properties and determine the best method of distinguishing between them. The respective means of the maximum 11 residue less than mu H greater than for the amphipathic helical and control peptides were 0.46 (+/-/-0.07) and 0.33 (0.07) (P + 0.004). To better reflect the amphipathic potential of the entire peptide, the percent of 11 residue segments in each peptide above a particular less than mu H greater than was plotted vs less than mu H greater than. The resulting curves are referred to as HM-C. The mean HM-C (of the two groups) was highly significantly different such that the HM-C method was superior to others in its ability to distinguish amphipathic from nonamphipathic peptides. Several potential new members of this structural class were identified using this approach. Molecular modeling of a portion of one of these, prolactin inhibitory factor, reveals a strongly amphipathic alpha helix at residues 4-21. This computer-based method may enable rapid identification of peptides of the amphipathic alpha-helix class.", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet"], ["The effect of the addition of daily fruit and nut bars to diet on weight, and cardiac risk profile, in overweight adults. BACKGROUND: The frequency of unhealthful snacking has increased dramatically over the last three decades. Fruits and nuts have been shown to have positive health effects. No study has investigated the aggregate effects of various fruits combined with nuts in the form of snack bars on cardiovascular risk factors. The aim of this randomised trial was to investigate the effects of a fruit and nut snack bar on anthropomorphic measures, lipid panel and blood pressure in overweight adults. METHODS: Ninety-four overweight adults (body mass index > 25 kg m(-2)) were randomly assigned to add two fruit and nut bars totalling 1421.9 kJ (340 kcal) to their ad libitum diet (intervention group) or to continue with their ad libitum diet (control group). Subjects underwent assessment for weight (primary outcome measure), as well as waist circumference, lipid panel and blood pressure (secondary outcome measures), before and at the end of the 8-week treatment. RESULTS: Weight did not change from baseline after snack bar addition compared to controls (P = 0.44). Waist circumference (P = 0.69), blood pressure (systolic, P = 0.83; diastolic, P = 0.79) and blood lipid panel (total cholesterol, P = 0.72; high-density lipoprotein, P = 0.11; total cholesterol/high-density lipoprotein, P = 0.37; triglycerides, P = 0.89; low-density lipoprotein, P = 0.81) also did not change from baseline compared to controls. CONCLUSIONS: Two daily fruit and nut bars, totalling 1421.9 kJ (340 kcal), did not cause weight gain. The role of habitual snacking on nutrient dense and satiating foods on both weight over time, and diet quality, warrants further study. Satiating snacks rich in fibre may provide a means to weight stabilisation. \u00a9 2011 The Authors. Journal of Human Nutrition and Dietetics \u00a9 2011 The British Dietetic Association Ltd.", "Two weeks of overfeeding with candy, but not peanuts, increases insulin levels and body weight. OBJECTIVE: To study the effects of snacking based on fast acting carbohydrates (candy) or fat and protein (peanuts) in a prospective randomized, parallel intervention study. METHODS: Basal metabolic rate (BMR) and cardiovascular risk factors were measured before and after hyper-alimentation by addition of 20 kcal/kg (84 kJ/kg) body weight of either candy or roasted peanuts, to the regular caloric intake, for two weeks in healthy subjects. Eleven men and 14 women completed the randomized study. RESULTS: Energy-intake increased similarly in the groups (candy: +46.1+/-35%, peanuts: +46.8+/-28% p=0.96). Body-weight (candy: from 67.3+/-7.6 kg to 68.1+/-7.3 kg, p=0.01, nuts: from 68.7+/-6.1 kg to 69.0+/-5.7 kg p=0.3) and waist circumference increased significantly only in the candy group. At the end of the study LDL cholesterol (candy: 2.6+/-0.4 mmol/l peanuts: 2.1+/-0.4 mmol/l, p=0.005) and ApoB/ApoA-1-ratio (candy: 0.68+/-0.16 peanuts 0.53+/-0.11, p=0.01) were higher in the candy group than in the peanut group. On the other hand, BMR increased only in the peanut group (candy: from 6.657+/-1.1 MJ/24 h to 6.762+/-1.1 MJ/24 h, p=0.3 nuts: from 6.896+/-0.98 MJ/24 h to 7.256+/-1.1 MJ/24 h, p=0.02). CONCLUSION: Two weeks of snacking based on peanuts does not cause the same negative metabolic effects as an isocaloric diet in which the snacking is based on short acting carbohydrates in the form of candy in non-obese healthy subjects.", "A premeal snack of raisins decreases mealtime food intake more than grapes in young children. The effect of a premeal snack of grapes, raisins, or a mix of almonds and raisins, compared with a water control, on food intake (FI) was examined in 8- to 11-year-old normal-weight (15th to 85th percentile) children. Children randomly received 1 of 4 ad libitum (Experiment 1: 13 boys, 13 girls) or fixed-calorie (150 kcal; Experiment 2: 13 boys, 13 girls) treatments, followed by an ad libitum pizza meal 30 min later. Appetite was measured throughout the study, and FI was measured at 30 min. The ad libitum consumption (Experiment 1) of raisins reduced pizza intake (p < 0.037), compared with water (26%), grapes (22%), and the mixed snack (15%). Cumulative energy intake (in kcal: snack + pizza) was lower after water and raisins than after either grapes or the mixed snack (p < 0.031). As a fixed-calorie (150 kcal) snack (Experiment 2), raisins reduced pizza intake, compared with water (\u223c11%, p = 0.005), and resulted in a cumulative intake similar to water; however, both grapes and the mixed snack resulted in higher cumulative intakes (p < 0.015). Appetite was lower after all caloric ad libitum snacks (p < 0.003) and after fixed amounts of grapes and the mixed snack (p < 0.037), compared with water. In conclusion, consumption of a premeal snack of raisins, but not grapes or a mix of raisins and almonds, reduces meal-time energy intake and does not lead to increased cumulative energy intake in children.", "Short-term effects of a snack including dried prunes on energy intake and satiety in normal-weight individuals. The purpose of this study was to test the hypothesis that a preload including dried prunes consumed as a snack before a meal, compared to an isoenergetic and equal weighed bread product preload would: (a) have greater short-term effect on satiety measured by subsequent ad libitum meal intake, (b) induce greater satiety as assessed by visual analogue scales (VAS), and (c) reduce appetite for dessert offered shortly after lunch. Forty-five healthy, normal-weight subjects participated in this randomised within-subject crossover study. Statistical analysis of the results showed that when subjects consumed the preload that included dried prunes, also consumed less amount of dessert and had lower total energy intake at meal. Additionally, subjects' feeling of hunger, desire and motivation to eat, as assessed with the use of VAS, were lower at all time points between snack and meal. Since macronutrients content of both preloads were similar, the satiating power of prunes could be due to their relatively high fiber content. Identifying meal patterns and foods that promote satiety without increasing considerably the overall energy intake is very important. The addition of dried prunes to a snack seems to promote satiety besides providing valuable nutrients. 2010 Elsevier Ltd. All rights reserved.", "\\\"Split them!\\\" smaller item sizes of cookies lead to a decrease in energy intake in children. OBJECTIVE: Examine the influence of altering the size of snack food (ie, small vs large cookies) on short-term energy intake. METHODS: First- and sixth-graders (n = 77) participated in a between-subjects experimental design. All participants were offered the same gram weight of cookies during an afternoon tea at their school. For half of the participants, food was cut in 2 to make the small item size. Food intake (number of cookies, gram weight, and energy intake) was examined using ANOVA. RESULTS: Decreasing the item size of food led to a decrease of 25% in gram weight intake, corresponding to 68 kcal. Appetitive ratings and subject and food characteristics had no moderating effect. CONCLUSIONS AND IMPLICATIONS: Reducing the item size of food could prove a useful dietary prevention strategy based on decreased consumption, aimed at countering obesity-promoting eating behaviors favored by the easy availability of large food portions. Copyright \u00a9 2012 Society for Nutrition Education and Behavior. Published by Elsevier Inc. All rights reserved."], ["Nutrition and colonic health: the critical role of the microbiota. PURPOSE OF REVIEW: To highlight mechanisms whereby diet affects colonic function and disease patterns. RECENT FINDINGS: Topical nutrients are preferentially used by the gut mucosa to maintain structure and function. With the colon, topical nutrients are generated by the colonic microbiota to maintain mucosal health. Most importantly, short chain fatty acids control proliferation and differentiation, thereby reducing colon cancer risk. In patients with massive loss of small intestine, short chain fatty acid production supports survival by releasing up to 1000 kcal energy/day. Human studies show that the microbiota synthesizes a large pool of utilizable folate which may support survival in impoverished populations. Unfortunately, the microbiota may also elaborate toxic products from food residues such as genotoxic hydrogen sulfide by sulfur-reducing bacteria in response to a high-meat diet. The employment of culture-free techniques based on 16S regions of DNA has revealed that our colons harbor over 800 bacterial species and 7000 different strains. Evidence suggests that the diet directly influences the diversity of the microbiota, providing the link between diet, colonic disease, and colon cancer. The microbiota, however, can determine the efficiency of food absorption and risk of obesity. SUMMARY: Our investigations have focused on a small number of bacterial species: characterization of microbiota and its metabolism can be expected to provide the key to colonic health and disease.", "High polyphenol, low probiotic diet for weight loss because of intestinal microbiota interaction. The relative proportion of Bacteroidetes to Firmicutes is decreased in obese people. This imbalance in gut microbiota generates signals controlling the expression of genes by the epithelial intestinal cells. Both dairy and non-dairy probiotics increase body weight, reportedly through Lactobacillus species growth in the gut. On the other hand, daily intake of some fruits and drinks such as three apples or three pears or grapefruit, or green tea, which all are rich in polyphenols, can significantly reduce body weight in obese people. Metabolism of polyphenols by microbiota involves the cleavage of glycosidic linkages. Glycans, which are the product of glycosidic cleavage, are necessary for survival of the intestinal microbiota as a nutrient foundation. There are two pivotal points: (i) Firmicutes possess a disproportionately smaller number of glycan-degrading enzymes than Bacteroidetes, (ii) Firmicutes are more repressed than the Bacteroidetes by phenolic compounds' antimicrobial properties. The Bacteroidetes community prevails following dietary polyphenol intake and its fermentation to phenolic compounds, due to having more glycan-degrading enzymes, so this may thus be a mechanism by which dietary polyphenols exert their weight lowering effect. I suggest that future studies utilize clone libraries and fingerprinting techniques enabling identification of the composition and community structure of the microbiota, and dot blot hybridization or fluorescent in situ hybridization to analyze abundance of particular taxa in obese and individuals. A supplementation with polyphenols with high bioavailability in obese individuals with higher Firmicutes/Bacteroides community ratio phenotype, when associated to a probiotic restricted diet, is proposed for weight loss; this hypothesis could have relevant implication in planning a successful dietary regimen and/or neutraceutical/pharmaceutical preparations for achieving and maintaining a normal body weight in obese individuals, especially including much more use of polyphenol-rich foodstuffs and/or polyphenol-rich syrups, and including low amounts of probiotic-rich foodstuffs like yogurt, soy yogurt, or as probiotic supplements. Copyright \u00a9 2010 Elsevier Ireland Ltd. All rights reserved.", "Influence of dietary protein supplements on the formation of bacterial metabolites in the colon. BACKGROUND: To evaluate the influence of increased dietary protein intake on bacterial colonic metabolism in healthy volunteers. METHODS: Short chain fatty acids, ammonia, and volatile organic compounds in faecal samples, and phenols in the urine of five volunteers were measured after one week of basal nutrient intake and and after one week of a diet supplemented with a protein rich food (Fortimel; Nutricia, Zoetermeer, The Netherlands). Paired t tests and factor analysis were used for statistical analysis. RESULTS: Total energy and resistant carbohydrate intake remained unchanged in each study period. The percentage energy intake delivered as dietary protein, increased significantly (from 15.4% to 23.8%; p = 0.007) during supplement intake. A significant increase in faecal ammonia (p = 0.002), faecal valeric acid (p = 0.02), and urinary p-cresol (p = 0.04) was noted during supplementary protein intake. A total of 120 different volatile compounds were isolated from the faecal samples of which 10 increased significantly during dietary protein supplementation. The change in volatile pattern, especially for S containing metabolites, was clearly shown by a factor analysis model which made a distinction between the two dietary regimens for all volunteers. CONCLUSION: An increase in dietary protein leads to altered products formation by colonic metabolism, mainly reflected by an increase in faecal ammonia, faecal volatile S substances, and urinary p-cresol.", "Mechanisms of primary cancer prevention by butyrate and other products formed during gut flora-mediated fermentation of dietary fibre. Dietary fibres are indigestible food ingredients that reach the colon and are then fermented by colonic bacteria, resulting mainly in the formation of short-chain fatty acids (SCFA) such as acetate, propionate, and butyrate. Those SCFA, especially butyrate, are recognised for their potential to act on secondary chemoprevention by slowing growth and activating apoptosis in colon cancer cells. Additionally, SCFA can also act on primary prevention by activation of different drug metabolising enzymes. This can reduce the burden of carcinogens and, therefore, decrease the number of mutations, reducing cancer risk. Activation of GSTs by butyrate has been studied on mRNA, protein, and enzyme activity level by real-time RT-PCR, cDNA microarrays, Western blotting, or photometrical approaches, respectively. Butyrate had differential effects in colon cells of different stages of cancer development. In HT29 tumour cells, e.g., mRNA GSTA4, GSTP1, GSTM2, and GSTT2 were induced. In LT97 adenoma cells, GSTM3, GSTT2, and MGST3 were induced, whereas GSTA2, GSTT2, and catalase (CAT) were elevated in primary colon cells. Colon cells of different stages of carcinogenesis differed in post-transcriptional regulatory mechanisms because butyrate increased protein levels of different GST isoforms and total GST enzyme activity in HT29 cells, whereas in LT97 cells, GST protein levels and activity were slightly reduced. Because butyrate increased histone acetylation and phosphorylation of ERK in HT29 cells, inhibition of histone deacetylases and the influence on MAPK signalling are possible mechanisms of GST activation by butyrate. Functional consequences of this activation include a reduction of DNA damage caused by carcinogens like hydrogen peroxide or 4-hydroxynonenal (HNE) in butyrate-treated colon cells. Treatment of colon cells with the supernatant from an in vitro fermentation of inulin increased GST activity and decreased HNE-induced DNA damage in HT29 cells. Additional animal and human studies are needed to define the exact role of dietary fibre and butyrate in inducing GST activity and reducing the risk of colon cancer.", "Systemic immunity-enhancing effects in healthy subjects following dietary consumption of the lactic acid bacterium Lactobacillus rhamnosus HN001. OBJECTIVE: To determine the effects of the probiotic lactic acid bacterium, Lactobacillus rhamnosus HN001, on natural cellular immunity when delivered orally in normal low-fat milk (LFM) or lactose-hydrolyzed low-fat milk (LFM-LH). DESIGN: A three stage, pre-post intervention trial, spanning nine weeks. SETTING: Taipei Medical College Hospital, Taipei, Taiwan. SUBJECTS: Fifty-two healthy middle-aged and elderly volunteers (17 males, 35 females; median age 63.5, range 44-80). INTERVENTIONS: Stage 1 (run-in diet): 25 g/200 mL reconstituted LFM powder, twice daily for 3 weeks. Stage 2 (probiotic intervention): LFM or LFM-LH, supplemented with 10(9) CFUs/g L. rhamnosus HN001 in each case, for 3 weeks. Stage 3 (wash-out): LFM for 3 weeks. MEASURES OF OUTCOME: In vitro phagocytic capacity of peripheral blood polymorphonuclear (PMN) leukocytes; in vitro tumoricidal activity of natural killer (NK) leukocytes. RESULTS: Immunological responses were unaffected by the run-in diet of LFM alone. In contrast, the relative proportion of PMN cells showing phagocytic activity increased by 19% and 15%, respectively, following consumption of HN001 in either LFM or LFM-LH; the relative level of NK cell tumor killing activity increased by 71% and 147%. In most cases these levels declined following cessation, but remained above baseline. CONCLUSIONS: Dietary consumption of L. rhamnosus HN001, in a base of low-fat milk or lactose-hydrolyzed low-fat milk, appears to enhance systemic cellular immune responses and may be useful as a dietary supplement to boost natural immunity."], ["The Effects of Phytosterols Present in Natural Food Matrices on Cholesterol Metabolism and LDL-Cholesterol: A Controlled Feeding Trial Background/Objectives Extrinsic phytosterols supplemented to the diet reduce intestinal cholesterol absorption and plasma LDL-cholesterol. However, little is known about their effects on cholesterol metabolism when given in native, unpurified form and in amounts achievable in the diet. The objective of this investigation was to test the hypothesis that intrinsic phytosterols present in unmodified foods alter whole-body cholesterol metabolism. Subjects/Methods Twenty out of 24 subjects completed a randomized, crossover feeding trial where all meals were provided by a metabolic kitchen. Each subject consumed two diets for 4 weeks each. The diets differed in phytosterol content (phytosterol-poor diet, 126 mg phytosterols/2000 kcal; phytosterol-abundant diet, 449 mg/2000 kcal) but were otherwise matched for nutrient content. Cholesterol absorption and excretion were determined by gas chromatograph/mass spectrometry after oral administration of stable isotopic tracers. Results The phytosterol-abundant diet resulted in lower cholesterol absorption [54.2 \u00b1 2.2 % (95% confidence interval, 50.5%, 57.9%) vs. 73.2 \u00b1 1.3% (69.5%, 76.9%), P<0.0001] and 79% higher fecal cholesterol excretion [1322 \u00b1 112 (1083.2, 1483.3) vs. 739 \u00b1 97 mg/day (530.1, 930.2), P<0.0001] relative to the phytosterol-poor diet. Plasma lathosterol/cholesterol ratio rose 82% [from 0.71 \u00b1 0.11 (0.41, 0.96) to 1.29 \u00b1 0.14 \u03bcg/mg (0.98, 1.53), (P<0.0001)]. LDL-cholesterol was similar between diets. Conclusions Intrinsic phytosterols at levels present in a healthy diet are biologically active and have large effects on whole body cholesterol metabolism not reflected in circulating LDL. More work is needed to assess the effects of phytosterol-mediated fecal cholesterol excretion on coronary heart disease risk in humans.", "The effect of combining plant sterols, soy protein, viscous fibers, and almonds in treating hypercholesterolemia. Reductions in low-density lipoprotein-cholesterol (LDL-C) result from diets containing almonds, or diets that are either low in saturated fat or high in viscous fibers, soy proteins, or plant sterols. We have therefore combined all of these interventions in a single diet (portfolio diet) to determine whether cholesterol reductions could be achieved of similar magnitude to those reported in recent statin trials which reduced cardiovascular events. Twenty-five hyperlipidemic subjects consumed either a portfolio diet (n=13), very low in saturated fat and high in plant sterols (1.2 g/1,000 kcal), soy protein (16.2 g/1,000 kcal), viscous fibers (8.3 g/1,000 kcal), and almonds (16.6 g/1,000 kcal), or a low-saturated fat diet (n=12) based on whole-wheat cereals and low-fat dairy foods. Fasting blood, blood pressure, and body weight were obtained at weeks 0, 2, and 4 of each phase. LDL-C was reduced by 12.1% +/- 2.4% (P<.001) on the low-fat diet and by 35.0% +/- 3.1% (P<.001) on the portfolio diet, which also reduced the ratio of LDL-C to high-density lipoprotein-cholesterol (HDL-C) significantly (30.0% +/- 3.5%; P<.001). The reductions in LDL-C and the LDL:HDL-C ratio were both significantly lower on the portfolio diet than on the control diet (P<.001 and P<.001, respectively). Mean weight loss was similar on test and control diets (1.0 kg and 0.9 kg, respectively). No difference was seen in blood pressure, HDL-C, serum triglycerides, lipoprotein(a) [Lp(a)], or homocysteine concentrations between diets. Combining a number of foods and food components in a single dietary portfolio may lower LDL-C similarly to statins and so increase the potential effectiveness of dietary therapy.", "Phytosterol composition of nuts and seeds commonly consumed in the United States. Phytosterols were quantified in nuts and seeds commonly consumed in the United States. Total lipid extracts were subjected to acid hydrolysis and then alkaline saponfication, and free sterols were analyzed as trimethylsilyl derivatives by capillary GC-FID and GC-MS. Delta5-Avenasterol was quantified after alkaline saponification plus direct analysis of the glucoside. Sesame seed and wheat germ had the highest total phytosterol content (400-413 mg/100 g) and Brazil nuts the lowest (95 mg/100 g). Of the products typically consumed as snack foods, pistachio and sunflower kernel were richest in phytosterols (270-289 mg/100 g). beta-Sitosterol, Delta5-avenasterol, and campesterol were predominant. Campestanol ranged from 1.0 to 12.7 mg/100 g. Only 13 mg/100 g beta-sitosterol was found in pumpkin seed kernel, although total sterol content was high (265 mg/100 g). Phytosterol concentrations were greater than reported in existing food composition databases, probably due to the inclusion of steryl glycosides, which represent a significant portion of total sterols in nuts and seeds.", "Divergent changes in serum sterols during a strict uncooked vegan diet in patients with rheumatoid arthritis. The effects of a strict uncooked vegan diet on serum lipid and sterol concentrations were studied in patients with rheumatoid arthritis. The subjects were randomized into a vegan diet group (n 16), who consumed a vegan diet for 2-3 months, or into a control group (n 13), who continued their usual omnivorous diets. Serum total and LDL-cholesterol and -phospholipid concentrations were significantly decreased by the vegan diet. The levels of serum cholestanol and lathosterol also decreased, but serum cholestanol:total cholesterol and lathosterol:total cholesterol did not change. The effect of a vegan diet on serum plant sterols was divergent as the concentration of campesterol decreased while that of sitosterol increased. This effect resulted in a significantly greater sitosterol:campesterol value in the vegan diet group than in the control group (1.48 (SD 0.39) v. 0.72 (SD 0.14); P < 0.001). A higher concentration of campesterol compared with sitosterol is normal in omnivorous subjects and can be explained by lower absorption and esterification rates of sitosterol. Our results suggest that a strict uncooked vegan diet changes the relative absorption rates of these sterols and/or their biliary clearance.", "Maintenance of the LDL cholesterol:HDL cholesterol ratio in an elderly population given a dietary cholesterol challenge. We previously evaluated the responses to dietary cholesterol in children and young adults. In this study, the effects of dietary cholesterol on plasma lipids and LDL atherogenicity were evaluated in 42 elderly subjects (29 postmenopausal women and 13 men > 60 y old). Our exclusion criteria were diabetes, heart disease, and the use of reductase inhibitors. The study followed a randomized crossover design in which subjects were assigned to consume the equivalent of 3 large eggs (EGG) daily or the same amount of a cholesterol-free, fat-free egg substitute (SUB) for a 1-mo period. After a 3-wk washout period, subjects were assigned to the alternate treatment. The concentration of plasma cholesterol after the EGG period varied among subjects. When all subjects were evaluated, there were significant increases in LDL cholesterol (LDL-C) (P < 0.05) and HDL-C (P < 0.001) for both men and women during the EGG period, resulting in no alterations in the LDL-C:HDL-C or the total cholesterol:HDL-C ratios. In addition, the LDL peak diameter was increased during the EGG period for all subjects. In contrast, the measured parameters of LDL oxidation, conjugated diene formation, and LDL lag time did not differ between the EGG and the SUB periods. We conclude from this study that dietary cholesterol provided by eggs does not increase the risk for heart disease in a healthy elderly population."], ["Application of LC and LC-MS to the analysis of melatonin and serotonin in edible plants. Melatonin is a neurohormone produced by the pineal gland of animals. Serotonin is a monoamine neurotransmitter and one of the precursors of melatonin biosynthesis. These two indoleamines have recently been reported to have widespread occurrence in many edible plants. Consuming foodstuffs containing melatonin and serotonin could raise their physiologic concentrations in blood and enhance human health. Literature concerning analytical methods suitable for determination of melatonin and serotonin in edible plants is limited, although several liquid chromatographic (LC) techniques have been used for their quantification. Liquid chromatography-mass spectrometry (LC-MS) methods combine selectivity, sensitivity, and high precision, and enable the simultaneous determination of melatonin and serotonin. This work reviews LC and LC-MS techniques used to determine melatonin and serotonin, and the available data on melatonin and serotonin levels in edible plants. \u00a9 2011 Crown Copyright", "HPLC analysis of serotonin, tryptamine, tyramine, and the hydroxycinnamic acid amides of serotonin and tyramine in food vegetables. Biogenic monoamines such as serotonin, tryptamine, and tyramine function as neurotransmitters and mitogenic factors in animals and are involved in flowering, morphogenesis, and protection from and adaptation to environmental changes in plants. In plants, serotonin and tyramine are conjugated to form phenolic compounds via thioester linkages during the synthesis of hydroxycinnamic acid amides, including p-coumaroylserotonin (CS), feruloylserotonin (FS), p-coumaroyltyramine (CT), and feruloyltyramine (FT). In this study, we determined the amounts of the biogenic monoamines CS, FS, CT, and FT in commonly consumed vegetables using high-performance liquid chromatography. Serotonin, tryptamine, and tyramine were detected in all vegetables tested. The serotonin levels ranged from 1.8 to 294 microg/g of dry weight, the tryptamine levels ranged from 0.8 to 372 microg/g of dry weight, and the tyramine levels ranged from 1.4 to 286 microg/g of dry weight. The highest serotonin and tryptamine contents were found in tomato and cherry tomato (140.3-222 microg/g of dry weight), while paprika and green pepper had higher tyramine contents than the other vegetables (286 and 141.5 microg/g of dry weight, respectively). Overall, the levels of CS, FS, CT, and FT ranged from 0.03 to 13.8 microg/g of dry weight, with green onion possessing the highest levels of CS (0.69 microg/g of dry weight), FT (1.99 microg/g of dry weight), and CT (13.85 microg/g of dry weight).", "From the Cover: Transfer of a cyanobacterial neurotoxin within a temperate aquatic ecosystem suggests pathways for human exposure \u03b2-methylamino-L-alanine (BMAA), a neurotoxic nonprotein amino acid produced by most cyanobacteria, has been proposed to be the causative agent of devastating neurodegenerative diseases on the island of Guam in the Pacific Ocean. Because cyanobacteria are widespread globally, we hypothesized that BMAA might occur and bioaccumulate in other ecosystems. Here we demonstrate, based on a recently developed extraction and HPLC-MS/MS method and long-term monitoring of BMAA in cyanobacterial populations of a temperate aquatic ecosystem (Baltic Sea, 2007\u20132008), that BMAA is biosynthesized by cyanobacterial genera dominating the massive surface blooms of this water body. BMAA also was found at higher concentrations in organisms of higher trophic levels that directly or indirectly feed on cyanobacteria, such as zooplankton and various vertebrates (fish) and invertebrates (mussels, oysters). Pelagic and benthic fish species used for human consumption were included. The highest BMAA levels were detected in the muscle and brain of bottom-dwelling fishes. The discovery of regular biosynthesis of the neurotoxin BMAA in a large temperate aquatic ecosystem combined with its possible transfer and bioaccumulation within major food webs, some ending in human consumption, is alarming and requires attention.", "Cyanobacterial Blooms and the Occurrence of the neurotoxin beta-N-methylamino-L-alanine (BMAA) in South Florida Aquatic Food Webs Recent studies demonstrate that most cyanobacteria produce the neurotoxin beta-N-methylamino-L-alanine (BMAA) and that it can biomagnify in at least one terrestrial food chain. BMAA has been implicated as a significant environmental risk in the development of neurodegenerative diseases such as Alzheimer\u2019s disease, Parkinson\u2019s disease, and Amyotrophic Lateral Sclerosis (ALS). We examined several blooms of cyanobacteria in South Florida, and the BMAA content of resident animals, including species used as human food. A wide range of BMAA concentrations were found, ranging from below assay detection limits to approximately 7000 \u03bcg/g, a concentration associated with a potential long-term human health hazard.", "Aluminium and other elements in selected herbal tea plant species and their infusions. The determination of Al, B, Cu, Fe, Mn, Ni, P, Zn and Ca, K, Mg by inductively coupled plasma optical emission spectrometry (ICP-OES) and flame atomic absorption spectroscopy (FAAS), respectively, in digests and infusions of Hibiscus sabdariffa (petals), Rosa canina (receptacles), Ginkgo biloba (leaves), Cymbopogon citratus (leaves), Aloe vera (leaves) and Panax ginseng (roots) was carried out in this study. Particular attention has been given to Al and heavy metals for the identification of possible raw material contaminants, their transformation into the infusion and for predicting their eventual role in the human diet during daily consumption. Additionally, Ion Chromatography (IC) speciation of Al in the leachates was carried out. In dry herbs, hibiscus and ginkgo appeared to contain the greatest contents of Al, Fe, K, Mn, Ni, Zn and B, Mg, P, respectively. A. vera contained the highest amount of Ca and highest values of Cu and P were observed in ginseng. In infusions, the topmost concentrations of Al, B, Cu, Fe, P, K, Mn, Ni, Zn were detected in those prepared from hibiscus petals, Ca from aloe leaves and Mg from leaves of ginkgo. According to a possible daily consumption exceeding 1 L, hibiscus decoction was identified as potentially dietetically significant in the content of certain elements. It seems to be possibly one of the top contributors of B from food (up to 5.5\u00b10.2 mg/L). The Mg contained in the infusion (up to 106\u00b15 mg/L) may be a contributor in the attenuation of blood pressure. A high amount of accessible Mn (up to 17.4\u00b11.1 mg/L) can probably have an adverse effect in humans. The total Al allowance (up to 1.2\u00b10.1 mg/L) suggests that no more than 1 L of the hibiscus infusion should be consumed per day by sensitive individuals including pregnant women and should be completely excluded from the diet of children under 6 months of age and children with chronic renal failure. Copyright \u00a9 2013 Elsevier Ltd. All rights reserved."], ["Kiwifruit improves bowel function in patients with irritable bowel syndrome with constipation. Irritable bowel syndrome (IBS) is a common functional disorder of the gastrointestinal system, and is characterized by abdominal pain, diarrhea (IBS/D), constipation (IBS/C), and alternating diarrhea and constipation (IBSC/A). The purpose of this study was to examine the impact of a four week kiwifruit intervention on bowel function in patients diagnosed with IBS/C. Fifty-four patients with IBS/C and 16 healthy adults participated in this study. All subjects participated in the 6 week, three phase study, which included a baseline phase (1 week), a dietary intervention period (4 weeks), and a post-intervention phase (1 week). Forty-one IBS/C patients and all healthy adults consumed two Hayward green (Actinida deliciosa var) kiwifruits per day for 4 weeks. Thirteen IBS/C patients in the control group took two placebo capsules per day for 4 weeks. Colon transit time was measured immediately prior to and following the intervention period. All subjects completed daily defecation records. After the 4-week intervention, weekly defecation frequency significantly increased in the IBS/C group of participants who consumed kiwifruit (p<0.05). Colon transit time significantly decreased (p=0.026) in the IBS/C group that consumed kiwi fruit. These findings suggest that kiwifruit consumption for 4 weeks shortens colon transit time, increases defecation frequency, and improves bowel function in adults diagnosed with IBS/C.", "Effect of kiwifruit consumption on sleep quality in adults with sleep problems. Numerous studies have revealed that kiwifruit contains many medicinally useful compounds, among which antioxidants and serotonin may be beneficial in the treatment of the sleep disorders. The aim of this study was to evaluate the effects of kiwifruit on sleep patterns, including sleep onset, duration, and quality. In this study, we applied a free-living, self-controlled diet design. Twenty-four subjects (2 males, 22 females) 20 to 55 years of age consumed 2 kiwifruits 1 hour before bedtime nightly for 4 weeks. The Chinese version of the Pittsburgh Sleep Quality Index (CPSQI), a 3-day sleep diary, and the Actigraph sleep/activity logger watch were used to assess the subjective and objective parameters of sleep quality, including time to bed, time of sleep onset, waking time after sleep onset, time of getting up, total sleep time, and self-reported sleep quality and sleep onset latency, waking time after sleep onset, total sleep time, and sleep efficiency before and after the intervention. After 4 weeks of kiwifruit consumption, the subjective CPSQI score, waking time after sleep onset, and sleep onset latency were significantly decreased (42.4%, 28.9%, and 35.4%, respectively). Total sleep time and sleep efficiency were significantly increased (13.4% and 5.41%, respectively). Kiwifruit consumption may improve sleep onset, duration, and efficiency in adults with self-reported sleep disturbances. Further investigation of the sleep-promoting properties of kiwifruit may be warranted.", "Linaclotide (Linzess) for Irritable Bowel syndrome With Constipation and For Chronic Idiopathic Constipation Linaclotide (Linzess) for irritable bowel syndrome with constipation and for chronic idiopathic constipation.", "Treatment of abdominal pain in irritable bowel syndrome. Functional abdominal pain in the context of irritable bowel syndrome (IBS) is a challenging problem for primary care physicians, gastroenterologists and pain specialists. We review the evidence for the current and future non-pharmacological and pharmacological treatment options targeting the central nervous system and the gastrointestinal tract. Cognitive interventions such as cognitive behavioral therapy and hypnotherapy have demonstrated excellent results in IBS patients, but the limited availability and labor-intensive nature limit their routine use in daily practice. In patients who are refractory to first-line therapy, tricyclic antidepressants (TCA) and selective serotonin reuptake inhibitors are both effective to obtain symptomatic relief, but only TCAs have been shown to improve abdominal pain in meta-analyses. A diet low in fermentable carbohydrates and polyols (FODMAP) seems effective in subgroups of patients to reduce abdominal pain, bloating, and to improve the stool pattern. The evidence for fiber is limited and only isphagula may be somewhat beneficial. The efficacy of probiotics is difficult to interpret since several strains in different quantities have been used across studies. Antispasmodics, including peppermint oil, are still considered the first-line treatment for abdominal pain in IBS. Second-line therapies for diarrhea-predominant IBS include the non-absorbable antibiotic rifaximin and the 5HT3 antagonists alosetron and ramosetron, although the use of the former is restricted because of the rare risk of ischemic colitis. In laxative-resistant, constipation-predominant IBS, the chloride-secretion stimulating drugs lubiprostone and linaclotide, a guanylate cyclase C agonist that also has direct analgesic effects, reduce abdominal pain and improve the stool pattern.", "Effect of red pepper on symptoms of irritable bowel syndrome: preliminary study. BACKGROUND: Abdominal pain, that characterizes irritable bowel syndrome (IBS) together with bloating and disordered defecation, is mainly related to a visceral hypersensitivity due to an increase of TRPV(1) nociceptive nerve fiber activity. AIM: As capsaicin contained in red pepper is able to desensitize the TRPV(1) fibres, we evaluated whether the red pepper oral administration can decrease the symptoms of visceral hypersensitivity in IBS patients. METHODS: The study was performed on 50 patients with IBS diagnosed following Rome II criteria. After a 2-week washout period, 23 patients were planned to receive 4 pills/day, for 6\u00a0weeks randomly and in a double blind manner, each containing 150\u00a0mg of red pepper powder with a coat that dissolves in the colon, and 27 patients placebo. The patients scored each day in a diary the abdominal pain and bloating intensities following the 5-point Likert scale. The weekly symptom mean scores and the final patient subjective evaluation on treatment effectiveness were statistically compared among groups and intra-groups with appropriate tests. RESULTS: Eight patients dropped from the study: 6 in the red pepper group for abdominal pain and 2 in the placebo group. In 8 patients, the pills were reduced to 2/day, because of the abdominal pain at the onset of treatment. The intra-group comparisons showed that in patients taking red pepper the abdominal pain and bloating mean score values of the last weeks of treatment were significantly improved with respect to pre-treatment values, unlike patients taking placebo. The final patient subjective evaluation on the treatment effectiveness showed that red pepper group scored significantly better than placebo. CONCLUSIONS: The results of this preliminary study indicate that the chronic administration of red pepper powder in IBS patients with enteric-coated pills was significantly more effective than placebo in decreasing the intensity of abdominal pain and bloating and was considered by the patients more effective than placebo."], ["Dietary clues to the pathogenesis of Crohn's disease. Crohn's disease is a complex inherited disorder of unknown pathogenesis with environmental, genetic and microbial factors involved in the development of the disease. A remarkable feature of this disease in childhood is the effective response to exclusive enteral nutrition (EEN) therapy and the need for complete exclusion of normal diet required for success (principle of exclusivity). EEN or dietary interventions might act through removal of dietary components, which affect microbial composition, decrease a proinflammatory response and promote restitution of the epithelial barrier, likewise allowing termination of this vicious disease-forming cycle before a critical threshold is reached. Multiple traditional and nontraditional dietary components may affect the microbiome, mucous layer, intestinal permeability, or adherence and translocation of pathobionts. We review the epidemiological data, as well as data from animal models and cell lines, and propose a model for pathogenesis we have termed the 'bacterial penetration cycle', whereby dietary components such as animal fat, high sugar intake and gliadin, and consumption of emulsifiers, maltodextrin as well as low-fiber diets may be able to cause a localized acquired bacterial clearance defect, leading to bacterial adhesion and penetration, and subsequently inflammation in the gut. \u00a9 2014 S. Karger AG, Basel.", "Efficacy and tolerability of a low microparticle diet in a double blind, randomized, pilot study in Crohn's disease. BACKGROUND: Ultrafine and fine particles are potent adjuvants in antigen-mediated immune responses, and cause inflammation in susceptible individuals. Following recent findings that microparticles accumulate in the phagocytes of intestinal lymphoid aggregates, this study is the first investigation of whether their reduction in the diet improves the symptoms of Crohn's disease. METHODS: In a double blind study, 20 patients with active corticosteroid-treated ileal or ileo-colonic Crohn's disease randomly received either a low microparticle diet (trial group; n = 10) or a control diet (n = 10) for 4 months. Crohn's disease activity index (CDAI) and corticosteroid requirements were compared. RESULTS: One patient in each group was withdrawn. In the trial group there was a progressive decrease in CDAI from entry (392 +/- 25) to month 4 (145 +/- 47) (P = 0.002 vs control group) and seven patients were in remission (CDAI <150). In contrast, the control group had returned to baseline levels (302 +/- 28 on entry and 295 +/- 25 at month 4), with none in remission. Corticosteroid intake was reduced more in the trial group although this did not reach significance. CONCLUSIONS: A low microparticle diet may be effective in the management of ileal Crohn's disease and could explain the efficacy of elemental diets, which similarly are low in microparticles.", "Dietary intake and risk of developing inflammatory bowel disease: a systematic review of the literature. OBJECTIVES: The incidence of inflammatory bowel disease (IBD) is increasing. Dietary factors such as the spread of the \\\"Western\\\" diet, high in fat and protein but low in fruits and vegetables, may be associated with the increase. Although many studies have evaluated the association between diet and IBD risk, there has been no systematic review. METHODS: We performed a systematic review using guideline-recommended methodology to evaluate the association between pre-illness intake of nutrients (fats, carbohydrates, protein) and food groups (fruits, vegetables, meats) and the risk of subsequent IBD diagnosis. Eligible studies were identified via structured keyword searches in PubMed and Google Scholar and manual searches. RESULTS: Nineteen studies were included, encompassing 2,609 IBD patients (1,269 Crohn's disease (CD) and 1,340 ulcerative colitis (UC) patients) and over 4,000 controls. Studies reported a positive association between high intake of saturated fats, monounsaturated fatty acids, total polyunsaturated fatty acids (PUFAs), total omega-3 fatty acids, omega-6 fatty acids, mono- and disaccharides, and meat and increased subsequent CD risk. Studies reported a negative association between dietary fiber and fruits and subsequent CD risk. High intakes of total fats, total PUFAs, omega-6 fatty acids, and meat were associated with an increased risk of UC. High vegetable intake was associated with a decreased risk of UC. CONCLUSIONS: High dietary intakes of total fats, PUFAs, omega-6 fatty acids, and meat were associated with an increased risk of CD and UC. High fiber and fruit intakes were associated with decreased CD risk, and high vegetable intake was associated with decreased UC risk.", "Diet and risk of inflammatory bowel disease. BACKGROUND: A better understanding of the environmental factors leading to inflammatory bowel disease should help to prevent occurrence of the disease and its relapses. AIM: To review current knowledge on dietary risk factors for inflammatory bowel disease. METHODS: The PubMed, Medline and Cochrane Library were searched for studies on diet and risk of inflammatory bowel disease. RESULTS: Established non-diet risk factors include family predisposition, smoking, appendectomy, and antibiotics. Retrospective case-control studies are encumbered with methodological problems. Prospective studies on European cohorts, mainly including middle-aged adults, suggest that a diet high in protein from meat and fish is associated with a higher risk of inflammatory bowel disease. Intake of the n-6 polyunsaturated fatty acid linoleic acid may confer risk of ulcerative colitis, whereas n-3 polyunsaturated fatty acids may be protective. No effect was found of intake of dietary fibres, sugar, macronutrients, total energy, vitamin C, D, E, Carotene, or Retinol (vitamin A) on risk of ulcerative colitis. No prospective data was found on risk related to intake of fruits, vegetables or food microparticles (titanium dioxide and aluminium silicate). CONCLUSIONS: A diet high in protein, particular animal protein, may be associated with increased risk of inflammatory bowel disease and relapses. N-6 polyunsaturated fatty acids may predispose to ulcerative colitis whilst n-3 polyunsaturated fatty acid may protect. These results should be confirmed in other countries and in younger subjects before dietary counselling is recommended in high risk subjects. Copyright \u00a9 2011 Editrice Gastroenterologica Italiana S.r.l. Published by Elsevier Ltd. All rights reserved.", "Crohn's disease: a review of treatment options and current research. Crohn's disease is an autoimmune disorder that affects nearly 1.4 million Americans. The etiology of Crohn's disease is not completely understood, however, research has suggested a genetic link. There is currently no known cure for Crohn's disease and, as a result, most government-funded research is being conducted to increase the quality of life of afflicted patients (i.e. reducing chronic inflammation and alleviating growth impairment in pediatric patients). A number of treatment options are available including an alpha-4 integrin inhibitor and several TNF-alpha inhibitors. Furthermore, research is being conducted on several alternative treatment options to help understand exactly which cellular mechanisms (i.e. inducing apoptosis in leukocytes) are required for clinical efficacy. This review seeks to chronicle the current available treatment options for patients affected by Crohn's disease to aid in understanding potential cellular mechanistic requirements for an efficacious drug, and shed light on potential options for future treatment. Crown Copyright \u00a9 2013. Published by Elsevier Inc. All rights reserved."], ["Occupational transmission of hepatitis C virus resulting from use of the same supermarket meat slicer. Tracing risk factors for acquiring hepatitis C virus (HCV) in an HCV-infected patient, the only identified risk was working at the same butcher's counter of a supermarket as another HCV-infected patient, using a common ham cutting machine, with frequent bleeding hand injuries. A phylogenetic analysis showed a high percentage of nucleotide homology between the two patients' strains. \u00a9 2010 European Society of Clinical Microbiology and Infectious Diseases. No claim to original US government works.", "Clostridium difficile in food--innocent bystander or serious threat? Clostridium difficile is a critically important cause of disease in humans, particularly in hospitalized individuals. Three major factors have raised concern about the potential for this pathogen to be a cause of foodborne disease: the increasing recognition of community-associated C. difficile infection, recent studies identifying C. difficile in food animals and food, and similarities in C. difficile isolates from animals, food and humans. It is clear that C. difficile can be commonly found in food animals and food in many regions, and that strains important in human infections, such as ribotype 027/NAP1/toxinotype III and ribotype 078/toxinotype V, are often present. However, it is currently unclear whether ingestion of contaminated food can result in colonization or infection. Many questions remain unanswered regarding the role of C. difficile in community-associated diarrhoea: its source when it is a food contaminant, the infective dose, and the association between ingestion of contaminated food and disease. The significant role of this pathogen in human disease and its potential emergence as an important community-associated pathogen indicate that careful evaluation of different sources of exposure, including food, is required, but determination of the potential role of food in C. difficile infection may be difficult.", "Vital signs: incidence and trends of infection with pathogens transmitted commonly through food--foodborne diseases active surveillance network, 10... BACKGROUND: In the United States, contaminated food causes approximately 1,000 reported disease outbreaks and an estimated 48 million illnesses, 128,000 METHODS: The Foodborne Diseases Active Surveillance Network (FoodNet) conducts surveillance among 15% of the U.S. population for laboratory-confirmed infections with nine pathogens transmitted commonly through food. Overall and pathogen-specific changes in incidence were estimated from 1996-1998 to 2010 and from 2006-2008 to 2010.hospitalizations, and 3,000 deaths annually. This report summarizes 2010 surveillance data and describes trends since 1996. RESULTS: A total of 19,089 infections, 4,247 hospitalizations, and 68 deaths were reported from FoodNet sites in 2010. Salmonella infection was the most common infection reported (17.6 illnesses per 100,000 persons) and was associated with the largest number of hospitalizations (2,290) and deaths (29); no significant change in incidence of Salmonella infection has occurred since the start of surveillance during 1996-1998. Shiga toxin-producing Escherichia coli (STEC) O157 infection caused 0.9 illnesses per 100,000. Compared with 1996-1998, overall incidence of infection with six key pathogens in 2010 was 23% lower, and pathogen-specific incidence was lower for Campylobacter, Listeria, STEC O157, Shigella, and Yersinia infection but higher for Vibrio infection. Compared with a more recent period, 2006--2008, incidence in 2010 was lower for STEC O157 and Shigella infection but higher for Vibrio infection. CONCLUSIONS: The incidence of STEC O157 infection has declined to reach the 2010 national health objective target of \u22651 case per 100,000. This success, as well as marked declines since 1996-1998 in overall incidence of six key foodborne infections, demonstrates the feasibility of preventing foodborne illnesses. IMPLICATIONS FOR PUBLIC HEALTH PRACTICE: Salmonella infection should be targeted because it has not declined significantly in more than a decade, and other data indicate that it is one of the most common foodborne infections, resulting in an estimated $365 million in direct medical costs annually. The prevention measures that reduced STEC O157 infection need to be applied more broadly to reduce Salmonella and other infections. Effective measures from farm to table include preventing contamination of meat during slaughter and of all foods, including produce, during processing and preparation; cooking meat thoroughly; vigorously detecting and investigating outbreaks; and recalling contaminated food.", "Inorganic arsenic in rice bran and its products are an order of magnitude higher than in bulk grain. Rice is more elevated in arsenic than all other grain crops tested to date, with whole grain (brown) rice having higher arsenic levels than polished (white). It is reported here that rice bran, both commercially purchased and specifically milled for this study, have levels of inorganic arsenic, a nonthreshold, class 1 carcinogen, reaching concentrations of approximately 1 mg/kg dry weight, around 10-20 fold higher than concentrations found in bulk grain. Although pure rice bran is used as a health food supplement, perhaps of more concern is rice bran solubles, which are marketed as a superfood and as a supplement to malnourished children in international aid programs. Five rice bran solubles products were tested, sourced from the United States and Japan, and were found to have 0.61-1.9 mg/kg inorganic arsenic. Manufactures recommend approximately 20 g servings of the rice bran solubles per day, which equates to a 0.012-0.038 mg intake of inorganic arsenic. There are no maximum concentration levels (MCLs) set for arsenic or its species in food stuffs. EU and U.S. water regulations, set at 0.01 mg/L total or inorganic arsenic, respectively, are based on the assumption that 1 L of water per day is consumed, i.e., 0.01 mg of arsenic/ day. At the manufacturers recommended rice bran solubles consumption rate, inorganic arsenic intake exceeds 0.01 mg/ day, remembering that rice bran solubles are targeted at malnourished children and that actual risk is based on mg kg(-1) day(-1) intake.", "Outbreak of Salmonella Heidelberg infections linked to a single poultry producer -- 13 states, 2012-2013. In June 2012, the Oregon Health Authority and the Washington State Department of Health noted an increase in the number of Salmonella enterica serotype Heidelberg clinical isolates sharing an identical pulsed-field gel electrophoresis (PFGE) pattern. In 2004, this pattern had been linked to chicken from Foster Farms by the Washington State Department of Health; preliminary 2012 interviews with infected persons also indicated exposure to Foster Farms chicken. On August 2, 2012, CDC's PulseNet* detected a cluster of 19 Salmonella Heidelberg clinical isolates matching the outbreak pattern. This report summarizes the investigation by CDC, state and local health departments, the U.S. Department of Agriculture's Food Safety and Inspection Service (USDA-FSIS), and the Food and Drug Administration (FDA) and reinforces the importance of safe food handling to prevent illness. A total of 134 cases from 13 states were identified, including 33 patients who were hospitalized. This multifaceted investigation used standard epidemiologic and laboratory data along with patient shopper card purchase information, and PFGE data from the retail meat component of the National Antimicrobial Resistance Monitoring System (NARMS)\u2020, a relatively novel tool in outbreak investigation, to link the outbreak strain to chicken from Foster Farms."], ["Emerging issues associated with HIV patients seeking advice from health food stores. OBJECTIVES: To ascertain the recommendations, training and education of health food store employees and determine how they communicate the costs, benefits and risks associated with natural health products for the HIV/AIDS community. METHODS: Four male research assistants, posing as asymptomatic HIV-positive individuals, inquired of employees of all retail health food stores in a major Canadian city as to what is recommended for their condition. The research assistants asked about product costs, side effects, potential drug interactions and efficacy. They also inquired as to employee education related to Complementary and Alternative Medicine (CAM) and noted whether employees asked about which conventional medications they were taking and whether they recommended that the subjects seek physician or CAM provider advice. RESULTS: A total of 32 stores were included. Eight store employees (25%) offered no advice; eight (25%) inquired whether the subjects were currently taking medications; six (19%) suggested visiting a physician; and eight (25%) suggested visiting a CAM provider. A total of 36 different products (mean 2.3 per employee) were recommended with considerable variability in product evidence and cost. The education of the employees varied from postgraduate education (n=3), to undergraduate degree (n=3), college level (n=5) in CAM, or no formal education in CAM (n=21). CONCLUSION: There was considerable heterogeneity in advice on natural food products provided by employees of natural food stores and, in general, these individuals had limited formal training in CAM. The products they recommended had limited evidence supporting their efficacy and in some instances were potentially harmful and had considerable costs. The findings of this study support the need to further examine how best to regulate this growing component of the health care system.", "Health information provided by retail health food outlets. Alternative health practices have become increasingly popular in recent years. Many patients visit specific complementary practitioners, while others attempt to educate themselves, trusting advice from employees at local health food stores or the Internet. Thirty-two retail health food stores were surveyed on the nature of the information provided by their staff. A research assistant visited the stores and presented as the mother of a child in whom Crohn's disease had been diagnosed. Seventy-two per cent (23 of 32) of store employees offered advice, such as to take nutritional and herbal supplements. Of the 23 stores where recommendations were made, 15 (65%) based their recommendation on a source of information. Fourteen of the 15 stores using information sources used the same reference book. This had a significant impact on the recommendations; the use of nutritional supplements was favoured. In conclusion, retail health food stores are not as inconsistent as hypothesized, although there are many variances in the types of supplements recommended for the same chronic disease.", "Health food stores' recommendations for nausea and migraines during pregnancy. BACKGROUND: Many pregnant women use dietary supplements during pregnancy; however, relatively scant information is available on the safety of these products. Consumers of dietary supplements often rely on employees of health food stores to provide recommendations. OBJECTIVE: To evaluate recommendations made by health food store employees in the Phoenix metropolitan area regarding treatment of nausea/vomiting and migraines during pregnancy. METHODS: Phone calls were made by a disguised shopper to 155 health food stores in the greater Phoenix area. The caller posed as a woman 8 weeks' pregnant asking for recommendations for treatment of nausea/vomiting and migraines. Responses and recommendations were recorded and then compared with current scientific evidence obtained during a search of the literature using MEDLINE (1966-September 2004) as to whether or not the supplements and the methods of their use during pregnancy were contraindicated. RESULTS: Eighty-nine percent of stores offered recommendations for nausea/vomiting, and 82% provided recommendations for migraines. The use of ginger was the most recommended therapy for nausea/vomiting. Only 3.6% of respondents recommended correct usage, but failed to supply the correct dosage and duration. A total of 15 of 278 (5%) recommendations, for both nausea/vomiting and migraines, were for products contraindicated in pregnancy. CONCLUSIONS: In light of the increased use of dietary supplements by women during pregnancy, the willingness of personnel in health food stores to make any recommendations should foster concerns by patients and healthcare providers alike. Use of dietary supplements contraindicated in pregnancy could cause significant harm to the mother and/or fetus. Studies are needed to address the need for more stringent guidelines regarding health food stores and their recommendations.", "Health food store recommendations for breast cancer patients. CONTEXT: Despite cancer patients' widespread and growing use of complementary and alternative medicine, minimal attention has been paid to the role of health food stores in the \\\"supply side\\\" of this phenomenon. OBJECTIVE: To gain a better understanding of health food store personnel's recommendations for breast cancer patient care. DESIGN: Researcher posing as the daughter of a breast cancer patient and surveying health food store personnel on their product recommendations for cancer care. SETTING: Oahu, Hawaii, summer 1998. PARTICIPANTS: All health food stores (N = 40) offering products for cancer patients. MAIN OUTCOME MEASURES: Recommended products and services, proposed mechanism of action, and costs. RESULTS: Store personnel readily provided information and product recommendations, with shark cartilage being the most frequent. Suggested mechanisms of action drew on traditional healing, scientific, and pseudoscientific rationales. Costs for recommended dosages varied multifold across stores and brands. CONCLUSIONS: Retailers supplying supplements can play an important role in the network of \\\"authorities\\\" for patients with breast and other cancers, as they readily provide advice and recommend products. The reasons why patients seek health food store remedies are useful in developing approaches to patient education. Physicians and other providers are in a key position to assist cancer patients in making informed choices when considering health store products.", "How does physician advice influence patient behavior? Evidence for a priming effect. OBJECTIVE: To explore a potential \\\"priming effect\\\" of physician advice on patient responses to behavioral change interventions. DESIGN: Randomized controlled trial with a 3-month follow-up. SETTING: Four community-based group family medicine clinics in southeastern Missouri. PARTICIPANTS: Adult patients (N = 915). INTERVENTIONS: Printed educational materials designed to encourage patients to quit smoking, eat less fat, and increase physical activity. MAIN OUTCOME MEASURES: Recall, rating, and use of the educational materials; changes in smoking behavior, dietary fat consumption, and physical activity. RESULTS: Patients who received physician advice to quit smoking, eat less fat, or get more exercise prior to receiving intervention materials on the same topic were more likely to remember the materials, show them to others, and perceive the materials as applying to them specifically. They were also more likely to report trying to quit smoking (odds ratio [OR] = 1.54, 95% confidence interval [CI] = 0.95-2.40), quitting for at least 24 hours (OR = 1.85, 95% CI = 1.02-3.34), and making some changes in diet (OR = 1.35, 95% CI = 1.00-1.84) and physical activity (OR = 1.51, 95% CI = 0.95-2.40). CONCLUSIONS: Findings support an integrated model of disease prevention in which physician advice is a catalyst for change and is supported by a coordinated system of information and activities that can provide the depth of detail and individualization necessary for sustained behavioral change."], ["Diet, vegetarianism, and cataract risk. BACKGROUND: Age-related cataract is a major cause of morbidity. Previous studies of diet and cataract risk have focused on specific nutrients or healthy eating indexes but not on identifiable dietary groups such as vegetarians. OBJECTIVE: We investigated the association between diet and cataract risk in a population that has a wide range of diets and includes a high proportion of vegetarians. DESIGN: We used Cox proportional hazards regression to study cataract risk in relation to baseline dietary and lifestyle characteristics of 27,670 self-reported nondiabetic participants aged \u226540 y at recruitment in the Oxford (United Kingdom) arm of the European Prospective Investigation into Cancer and Nutrition (EPIC-Oxford) by using data from the Hospital Episode Statistics in England and Scottish Morbidity Records. RESULTS: There was a strong relation between cataract risk and diet group, with a progressive decrease in risk of cataract in high meat eaters to low meat eaters, fish eaters (participants who ate fish but not meat), vegetarians, and vegans. After multivariable adjustment, incidence rate ratios (95% CIs) for moderate meat eaters (50-99 g meat/d), low meat eaters (<50 g meat/d), fish eaters, vegetarians, and vegans compared with high-meat eaters (\u2265100 g meat/d) were 0.96 (0.84, 1.11), 0.85 (0.72, 0.99), 0.79 (0.65, 0.97), 0.70 (0.58, 0.84), and 0.60 (0.38, 0.96), respectively (P < 0.001 for heterogeneity). Associations between cataract risk and intakes of selected nutrients and foods generally reflected the strong association with diet group. CONCLUSION: Vegetarians were at lower risk of cataract than were meat eaters in this cohort of health-conscious British residents.", "Cataract is a self-defence reaction to protect the retina from oxidative damage. Age-related macular degeneration (AMD) is the leading cause of blindness in developed countries. Cataract extraction is the most common surgical procedure in developed countries. Lutein (L) and zeaxanthin (Z), retinal carotenoids, are the most powerful retinal anti-oxidants and absorb the harmful blue light. The depletion of L+Z induces the development of the lens opacification-cataract. Cataract reduces the retinal oxidative stress (OS), which causes a reduction of the probability to develop AMD. Oxidative Stress at the retinal level is the common pathway in the development of AMD and cataract. AMD and cataract are not two independent processes. Cataract is a self-defense reaction of the retina to reduce OS and retinal damage. Restoring the anti-oxidative capabilities of the retina by increasing intake of L+Z reduces the likelihood of AMD and cataract. Extracting the opaque lens elevates the retinal OS and increases the rate of AMD. Copyright \u00a9 2011 Elsevier Ltd. All rights reserved.", "The Association of Consumption of Fruits/Vegetables with Decreased Risk of Glaucoma among Older African American Women in the Study of Osteoporotic Fractures Purpose To explore the association between consumption of fruits and vegetables and the presence of glaucoma in older African American women. Design Cross-sectional study. Methods Disc photographs and suprathreshold visual fields were obtained from the 662 African American participants in the Study of Osteoporotic Fractures. Masked, trained readers graded all discs, and two glaucoma specialists reviewed photos and visual fields. The Block Food Frequency Questionnaire assessed food consumption. Relationships between selected fruit/vegetable/nutrient consumption and glaucoma were evaluated using logistic regression models after adjusting for potential confounders. Results After excluding women missing Food Frequency Questionnaire and disc data, 584 African American women (88.2% of total African American cohort) were included. Glaucoma was diagnosed in at least one eye in 77 subjects (13%). Women who ate 3 or more servings/day of fruits/fruit juices were 79% (odds ratio [OR]=0.21; 95% confidence interval [CI]: 0.08\u20130.60) less likely to have glaucoma than women who ate less than one serving/day. Women who consumed more than 2 servings/week of fresh oranges (OR=0.18; 95%CI: 0.06\u20130.51) and peaches (OR=0.30; 95%CI: 0.13\u20130.67) had a decreased odds of glaucoma compared to those consuming less than one serving/week. For vegetables, >1 serving/week compared to \u22641 serving/month of collard-greens/kale decreased the odds of glaucoma by 57% (OR=0.43; 95%CI: 0.21\u20130.85). There was a protective trend against glaucoma in those consuming more fruit/fruit juices (p=0.023), fresh oranges (p=0.002), fresh peaches (p=0.002), and collard greens/kale (p=0.014). Higher consumption of carrots (p=0.061) and spinach (p=0.094) also showed some associations. Individual nutrient intake from food sources found protective trends with higher intakes of vitamin A (p=0.011), vitamin C (p=0.018), and \u03b1-carotene (p=0.021), and close to statistically significant trends with \u03b2-carotene (p=0.052), folate (p=0.056), and lutein/zeaxanthin (p=0.077). Conclusion Higher intake of certain fruits and vegetables high in Vitamins A and C and carotenoids may be associated with a decreased likelihood of glaucoma in older African American women. Randomized controlled trials are needed to determine whether the intake of specific nutrients changes the risk of glaucoma.", "Influence of diet on tear function. The effect of diet on tear function is illustrated clearly by malnutrition-induced xerophthalmia. Dietary habits in well nourished North American society have been implicated as a cause of some tear dysfunction. A review of the ocular literature suggests that sufficient dietary protein, vitamins A, B6 and C, potassium, and zinc may be necessary for normal tear function. Excesses of dietary fats, salt, cholesterol, alcohol, protein, and sucrose have been associated with or suggested as causes of tear dysfunction. No unequivocal link has been established between diet and remission of dry eye states in a well nourished population.", "Lifestyle recommendations to reduce the risk of kidney stones. Kidney stones are increasingly common in wealthy industrialized countries. The most frequent form (80%) is idiopathic calcium stone disease. Eating habits and lifestyle have a direct effect on the lithogenic urinary risk factors and the pathogenesis of this condition. A diet characterized by a high intake of fluids, fruits, and vegetables; a low consumption of salt and protein; and a balanced intake of calcium, fats, and carbohydrates constitutes an efficacious approach to the prevention and treatment of this illness. A correct body weight, regular exercise, and a reduction in stressful life events are also useful preventive actions. Copyright \u00a9 2011 Elsevier Inc. All rights reserved."], ["Identification of cheese mite species inoculated on Mimolette and Milbenkase cheese through cryogenic scanning electron microscopy. Samples of Mimolette (France) and Milbenkase (Germany) cheeses traditionally ripened by mites were analyzed to determine the mite species present on each sample. Scientific literature was reviewed to understand which mite species most commonly infest cheese. Morphological features possessed by mites were then studied to understand what unique characteristics are required to ensure accurate identification. After identification and compilation of a detailed key of stored food mites (subclass Acari, order Astigmata) and their delineating features, the mites were viewed through a cryogenic scanning electron microscope. It was determined that Mimolette cheese is inoculated with Acarus siro L. The features studied to identify this mite species included idiosomal length and shape, setae length and arrangement, leg size, placement of anus and genitals, and solenidia shape. The Milbenkase cheese is inoculated with Tyrolichus casei Oudemans, which was evident after viewing the same features used to identify A. siro and the supracoxal seta shape. With this knowledge, further research can be conducted on the 2 cheese varieties to understand what chemical, physical, and microbial changes occur within the cheeses because of mites. It is important to identify the mite species present on each cheese variety to improve our understanding of their role in creating the distinctive characteristics that set these cheeses apart from others. Copyright (c) 2010 American Dairy Science Association. Published by Elsevier Inc. All rights reserved.", "Microbial and sensory changes throughout the ripening of Prato cheese made from milk with different levels of somatic cells. The objective of this research was to evaluate the effects of 2 levels of raw milk somatic cell count (SCC) on the composition of Prato cheese and on the microbiological and sensory changes of Prato cheese throughout ripening. Two groups of dairy cows were selected to obtain low-SCC (<200,000 cells/mL) and high-SCC (>700,000 cells/mL) milks, which were used to manufacture 2 vats of cheese. The pasteurized milk was evaluated according to the pH, total solids, fat, total protein, lactose, standard plate count, coliforms at 45 degrees C, and Salmonella spp. The cheese composition was evaluated 2 d after manufacture. Lactic acid bacteria, psychrotrophic bacteria, and yeast and mold counts were carried out after 3, 9, 16, 32, and 51 d of storage. Salmonella spp., Listeria monocytogenes, and coagulase-positive Staphylococcus counts were carried out after 3, 32, and 51 d of storage. A 2 x 5 factorial design with 4 replications was performed. Sensory evaluation of the cheeses from low- and high-SCC milks was carried out for overall acceptance by using a 9-point hedonic scale after 8, 22, 35, 50, and 63 d of storage. The somatic cell levels used did not affect the total protein and salt:moisture contents of the cheeses. The pH and moisture content were higher and the clotting time was longer for cheeses from high-SCC milk. Both cheeses presented the absence of Salmonella spp. and L. monocytogenes, and the coagulase-positive Staphylococcus count was below 1 x 10(2) cfu/g throughout the storage time. The lactic acid bacteria count decreased significantly during the storage time for the cheeses from both low- and high-SCC milks, but at a faster rate for the cheese from high-SCC milk. Cheeses from high-SCC milk presented lower psychrotrophic bacteria counts and higher yeast and mold counts than cheeses from low-SCC milk. Cheeses from low-SCC milk showed better overall acceptance by the consumers. The lower overall acceptance of the cheeses from high-SCC milk may be associated with texture and flavor defects, probably caused by the higher proteolysis of these cheeses.", "Galactose-\u03b1-1,3-galactose and Delayed Anaphylaxis, Angioedema, and Urticaria in Children BACKGROUND AND OBJECTIVE: Despite a thorough history and comprehensive testing, many children who present with recurrent symptoms consistent with allergic reactions elude diagnosis. Recent research has identified a novel cause for \u201cidiopathic\u201d allergic reactions; immunoglobulin E (IgE) antibody specific for the carbohydrate galactose-\u03b1-1,3-galactose (\u03b1-Gal) has been associated with delayed urticaria and anaphylaxis that occurs 3 to 6 hours after eating beef, pork, or lamb. We sought to determine whether IgE antibody to \u03b1-Gal was present in sera of pediatric patients who reported idiopathic anaphylaxis or urticaria. METHODS: Patients aged 4 to 17 were enrolled in an institutional review board\u2013approved protocol at the University of Virginia and private practice allergy offices in Lynchburg, VA. Sera was obtained and analyzed by ImmunoCAP for total IgE and specific IgE to \u03b1-Gal, beef, pork, cat epithelium and dander, Fel d 1, dog dander, and milk. RESULTS: Forty-five pediatric patients were identified who had both clinical histories supporting delayed anaphylaxis or urticaria to mammalian meat and IgE antibody specific for \u03b1-Gal. In addition, most of these cases had a history of tick bites within the past year, which itched and persisted. CONCLUSIONS: A novel form of anaphylaxis and urticaria that occurs 3 to 6 hours after eating mammalian meat is not uncommon among children in our area. Identification of these cases may not be straightforward and diagnosis is best confirmed by specific testing, which should certainly be considered for children living in the area where the Lone Star tick is common.", "Beef, pork, and milk allergy (cross reactivity with each other and pet allergies). OBJECTIVE: The purposes of this study were to examine milk allergic patients to determine concomitant reactivity between milk, beef, pork and cat and dog dander and other common inhalant allergens. METHODS: 19 patients were selected according to their Immuno-CAP results, which had increased Ig-E levels against milk, pork or beef. Patients were also tested against Johnson grass, short ragweed, cat/dog dander and d. farina. RESULTS: Pearson's test revealed strong correlation between beef and pork, beef and milk, pork and milk Ig-E counts (consecutively r2 = 0.89, r2 = 0.81, r2 = 0.60 and p < 0.01. All cat allergic patients also appeared to be allergic to either beef/pork meat or milk. The correlation between pork and dog dander Ig-E counts was also significant (r2 = 0.38, p < 0.01). No correlation detected between milk-meat-pet and grass-weed-dust allergies. DISCUSSION AND CONCLUSION: Patients who are known to have pet allergies may need to be screened for meat and milk allergy. Milk allergic patients may also need to avoid cows and pork meat.", "Freezing of infested pork muscle kills cysticerci. A method for culturing cysticerci that allows successful evagination and growth of scolexes from metacestodes of Taenia solium was used to study the survival of cysticerci subjected to low temperatures. Refrigeration of pork muscle infested with cysticerci at temperatures above 0 degrees C did not affect the parasites' survival in culture. Conversely, freezing of meat prevented survival of cysts. A practical procedure to kill cysticerci is the storage of pork muscle for four days at -5 degrees C, three days at -15 degrees C, or one day at -24 degrees C. These simple measures would help prevent the most frequent parasitosis of man's central nervous system."], ["MR aortography and serum cholesterol levels in patients with long-term nonspecific lower back pain. STUDY DESIGN: A cross-sectional analysis of the feeding arteries of the lumbar spine and cholesterol levels on patients with long-term nonspecific lower back pain. OBJECTIVES: To evaluate whether occlusion of lumbar and middle sacral arteries or serum cholesterol levels are associated with lower back pain and/or with disc degeneration. SUMMARY OF BACKGROUND DATA: Atherosclerosis in the wall of the abdominal aorta usually develops at the ostia of branching arteries and the bifurcation, and may obliterate orifices of lumbar and middle sacral arteries. Obstruction of these arteries causes ischemia in the lumbar spine and may result in back symptoms and disc degeneration. METHODS: MR aortography and cholesterol blood tests were performed on 51 patients with long-term lower back pain without specific findings (i.e., spinal or nerve root compression) in regular lumbar MR images. The patients ranged from 35 to 70 years of age (mean age, 56 years). Serum cholesterol and low-density lipoprotein (LDL) cholesterol levels were measured. To assess symptoms and disability NASS low back Outcome Instrument was used. RESULTS: Twenty-nine (78%) of 37 men and 11 (77%) of 14 women showed occluded lumbar and/or middle sacral arteries. The prevalence of occluded arteries was 2.5 times more than in subjects of corresponding age group in a Finnish necropsy material. Twenty-three (62%) men and seven (50%) women had significant disc degeneration. Disc degeneration was associated with occluded lumbar/middle sacral arteries (P = 0.035). Patients with occluded arteries or significant disc degeneration did not complain more severe symptoms than those without, whereas patients with above normal serum LDL cholesterol scored higher in neurogenic symptoms (P = 0.031) and complained more often severe pain (P = 0.049) than those with normal LDL cholesterol. CONCLUSIONS: The study indicates that lumbar and middle sacral arteries are often occluded in patients with nonspecific long-term lower back pain. Occlusion of these arteries may also be associated with disc degeneration.", "Atherosclerosis and disc degeneration/low-back pain--a systematic review. OBJECTIVES: Atherosclerosis can obstruct branching arteries of the abdominal aorta, including four paired lumbar arteries and the middle sacral artery that feed the lumbar spine. The diminished blood flow could result in various back problems. The aim of this systematic literature review was to assess associations between atherosclerosis and disc degeneration (DD) or low-back pain (LBP). DATA SOURCES: A systematic search of the Medline/PubMed database for all original articles on atherosclerosis and DD/LBP published until October 2008. The search was performed with the medical subject headings atherosclerosis, cardiovascular risk factor, or vascular disease and keywords \\\"disc degeneration\\\", \\\"disc herniation\\\", and \\\"back pain\\\" on the basis of MeSH tree and as a text search. In addition reference lists were studied and searched manually. Observational studies investigating the association of atherosclerosis or its risk factors and lumbar DD/LBP were selected. REVIEW METHODS: The following data were extracted: study characteristics, duration of follow-up, year of publication, findings of atherosclerosis/cardiovascular risk factors and DD/LBP. Disc herniation was regarded as a form of disc degeneration and cardiovascular risk factors were regarded as surrogate for atherosclerosis in epidemiological studies. RESULTS: One hundred and seventy-nine papers were identified. After exclusion of case reports, letters, editorials, papers not related to the lumbar spine, and animal studies, 25 papers were included. Post-mortem studies showed an association between atheromatous lesions in the aorta and DD, as well as between occluded lumbar arteries and life-time LBP. In clinical studies, aortic calcification was associated with LBP, and stenosis of lumbar arteries was associated with both DD and LBP. In epidemiological studies, smoking and high serum cholesterol levels were found to have the most consistent associations with DD and LBP. CONCLUSION: Aortic atherosclerosis and stenosis of the feeding arteries of the lumbar spine were associated with DD and LBP. Cardiovascular risk factors had weaker associations, being clearly apparent only in cohorts on elderly people or in large study samples. More prospective clinical studies are needed to further clarify the association of atherosclerosis and low-back disorders.", "Serum lipids in relation to sciatica among Finns. OBJECTIVES: Atherosclerosis of arteries supplying the lumbar region has been suggested as a mechanism leading to intervertebral disc degeneration and sciatica. The study described here examined whether serum lipid levels or pharmacologically treated hyperlipidemia were associated with sciatica. METHODS: A nationally representative sample (n=8028) of Finns aged 30 years or over was interviewed and examined. Sciatica was assessed by a physician according to preset criteria. Information for the present purpose was available for 74.8% of the sample. RESULTS: The prevalence of sciatica was 3.3% for men and 2.2% for women. In men without hyperlipidemia treatment, sciatica was associated with total cholesterol (high vs. low tertile: OR 2.28, 95% CI 1.14-4.55), LDL cholesterol (2.12; 1.11-4.05), and triglycerides (1.92; 1.04-3.55), adjusted for age, BMI, exercise, smoking, heavy physical work, and education. HDL was not associated with sciatica. For men in the highest tertile of both total cholesterol and triglycerides, the OR of sciatica was 3.89 (1.68-8.99) in comparison to men with cholesterol in the lowest tertile and triglycerides in the lowest or the middle tertile. In similar analyses among women no associations were seen. Pharmacologically treated hyperlipidemia was associated with sciatica in women (2.02; 1.01-4.04), but not in men (1.71; 0.83-3.55). CONCLUSIONS: Independent of BMI and other possible confounders, clinically assessed sciatica in men was associated with levels of atherogenic serum lipids. Pharmacologically treated hyperlipidemia was associated with sciatica in women. The findings are in accordance with the atherosclerosis-sciatica hypothesis.", "Symptomatic disc herniation and serum lipid levels Insufficient blood supply to the intervertebral disc (IVD) has been proposed to play a role as causative factor in IVD degeneration. There is an association between IVD diseases and increased risk of dying of ischaemic heart disease. Obesity and tobacco are potential risk factors for degenerative IVD disease. High blood cholesterol and triglycerides serum levels are risk factors for atherosclerosis, and could be responsible for a decreased in the blood supply to the already poor vascularized IVD. We performed a frequency-matched case\u2013control study to determine the serum levels of patients with symptomatic herniated lumbar disc. We examined the fasting serum lipid levels in 384 subjects who were operated at our institution. Group 1 included 169 consecutive patients (115 men and 54 women; mean age: 59.1\u00a0years, range 29\u201385) who underwent surgery for symptomatic disc herniation. Group 2 (control group) included 169 patients (115 men and 54 women; mean age: 61\u00a0years, range 26\u201386) who underwent arthroscopic meniscectomy for a meniscal tear in the same period. These patients were frequency-matched by age (within 3\u00a0years) and gender with patients of Group 1. Sera were extracted from blood samples and the concentrations of total cholesterol (TC) and triglycerides (TG) were determined. When comparing the two groups, patients with symptomatic herniated lumbar disc showed statistically significant higher triglyceride concentration (P\u00a0=\u00a00.02) and total cholesterol concentration (P\u00a0=\u00a00.01). Serum lipid levels may be a risk factor for IVD pathology. An enhanced understanding of these factors holds the promise of new approaches to the prevention and management of IVD pathology.", "Prevalence of stenotic changes in arteries supplying the lumbar spine. A postmortem angiographic study on 140\u00a0subjects OBJECTIVES\u2014To study the prevalence of arterial diseases in the arteries supplying the lumbar spine and their relation to other vascular diseases, as well as to chronic low back pain. METHODS\u2014Five pairs of the lumbar arteries and the middle sacral artery were evaluated from 140\u00a0postmortem aortograms, performed in connection with routine medicolegal necropsies on subjects ranging from 16\u00a0to 89\u00a0years of age. For information about low back pain history, a close relative of each of the deceased was interviewed two to four weeks after the necropsy. RESULTS\u2014Twenty one (22%) men and nine (20%) women had occluded arteries, and an additional 33\u00a0(35%) men and 17\u00a0(38%) women had narrowed arteries. The mean age for men with occluded or narrowed arteries, or both, was 50\u00a0years and for women 59\u00a0years. Most of the stenotic changes were seen at the orifices or in the first part of the arteries. The middle sacral artery was most often affected, followed by the fourth lumbar arteries. The number of collateral arteries increased with occluded (p <0.001) and narrowed arteries (p\u00a0=\u00a00.001). Stenotic lumbar/middle sacral arteries were found, on average, five years earlier than atherosclerosis of the coronary arteries. Subjects with one or more occluded/narrowed arteries were 8.5\u00a0times more likely to have suffered from chronic (that is, three months or longer) low back pain at some time during their life than were those without such findings (odds ratio adjusted for age and sex 8.5; 95% confidence intervals 2.9,\u00a024; p <0.001). CONCLUSIONS\u2014The study shows that the lumbar and middle sacral arteries frequently become obliterated by atheromatous lesions during adult life, and that obliteration of these arteries is more common in subjects with a history of chronic back pain than in those without."], ["Clinical Trials and Observations: Monoclonal gammopathy of undetermined significance (MGUS) consistently precedes multiple myeloma: a prospective study Monoclonal gammopathy of undetermined significance (MGUS) is a premalignant plasma-cell proliferative disorder associated with a life-long risk of progression to multiple myeloma (MM). It is not known whether MM is always preceded by a premalignant asymptomatic MGUS stage. Among 77\u2009469 healthy adults enrolled in the nationwide population-based prospective Prostate, Lung, Colorectal, and Ovarian (PLCO) Cancer Screening Trial, we identified 71 subjects who developed MM during the course of the study in whom serially collected (up to 6) prediagnostic serum samples obtained 2 to 9.8 years prior to MM diagnosis were available. Using assays for monoclonal (M)\u2013proteins (electrophoresis/immunofixation) and kappa-lambda free light chains (FLCs), we determined longitudinally the prevalence of MGUS and characterized patterns of monoclonal immunoglobulin abnormalities prior to MM diagnosis. MGUS was present in 100.0% (87.2%-100.0%), 98.3% (90.8%-100.0%), 97.9% (88.9%-100.0%), 94.6% (81.8%-99.3%), 100.0% (86.3%-100.0%), 93.3% (68.1%-99.8%), and 82.4% (56.6%-96.2%) at 2, 3, 4, 5, 6, 7, and 8+ years prior to MM diagnosis, respectively. In approximately half the study population, the M-protein concentration and involved FLC-ratio levels showed a yearly increase prior to MM diagnosis. In the present study, an asymptomatic MGUS stage consistently preceded MM. Novel molecular markers are needed to better predict progression to MM in patients with MGUS.", "Strawberry fields forever? On the basis of copious preclinical data supporting the preventive efficacy of small fruits such as berries and grapes, Chen and colleagues conducted a randomized (noncomparative) phase II trial evaluating two doses of strawberry powder (60 g/d or 30 g/d for six months) to prevent esophageal cancer in China (reported in this issue of the journal, beginning on page 41); 60 g/d reduced the histologic grade of dysplastic lesions and reduced localized biomarkers, whereas 30 g/d was not effective. Fundamental questions remain such as the best formulation of strawberry powder, the active components associated with powder, and the actual mechanism of action, and standardized preparations will be required to permit the widespread use of strawberry powder with a predicable outcome. Clearly, however, this work is a good example of proof-of-principle and highlights the important role of diet, nutrition, and natural products in cancer prevention. \u00a92012 AACR.", "Monoclonal gammopathy of undetermined significance, smoldering multiple myeloma, and curcumin: a randomized, double-blind placebo-controlled cross-... Monoclonal gammopathy of undetermined significance (MGUS) and smoldering multiple myeloma (SMM) represent useful models for studying multiple myeloma precursor disease, and for developing early intervention strategies. Administering a 4g dose of curcumin, we performed a randomised, double-blind placebo-controlled cross-over study, followed by an open-label extension study using an 8g dose to assess the effect of curcumin on FLC response and bone turnover in patients with MGUS and SMM. 36 patients (19 MGUS and 17 SMM) were randomised into two groups: one received 4g curcumin and the other 4g placebo, crossing over at 3 months. At completion of the 4g arm, all patients were given the option of entering an open-label, 8g dose extension study. Blood and urine samples were collected at specified intervals for specific marker analyses. Group values are expressed as mean \u00b1 1 SD. Data from different time intervals within groups were compared using Student's paired t-test. 25 patients completed the 4g cross-over study and 18 the 8g extension study. Curcumin therapy decreased the free light-chain ratio (rFLC), reduced the difference between clonal and nonclonal light-chain (dFLC) and involved free light-chain (iFLC). uDPYD, a marker of bone resorption, decreased in the curcumin arm and increased on the placebo arm. Serum creatinine levels tended to diminish on curcumin therapy. These findings suggest that curcumin might have the potential to slow the disease process in patients with MGUS and SMM. Copyright \u00a9 2012 Wiley Periodicals, Inc.", "Post-epidemic eosinophilia myalgia syndrome associated with L-Tryptophan Eosinophilia\u2013myalgia syndrome (EMS) is characterized by subacute onset of myalgias and peripheral eosinophilia, followed by chronic neuropathy and skin induration. An epidemic of EMS in 1989 was linked to L-tryptophan consumption originating from a single source. Following the Food and Drug Administration (FDA) ban on the sale of L-tryptophan, the incidence of EMS declined rapidly. Moreover, no new cases have been published since the FDA ban was lifted in 2005. We report the clinical, histopathological and immunogenetic features of a new case of L-tryptophan-associated EMS along with evidence of activated transforming growth factor-\u00df and interleukin-4 signaling in the lesional skin.", "Southern Tick-Associated Rash Illness (STARI) in the North: STARI following a tick bite in Long Island, New York. The most common clinical manifestation of Lyme disease is the characteristic rash, erythema migrans (EM). In the 1980s EM-like eruptions were reported in Missouri and other southeastern states. The EM-like eruptions, which were of unknown etiology, often followed the bite of the Lone Star tick (Amblyomma americanum) and the rash is called STARI (southern tick-associated rash illness). Although the Lone Star tick is found in the Lyme disease-endemic areas of New England and Mid-Atlantic regions of the United States, STARI has been reported only once from the Northeast and Mid-Atlantic regions. We report a child from Connecticut who visited Long Island, New York, and developed a rash that was thought to be EM. Because the patient failed to respond to antibiotics used to treat Lyme disease, an investigation ensued, and the diagnosis of STARI was established."], ["Gerson regimen. The Gerson regimen, developed by Max Gerson in the 1930s, is promoted as an alternative cancer treatment. It involves consuming fresh, raw fruit and vegetable juices, eliminating salt from the diet, taking supplements such as potassium, vitamin B12, thyroid hormone, pancreatic enzymes, and detoxifying liver with coffee enemas to stimulate metabolism. Gerson therapy is based on the theory that cancer is caused by alteration of cell metabolism by toxic environmental substances and processed food, which changes its sodium and potassium content. It emphasizes increasing potassium intake and minimizing sodium consumption in an effort to correct the electrolyte imbalance, repair tissue, and detoxify the liver. The coffee enemas are believed to cause dilation of bile ducts and excretion of toxic breakdown products by the liver and through the colon wall. None of these theories has been substantiated by scientific research. Despite proponents' claims of recovery rates as high as 70% to 90%, case reviews by the National Cancer Institute (NCI) and the New York County Medical Society found no evidence of usefulness for the Gerson diet. An NCI-sponsored study of Gonzalez therapy, which is similar to the Gerson diet, showed that patients with inoperable pancreatic adenocarcinoma who underwent standard chemotherapy with gemcitabine (Gemzar) survived three times longer and had better quality of life than those who chose enzyme treatment, which included pancreatic enzymes, nutritional supplements, detoxification, and an organic diet.", "Monoamine oxidase inhibitors and the cheese effect. The behavior of inhibitors of monoamine oxidase-A (MAO-A) is considered in terms of the possibility of having an effective antidepressant that does not give rise to hypertensive interactions with dietary tyramine. Studies with punch-biopsy samples of human intestine and rat intestinal samples show MAO-A to be the predominant form of the enzyme in both species. Transport studies with everted rat intestinal preparations indicate that tyramine is extensively metabolized during transport through the intestine. Selective inhibition of MAO-A by clorgyline results in a large increase in the amount of unchanged tyramine transported, whereas selective inhibition of MAO-B with L-deprenyl (selegiline) has no significant effect. The behavior of reversible MAO-A inhibitors can significantly reduce, but not entirely eliminate, these effects on the intestinal metabolism of tyramine, but only if the inhibition is competitive in nature.", "Shifting from a conventional diet to an uncooked vegan diet reversibly alters fecal hydrolytic activities in humans. We studied the effect on fecal hydrolytic activities of adopting an uncooked extreme vegan diet and readopting a conventional diet. Eighteen subjects were randomly divided into test and control groups. In the test group subjects adopted the uncooked extreme vegan diet for 1 mo and then resumed a conventional diet for a second month. Controls consumed a conventional diet throughout the study. Phenol and p-cresol concentrations in serum and daily output in urine and fecal enzyme activities were measured. The activity of fecal urease significantly decreased (by 66%) as did cholylglycine hydrolase (55%), beta-glucuronidase (33%) and beta-glucosidase (40%) within 1 wk of beginning the vegan diet. The new level remained throughout the period of consuming this diet. Phenol and p-cresol concentrations in serum and daily outputs in urine significantly declined. The fecal enzyme activities returned to normal values within 2 wk of resuming the conventional diet. Concentrations of phenol and p-cresol in serum and daily output in urine had returned to normal after 1 mo of consuming the conventional diet. No changes were observed in the control group during the study. Results suggest that this uncooked extreme vegan diet causes a decrease in bacterial enzymes and certain toxic products that have been implicated in colon cancer risk.", "A \\\"glyconutrient sham\\\". The discipline of glycobiology contributes to our understanding of human health and disease through research, most of which is published in peer-reviewed scientific journals. Recently, legitimate discoveries in glycobiology have been used as marketing tools to help sell plant extracts termed \\\"glyconutrients.\\\" The glyconutrient industry has a worldwide sales force of over half a million people and sells nearly half a billion dollars (USD) of products annually. Here we address the relationship between glyconutrients and glycobiology, and how glyconutrient claims may impact the public and our discipline.", "No evidence supports vitamin E indiscriminate supplementation. For many years, the prevailing concept was that LDL oxidation plays the central role in atherogenesis. As a consequence, supplementation of antioxidants, particularly vitamin E, became very popular. Unfortunately, major randomized clinical trials yielded disappointing results and recent meta-analyses concluded that indiscriminate, high dose vitamin E supplementation results in increased mortality. This conclusion raised (quite reasonable) criticism, much of which referred to the characteristics of meta-analysis. In our recent study, we used a Markov-model approach, which is free of most of the limitations of meta-analyses. Our major finding was that the average quality-adjusted life years (QALY) of vitamin E- supplemented individuals was 0.30 QALY (95%CI 0.21 to 0.39) less than that of untreated people. In our view, this supports the view that indiscriminate supplementation of high dose vitamin E can not be recommended to the general public.In the present communication we address several recent studies that demonstrated negative effects of vitamin E and raise possible mechanisms that may be responsible for the harmful effects of vitamin E supplementation. We also review recent studies conducted with specific groups of patients that gained from vitamin E supplementation, indicating that although, on the average, indiscriminate supplementation of high dose vitamin E is not beneficial, specific populations may gain from vitamin E. The challenge is to establish selection criteria that will predict who is likely to benefit from vitamin E supplementation. Such criteria may be based either on the assumption that antioxidants are likely to be beneficial for people under oxidative stress or on knowledge regarding the benefit of sick people with certain diseases. In short, we adopt the view that vitamin E is a \\\"double-edge sword\\\" that should not be consumed until criteria are defined to predict who is likely to benefit from high dose supplementation of vitamin E. (c) 2009 International Union of Biochemistry and Molecular Biology, Inc."], ["Effects of vitamins C and E on N-nitroso compound formation, carcinogenesis, and cancer. The properties of N-nitroso compounds (NNC) and of vitamins C and E are briefly described. The author reviews the ability of vitamins C and E to inhibit NNC formation in chemical systems, in nitrite-preserved meat, in experimental animals and in humans. Dietary vitamins C and E both produced 30% to 60% inhibitions in most carcinogenesis experiments employing preformed carcinogens. Vitamin C reversed transformation in an in vitro system. Carcinogenicity tests of the vitamins are reviewed (vitamin C can promote bladder carcinogenesis). Intake of fresh fruits and vegetables (which contain vitamin C) is negatively correlated with cancer of the stomach, esophagus, larynx, mouth and cervix. For gastric and esophageal cancer, there is evidence that this association is due to an inhibition of in vivo NNC formation. Vitamin C is apparently not a useful treatment for cancer. The author supports the recommendation that fresh fruit and vegetable intake be increased to lower the risk of cancer.", "Effect of vitamin C supplements on physical performance. Vitamin C is an essential component of the diet and may reduce the adverse effects of exercise-induced reactive oxygen species, including muscle damage, immune dysfunction, and fatigue. However, reactive oxygen species may mediate beneficial training adaptations that vitamin C attenuates; indeed, from a total of 12 studies, vitamin C in doses >1 g\u00b7d(-1) impaired sport performance substantially in four of four studies, possibly by reducing mitochondrial biogenesis, while a further four studies demonstrated impairments that were not statistically significant. Doses of \u223c0.2 g\u00b7d(-1) of vitamin C consumed through five or more servings of fruit and vegetables may be sufficient to reduce oxidative stress and provide other health benefits without impairing training adaptations.", "Protein oxidation in emulsified cooked burger patties with added fruit extracts: Influence on colour and texture deterioration during chill storage. The influence of protein oxidation, as measured by the dinitrophenylhydrazine (DNPH) method, on colour and texture changes during chill storage (2 degrees C, 12days) of cooked burger patties was studied. Extracts from arbutus-berries (Arbutus unedoL., AU), common hawthorns (Crataegus monogynaL., CM), dog roses (Rosa caninaL., RC) and elm-leaf blackberries (Rubus ulmifoliusSchott., RU) were prepared, added to burger patties (3% of total weight) and evaluated as inhibitors of protein oxidation and colour and texture changes. Negative (no added extract, C) and positive control (added quercetin; 230mg/kg, Q) groups were also considered. The significant increase of protein carbonyls during chill storage of control burger patties reflect the intense oxidative degradation of the muscle proteins. Concomitantly, an intense loss of redness and increase of hardness was found to take place in burger patties throughout refrigerated storage. Most fruit extracts as well as Q significantly reduced the formation of protein carbonyls and inhibited colour and texture deterioration during chill storage. Likely mechanisms through which protein oxidation could play a major role on colour and texture changes during chill storage of burger patties are discussed. Amongst the extracts, RC was most suitable for use as a functional ingredient in processed meats since it enhanced oxidative stability, colour and texture properties of burger patties with no apparent drawbacks. Copyright 2010 Elsevier Ltd. All rights reserved.", "Determination of total N-nitroso compounds and their precursors in frankfurters, fresh meat, dried salted fish, sauces, tobacco, and tobacco smoke ... Total N-nitroso compounds (NOC) and NOC precursors (NOCP) were determined in extracts of food and tobacco products. Following Walters' method, NOC were decomposed to NO with refluxing HBr/HCl/HOAc/EtOAc and NO was measured by chemiluminescence. NOC were determined after sulfamic acid treatment to destroy nitrite, and NOCP were determined after treatment with 110 mM nitrite and then sulfamic acid. Analysis without HBr gave results < or =20% of those with HBr. This NOC method was efficient for nitrosamines but not nitrosoureas. The standard nitrosation for determining NOCP gave high yields for readily nitrosated amines, including 1-deoxy-1-fructosylvaline, but not for simple amines, dipeptides, and alkylureas. Mean NOC and NOCP results were (respectively, in micromol/kg of product) 5.5 and 2700 for frankfurters, 0.5 and 660 for fresh meat, 5.8 and 5800 for salted, dried fish, and 660 and 2900 for chewing tobacco (all for aqueous extracts) and 220 and 20000 nmol/cigarette for MeCN extracts of cigarette smoke filter pads.", "Fresh meat and further processing characteristics of ham muscles from finishing pigs fed ractopamine hydrochloride. Ractopamine hydrochloride (RAC) has consistently led to an advantage in carcass cutting yields of finishing pigs and remains a common feed additive in US finishing pig diets. Less is known about the effect of RAC on further processing characteristics. Some researchers have reported advantages in ultimate pH of the LM in pigs fed RAC. If a greater ultimate pH was also observed in hams, the increased pH could affect further processing characteristics and lead to better protein interaction and improved textural properties. The objective of this experiment was to determine if RAC-fed pigs yielded hams with a greater ultimate pH, and if so, whether or not that advantage improves textural properties and water retention of further processed hams. Two hundred hams from barrows and gilts fed RAC or control diets were selected based on HCW. Hams were fabricated into 5 separate pieces to determine cutting yields, and 6 muscles were evaluated for ultimate pH. Hams were processed to make cured and smoked hams. Ractopamine increased cutting yields of the whole ham (P < 0.0001), inside (P < 0.01), outside (P < 0.01), and knuckle (P < 0.01) when expressed as a percentage of chilled side weight. Ultimate pH of the rectus femoris, vastus lateralis, and semitendinosus were all 0.06 pH units greater (P < 0.05), the biceps femoris was 0.04 pH units greater (P = 0.02), and the semimembranosus and adductor muscles were 0.03 pH units greater in pigs fed 7.4 mg/kg of RAC when compared with control pigs. Cured hams from RAC-fed pigs were heavier at all stages of production. No differences were detected in binding strengths (P = 0.88) or protein fat-free values (P = 0.13) between RAC (9.06 kg and 20.37) and control hams (9.01 kg and 20.13). Ractopamine increased cutting yields, total weight of cured hams, and ultimate muscle pH. Ractopamine can be fed to pigs to achieve the desired growth characteristic advantages and cutting yields without affecting further processed ham characteristics."], ["Effect of blueberry ingestion on natural killer cell counts, oxidative stress, and inflammation prior to and after 2.5 h of running. Blueberries are rich in antioxidants known as anthocyanins, which may exhibit significant health benefits. Strenous exercise is known to acutely generate oxidative stress and an inflammatory state, and serves as an on-demand model to test antioxidant and anti-inflammatory compounds. The purpose of this study was to examine whether 250 g of blueberries per day for 6 weeks and 375 g given 1 h prior to 2.5 h of running at \u223c72% maximal oxygen consumption counters oxidative stress, inflammation, and immune changes. Twenty-five well-trained subjects were recruited and randomized into blueberry (BB) (N = 13) or control (CON) (N = 12) groups. Blood, muscle, and urine samples were obtained pre-exercise and immediately postexercise, and blood and urine 1 h postexercise. Blood was examined for F\u2082-isoprostanes for oxidative stress, cortisol, cytokines, homocysteine, leukocytes, T-cell function, natural killer (NK), and lymphocyte cell counts for inflammation and immune system activation, and ferric reducing ability of plasma for antioxidant capacity. Muscle biopsies were examined for glycogen and NFkB expression to evaluate stress and inflammation. Urine was tested for modification of DNA (8-OHDG) and RNA (5-OHMU) as markers of nucleic acid oxidation. A 2 (treatment) \u00d7 3 (time) repeated measures ANOVA was used for statistical analysis. Increases in F\u2082-isoprostanes and 5-OHMU were significantly less in BB and plasma IL-10 and NK cell counts were significantly greater in BB vs. CON. Changes in all other markers did not differ. This study indicates that daily blueberry consumption for 6 weeks increases NK cell counts, and acute ingestion reduces oxidative stress and increases anti-inflammatory cytokines.", "Influence of tart cherry juice on indices of recovery following marathon running. This investigation determined the efficacy of a tart cherry juice in aiding recovery and reducing muscle damage, inflammation and oxidative stress. Twenty recreational Marathon runners assigned to either consumed cherry juice or placebo for 5 days before, the day of and for 48 h following a Marathon run. Markers of muscle damage (creatine kinase, lactate dehydrogenase, muscle soreness and isometric strength), inflammation [interleukin-6 (IL-6), C-reactive protein (CRP) and uric acid], total antioxidant status (TAS) and oxidative stress [thiobarbituric acid reactive species (TBARS) and protein carbonyls] were examined before and following the race. Isometric strength recovered significantly faster (P=0.024) in the cherry juice group. No other damage indices were significantly different. Inflammation was reduced in the cherry juice group (IL-6, P<0.001; CRP, P<0.01; uric acid, P<0.05). TAS was ~10% greater in the cherry juice than the placebo group for all post-supplementation measures (P<0.05). Protein carbonyls was not different; however, TBARS was lower in the cherry juice than the placebo at 48 h (P<0.05). The cherry juice appears to provide a viable means to aid recovery following strenuous exercise by increasing total antioxidative capacity, reducing inflammation, lipid peroxidation and so aiding in the recovery of muscle function. \u00a9 2009 John Wiley & Sons A/S.", "Efficacy of a tart cherry juice blend in preventing the symptoms of muscle damage Background Numerous antioxidant and anti\u2010inflammatory agents have been identified in tart cherries. Objective To test the efficacy of a tart cherry juice blend in preventing the symptoms of exercise induced muscle damage. Methods This was a randomised, placebo controlled, crossover design. Fourteen male college students drank 12\u2005fl oz of a cherry juice blend or a placebo twice a day for eight consecutive days. A bout of eccentric elbow flexion contractions (2 \u00d7 20 maximum contractions) was performed on the fourth day of supplementation. Isometric elbow flexion strength, pain, muscle tenderness, and relaxed elbow angle were recorded before and for four days after the eccentric exercise. The protocol was repeated two weeks later with subjects who took the placebo initially, now taking the cherry juice (and vice versa). The opposite arm performed the eccentric exercise for the second bout to avoid the repeated bout protective effect. Results Strength loss and pain were significantly less in the cherry juice trial versus placebo (time by treatment: strength p<0.0001, pain p \u200a=\u200a 0.017). Relaxed elbow angle (time by treatment p \u200a=\u200a 0.85) and muscle tenderness (time by treatment p \u200a=\u200a 0.81) were not different between trials. Conclusions These data show efficacy for this cherry juice in decreasing some of the symptoms of exercise induced muscle damage. Most notably, strength loss averaged over the four days after eccentric exercise was 22% with the placebo but only 4% with the cherry juice.", "Watermelon juice: potential functional drink for sore muscle relief in athletes. l-Citrulline is an excellent candidate to reduce muscle soreness, and watermelon is a fruit rich in this amino acid. This study investigated the potential of watermelon juice as a functional drink for athletes. An in vitro study of intestinal absorption of l-citrulline in Caco-2 cells was performed using unpasteurized (NW), pasteurized (80 \u00b0C for 40 s) watermelon juice (PW) and, as control, a standard of l-citrulline. l-citrulline bioavailability was greater when it was contained in a matrix of watermelon and when no heat treatment was applied. In the in vivo experiment (maximum effort test in a cycloergometer), seven athletes were supplied with 500 mL of natural watermelon juice (1.17 g of l-citrulline), enriched watermelon juice (4.83 g of l-citrulline plus 1.17 g from watermelon), and placebo. Both watermelon juices helped to reduce the recovery heart rate and muscle soreness after 24 h.", "Transfer of spinal cord material to subsequent bovine carcasses at splitting. During the slaughter process, cattle carcasses are split by sawing centrally down the vertebral column, resulting in contamination of each half with spinal cord material. Using a novel method based on a real-time PCR assay, we measured saw-mediated tissue transfer among carcasses. Up to 2.5% of the tissue recovered from each of the five subsequent carcasses by swabbing the split vertebral face came from the first carcass to be split; approximately 9 mg was spinal cord tissue. Under controlled conditions in an experimental abattoir, between 23 and 135 g of tissue accumulated in the saw after splitting five to eight carcasses. Of the total tissue recovered, between 10 and 15% originated from the first carcass, and between 7 and 61 mg was spinal cord tissue from the first carcass. At commercial plants in the United Kingdom, between 6 and 101 g of tissue was recovered from the saw, depending on the particular saw-washing procedure and number of carcasses processed. Therefore, if a carcass infected with bovine spongiform encephalopathy were to enter the slaughter line, the main risk of subsequent carcass contamination would come from the tissue debris that accumulates in the splitting saw. This work highlights the importance of effective saw cleaning and indicates that design modifications are required to minimize the accumulation of spinal cord tissue debris and, hence, the risk of cross-contamination of carcasses."], ["Mutagenic and antioxidant activities of Croton lechleri sap in biological systems. The sap of Croton lechleri Muell.-Arg (Euphorbiaceae), called Dragon's blood, is used in folk medicine as a cicatrizant, anti-inflammatory and to treat cancer. In this research, the antioxidant activity of Croton lechleri sap was evaluated against the yeast Saccharomyces cerevisiae and against maize plantlets treated with the oxidative agents apomorphine and hydrogen peroxide. The mutagenic activity of the sap was also analyzed using the Salmonella/microsome assay (Salmonella typhimurium TA97a, TA98, TA100, TA102, TA1535) and in cells of the yeast Saccharomyces cerevisiae. The results showed that Croton lechleri sap possesses significant antioxidant activity against the oxidative damages induced by apomorphine in Saccharomyces cerevisiae under all the conditions studied. However, in the case of hydrogen peroxide, antioxidant activity of the sap was detected only in cells in the stationary phase of growth. The sap was also able to protect cells of the maize plantlets from the toxic effect of apomorphine. This sap showed mutagenic activity for strain TA1535 of Salmonella typhimurium in the presence of metabolic activation and a weak mutagenic activity for strain TA98. These strains detect base pair substitutions and frameshift mutations, respectively. Mutagenicity was also observed in a haploid Saccharomyces cerevisiae strain XV185-14c for the lys1-1, his1-7 locus-specific reversion and hom3-10 frameshift mutations.", "Toxicological and mutagenic analysis of Artemisia dracunculus (tarragon) extract. Mutagenicity and liver toxicity of the herb tarragon (Artemisia dracunculus) were evaluated using single cell gel (comet) electrophoresis. Ten microlitres aliquots of peripheral venous human blood were incubated with tarragon extract, saline, or the mutagen sodium dichromate. Cell suspensions dispersed in low-melting agarose were electrophoresed in ethidium bromide. The resulting DNA migration trails were obtained using fluorescent microscopy at 400\u00d7 magnification, and graded according to the mutagenicity index (MI) for each cell incubation condition. The in vivo liver toxicity of Artemisia dracunculus was assessed in the blood of mice treated orally with the extract of the herb, using alanine aminotransferase (ALT) and aspartate aminotransferase (AST) as liver function indicators. Liver morphology was assessed using hematoxylin and eosin (HE) staining of liver tissue. The present study demonstrated a direct correlation between tarragon extract dosage and three major outcome variables: MI; serum liver enzyme activity; and liver histopathology. These outcomes are possibly due to the presence in tarragon of methylchavicol and other genotoxic compounds. These findings provide a preliminary guide for risk assessment of tarragon in diet and in possible therapeutic applications. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Aluminium and other elements in selected herbal tea plant species and their infusions. The determination of Al, B, Cu, Fe, Mn, Ni, P, Zn and Ca, K, Mg by inductively coupled plasma optical emission spectrometry (ICP-OES) and flame atomic absorption spectroscopy (FAAS), respectively, in digests and infusions of Hibiscus sabdariffa (petals), Rosa canina (receptacles), Ginkgo biloba (leaves), Cymbopogon citratus (leaves), Aloe vera (leaves) and Panax ginseng (roots) was carried out in this study. Particular attention has been given to Al and heavy metals for the identification of possible raw material contaminants, their transformation into the infusion and for predicting their eventual role in the human diet during daily consumption. Additionally, Ion Chromatography (IC) speciation of Al in the leachates was carried out. In dry herbs, hibiscus and ginkgo appeared to contain the greatest contents of Al, Fe, K, Mn, Ni, Zn and B, Mg, P, respectively. A. vera contained the highest amount of Ca and highest values of Cu and P were observed in ginseng. In infusions, the topmost concentrations of Al, B, Cu, Fe, P, K, Mn, Ni, Zn were detected in those prepared from hibiscus petals, Ca from aloe leaves and Mg from leaves of ginkgo. According to a possible daily consumption exceeding 1 L, hibiscus decoction was identified as potentially dietetically significant in the content of certain elements. It seems to be possibly one of the top contributors of B from food (up to 5.5\u00b10.2 mg/L). The Mg contained in the infusion (up to 106\u00b15 mg/L) may be a contributor in the attenuation of blood pressure. A high amount of accessible Mn (up to 17.4\u00b11.1 mg/L) can probably have an adverse effect in humans. The total Al allowance (up to 1.2\u00b10.1 mg/L) suggests that no more than 1 L of the hibiscus infusion should be consumed per day by sensitive individuals including pregnant women and should be completely excluded from the diet of children under 6 months of age and children with chronic renal failure. Copyright \u00a9 2013 Elsevier Ltd. All rights reserved.", "The effect of blood removal on oxidation and shelf life of broiler breast meat. Blood components, especially hemoglobin, are powerful promoters of lipid oxidation and may decrease the shelf life of meat products. Therefore, this study examined different slaughter techniques to determine their effects on pH (24 h), color (L*a*b* values at 24 h), lipid oxidation, residual hemoglobin concentration (24 h), and sensory evaluation (d 1 and 4 postmortem; PM) in broiler breast fillets. The treatments included 1) CO(2) slaughter and not bled, 2) no stunning and bled, 3) electrical stunning (ES) and bled, 4) CO(2) stunning and bled, and 5) ES and decapitation. The birds were conventionally processed, and analyses were performed at 24 h PM except residual hemoglobin for which the samples were frozen (-80 degrees C) until analyses ( < 2 mo). There were no significant differences in pH or b* values at 24 h PM among any of the treatments. L* values were significantly higher, indicating lighter fillets in the ES and decapitated birds compared with the darker fillets from the CO(2) stunned and bled birds. The CO(2) slaughter and not bled birds had significantly higher a* values, indicating more red color, when compared with the ES and bled and decapitated birds. There were no significant differences in the residual hemoglobin contents in the broiler breast muscle when comparing all of the treatments except CO(2) slaughter and not bled, which was significantly (around 15%) greater. Overall TBA-reactive substances (TBARS; raw, cooked at 24 h, and cooked at 72 h PM) indicated that ES and bled birds had the lowest TBARS when compared with the remaining treatments. Consumer panels detected increased aroma (chicken meaty and warmed-over aromas) and flavor (chicken meaty and warmed-over flavors) in not bled samples at 24 h PM. By 72 h PM, however, there were no significant differences in aroma or flavor. Therefore, different slaughter and bleeding method may affect color and sensory properties of the broiler breast fillets, and the ES and decapitation method had the most favorable results for sensory quality.", "Bioavailability of natural carotenoids in human skin compared to blood. Skin functions and structure are significantly influenced by nutrients. Antioxidants protect the supportive layer of the skin against any damaging irradiation effects and the action of free radicals. A lack of suitable methods means that the pharmacokinetic properties of systemically applied carotenoids transferred into the skin remain poorly understood. In this study, a natural kale extract or placebo oil were given orally to 22 healthy volunteers for 4 weeks. Carotenoid bioaccessibility was evaluated using non-invasive resonance Raman spectroscopy on the palm and forehead skin. For the analysis of the blood serum, the standard HPLC method was used. The blood and skin levels of the carotenoids increased significantly during the study but compared to the blood serum values, increases in skin were delayed and depended on the dermal area as well as on the carotenoid. Lycopene, measured as being low in the extract, increases more in the skin compared to the blood indicating that the natural mixture of the extract stabilizes the antioxidative network in the skin. After supplementation had ended, the carotenoids decreased much faster in the blood than in the skin. The delayed decrease in the skin may indicate a peripheral buffer function of the skin for carotenoids. Copyright \u00a9 2010 Elsevier B.V. All rights reserved."], ["Goji (Lycium barbarum and L. chinense): Phytochemistry, pharmacology and safety in the perspective of traditional uses and recent popularity. Since the beginning of this century, Goji berries and juice are being sold as health food products in western countries and praised in advertisements and in the media for well-being and as an anti-aging remedy. The popularity of Goji products has rapidly grown over the last years thanks to efficient marketing strategies. Goji is a relatively new name given to Lycium barbarum and L. chinense, two close species with a long tradition of use as medicinal and food plants in East Asia, in particular in China. While only L. barbarum is officinal, the fruit (fructus Lycii) and the root bark (cortex Lycii radicis) of both species are used in the folk medicine. We review here the constituents, pharmacology, safety, and uses of L. barbarum and L. chinense with consideration to the different parts of the plant. Investigations of the fruit have focused on proteoglycans, known as \\\" Lycium barbarum polysaccharides\\\", which showed antioxidative properties and some interesting pharmacological activities in the context of age related diseases such as atherosclerosis and diabetes. As to the root bark, several compounds have demonstrated a hepatoprotective action as well as inhibitory effects on the rennin/angiotensin system which may support the traditional use for the treatment of hypertension. While there are no signs of toxicity of this plant, two cases of possible interaction with warfarin point to a potential risk of drug interaction. In view of the available pharmacological data and the long tradition of use in the traditional Chinese medicine, L. barbarum and L. chinense certainly deserve further investigation. However, clinical evidences and rigorous procedures for quality control are indispensable before any recommendation of use can be made for Goji products. Copyright Georg Thieme Verlag KG Stuttgart . New York.", "Goji berry effects on macular characteristics and plasma antioxidant levels. PURPOSE: Goji berry (Lycium barbarum L.) is purported to benefit vision because of its high antioxidant (especially zeaxanthin) content, although this effect has not been demonstrated in high-quality human studies. The purpose of this study was to evaluate the effects of daily supplementation with a proprietary milk-based formulation of goji berry, Lacto-Wolfberry (LWB), on macular characteristics and plasma zeaxanthin and antioxidant capacity levels in elderly subjects. METHODS: This was a double-masked, randomized, placebo-controlled trial in healthy elderly subjects (range, 65 to 70 years) receiving 13.7 g/d of LWB (n = 75) or placebo (n = 75) for 90 days. Subjects underwent direct ophthalmic examination to assess pigmentation and soft drusen count in the macula and a blood draw to measure plasma zeaxanthin level and total antioxidant capacity. RESULTS: The placebo group demonstrated hypopigmentation and soft drusen accumulation in the macula, whereas the LWB group remained stable. Both plasma zeaxanthin level and antioxidant capacity increased significantly in the LWB group, by 26% and 57%, respectively, but did not change in the placebo group. No product-related adverse events were reported in either group. CONCLUSIONS: Overall, daily dietary supplementation with goji berry for 90 days increases plasma zeaxanthin and antioxidant levels as well as protects from hypopigmentation and soft drusen accumulation in the macula of elderly subjects. However, the mechanism of action is unclear, given the lack of relationship between change in plasma zeaxanthin and change in macular characteristics.", "Fasting plasma zeaxanthin response to Fructus barbarum L. (wolfberry; Kei Tze) in a food-based human supplementation trial. Age-related macular degeneration (AMD) is a common disorder that causes irreversible loss of central vision. Increased intake of foods containing zeaxanthin may be effective in preventing AMD because the macula accumulates zeaxanthin and lutein, oxygenated carotenoids with antioxidant and blue light-absorbing properties. Lycium barbarum L. is a small red berry known as Fructus lycii and wolfberry in the West, and Kei Tze and Gou Qi Zi in Asia. Wolfberry is rich in zeaxanthin dipalmitate, and is valued in Chinese culture for being good for vision. The aim of this study, which was a single-blinded, placebo-controlled, human intervention trial of parallel design, was to provide data on how fasting plasma zeaxanthin concentration changes as a result of dietary supplementation with whole wolfberries. Fasting blood was collected from healthy, consenting subjects; fourteen subjects took 15 g/d wolfberry (estimated to contain almost 3 mg zeaxanthin) for 28 d. Repeat fasting blood was collected on day 29. Age- and sex-matched controls (n 13) took no wolfberry. Responses in the two groups were compared using the Mann-Whitney test. After supplementation, plasma zeaxanthin increased 2.5-fold: mean values on day 1 and 29 were 0.038 (sem 0.003) and 0.096 (sem 0.009) micromol/l (P<0.01), respectively, for the supplementation group; and 0.038 (sem 0.003) and 0.043 (sem 0.003) micromol/l (P>0.05), respectively, for the control group. This human supplementation trial shows that zeaxanthin in whole wolfberries is bioavailable and that intake of a modest daily amount markedly increases fasting plasma zeaxanthin levels. These new data will support further study of dietary strategies to maintain macular pigment density.", "Cranberries: ripe for more cancer research? Berries have been recognized as a functional food with potential to protect against a variety of health conditions, including some cancers. Cranberry (Vaccinium macrocarpon) production and consumption have grown in recent years, warranting further evaluation of potential health benefits. Extracts and isolated constituents from cranberry fruit inhibit growth and proliferation of tumor cells in vitro, and recent data from animal studies lend further support to cranberry's reputation as a cancer fighter. Several likely mechanisms of action for cranberry against prostate and other cancers have been identified, including induction of apoptosis and inhibition of events linked to cellular invasion and migration. This article attempts to put into perspective what is known about cranberry's potential chemopreventive properties, what is yet to be determined, and some factors to consider as research moves forward. Copyright \u00a9 2011 Society of Chemical Industry.", "Two-year randomized, placebo-controlled study of black currant anthocyanins on visual field in glaucoma. AIM: To examine the influence of the black currant anthocyanins (BCACs) on the disease progression of open-angle glaucoma (OAG), a randomized, placebo-controlled, double-masked trial was made in 38 patients with OAG treated by antiglaucoma drops. METHODS: BCACs (50 mg/day, n = 19) or their placebos (n = 19) were orally administered once daily for a 24-month period. Systemic blood pressure, pulse rates, intraocular pressure (IOP), ocular blood circulation by laser-speckle flowgraphy, and Humphrey visual field mean deviation (MD) were measured during the 24-month period. RESULTS: As a main outcome measurement, we evaluated the difference between the groups in MD deterioration in the eye with a better MD from the trial's baseline through 24 months. A statistically significant difference was observed between the treatment groups in mean change from baseline in MD 24 months after therapy (p = 0.039, unpaired t test). Upon administration of BCACs, the ocular blood flows during the 24-month observational period increased in comparison with placebo-treated patients. However, no significant changes were observed in systemic and ocular conditions including IOP during the 24-month period. CONCLUSIONS: Our results suggest that oral administration of BCACs may be a safe and promising supplement for patients with OAG in addition to antiglaucoma medication. Copyright \u00a9 2012 S. Karger AG, Basel."], ["Preventing and arresting coronary atherosclerosis. The good news about coronary atherosclerosis is that it takes an awful lot of plaque before symptoms of myocardial ischemia occur. The bad news is that despite the need for large quantities of plaque for symptoms to occur, nevertheless nearly half of us in the United States eventually have the necessary quantity. Atherosclerosis is infrequently hereditary in origin. Most of us get atherosclerosis because we consume too much fat, cholesterol, and calories. The consequence is an elevated ( > 150 mg/dl) serum total cholesterol level, and the higher the number is above 150, the greater is the quantity of plaque deposited in our arteries. If the serum total cholesterol level can be prevented from rising to more than 150 mg/dl, plaques are not laid down; if elevated levels are lowered to 150 mg/dl, further plaque does not form, and parts of those present may vanish. A fruit-vegetarian-starch diet is necessary as a rule to achieve the 150 mg/dl level in most adults. Lipid-lowering drugs are required in the patients with familial hypercholesterolemia and in most patients with atherosclerotic events. The best news about atherosclerosis is that it can be prevented in those without the hereditary form, and it can be arrested by lowering elevated serum total (and LDL) cholesterol to the 150 mg/dl level.", "The Collateral Network Concept: A Reassessment of the Anatomy of Spinal Cord Perfusion OBJECTIVE Prevention of paraplegia following repair of thoracoabdominal aortic aneurysms (TAAA) requires understanding the anatomy and physiology of the blood supply to the spinal cord. Recent laboratory studies and clinical observations suggest that a robust collateral network must exist to explain preservation of spinal cord perfusion when segmental vessels are interrupted. An anatomical study was undertaken. METHODS Twelve juvenile Yorkshire pigs underwent aortic cannulation and infusion of a low-viscosity acrylic resin at physiological pressures. After curing of the resin and digestion of all organic tissue, the anatomy of the blood supply to the spinal cord was studied grossly and using light and electron microscopy. RESULTS All vascular structures \u2265 8\u03bcm in diameter were preserved. Thoracic and lumbar segmental arteries (SAs) give rise not only to the anterior spinal artery (ASA), but to an extensive paraspinous network feeding the erector spinae, iliopsoas, and associated muscles. The ASA, mean diameter 134\u00b120 \u03bcm, is connected at multiple points to repetitive circular epidural arteries with mean diameters of 150\u00b126 \u03bcm. The capacity of the paraspinous muscular network is 25-fold the capacity of the circular epidural arterial network and ASA combined. Extensive arterial collateralization is apparent between the intraspinal and paraspinous networks, and within each network. Only 75% of all SAs provide direct ASA-supplying branches. CONCLUSIONS The ASA is only one component of an extensive paraspinous and intraspinal collateral vascular network. This network provides an anatomic explanation of the physiological resiliency of spinal cord perfusion when SAs are sacrificed during TAAA repair.", "How to save a life during a clinic visit for erectile dysfunction by modifying cardiovascular risk factors. Erectile dysfunction (ED) is an early marker for systemic atherosclerosis and is a predictor for coronary artery disease and cardiac events. The aim of this paper is to convey the importance of addressing cardiovascular risk factors in patients with ED and to inform urologists as well as other physicians who are not specialized in cardiology how to carry out a basic cardiovascular evaluation, including history, physical examination and objective data. We review the evidence and pathophysiology linking ED to cardiovascular disease, and then describe how to carry out a basic cardiovascular evaluation. We present data from the literature showing that appropriate use of lifestyle modifications and medical therapy has a positive effect on mortality, on numerous cardiovascular end points and on ED. Suggestions of when to refer the ED patient to an internist or cardiologist are provided. Identifying and treating cardiovascular risk factors may not only benefit the patient's ED, but it might also save the patient's life.", "The link between erectile and cardiovascular health: the canary in the coal mine. Lifestyle and nutrition have been increasingly recognized as central factors influencing vascular nitric oxide (NO) production and erectile function. This review underscores the importance of NO as the principal mediator influencing cardiovascular health and erectile function. Erectile dysfunction (ED) is associated with smoking, excessive alcohol intake, physical inactivity, abdominal obesity, diabetes, hypertension, and decreased antioxidant defenses, all of which reduce NO production. Better lifestyle choices; physical exercise; improved nutrition and weight control; adequate intake of or supplementation with omega-3 fatty acids, antioxidants, calcium, and folic acid; and replacement of any testosterone deficiency will all improve vascular and erectile function and the response to phosphodiesterase-5 inhibitors, which also increase vascular NO production. More frequent penile-specific exercise improves local endothelial NO production. Excessive intake of vitamin E, calcium, l-arginine, or l-citrulline may impart significant cardiovascular risks. Interventions discussed also lower blood pressure or prevent hypertension. Certain angiotensin II receptor blockers improve erectile function and reduce oxidative stress. In men aged <60 years and in men with diabetes or hypertension, erectile dysfunction can be a critical warning sign for existing or impending cardiovascular disease and risk for death. The antiarrhythmic effect of omega-3 fatty acids may be particularly crucial for these men at greatest risk for sudden death. In conclusion, by better understanding the complex factors influencing erectile and overall vascular health, physicians can help their patients prevent vascular disease and improve erectile function, which provides more immediate motivation for men to improve their lifestyle habits and cardiovascular health. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Relation of serum lipoprotein levels and systolic blood pressure to early atherosclerosis. The Bogalusa Heart Study. We assessed the relation of risk factors for cardiovascular disease to early atherosclerotic lesions in the aorta and coronary arteries in 35 persons (mean age at death, 18 years). Aortic involvement with fatty streaks was greater in blacks than in whites (37 vs. 17 percent, P less than 0.01). However, aortic fatty streaks were strongly related to antemortem levels of both total and low-density lipoprotein cholesterol (r = 0.67, P less than 0.0001 for each association), independently of race, sex, and age, and were inversely correlated with the ratio of high-density lipoprotein cholesterol to low-density plus very-low-density lipoprotein cholesterol (r = -0.35, P = 0.06). Coronary-artery fatty streaks were correlated with very-low-density lipoprotein cholesterol (r = 0.41, P = 0.04). Mean systolic blood-pressure levels also tended to be higher in the four subjects with coronary-artery fibrous plaques than in those without them: 112 mm Hg as compared with 104 (P = 0.09). These results document the importance of risk-factor levels to early anatomical changes in the aorta and coronary arteries. The progression of fatty streaks to fibrous plaques is uncertain, but these data suggest that a rational approach to the prevention of cardiovascular disease should begin early in life."], ["Towards prevention of vitamin D deficiency and beyond: knowledge gaps and research needs in vitamin D nutrition and public health. The North American Institute of Medicine (IOM) recently published their report on dietary reference intakes (DRI) for Ca and vitamin D. The DRI committee's deliberations underpinning this most comprehensive report on vitamin D nutrition to date benefited hugely from a much expanded knowledge base in vitamin D over the last decade or more. However, since their release, the vitamin D DRI have been the subject of intense controversy, which is largely due to the persistence of fundamental knowledge gaps in vitamin D. These can be identified at the levels of exposure, metabolism, storage, status, dose-response, function and beneficial or adverse health effects, as well as safe and effective application of intake recommendations at the population level through sustainable food-based approaches. The present review provides a brief overview of the approach used by the IOM committee to revise the DRI for vitamin D and to collate from a number of authoritative sources key knowledge gaps in vitamin D nutrition from the public health perspective. A number of research topics are outlined and data requirements within these are identified and mapped to the risk assessment framework used by the DRI committee. While not intended as an exhaustive list, it provides a basis for organising and prioritising research efforts in the area of vitamin D, which may offer a perspective on the major areas in need of attention. It is intended to be of use to researchers, national policy makers, the public health community, industry groups and other relevant stakeholders including funding institutions.", "Evaluation, treatment, and prevention of vitamin D deficiency: an Endocrine Society clinical practice guideline. OBJECTIVE: The objective was to provide guidelines to clinicians for the evaluation, treatment, and prevention of vitamin D deficiency with an emphasis on the care of patients who are at risk for deficiency. PARTICIPANTS: The Task Force was composed of a Chair, six additional experts, and a methodologist. The Task Force received no corporate funding or remuneration. CONSENSUS PROCESS: Consensus was guided by systematic reviews of evidence and discussions during several conference calls and e-mail communications. The draft prepared by the Task Force was reviewed successively by The Endocrine Society's Clinical Guidelines Subcommittee, Clinical Affairs Core Committee, and cosponsoring associations, and it was posted on The Endocrine Society web site for member review. At each stage of review, the Task Force received written comments and incorporated needed changes. CONCLUSIONS: Considering that vitamin D deficiency is very common in all age groups and that few foods contain vitamin D, the Task Force recommended supplementation at suggested daily intake and tolerable upper limit levels, depending on age and clinical circumstances. The Task Force also suggested the measurement of serum 25-hydroxyvitamin D level by a reliable assay as the initial diagnostic test in patients at risk for deficiency. Treatment with either vitamin D(2) or vitamin D(3) was recommended for deficient patients. At the present time, there is not sufficient evidence to recommend screening individuals who are not at risk for deficiency or to prescribe vitamin D to attain the noncalcemic benefit for cardiovascular protection.", "Vitamin D: extraskeletal health. Vitamin D deficiency is the most common nutritional deficiency and likely the most common medical condition in the world. The major cause of vitamin D deficiency has been the lack of appreciation that the body requires 5- to 10-fold higher intakes than is currently recommended by health agencies. There is now overwhelming and compelling scientific and epidemiologic data suggesting that the human body requires a blood level of 25(OH)D above 30 ng/mL for maximum health. To increase the blood level to the minimum 30 ng/mL requires the ingestion of at least 1000 IU of vitamin D per day for adults. In general, there is no downside to increasing either a child's or adult's vitamin D intake. Copyright 2010 Elsevier Inc. All rights reserved.", "Low Vitamin D Status: Definition, Prevalence, Consequences and Correction Vitamin D is obtained from cutaneous production when 7-dehydrocholesterol is converted to vitamin D3 (cholecalciferol) by ultraviolet B radiation or by oral intake of vitamin D2 (ergocalciferol) and D3. An individual's vitamin D status is best evaluated by measuring the circulating 25-hydroxyvitamin D [25(OH)D] concentration. Though controversy surrounds the definition of low vitamin D status, there is increasing agreement that the optimal circulating 25(OH)D level should be ~30-32 ng/ml or above. Using this definition, it has been is estimated that approximately three quarters of all adults in the United States are low. Classically, low vitamin D status has skeletal consequences such as osteomalacia/rickets. More recently, associations between low vitamin D status and increased risk for various non-skeletal morbidities have been recognized; whether all of these associations are causally related to low vitamin D status remains to be determined. To achieve optimal vitamin D status, daily intakes of at least 1000 IU or more of vitamin D are required. The risk of toxicity with \u201chigh\u201d amounts of vitamin D intake is low. Substantial between-individual variability exists in response to the same administered vitamin D dose. When to monitor 25(OH)D levels has received little attention. Supplementation with vitamin D3 may be preferable to vitamin D2.", "No evidence supports vitamin E indiscriminate supplementation. For many years, the prevailing concept was that LDL oxidation plays the central role in atherogenesis. As a consequence, supplementation of antioxidants, particularly vitamin E, became very popular. Unfortunately, major randomized clinical trials yielded disappointing results and recent meta-analyses concluded that indiscriminate, high dose vitamin E supplementation results in increased mortality. This conclusion raised (quite reasonable) criticism, much of which referred to the characteristics of meta-analysis. In our recent study, we used a Markov-model approach, which is free of most of the limitations of meta-analyses. Our major finding was that the average quality-adjusted life years (QALY) of vitamin E- supplemented individuals was 0.30 QALY (95%CI 0.21 to 0.39) less than that of untreated people. In our view, this supports the view that indiscriminate supplementation of high dose vitamin E can not be recommended to the general public.In the present communication we address several recent studies that demonstrated negative effects of vitamin E and raise possible mechanisms that may be responsible for the harmful effects of vitamin E supplementation. We also review recent studies conducted with specific groups of patients that gained from vitamin E supplementation, indicating that although, on the average, indiscriminate supplementation of high dose vitamin E is not beneficial, specific populations may gain from vitamin E. The challenge is to establish selection criteria that will predict who is likely to benefit from vitamin E supplementation. Such criteria may be based either on the assumption that antioxidants are likely to be beneficial for people under oxidative stress or on knowledge regarding the benefit of sick people with certain diseases. In short, we adopt the view that vitamin E is a \\\"double-edge sword\\\" that should not be consumed until criteria are defined to predict who is likely to benefit from high dose supplementation of vitamin E. (c) 2009 International Union of Biochemistry and Molecular Biology, Inc."], ["Apple juice prevents oxidative stress induced by amyloid-beta in culture. Increased oxidative stress contributes to the decline in cognitive performance during normal aging and in neurodegenerative conditions such as Alzheimer's disease. Dietary supplementation with fruits and vegetables that are high in antioxidant potential have in some cases compensated for oxidative stress. Herein, we examined whether apple juice could alleviate the neurotoxic consequences of exposure of cultured neuronal cells to amyloid-beta (Abeta), since at least a portion of the neurotoxicity of Abeta is due to oxidative stress. Apple juice concentrate (AJC; 70 degree brix) was diluted into culture medium of SH-SY-5Y human neuroblastoma cells that had been differentiated for 7 days with 5 microM retinoic acid concurrent with the addition of 20 microM Abeta. AJC prevented the increased generation of reactive oxygen species (ROS) normally induced by Abeta treatment under these conditions. AJC also prevented Abeta-induced calcium influx and apoptosis, each of which results in part due to increased ROS. These findings suggest that the antioxidant potential of apple products can prevent Abeta-induced oxidative damage.", "Cancer chemopreventive potential of apples, apple juice, and apple components. Apples ( MALUS sp., Rosaceae) are a rich source of nutrient as well as non-nutrient components and contain high levels of polyphenols and other phytochemicals. Main structural classes of apple constituents include hydroxycinnamic acids, dihydrochalcones, flavonols (quercetin glycosides), catechins and oligomeric procyanidins, as well as triterpenoids in apple peel and anthocyanins in red apples. Several lines of evidence suggest that apples and apple products possess a wide range of biological activities which may contribute to health beneficial effects against cardiovascular disease, asthma and pulmonary dysfunction, diabetes, obesity, and cancer (reviewed by Boyer and Liu, Nutr J 2004). The present review will summarize the current knowledge on potential cancer preventive effects of apples, apple juice and apple extracts (jointly designated as apple products). In brief, apple extracts and components, especially oligomeric procyanidins, have been shown to influence multiple mechanisms relevant for cancer prevention in IN VITRO studies. These include antimutagenic activity, modulation of carcinogen metabolism, antioxidant activity, anti-inflammatory mechanisms, modulation of signal transduction pathways, antiproliferative and apoptosis-inducing activity, as well as novel mechanisms on epigenetic events and innate immunity. Apple products have been shown to prevent skin, mammary and colon carcinogenesis in animal models. Epidemiological observations indicate that regular consumption of one or more apples a day may reduce the risk for lung and colon cancer.", "Intake of whole apples or clear apple juice has contrasting effects on plasma lipids in healthy volunteers. PURPOSE: Fruit consumption is associated with a decreased risk of CVD in cohort studies and is therefore endorsed by health authorities as part of the '5 or more a day' campaigns. A glass of fruit juice is generally counted as one serving. Fruit may cause protection by affecting common risk factors of CVD. METHODS: Apples are among the most commonly consumed fruits and were chosen for a comprehensive 5 \u00d7 4 weeks dietary crossover study to assess the effects of whole apples (550 g/day), apple pomace (22 g/day), clear and cloudy apple juices (500 ml/day), or no supplement on lipoproteins and blood pressure in a group of 23 healthy volunteers. RESULTS: The intervention significantly affected serum total and LDL-cholesterol. Trends towards a lower serum LDL-concentration were observed after whole apple (6.7%), pomace (7.9%) and cloudy juice (2.2%) intake. On the other hand, LDL-cholesterol concentrations increased by 6.9% with clear juice compared to whole apples and pomace. There was no effect on HDL-cholesterol, TAG, weight, waist-to-hip ratio, blood pressure, inflammation (hs-CRP), composition of the gut microbiota or markers of glucose metabolism (insulin, IGF1 and IGFBP3). CONCLUSIONS: Apples are rich in polyphenols and pectin, two potentially bioactive constituents; however, these constituents segregate differently during processing into juice products and clear juice is free of pectin and other cell wall components. We conclude that the fibre component is necessary for the cholesterol-lowering effect of apples in healthy humans and that clear apple juice may not be a suitable surrogate for the whole fruit in nutritional recommendations.", "Arsenic and lead in juice: apple, citrus, and apple-base. Exposure limits for arsenic and lead in drinking water have long been established by the U.S. Environmental Protection Agency and new regulations regarding the presence of these contaminants in bottled water went into effect in California in 2009. No comparable exposure limits or regulations are available, however, for juices and other beverages that may contain arsenic and lead. In the study described in this article, 20 apple juices (or ciders), 15 apple-containing juices, one grape, and one citrus juice were analyzed for arsenic and lead. Arsenic was detected in all juices while lead was detected in more than 94% of juices analyzed. Twelve samples (32%) demonstrated arsenic levels nearly at or above the drinking water exposure limit of 10 parts per billion. No juices contained lead above drinking water exposure limits. Expanding drinking water limits to include juices (and other frequently consumed beverages) would better protect consumers while regular testing of these juices would better inform consumers of the risks posed by specific juices and brands.", "Antiproliferative effects of apple peel extract against cancer cells. Studies have shown an inverse relationship between the consumption of apples and the risk of several cancers. The peels of apple, which have been shown to possess exceptionally high concentrations of antioxidants, are often discarded. In this study, we evaluated the antiproliferative effects of apple peel extract (APE) in variety of cancer cell types. Our data demonstrated that APE, obtained from organic Gala apples, imparted significant reduction in the viability of a variety of cancer cell lines. Further, our data showed a significant decrease in growth and clonogenic survival of human prostate carcinoma CWR22Rnu1 and DU145 cells and breast carcinoma Mcf-7 and Mcf-7:Her18 cells. Also, the antiproliferative effects of APE were found to be accompanied by a G0-G1 phase arrest of prostate and breast cancer cells. Furthermore, APE treatment resulted in a marked concentration-dependent decrease in the protein levels of proliferative cell nuclear antigen, a marker for proliferation. In addition, APE treatment resulted in a marked increase in maspin, a tumor suppressor protein that negatively regulates cell invasion, metastasis, and angiogenesis. Our data suggested that APE possesses strong antiproliferative effects against cancer cells, and apple peels should not be discarded from the diet. Detailed mechanistic studies, especially in appropriate in vivo animal models, are needed to further examine the antiproliferative and preventive effects of APE against cancer."], ["Essentials of Healthy Eating: A Guide Enough solid evidence now exists to offer women several fundamental strategies for healthy eating. They include emphasizing healthful unsaturated fats, whole grains, good protein \u201cpackages,\u201d and fruits and vegetables; limiting consumption of trans and saturated fats, highly refined grains, and sugary beverages; and taking a multivitamin with folic acid and extra vitamin D as a nutritional safety net. A diet based on these principles is healthy through virtually all life stages, from young adulthood through planning for pregnancy, pregnancy, and on into old age.", "The value of current nutrition information. To prevent or delay the occurrence of chronic diseases, scientific bodies from the cardiologic and oncologic disciplines have made recommendations regarding the daily dietary intake of certain macro- and micronutrients. This study assessed the knowledge of a random population of 2,305 individuals comprising members of the public, health care workers, university graduate students, and health club attendees. Segments of this population might be expected to have a greater understanding and ability to implement these dietary recommendations. We found that over 90% of the participants were unaware of the recommendations for calcium, salt, vitamin A, and fiber, and the fiber content in a high fiber cereal. Approximately 80% of the participants were unaware of the recommendations regarding fat intake and could not calculate the fat content of a food product. Almost half of the study population took a vitamin pill daily. Of the subjects who were aware of the correct unit measurement for vitamin A (IU), almost 25% of gave a response that exceeded the recommended daily intake. A majority of this study population were unaware of the dietary recommendations regarding the prevention of cardiovascular events and cancer. Subgroups of this study population that might be expected to have more information regarding these recommendations (i.e., having higher education or being a health care professional) did not display a satisfactory level of knowledge. To further compound the problems of adhering to the recommended guidelines, the labeling of many food products is misleading. The recommendations on dietary intake and the information on food product content must be transmitted to the public in a form that allows for ready application when purchasing and consuming food.", "Recommended dietary reference intakes, nutritional goals and dietary guidelines for fat and fatty acids: a systematic review. Dietary fat and its effects on health and disease has attracted interest for research and Public Health. Since the 1980s many bodies and organizations have published recommendations regarding fat intake. In this paper different sets of recommendations are analyzed following a systematic review process to examine dietary reference intakes, nutritional goals and dietary guidelines for fat and fatty acids. A literature search was conducted in relevant literature databases along a search for suitable grey literature reports. Documents were included if they reported information on either recommended intake levels or dietary reference values or nutritional objectives or dietary guidelines regarding fat and/or fatty acids and/or cholesterol intake or if reported background information on the process followed to produce the recommendations. There is no standard approach for deriving nutrient recommendations. Recommendations vary between countries regarding the levels of intake advised, the process followed to set the recommendations. Recommendations on fat intake share similar figures regarding total fat intake, saturated fats and trans fats. Many sets do not include a recommendation about cholesterol intake. Most recent documents provide advice regarding specific n-3 fatty acids. Despite efforts to develop evidence based nutrient recommendations and dietary guidelines that may contribute to enhance health, there are still many gaps in research. It would be desirable that all bodies concerned remain transparent about the development of dietary recommendations. In order to achieve this, the type of evidence selected to base the recommendations should be specified and ranked. Regular updates of such recommendations should be planned.", "Paleolithic vs. modern diets--selected pathophysiological implications. The nutritional patterns of Paleolithic humans influenced genetic evolution during the time segment within which defining characteristics of contemporary humans were selected. Our genome can have changed little since the beginnings of agriculture, so, genetically, humans remain Stone Agers--adapted for a Paleolithic dietary regimen. Such diets were based chiefly on wild game, fish and uncultivated plant foods. They provided abundant protein; a fat profile much different from that of affluent Western nations; high fibre; carbohydrate from fruits and vegetables (and some honey) but not from cereals, refined sugars and dairy products; high levels of micronutrients and probably of phytochemicals as well. Differences between contemporary and ancestral diets have many pathophysiological implications. This review addresses phytochemicals and cancer; calcium, physical exertion, bone mineral density and bone structural geometry; dietary protein, potassium, renal acid secretion and urinary calcium loss; and finally sarcopenia, adiposity, insulin receptors and insulin resistance. While not, yet, a basis for formal recommendations, awareness of Paleolithic nutritional patterns should generate novel, testable hypotheses grounded in evolutionary theory and it should dispel complacency regarding currently accepted nutritional tenets.", "Nutrient profiling of foods: creating a nutrient-rich food index. Nutrient profiling of foods, described as the science of ranking foods based on their nutrient content, is fast becoming the basis for regulating nutrition labels, health claims, and marketing and advertising to children. A number of nutrient profile models have now been developed by research scientists, regulatory agencies, and by the food industry. Whereas some of these models have focused on nutrients to limit, others have emphasized nutrients known to be beneficial to health, or some combination of both. Although nutrient profile models are often tailored to specific goals, the development process ought to follow the same science-driven rules. These include the selection of index nutrients and reference amounts, the development of an appropriate algorithm for calculating nutrient density, and the validation of the chosen nutrient profile model against healthy diets. It is extremely important that nutrient profiles be validated rather than merely compared to prevailing public opinion. Regulatory agencies should act only when they are satisfied that the scientific process has been followed, that the algorithms are transparent, and that the profile model has been validated with respect to objective measures of a healthy diet."], ["Chemopreventive characteristics of avocado fruit. Phytochemicals are recognized as playing an important role in cancer prevention by fruits and vegetables. The avocado is a widely grown and consumed fruit that is high in nutrients and low in calories, sodium, and fats. Studies have shown that phytochemicals extracted from the avocado fruit selectively induce cell cycle arrest, inhibit growth, and induce apoptosis in precancerous and cancer cell lines. Our recent studies indicate that phytochemicals extracted with chloroform from avocado fruits target multiple signaling pathways and increase intracellular reactive oxygen leading to apoptosis. This review summarizes the reported phytochemicals in avocado fruit and discusses their molecular mechanisms and targets. These studies suggest that individual and combinations of phytochemicals from the avocado fruit may offer an advantageous dietary strategy in cancer prevention.", "Chemopreventive characteristics of avocado fruit. Phytochemicals are recognized as playing an important role in cancer prevention by fruits and vegetables. The avocado is a widely grown and consumed fruit that is high in nutrients and low in calories, sodium, and fats. Studies have shown that phytochemicals extracted from the avocado fruit selectively induce cell cycle arrest, inhibit growth, and induce apoptosis in precancerous and cancer cell lines. Our recent studies indicate that phytochemicals extracted with chloroform from avocado fruits target multiple signaling pathways and increase intracellular reactive oxygen leading to apoptosis. This review summarizes the reported phytochemicals in avocado fruit and discusses their molecular mechanisms and targets. These studies suggest that individual and combinations of phytochemicals from the avocado fruit may offer an advantageous dietary strategy in cancer prevention.", "Anti-inflammatory effects of plant-based foods and of their constituents. Inflammation is a pathological condition underlying a number of diseases including cardiovascular diseases, cancer, and chronic inflammatory diseases. In addition, healthy, obese subjects also express markers of inflammation in their blood. Diet provides a variety of nutrients as well as non-nutritive bioactive constituents which modulate immunomodulatory and inflammatory processes. Epidemiological data suggest that dietary patterns strongly affect inflammatory processes. Primarily the intake of fruit and vegetables as well as of whole wheat is inversely associated with the risk of inflammation. In addition to observational studies there are also data from human intervention studies suggesting an anti-inflammatory potential of these plant foods. At the level of bioactive compounds occurring in plant foods, primarily carotenoids and flavonoids seem to modulate inflammatory as well as immunological processes. In conclusion, there is convincing evidence that plant foods and non-nutritive constituents associated with these foods modulate immunological and inflammatory processes. By means of anti-inflammatory activities a plant-based diet may contribute to the lower risk of cardiovascular diseases and cancer. A high intake of vegetables, fruit, and whole wheat as recommended by all international nutrition authorities provides a wide spectrum of bioactive compounds at health-promoting concentrations.", "Controlling for sugar and ascorbic acid, a mixture of flavonoids matching navel oranges significantly increases human postprandial serum antioxidan... Fruit and vegetable consumption reduces the risk for cardiovascular disease development. The postprandial state is an important contributor to chronic disease development. Orange flavonoids may reduce postprandial oxidation. It was hypothesized that a mixture of orange flavonoids would reduce postprandial oxidation better than a single orange flavonoid or orange sugar and ascorbic acid, but not as well as orange juice, when consumed with a typical breakfast. A placebo-controlled crossover trial (16 male and female participants, 4 treatments, 4 visits) was carried out. Treatments were placebo (ascorbic acid and sugar equivalent to orange juice); placebo plus hesperidin; placebo plus hesperidin, luteolin, and naringenin (mixture; found to have synergistic antioxidant properties in vitro in previous work); and orange juice (positive control). Serum oxygen radical absorbance capacity (ORAC), total plasma phenolics (TP), and serum lipoprotein oxidation (LO) were measured after a 12-hour baseline fast and at 1, 2, and 3 hours after sample consumption. The placebo plus mixture and orange juice groups were significantly increased in ORAC and LO lag time. Data for TP were inconsistent with ORAC and LO. Contrary to previous studies attributing the protective postprandial effect to fructose and ascorbate in other fruit trials, orange phenolic compounds contribute directly to the postprandial oxidative protection of serum, despite an inconsistent change in serum TP. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Intake of whole apples or clear apple juice has contrasting effects on plasma lipids in healthy volunteers. PURPOSE: Fruit consumption is associated with a decreased risk of CVD in cohort studies and is therefore endorsed by health authorities as part of the '5 or more a day' campaigns. A glass of fruit juice is generally counted as one serving. Fruit may cause protection by affecting common risk factors of CVD. METHODS: Apples are among the most commonly consumed fruits and were chosen for a comprehensive 5 \u00d7 4 weeks dietary crossover study to assess the effects of whole apples (550 g/day), apple pomace (22 g/day), clear and cloudy apple juices (500 ml/day), or no supplement on lipoproteins and blood pressure in a group of 23 healthy volunteers. RESULTS: The intervention significantly affected serum total and LDL-cholesterol. Trends towards a lower serum LDL-concentration were observed after whole apple (6.7%), pomace (7.9%) and cloudy juice (2.2%) intake. On the other hand, LDL-cholesterol concentrations increased by 6.9% with clear juice compared to whole apples and pomace. There was no effect on HDL-cholesterol, TAG, weight, waist-to-hip ratio, blood pressure, inflammation (hs-CRP), composition of the gut microbiota or markers of glucose metabolism (insulin, IGF1 and IGFBP3). CONCLUSIONS: Apples are rich in polyphenols and pectin, two potentially bioactive constituents; however, these constituents segregate differently during processing into juice products and clear juice is free of pectin and other cell wall components. We conclude that the fibre component is necessary for the cholesterol-lowering effect of apples in healthy humans and that clear apple juice may not be a suitable surrogate for the whole fruit in nutritional recommendations."], ["Oestrogen levels in serum and urine of premenopausal women eating low and high amounts of meat. OBJECTIVE: Based on the hypothesis that high-meat diets may increase breast cancer risk through hormonal pathways, the present analysis compared oestrogens in serum and urine by meat-eating status. DESIGN: Intervention with repeated measures. SETTING: Two randomized soya trials (BEAN1 and BEAN2) among premenopausal healthy women. SUBJECTS: BEAN1 participants completed seven unannounced 24 h dietary recalls and donated five blood and urine samples over 2 years. BEAN2 women provided seven recalls and three samples over 13 months. Serum samples were analysed for oestrone (E\u2081) and oestradiol (E\u2082) using RIA. Nine oestrogen metabolites were measured in urine by LC-MS. Semi-vegetarians included women who reported consuming <30 g of red meat, poultry and fish daily, and pescatarians those who reported consuming <20 g of meat/poultry but >10 g of fish daily. All other women were classified as non-vegetarians. We applied mixed models to compute least-square means by vegetarian status adjusted for potential confounders. RESULTS: The mean age of the 272 participants was 41\u00b79 (SD 4\u00b75) years. Serum E\u2081 (85 v. 100 pg/ml, P = 0\u00b704) and E\u2082 (140 v. 154 pg/ml, P = 0\u00b704) levels were lower in the thirty-seven semi-vegetarians than in the 235 non-vegetarians. The sum of the nine urinary oestrogen metabolites (183 v. 200 pmol/mg creatinine, P = 0\u00b727) and the proportions of individual oestrogens and pathways did not differ by meat-eating status. Restricting the models to the samples collected during the luteal phase strengthened the associations. CONCLUSIONS: Given the limitations of the study, the lower levels of serum oestrogens in semi-vegetarians than non-vegetarians need confirmation in larger populations.", "Phytochemicals for breast cancer prevention by targeting aromatase. Aromatase is a cytochrome P450 enzyme (CYP19) and is the rate limiting enzyme in the conversion of androgens to estrogens. Suppression of in situ estrogen production through aromatase inhibition is the current treatment strategy for hormone-responsive breast cancers. Drugs that inhibit aromatase have been developed and are currently utilized as adjuvant therapy for breast cancer in post-menopausal women with hormone dependent breast cancer. Natural compounds have been studied extensively for important biologic effects such as antioxidant, anti-tumor and anti-viral effects. A significant number of studies have also investigated the aromatase inhibitory properties of a variety of plant extracts and phytochemicals. The identification of natural compounds that inhibit aromatase could be useful both from a chemopreventive standpoint and in the development of new aromatase inhibitory drugs. This review will discuss whole food extracts and the common classes of phytochemicals which have been investigated for potential aromatase inhibitory activity. We will review reported aromatase inhibition, kinetic data and possible structural variations that may inhibit or enhance the interaction of phytochemicals with the aromatase enzyme.", "Determination of urinary lignans and phytoestrogen metabolites, potential antiestrogens and anticarcinogens, in urine of women on various habitual ... Recently two groups of compounds with diphenolic structure, the lignans and the isoflavonic phytoestrogens, were detected and identified in human urine and other biological fluids. These compounds are of great biological interest because they exhibit both in vitro and in vivo weak estrogenic and sometimes also antiestrogenic activities and many plant lignans have been shown to have anticarcinogenic, antiviral, antifungal and other interesting biological effects. The compounds found in relatively large amounts (10-1000 times more than estrogens) in urine are modified by intestinal bacteria from plant lignans and phytoestrogens, which are present in fiber-rich food such as grain and beans. They bind with low affinity to estrogen receptors and preliminary results suggest that they may induce production of sex hormone binding globulin (SHBG) in the liver and in this way may influence sex hormone metabolism and biological effects. Five compounds, the lignans enterolactone (Enl), enterodiol (End) and the isoflavonic phytoestrogen metabolites daidzein (Da), equol (Eq) and O-desmethylangolensin (O-Dma) were measured in urine by gas chromatography-mass spectrometry (selected ion monitoring) using deuterated internal standards in 5 groups of women (total number 53). The members of three dietary groups (omnivores, lactovegetarians and macrobiotics) were living in Boston and of two groups in Helsinki (omnivores and lactovegetarians). Until now measurements have been carried out in 94 72-h samples. The highest mean excretion of the most abundant compound, enterolactone, was found in the macrobiotic group and the lowest in the omnivoric groups. Total mean 24-h excretion of enterolactone was 17,680 nmol in the macrobiotics, 4,170 nmol in the Boston lactovegetarians, 3,650 nmol in the Helsinki lactovegetarians, 2,460 nmol in the Helsinki omnivores and 2,050 nmol in the Boston omnivores. The other diphenols followed approximately the same pattern. In an earlier study the lowest excretion of enterolactone (1,040 nmol/24 h) was found in a group of postmenopausal apparently healthy breast cancer patients living in Boston. It is concluded that further studies are necessary to elucidate the possible role of these compounds in cancer and other diseases. However, the evidence obtained until now seems to justify the conclusion that these compounds may be among the dietary factors affording protection against hormone-dependent cancers in vegetarians and semivegetarians.", "Vomiting from multivitamins: a potential drug interaction. A commercial weight loss program with a client base composed of >95% women experienced sporadic complaints of nausea and vomiting after changing its multivitamin supplier. This retrospective and observational study was designed to determine if related adverse event reports were significant, and to investigate potential mechanism for their occurrence in this group of subjects, many of whom were concurrently receiving oral contraceptives or hormone replacement therapy. Incidence of nausea, vomiting, rash, and total complaints in the 3 months following the change of the multivitamin formulation was compared with the same complaints in the 3 months before the change. In the 3 months following the multivitamin change, there were 166 complaints of nausea and vomiting, 9 complaints of rash and 194 total complaints from a group of 88,468 patients. In the 3 months before the change in the multivitamin, there had been 2 complaints of nausea and vomiting, no complaints of rash, and 11 total complaints from 88,252 patients. The difference detected by a chi-squared test was significant for all events studied; nausea and vomiting (P < 0.0001), rash (P < 0.02), and total complaints (P < 0.0001). The altered multivitamins contained added citrus bioflavanoids not included in the original formula. Citrus bioflavanoids decrease the clearance of exogenous estrogens by inhibiting cytochrome P450 enzyme systems. Elevated estrogen levels could account for the increased incidence of nausea and vomiting. This experience demonstrates that adding dietary herbal supplements to multivitamins may be associated with adverse interactions with prescription drugs.", "Diethylstilboestrol--a long-term legacy. Diethylstilboestrol (DES) is an endocrine disrupter which causes cancer in rodents. It was prescribed in large amounts to treat women with gynaecological problems; some of the daughters of these women subsequently developed a rare cancer (vaginal clear cell adenocarcinoma) while genital abnormalities were found in some of the sons. It was used for decades in livestock feed and this may have contaminated the food chain leading to the exposure of the more general population. DES appears to cause epigenetic effects in animals and there is some evidence that this also occurs in man. The mechanisms of carcinogenesis are complex and the effects are difficult to prove due to the background of dietary and environmental phyto- and xenooestrogens. It has been suggested that, like other endocrine disrupters, DES may have acted as an obesogen in the human population. Copyright \u00a9 2012 Elsevier Ireland Ltd. All rights reserved."], ["Iodine-induced neonatal hypothyroidism secondary to maternal seaweed consumption: a common practice in some Asian cultures to promote breast milk s... Mild iodine deficiency is a recognised problem in Australia and New Zealand. However, iodine excess can cause hypothyroidism in some infants. We highlight two cases which illustrate the risks of excess dietary iodine intake during pregnancy and breastfeeding. They also describe a cultural practice of consuming seaweed soup to promote breast milk supply. Although most attention recently has been on the inadequacy of iodine in Australian diets, the reverse situation should not be overlooked. Neither feast nor famine is desirable. \u00a9 2011 The Authors. Journal of Paediatrics and Child Health \u00a9 2011 Paediatrics and Child Health Division (Royal Australasian College of Physicians).", "Iodine toxicity from soy milk and seaweed ingestion is associated with serious thyroid dysfunction. We report a series of cases of thyroid dysfunction in adults associated with ingestion of a brand of soy milk manufactured with kombu (seaweed), and a case of hypothyroidism in a neonate whose mother had been drinking this milk. We also report two cases of neonatal hypothyroidism linked to maternal ingestion of seaweed made into soup. These products were found to contain high levels of iodine. Despite increasing awareness of iodine deficiency, the potential for iodine toxicity, particularly from sources such as seaweed, is less well recognised.", "Povidone iodine-induced overt hypothyroidism in a patient with prolonged habitual gargling: urinary excretion of iodine after gargling in normal su... Iodine-induced hypothyroidism that develops in patients who gargle routinely with povidone iodine is well known. Usually the hypothyroidism is mild and resolves spontaneously upon cessation of gargling. Here, we report a 63-year-old patient with overt hypothyroidism that developed due to habitual gargling with povidone iodine for more than 10 years. The urinary excretion of iodine was estimated to be greater than 5 mg/day, based on values obtained from 18 normal subjects who gargled three times a day (4.6+/-2.1 mg, mean+/-SD). After discontinuation of the gargling, the patient has been euthyroid for more than 10 months.", "Variability of iodine content in common commercially available edible seaweeds. Dietary seaweeds, common in Asia and in Asian restaurants, have become established as part of popular international cuisine. To understand the possibility for iodine-induced thyroid dysfunction better, we collected samples of the most common dietary seaweeds available from commercial sources in the United States, as well as harvester-provided samples from Canada, Tasmania, and Namibia. Altogether, 12 different species of seaweeds were analyzed for iodine content, and found to range from 16 microg/g (+/-2) in nori (Porphyra tenera) to over 8165 +/- 373 microg/g in one sample of processed kelp granules (a salt substitute) made from Laminaria digitata. We explored variation in preharvest conditions in a small study of two Namibian kelps (Laminaria pallida and Ecklonia maxima), and found that iodine content was lowest in sun-bleached blades (514 +/- 42 microg/g), and highest amount in freshly cut juvenile blades (6571 +/- 715 microg/g). Iodine is water-soluble in cooking and may vaporize in humid storage conditions, making average iodine content of prepared foods difficult to estimate. It is possible some Asian seaweed dishes may exceed the tolerable upper iodine intake level of 1100 microg/d.", "Hyperthyroidism caused by excessive consumption of sausages. Hyperthyroidism results from excessive production of thyroid hormones. This is usually caused by Graves disease, but exogenous thyroid hormones can lead to similar symptoms. Recognition of the latter is difficult as excessive intake of thyroid hormone is not usually admitted nor recognised. To our knowledge, exogenous hyperthyroidism caused by thyroid-contaminated food has been described twice, but not in the Netherlands. A 77-year-old man presented at the Outpatient Department of Internal Medicine with lab values revealing hyperthyroidism. There were no abnormal findings at the physical examination. Antibodies against the thyroidstimulating hormone (TSH) receptor were not detectable. Thyroid scintigraphy with 123I showed an uptake of less than 1%. Silent thyroiditis was diagnosed and the natural course was awaited, but with no improvement in the thyroid values. The thyroglobulin was very low. Further anamnesis revealed an excessive daily consumption of sausages. Thyroid hormones were detectable in these sausages. After the patient stopped eating them, he became and remained euthyroid. The case stipulates the importance of a thorough anamnesis."], ["Does milk increase mucus production? Excessive milk consumption has a long association with increased respiratory tract mucus production and asthma. Such an association cannot be explained using a conventional allergic paradigm and there is limited medical evidence showing causality. In the human colon, beta-casomorphin-7 (beta-CM-7), an exorphin derived from the breakdown of A1 milk, stimulates mucus production from gut MUC5AC glands. In the presence of inflammation similar mucus overproduction from respiratory tract MUC5AC glands characterises many respiratory tract diseases. beta-CM-7 from the blood stream could stimulate the production and secretion of mucus production from these respiratory glands. Such a hypothesis could be tested in vitro using quantitative RT-PCR to show that the addition of beta-CM-7 into an incubation medium of respiratory goblet cells elicits an increase in MUC5AC mRNA and by identifying beta-CM-7 in the blood of asthmatic patients. This association may not necessarily be simply cause and effect as the person has to be consuming A1 milk, beta-CM-7 must pass into the systemic circulation and the tissues have to be actively inflamed. These prerequisites could explain why only a subgroup of the population, who have increased respiratory tract mucus production, find that many of their symptoms, including asthma, improve on a dairy elimination diet. (c) 2009 Elsevier Ltd. All rights reserved.", "Milk consumption and acne in teenaged boys Objective We sought to examine the association between dietary dairy intake and teenaged acne among boys. Methods This was a prospective cohort study. We studied 4273 boys, members of a prospective cohort study of youths and of lifestyle factors, who reported dietary intake on up to 3 food frequency questionnaires from 1996 to 1998 and teenaged acne in 1999. We computed multivariate prevalence ratios and 95% confidence intervals for acne. Results After adjusting for age at baseline, height, and energy intake, the multivariate prevalence ratios (95% confidence interval; P value for test of trend) for acne comparing highest (>2 servings/d) with lowest (<1/wk) intake categories in 1996 were 1.16 (1.01, 1.34; 0.77) for total milk, 1.10 (0.94, 1.28; 0.83) for whole/2% milk, 1.17 (0.99, 1.39; 0.08) for low-fat (1%) milk, and 1.19 (1.01, 1.40; 0.02) for skim milk. Limitations Not all members of the cohort responded to the questionnaire. Acne assessment was by self-report and boys whose symptoms might have been part of an underlying disorder were not excluded. We did not adjust for steroid use and other lifestyle factors that may affect occurrence of acne. Conclusion We found a positive association between intake of skim milk and acne. This finding suggests that skim milk contains hormonal constituents, or factors that influence endogenous hormones, in sufficient quantities to have biological effects in consumers.", "Is milk responsible for male reproductive disorders? The role of environmental compounds with estrogenic activity in the development of male reproductive disorders has been a source of great concern. Among the routes of human exposure to estrogens, we are particularly concerned about cows' milk, which contains considerable amounts of estrogens. The major sources of animal-derived estrogens in the human diet are milk and dairy products, which account for 60-70% of the estrogens consumed. Humans consume milk obtained from heifers in the latter half of pregnancy, when the estrogen levels in cows are markedly elevated. The milk that we now consume may be quite unlike that consumed 100 years ago. Modern genetically-improved dairy cows, such as the Holstein, are usually fed a combination of grass and concentrates (grain/protein mixes and various by-products), allowing them to lactate during the latter half of pregnancy, even at 220 days of gestation. We hypothesize that milk is responsible, at least in part, for some male reproductive disorders. Copyright 2001 Harcourt Publishers Ltd.", "Cows milk consumption in constipation and anal fissure in infants and young children. OBJECTIVE: To examine daily cows milk consumption and duration of breastfeeding in infants and young children with anal fissure and constipation. METHODS: Two groups of 30 consecutive children aged between 4 months and 3 years were evaluated retrospectively. Group I comprised children with chronic constipation and anal fissure in whom surgical causes were excluded, and group II comprised normal children. The daily consumption of cows milk, duration of breastfeeding and other clinical features of the children were investigated RESULTS: The mean daily consumption of cows milk was significantly higher in group I (756 mL, range 200-1500 mL) than group II (253 mL, range 0-1000 mL) (P < 0.001). Group I children were breastfed for a significantly shorter period (5.8 months, range 0-18 months) than group II (10.1 months, range 2-24 months) (P < 0.006). The odds ratios for the two factors - children consuming more than 200 mL of cows milk per day (25 children in group I, 11 children in group II) and breastfeeding for less than 4 months (16 children in group I, 5 children in group II) - were calculated to be 8.6 (95% confidence interval [CI]: 0.23-0.74, P = 0.0005) and 5.7 (95% CI: 0.37-0.66, P = 0.007), respectively. CONCLUSIONS: Infants and young children with chronic constipation and anal fissure may consume larger amounts of cows milk than children with a normal bowel habit. Additionally, shorter duration of breastfeeding and early bottle feeding with cows milk may play a role in the development of constipation and anal fissure in infants and young children.", "Monosodium glutamate 'allergy': menace or myth? Monosodium glutamate (MSG) is a salt form of a non-essential amino acid commonly used as a food additive for its unique flavour enhancing qualities. Since the first description of the 'Monosodium glutamate symptom complex', originally described in 1968 as the 'Chinese restaurant syndrome', a number of anecdotal reports and small clinical studies of variable quality have attributed a variety of symptoms to the dietary ingestion of MSG. Descriptions of MSG-induced asthma, urticaria, angio-oedema, and rhinitis have prompted some to suggest that MSG should be an aetiologic consideration in patients presenting with these conditions. This review prevents a critical review of the available literature related to the possible role of MSG in the so-called 'Chinese restaurant syndrome' and in eliciting asthmatic bronchospasm, urticaria, angio-oedema, and rhinitis. Despite concerns raised by early reports, decades of research have failed to demonstrate a clear and consistent relationship between MSG ingestion and the development of these conditions."], ["Spatial clustering of amyotrophic lateral sclerosis in Finland at place of birth and place of death. Previous evidence for spatial clustering of amyotrophic lateral sclerosis is inconclusive. Studies that have identified apparent clusters have often been based on a small number of cases, which means the results may have occurred by chance processes. Also, most studies have used the geographic location at the time of death as the basis for cluster detection, rather than exploring clusters at other points in the life cycle. In this study, the authors examine 1,000 cases of amyotrophic lateral sclerosis distributed throughout Finland who died between June 1985 and December 1995. Using a spatial-scan statistic, the authors examine whether there are significant clusters of the disease at both time of birth and time of death. Two significant, neighboring clusters were identified in southeast and south-central Finland at the time of death. A single significant cluster was identified in southeast Finland at the time of birth, closely matching one of the clusters identified at the time of death. These results are based on a large sample of cases, and they provide convincing evidence of spatial clustering of this condition. The results demonstrate also that, if the cluster analysis is conducted at different stages of the cases' life cycle, different conclusions about where potential risk factors may exist might result.", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "Human papillomavirus is a necessary cause of invasive cervical cancer worldwide. A recent report that 93 per cent of invasive cervical cancers worldwide contain human papillomavirus (HPV) may be an underestimate, due to sample inadequacy or integration events affecting the HPV L1 gene, which is the target of the polymerase chain reaction (PCR)-based test which was used. The formerly HPV-negative cases from this study have therefore been reanalyzed for HPV serum antibodies and HPV DNA. Serology for HPV 16 VLPs, E6, and E7 antibodies was performed on 49 of the 66 cases which were HPV-negative and a sample of 48 of the 866 cases which were HPV-positive in the original study. Moreover, 55 of the 66 formerly HPV-negative biopsies were also reanalyzed by a sandwich procedure in which the outer sections in a series of sections are used for histological review, while the inner sections are assayed by three different HPV PCR assays targeting different open reading frames (ORFs). No significant difference was found in serology for HPV 16 proteins between the cases that were originally HPV PCR-negative and -positive. Type-specific E7 PCR for 14 high-risk HPV types detected HPV DNA in 38 (69 per cent) of the 55 originally HPV-negative and amplifiable specimens. The HPV types detected were 16, 18, 31, 33, 39, 45, 52, and 58. Two (4 per cent) additional cases were only HPV DNA-positive by E1 and/or L1 consensus PCR. Histological analysis of the 55 specimens revealed that 21 were qualitatively inadequate. Only two of the 34 adequate samples were HPV-negative on all PCR tests, as against 13 of the 21 that were inadequate ( p< 0.001). Combining the data from this and the previous study and excluding inadequate specimens, the worldwide HPV prevalence in cervical carcinomas is 99.7 per cent. The presence of HPV in virtually all cervical cancers implies the highest worldwide attributable fraction so far reported for a specific cause of any major human cancer. The extreme rarity of HPV-negative cancers reinforces the rationale for HPV testing in addition to, or even instead of, cervical cytology in routine cervical screening. Copyright 1999 John Wiley & Sons, Ltd.", "Secondary prevention of CHD in UK men: the Diet and Reinfarction Trial and its sequel. The Diet and Reinfarction Trial (DART) involved 2033 men (mean age 56.5 years) recovering from myocardial infarction. They were randomly allocated to receive advice or to receive no advice on each of three dietary factors: an increase in fatty fish intake; a reduction in fat intake with an increase in polyunsaturated fat:saturated fat; an increased intake of cereal fibre. Compliance was satisfactory with the fish and fibre advice, but less so with the fat advice. The men given fish advice had 29% lower 2-year all-cause mortality; the other forms of advice did not have any significant effects. The Diet and Angina Randomized Trial (DART-2) involved 3114 men (mean age 61.1 years) with stable angina, who were followed up for 3-9 years. Advice to eat oily fish or take fish oil did not affect all-cause mortality, but it was associated with a significant increase in sudden cardiac death (P=0.018), and this effect was largely confined to the subgroup given fish oil capsules. Advice to eat more fruit and vegetables had no effect, probably because of poor compliance. The outcome of DART-2 appears to conflict with that of DART and some other studies; various possible explanations are considered. Nutritional interventions are not equally acceptable and should be tailored to the individuals for whom they are intended. Various distinct groups have a raised risk of CHD, and it cannot be assumed that the same nutritional interventions are appropriate to them all. Nutritional supplements do not necessarily have the same effects as the foods from which they are derived.", "Alzheimer's disease is incurable but preventable. The dramatic rising incidence and costs of Alzheimer's disease (AD) require that research efforts and funding be primarily directed on either finding a cure or applying preventive measures to curb this disorder. A cure for AD appears unlikely when significant cognitive loss has occurred because the neuronal networks that controlled the perturbed cognitive abilities are either dead or irreversibly damaged and replacing them, even if it were technically possible, would not reconstruct the intellectual identity of the host. Prevention of risk factors to sporadic AD is a more realistic stratagem and treatment, when indicated, ideally should begin in cognitively intact individuals as part of a mass screening effort. Prevention of modifiable risk factors to AD is cost-effective because it reduces hospice or hospital stay, repeated doctor visits, and long-term care. Presently, neurocognitive and neuroimaging tests are used with partial success in identifying persons at higher risk of AD but these tests can not pinpoint either a cause or a specific intervention that could attenuate disease progress. We previously proposed that carotid artery ultrasound +echocardiography together with ankle-brachail index (CAUSE+ABI) as mass screening tests in asymptomatic persons could detect not only cardio-cerebrovascular risk factors to AD, but also identify an indicated intervention. CAUSE+ABI are simple to perform, cost-effective, non-invasive, and reasonably accurate for the intended purpose. Additionally, detection of cardio-cerebrovasacular abnormalities long before expression of cognitive deterioration allows higher success rate with earlier treatment. Evidence-based medicine is recommended for optimizing clinical decision-making in evaluating AD risk factors and their treatment."], ["Studies on the antidiarrhoeal effect of dragon's blood from Croton urucurana. The red sap obtained by slashing the bark of Croton urucurana Baill. (Euphorbiaceae), also known as dragon's blood, was screened for a possible antidiarrhoeal activity on castor oil-induced diarrhoea in rats, cholera toxin-induced intestinal secretion in mice and on small intestinal transit in mice. Dragon's blood at an oral dose of 600 mg/kg caused in marked inhibition of the diarrhoeal response following castor oil administration as well as the intestinal fluid accumulation promoted by cholera toxin. At a similar dose the red sap significantly inhibited the small intestinal transit which was, however, found to be independent of the opioid mechanism. These results suggest a potential usefulness of the red sap from Croton urucurana Baill. in the control of secretory diarrhoea associated pathologies. Copyright 2001 John Wiley & Sons, Ltd.", "Effects of A\u00e7ai (Euterpe oleracea Mart.) berry preparation on metabolic parameters in a healthy overweight population: A pilot study Background The purpose of this study was to evaluate the effect of a\u00e7ai fruit pulp on risk factors for metabolic disorders in overweight subjects. The a\u00e7a\u00ed palm (Euterpe oleracea Mart.), which is native to South America, produces a small, black-purple fruit which is edible. The fruit has recently become popular as a functional food due to its antioxidant potential. Although several studies have been conducted in vitro and with animals, little is known about the potential health benefits in humans aside from an increase in plasma anti-oxidant capacity. Metabolic syndrome is a condition which is defined by a cluster of risk factors for cardiovascular disease and/or type-2 diabetes. Preliminary studies indicate that a reduction in reactive oxygen species can assist in the normalization of the metabolic pathways involved in this syndrome. Methods This was an open label pilot study conducted with 10 overweight adults (BMI \u2265 25 kg/m2 and \u2264 30 kg/m2) who took 100 g a\u00e7ai pulp twice daily for 1 month. The study endpoints included levels of fasting plasma glucose, insulin, cholesterol, triglycerides, exhaled (breath) nitric oxide metabolites (eNO) and plasma levels of high sensitivity C-reactive protein (hs-CRP). The response of blood glucose, blood pressure and eNO to a standardized meal was determined at baseline and following the 30 day treatment. Results Compared to baseline, there were reductions in fasting glucose and insulin levels following the 30 day treatment (both p < 0.02). There was also a reduction in total cholesterol (p = 0.03), as well as borderline significant reductions in LDL-cholesterol and the ratio of total cholesterol to HDL-cholesterol (both p = 0.051). Compared to baseline, treatment with a\u00e7ai ameliorated the post-prandial increase in plasma glucose following the standardized meal, measured as the area under the curve (p = 0.047). There was no effect on blood pressure, hs-CRP or eNO. Conclusion In this uncontrolled pilot study, consumption of a\u00e7ai fruit pulp reduced levels of selected markers of metabolic disease risk in overweight adults, indicating that further studies are warranted.", "Date fruits (Phoenix dactylifera Linn): an emerging medicinal food. Date palm is one of the oldest trees cultivated by man. In the folk-lore, date fruits have been ascribed to have many medicinal properties when consumed either alone or in combination with other herbs. Although, fruit of the date palm served as the staple food for millions of people around the world for several centuries, studies on the health benefits are inadequate and hardly recognized as a healthy food by the health professionals and the public. In recent years, an explosion of interest in the numerous health benefits of dates had led to many in vitro and animal studies as well as the identification and quantification of various classes of phytochemicals. On the basis of available documentation in the literature on the nutritional and phytochemical composition, it is apparent that the date fruits are highly nutritious and may have several potential health benefits. Although dates are sugar-packed, many date varieties are low GI diet and refutes the dogma that dates are similar to candies and regular consumption would develop chronic diseases. More investigations in these areas would validate its beneficial effects, mechanisms of actions, and fully appreciate as a potential medicinal food for humans all around the world. Therefore, in this review we summarize the phytochemical composition, nutritional significance, and potential health benefits of date fruit consumption and discuss its great potential as a medicinal food for a number of diseases inflicting human beings.", "Fasting plasma zeaxanthin response to Fructus barbarum L. (wolfberry; Kei Tze) in a food-based human supplementation trial. Age-related macular degeneration (AMD) is a common disorder that causes irreversible loss of central vision. Increased intake of foods containing zeaxanthin may be effective in preventing AMD because the macula accumulates zeaxanthin and lutein, oxygenated carotenoids with antioxidant and blue light-absorbing properties. Lycium barbarum L. is a small red berry known as Fructus lycii and wolfberry in the West, and Kei Tze and Gou Qi Zi in Asia. Wolfberry is rich in zeaxanthin dipalmitate, and is valued in Chinese culture for being good for vision. The aim of this study, which was a single-blinded, placebo-controlled, human intervention trial of parallel design, was to provide data on how fasting plasma zeaxanthin concentration changes as a result of dietary supplementation with whole wolfberries. Fasting blood was collected from healthy, consenting subjects; fourteen subjects took 15 g/d wolfberry (estimated to contain almost 3 mg zeaxanthin) for 28 d. Repeat fasting blood was collected on day 29. Age- and sex-matched controls (n 13) took no wolfberry. Responses in the two groups were compared using the Mann-Whitney test. After supplementation, plasma zeaxanthin increased 2.5-fold: mean values on day 1 and 29 were 0.038 (sem 0.003) and 0.096 (sem 0.009) micromol/l (P<0.01), respectively, for the supplementation group; and 0.038 (sem 0.003) and 0.043 (sem 0.003) micromol/l (P>0.05), respectively, for the control group. This human supplementation trial shows that zeaxanthin in whole wolfberries is bioavailable and that intake of a modest daily amount markedly increases fasting plasma zeaxanthin levels. These new data will support further study of dietary strategies to maintain macular pigment density.", "Supplementation of a western diet with golden kiwifruits (Actinidia chinensis var.'Hort 16A':) effects on biomarkers of oxidation damage and antioxidant protection Background The health positive effects of diets high in fruits and vegetables are generally not replicated in supplementation trials with isolated antioxidants and vitamins, and as a consequence the emphasis of chronic disease prevention has shifted to whole foods and whole food products. Methods We carried out a human intervention trial with the golden kiwifruit, Actinidia chinensis, measuring markers of antioxidant status, DNA stability, plasma lipids, and platelet aggregation. Our hypothesis was that supplementation of a normal diet with kiwifruits would have an effect on biomarkers of oxidative status. Healthy volunteers supplemented a normal diet with either one or two golden kiwifruits per day in a cross-over study lasting 2 \u00d7 4 weeks. Plasma levels of vitamin C, and carotenoids, and the ferric reducing activity of plasma (FRAP) were measured. Malondialdehyde was assessed as a biomarker of lipid oxidation. Effects on DNA damage in circulating lymphocytes were estimated using the comet assay with enzyme modification to measure specific lesions; another modification allowed estimation of DNA repair. Results Plasma vitamin C increased after supplementation as did resistance towards H2O2-induced DNA damage. Purine oxidation in lymphocyte DNA decreased significantly after one kiwifruit per day, pyrimidine oxidation decreased after two fruits per day. Neither DNA base excision nor nucleotide excision repair was influenced by kiwifruit consumption. Malondialdehyde was not affected, but plasma triglycerides decreased. Whole blood platelet aggregation was decreased by kiwifruit supplementation. Conclusion Golden kiwifruit consumption strengthens resistance towards endogenous oxidative damage."], ["Simultaneous quantitation of multiple classes of organohalogen compounds in fish oils with direct sample introduction comprehensive two-dimensional... We successfully optimized an analytical method using gel permeation chromatography followed by direct sample introduction comprehensive two-dimensional gas chromatography with time-of-flight mass spectrometry to quantify multiple groups of targeted persistent organic pollutants and halogenated natural products (HNPs) simultaneously in fish oil samples. This new method has a wider analytical scope than the traditional approach to use multiple methods to cover each class of compounds. Our analysis revealed that the relatively more volatile and lighter organic compounds, such as polychlorinated biphenyls (PCBs), organochlorine pesticides, and other smaller organohalogen compounds, were still present in two brands of \\\"PCB-free\\\" cod liver oils, albeit at much lower levels than in an untreated commercial sample. Moreover, the less volatile organic compounds, such as polybrominated diphenyl ethers and brominated HNPs, were detected at similar levels in all three cod liver oils. This suggests that the commercial molecular distillation treatment used for removal of organic/inorganic toxic contaminants is only effective for the lighter organic contaminants.", "Children's daily exposure to polychlorinated biphenyls from dietary supplements containing fish oils. In children, omega-3 polyunsaturated fatty acids (PUFAs) may elicit a suite of health benefits including enhancement of cognitive development. Subsequently, dietary supplements containing omega-3 PUFAs have become increasingly popular. Often, the largest source of beneficial PUFAs in these supplements is fish oil, which may contain significant levels of contaminants such as polychlorinated biphenyls (PCBs). The objectives of this study were to evaluate congener-specific PCB concentrations in 13 over-the-counter children's dietary supplements containing fish oils/powders and assess potential PCB exposures through ingestion of these products on a daily basis. Every supplement analysed contained PCBs, with a mean concentration of 9 \u00b1 8 ng PCBs/g supplement. When following serving size suggestions, mean daily exposure values ranged from 2.5 to 50.3 ng PCBs/day. Daily exposures for children's supplements were significantly lower than those previously reported for adult supplements and may be explained, in part, by the variability in the amount of fish oil (and PUFA content) in a serving size. Based on this study, factors such as fish oil purification methods (e.g., molecular distillation) and the trophic level of the fish species used to make the fish oil cannot be used as indicators of PCB levels within children's supplements. Fish supplements may decrease or increase daily PCB exposure compared with ingestion of fresh fish. However, eating fish high in omega-3 PUFAs and low in PCBs may reduce PCB exposure compared with daily supplementation with fish oils for some products studied.", "Docosahexaenoic acid from a cultured microalga inhibits cell growth and induces apoptosis by upregulating Bax/Bcl-2 ratio in human breast carcinoma... Docosahexaenoic acid (DHA) is an omega-3 fatty acid that comprises 22 carbons and 6 alternative double bonds in its hydrocarbon chain (22:6omega3). Previous studies have shown that DHA from fish oil controls the growth and development of different cancers; however, safety issues have been raised repeatedly about contamination of toxins in fish oil that makes it no longer a clean and safe source of the fatty acid. We investigated the cell growth inhibition of DHA from the cultured microalga Crypthecodinium cohnii (algal DHA [aDHA]) in human breast carcinoma MCF-7 cells. aDHA exhibited growth inhibition on breast cancer cells dose-dependently by 16.0% to 59.0% of the control level after 72-h incubations with 40 to 160 microM of the fatty acid. DNA flow cytometry shows that aDHA induced sub-G(1) cells, or apoptotic cells, by 64.4% to 171.3% of the control levels after incubations with 80 mM of the fatty acid for 24, 48, and 72 h. Western blot studies further show that aDHA did not modulate the expression of proapoptotic Bax protein but induced the downregulation of anti-apoptotic Bcl-2 expression time-dependently, causing increases of Bax/Bcl-2 ratio by 303.4% and 386.5% after 48- and 72-h incubations respectively with the fatty acid. Results from this study suggest that DHA from the cultured microalga is also effective in controlling cancer cell growth and that downregulation of antiapoptotic Bcl-2 is an important step in the induced apoptosis.", "Algal-oil capsules and cooked salmon: nutritionally equivalent sources of docosahexaenoic acid. Food and nutrition professionals question whether supplement-sourced nutrients appear to be equivalent to those derived from natural food sources. We compared the nutritional availability of docosahexaenoic acid (DHA) from algal-oil capsules to that from assayed cooked salmon in 32 healthy men and women, ages 20 to 65 years, in a randomized, open-label, parallel-group study. In this 2-week study comparing 600 mg DHA/day from algal-oil capsules to that from assayed portions of cooked salmon, mean change from baseline in plasma phospholipids and erythrocyte DHA levels was analyzed and DHA levels were compared by Student's t tests. In post-hoc analyses to determine bioequivalence, least-squares mean ratios of percent change from baseline in plasma phospholipid and erythrocyte DHA levels were compared. DHA levels increased by approximately 80% in plasma phospholipids and by approximately 25% in erythrocytes in both groups. Changes in DHA levels in plasma phospholipids and erythrocytes were similar between groups. As measured by delivery of DHA to both plasma and erythrocytes, fish and algal-oil capsules were equivalent. Both regimens were generally well-tolerated. These results indicate that algal-oil DHA capsules and cooked salmon appear to be bioequivalent in providing DHA to plasma and red blood cells and, accordingly, that algal-oil DHA capsules represent a safe and convenient source of non-fish-derived DHA.", "Associations of maternal long chain polyunsaturated fatty acids, methyl mercury, and infant development in the Seychelles Child Development Nutrition Study Fish consumption during gestation can provide the fetus with long chain polyunsaturated fatty acids (LCPUFA) and other nutrients essential for growth and development of the brain. However, fish consumption also exposes the fetus to the neurotoxicant, methyl mercury (MeHg). We studied the association between these fetal exposures and early child development in the Seychelles Child Development Nutrition Study (SCDNS). Specifically, we examined a priori models of \u03a9-3 and \u03a9-6 LCPUFA measures in maternal serum to test the hypothesis that these LCPUFA families before or after adjusting for prenatal MeHg exposure would reveal associations with child development assessed by the BSID-II at ages 9 and 30 months. There were 229 children with complete outcome and covariate data available for analysis. At 9 months, the PDI was positively associated with total \u03a9-3 LCPUFA and negatively associated with the ratio of \u03a9-6/\u03a9-3 LCPUFA. These associations were stronger in models adjusted for prenatal MeHg exposure. Secondary models suggested that the MeHg effect at 9 months varied by the ratio of \u03a9-6/\u03a9-3 LCPUFA. There were no significant associations between LCPUFA measures and the PDI at 30 months. There were significant adverse associations, however, between prenatal MeHg and the 30 month PDI when the LCPUFA measures were included in the regression analysis. The BSID-II Mental Developmental Index (MDI) was not associated with any exposure variable. These data support the potential importance to child development of prenatal availability of \u03a9-3 LCPUFA present in fish and of LCPUFA in the overall diet. Furthermore, they indicate that the beneficial effects of LCPUFA can obscure the determination of adverse effects of prenatal MeHg exposure in longitudinal observational studies."], ["Acne, dairy and cancer A potent link to dairy seems to exist for three hormone-responsive glands. Acne, breast cancer and prostate cancer have all been linked epidemiologically to dairy intake. Although mechanisms postulated here remain to be accurately defined, the likely link involves Insulin-like Growth Factor-1 as a general stimulant, synergized by the steroid hormones present in milk. The IGF-1 may be either absorbed from milk, or stimulated by its ingestion, or both. The 5alpha-reduced compound 5alpha-pregnanedione (5\u03b1-P) present in milk is a direct precursor of dihydrotestosterone and may act through that pathway in prostate cancer, but 5\u03b1-P has also recently been shown to be capable of inducing estrogen receptors in breast cancer cells, upregulating cancer cells' sensitivity to estrogen. The introduction of exogenous hormones and growth factors into tissues that have not evolved defensive feedback inhibition of their corresponding endogenous sources is postulated as a direct stimulatory threat to these organ systems, whether for hyperplasia or neoplasia.", "Acne: risk indicator for increased body mass index and insulin resistance. Acne appears to represent a visible indicator disease of over-activated mTORC1 signalling, an unfavour-able metabolic deviation on the road to serious common Western diseases of civilisation associated with increased body mass index and insulin resistance. Exaggerated mTORC1 signalling by Western diet explains the association of acne with increased body mass index, insulin resistance, and early onset of menarche. Both, a high glycaemic load and increased consumption of milk and milk products, staples of Western diet, aggravate mammalian target of rapamycin complex 1 signalling. This review of the literature summarises present evidence for an association between acne, increased body mass index, insulin resistance and Western diet. By dietary intervention with a Palaeolithic-type diet, the dermatologist has the chance to attenuate patients' increased mTORC1 signalling by reducing glycaemic load and milk consumption, which may not only improve acne but may delay the march to more serious mTORC1-driven diseases of civilisation.", "Potential role of FoxO1 and mTORC1 in the pathogenesis of Western diet-induced acne Acne in adolescents of developed countries is an epidemic skin disease and has currently been linked to the Western diet (WD). It is the intention of this viewpoint to discuss the possible impact of WD-mediated nutrient signalling in the pathogenesis of acne. High glycaemic load and dairy protein consumption both increase insulin/insulin-like growth factor-1 (IGF-1) signalling (IIS) that is superimposed on elevated IGF-1 signalling of puberty. The cell's nutritional status is primarily sensed by the forkhead box transcription factor O1 (FoxO1) and the serine/threonine kinase mammalian target of rapamycin complex 1 (mTORC1). Increased IIS extrudes FoxO1 into the cytoplasm, whereas nuclear FoxO1 suppresses hepatic IGF-1 synthesis and thus impairs somatic growth. FoxO1 attenuates androgen signalling, interacts with regulatory proteins important for sebaceous lipogenesis, regulates the activity of innate and adaptive immunity, antagonizes oxidative stress and most importantly functions as a rheostat of mTORC1, the master regulator of cell growth, proliferation and metabolic homoeostasis. Thus, FoxO1 links nutrient availability to mTORC1-driven processes: increased protein and lipid synthesis, cell proliferation, cell differentiation including hyperproliferation of acroinfundibular keratinocytes, sebaceous gland hyperplasia, increased sebaceous lipogenesis, insulin resistance and increased body mass index. Enhanced androgen, TNF-\u03b1 and IGF-1 signalling due to genetic polymorphisms promoting the risk of acne all converge in mTORC1 activation, which is further enhanced by nutrient signalling of WD. Deeper insights into the molecular interplay of FoxO1/mTORC1-mediated nutrient signalling are thus of critical importance to understand the impact of WD on the promotion of epidemic acne and more serious mTORC1-driven diseases of civilization.", "Diet and acne. Acne is caused by the action of dihydrotestosterone, derived from endogenous and exogenous precursors, likely acting synergistically with insulin-like growth factor-1. These sources and interactions are discussed. Both a mechanism of action and recommended dietary changes that limit ingestion and production of these hormones are proposed.", "Turning acne on/off via mTORC1 Over the past 10 years, the increase in comprehension of the mechanisms behind acne has been truly exponential. Starting with the ethnological work of Cordain, accelerated by the epidemiological work of Adebamowo, supported by the clinical trials of Smith and Mann, Kwon, DiLandro and others, the interface of diet and acne is coming into focus. Melnik now presents an exceptional pair of papers that illustrate for dermatologists what translational research is all about. The Western diet, the role of dairy, FoxO1 and mTORC1, the interplay of agonists and antagonists, therapeutics present and future \u2013 the jigsaw puzzle is coming together."], ["Adverse effects of concentrated green tea extracts. A myriad of health claims are being made in favor of the consumption of green tea. However, mostly due to the easy availability and greater than ever popularity of highly concentrated green tea extracts, sometimes combined with an attitude of more-is-better, certain health risks of green tea consumption have begun to emerge. Among such risks are the possibility of liver damage, the potential to interact with prescription drugs to alter their therapeutic efficacy, and the chance to cause harm when combined with other highly popular herbal remedies. This review will summarize documented examples of adverse effects of green tea in humans, and will discuss risks of copious consumption of highly concentrated green tea extracts as indicated by studies in animals. While there is no intention to minimize any of the scientifically established benefits of the use of green tea, the purpose of this review is to focus primarily on the potential for adverse effects and raise awareness of the rare, yet under-appreciated risks. Copyright \u00a9 2011 WILEY-VCH Verlag GmbH & Co. KGaA, Weinheim.", "The case of the purple colon. Purple discoloration of the large bowel at autopsy was related to beetroot ingestion and post-mortem changes.", "The nitrate story--no end in sight. It has been demonstrated that nitrates are reduced to nitrites in humans, possibly through bacterial activity. Nitrites, together with ubiquitous amines, can lead to an in-vivo synthesis of carcinogenic nitrosamines. The average daily intake of nitrates depends upon the amount of vegetables consumed and on the nitrate concentration in drinking water. Agricultural practices play an important part in the concentration of nitrate in both water and vegetables. If nitrate is taken up by the plant and not metabolised to amino acids, proteins or nucleic acids, it is stored in cell vacuoles as a reserve. However, with an over-supply of nitrate relative to possible photosynthesis, this stored nitrate is still present at harvest and leads to high concentrations in plant tissue. The nitrate content in plants also depends upon other factors, such as plant variety (cultivar), kind and amount of fertiliser, time of harvest and environmental factors such as light intensity, temperature, etc. It is suggested that we should try to meet the recommendations of toxicologists who believe a dramatic reduction nitrate intake for humans is necessary. It has been demonstrated that modern biological-organic farming methods clearly lead both to lower leaching of nitrates and to lower nitrate content in vegetables. Since no synthetic fungicides are used in this farming method, problems with the reaction of metabolites of such products and nitrites e.g. to highly cancerogenic and multigenic nitroso-ethylenethiourea do not exist.", "Too much of too little: xylitol, an unusual trigger of a chronic metabolic hyperchloremic acidosis. Homeopathic globules are frequently used in children as a first-line treatment. Most of these globules are coated with sugar substitutes like xylitol; these substitutes are known for their laxative effect. Our patient shows that consumption of globules coated with xylitol does not have only laxative effects. It may cause indeed considerable weight loss and life-threatening enteral bicarbonate loss by diarrhea when overdosed in an infant.", "Diverticular disease: eat your fiber! In industrialized nations, diverticular disease affects up to 70% of individuals by 60 years of age, with symptoms that can range from mild gastrointestinal disturbance to incapacitating pain. Diverticular disease appears to be related to increasing affluence and changed diet: Current theory holds that diverticular disease's origin is low-fiber diet. This explains why its incidence is highest and accelerating in the more prosperous countries where intake of fiber has decreased and intake of milled grains and refined sugars has increased over time. Not all patients develop symptoms, but if they do, the most frequent complaints associated with diverticulosis are cramping in the left-lower quadrant, bloating, constipation, and soiling. If diverticula perforate the gut's wall into the pericolic tissue, small and large abscesses, accompanied by bleeding, can form. Fistulization, when it occurs, most often penetrates to the bladder. Treatment addresses symptoms and may require hospitalization. During symptomatic periods, patients do best on low-fiber, bland diets. Once the acute episode or highly symptomatic period resolves or chronic disease is managed, patients should gradually increase dietary fiber to 20 to 30 grams daily or take dietary fiber in the form of bulk stimulants like psyllium."], ["Dietary links to Alzheimer's disease: 1999 update. With the republication of Grant (18), the first paper providing epidemiologic evidence linking diet to the development of Alzheimer's disease (AD), it is an appropriate time to review the findings and hypotheses therein in light of the subsequent literature. The main findings, that dietary fat and energy in old age are high risk factors, while fish and cereals are risk-reduction factors, have been supported in various recent epidemiologic studies. Diet contributes to the development of AD through modulating oxidative stress and inflammation, which is also linked to oxidative stress, but may also arise from series 2 prostaglandins. Thus, as one ages, dietary modifications and additional supplements designed to reduce free radical production and inflammation provide a significant measure of reduction in risk for the development of AD.", "Trends in diet and Alzheimer's disease during the nutrition transition in Japan and developing countries. BACKGROUND: Alzheimer's disease (AD) rates in Japan and developing countries have risen rapidly in recent years. Researchers have associated factors such as the Western diet, obesity, alcohol consumption, and smoking with risk of AD. OBJECTIVE: This paper evaluates whether the dietary transition might explain the rising trend of AD prevalence in Japan and in developing countries, evaluating other factors when possible. METHODS: This study used two approaches to see whether dietary or other changes could explain AD trends in Japan and developing countries. One approach involved comparing trends of AD in Japan with changes in national dietary supply factors, alcohol consumption, and lung cancer mortality rates from zero to 25 years before the prevalence data. The second compared AD prevalence values for eight developing countries with dietary supply factors from zero to 25 years before the prevalence data. RESULTS: For Japan, alcohol consumption, animal product, meat and rice supply, and lung cancer rates correlated highly with AD prevalence data, with the strongest correlation for a lag of 15-25 years. In the eight-country study, total energy and animal fat correlated highly with AD prevalence data, with a lag of 15-20 years. Mechanisms to explain the findings include increased obesity for the eight countries, and increases in cholesterol, saturated fat, and iron from increases in animal products and meat supply for Japan. CONCLUSION: Evidently AD rates will continue rising in non-Western countries for some time unless we address major risk factors involving diet, obesity, and smoking.", "Western Diet Consumption and Cognitive Impairment: Links to Hippocampal Dysfunction and Obesity Intake of saturated fats and simple carbohydrates, two of the primary components of a modern Western diet, is linked with the development of obesity and Alzheimer's Disease. The present paper summarizes research showing that Western diet intake is associated with cognitive impairment, with a specific emphasis on learning and memory functions that are dependent on the integrity of the hippocampus. The paper then considers evidence that saturated fat and simple carbohydrate intake is correlated with neurobiological changes in the hippocampus that may be related to the ability of these dietary components to impair cognitive function. Finally, a model is described proposing that Western diet consumption contributes to the development of excessive food intake and obesity, in part, by interfering with a type of hippocampal-dependent memory inhibition that is critical in the ability of animals to refrain from responding to environmental cues associated with food, and ultimately from consuming energy intake in excess of that driven solely by caloric need.", "Aluminum and Alzheimer's disease: after a century of controversy, is there a plausible link? The brain is a highly compartmentalized organ exceptionally susceptible to accumulation of metabolic errors. Alzheimer's disease (AD) is the most prevalent neurodegenerative disease of the elderly and is characterized by regional specificity of neural aberrations associated with higher cognitive functions. Aluminum (Al) is the most abundant neurotoxic metal on earth, widely bioavailable to humans and repeatedly shown to accumulate in AD-susceptible neuronal foci. In spite of this, the role of Al in AD has been heavily disputed based on the following claims: 1) bioavailable Al cannot enter the brain in sufficient amounts to cause damage, 2) excess Al is efficiently excreted from the body, and 3) Al accumulation in neurons is a consequence rather than a cause of neuronal loss. Research, however, reveals that: 1) very small amounts of Al are needed to produce neurotoxicity and this criterion is satisfied through dietary Al intake, 2) Al sequesters different transport mechanisms to actively traverse brain barriers, 3) incremental acquisition of small amounts of Al over a lifetime favors its selective accumulation in brain tissues, and 4) since 1911, experimental evidence has repeatedly demonstrated that chronic Al intoxication reproduces neuropathological hallmarks of AD. Misconceptions about Al bioavailability may have misled scientists regarding the significance of Al in the pathogenesis of AD. The hypothesis that Al significantly contributes to AD is built upon very solid experimental evidence and should not be dismissed. Immediate steps should be taken to lessen human exposure to Al, which may be the single most aggravating and avoidable factor related to AD.", "The risks of copper toxicity contributing to cognitive decline in the aging population and to Alzheimer's disease. It is a pleasure and an honor to contribute a paper to a special issue of the Journal of the American College of Nutrition honoring Stanley Wallach and Pearl Small. In this brief review I advance the hypothesis that copper toxicity is the major cause of the epidemic of mild cognitive impairment and Alzheimer's disease engulfing our aging population. This epidemic is recent, exploding in the last 50-60 years. The disease was virtually unknown 100 years ago. And it involves only developed countries that use copper plumbing. Something in our environment associated with development is poisoning the minds of our aged. The epidemic is associated with the use of copper plumbing, and the taking of copper in multi-mineral supplements. Food copper (organic copper) is processed by the liver and is transported and sequestered in a safe manner. Inorganic copper, such as that in drinking water and copper supplements, largely bypasses the liver and enters the free copper pool of the blood directly. This copper is potentially toxic because it may penetrate the blood/brain barrier. I review a web of animal and human data that tightens the noose around the hypothesis that copper toxicity is causing the epidemic of Alzeimer's disease and loss of cognition in our aging population."], ["Occupational exposure to meat and risk of lymphoma: a multicenter case-control study from Europe. Several studies have suggested an increased risk of lymphoma among workers exposed to meat, without conclusive evidence. We conducted a multicenter case-control study during 1998-2004 in the Czech Republic, France, Germany, Ireland, Italy and Spain, including 2,007 cases of non-Hodgkin lymphoma, 339 cases of Hodgkin lymphoma and 2,462 controls. We collected detailed information on occupational history and assessed exposure to meat in general and several types of meat via expert assessment of the questionnaires. The odds ratio (OR) of non-Hodgkin lymphoma for ever occupational exposure to meat was 1.18 (95% confidence interval [CI] 0.95-1.46), that for exposure to beef meat was 1.22 (95% CI 0.90-1.67), and that for exposure to chicken meat was 1.19 (95% CI 0.91-1.55). The ORs were higher among workers with longer duration of exposure. An increased risk among workers exposed to beef meat was mainly apparent for diffuse large B-cell lymphoma (OR 1.49, 95%CI 0.96-2.33), chronic lymphocytic leukemia (OR 1.35, 95% CI 0.78-2.34) and multiple myeloma (OR 1.40, 95%CI 0.67-2.94). The latter 2 types were also associated with exposure to chicken meat (OR 1.55, 95% CI 1.01-2.37, and OR 2.05, 95%CI 1.14-3.69). Follicular lymphoma and T-cell lymphoma, as well as Hodgkin lymphoma did not show any increase in risk. Occupational exposure to meat does not appear to represent an important risk factor of lymphoma, although an increased risk of specific types of non-Hodgkin lymphoma cannot be excluded. (c) 2007 Wiley-Liss, Inc.", "Risk factors for multiple myeloma: a hospital-based case-control study in Northwest China. BACKGROUND: The distinctive racial/ethnic and geographic distribution of multiple myeloma (MM) suggests that both family history and environmental factors may contribute to its development. METHODS: A hospital-based case-control study consisting of 220 confirmed MM cases and 220 individually matched patient controls, by sex, age and hospital was carried out at 5 major hospitals in Northwest China. A questionnaire was used to obtain information on demographics, family history, and the frequency of food items consumed. RESULTS: Based on multivariate analysis, a significant association between the risk of MM and family history of cancers in first degree relatives was observed (OR=4.03, 95% CI: 2.50-6.52). Fried food, cured/smoked food, black tea, and fish were not significantly associated with the risk of MM. Intake of shallot and garlic (OR=0.60, 95% CI: 0.43-0.85), soy food (OR=0.52, 95% CI: 0.36-0.75) and green tea (OR=0.38, 95% CI: 0.27-0.53) was significantly associated with a reduced risk of MM. In contrast, intake of brined vegetables and pickle was significantly associated with an increased risk (OR=2.03, 95% CI: 1.41-2.93). A more than multiplicative interaction on the decreased risk of MM was found between shallot/garlic and soy food. CONCLUSION: Our study in Northwest China found an increased risk of MM with a family history of cancer, a diet characterized by low consumption of garlic, green tea and soy foods, and high consumption of pickled vegetables. The effect of green tea in reducing the risk of MM is an interesting new finding which should be further confirmed. Copyright \u00a9 2012 Elsevier Ltd. All rights reserved.", "Cancer in British vegetarians: updated analyses of 4998 incident cancers in a cohort of 32,491 meat eaters, 8612 fish eaters, 18,298 vegetarians, and 2246 vegans Background: Vegetarian diets might affect the risk of cancer. Objective: The objective was to describe cancer incidence in vegetarians and nonvegetarians in a large sample in the United Kingdom. Design: This was a pooled analysis of 2 prospective studies including 61,647 British men and women comprising 32,491 meat eaters, 8612 fish eaters, and 20,544 vegetarians (including 2246 vegans). Cancer incidence was followed through nationwide cancer registries. Cancer risk by vegetarian status was estimated by using multivariate Cox proportional hazards models. Results: After an average follow-up of 14.9 y, there were 4998 incident cancers: 3275 in meat eaters (10.1%), 520 in fish eaters (6.0%), and 1203 in vegetarians (5.9%). There was significant heterogeneity between dietary groups in risks of the following cancers: stomach cancer [RRs (95% CIs) compared with meat eaters: 0.62 (0.27, 1.43) in fish eaters and 0.37 (0.19, 0.69) in vegetarians; P-heterogeneity = 0.006], colorectal cancer [RRs (95% CIs): 0.66 (0.48, 0.92) in fish eaters and 1.03 (0.84, 1.26) in vegetarians; P-heterogeneity = 0.033], cancers of the lymphatic and hematopoietic tissue [RRs (95% CIs): 0.96 (0.70, 1.32) in fish eaters and 0.64 (0.49, 0.84) in vegetarians; P-heterogeneity = 0.005], multiple myeloma [RRs (95% CIs): 0.77 (0.34, 1.76) in fish eaters and 0.23 (0.09, 0.59) in vegetarians; P-heterogeneity = 0.010], and all sites combined [RRs (95% CIs): 0.88 (0.80, 0.97) in fish eaters and 0.88 (0.82, 0.95) in vegetarians; P-heterogeneity = 0.0007]. Conclusion: In this British population, the risk of some cancers is lower in fish eaters and vegetarians than in meat eaters.", "Red meat and colon cancer: should we become vegetarians, or can we make meat safer? The effect of meat consumption on cancer risk is a controversial issue. However, recent meta-analyses show that high consumers of cured meats and red meat are at increased risk of colorectal cancer. This increase is significant but modest (20-30%). Current WCRF-AICR recommendations are to eat no more than 500 g per week of red meat, and to avoid processed meat. Moreover, our studies show that beef meat and cured pork meat promote colon carcinogenesis in rats. The major promoter in meat is heme iron, via N-nitrosation or fat peroxidation. Dietary additives can suppress the toxic effects of heme iron. For instance, promotion of colon carcinogenesis in rats by cooked, nitrite-treated and oxidized high-heme cured meat was suppressed by dietary calcium and by \u03b1-tocopherol, and a study in volunteers supported these protective effects in humans. These additives, and others still under study, could provide an acceptable way to prevent colorectal cancer. Copyright \u00a9 2011 Elsevier B.V. All rights reserved.", "Red meat consumption and cancer: reasons to suspect involvement of bovine infectious factors in colorectal cancer. An increased risk for colorectal cancer has been consistently reported for long-time consumption of cooked and processed red meat. This has frequently been attributed to chemical carcinogens arising during the cooking process of meat. Long-time fish or poultry consumption apparently does not increase the risk, although similar or higher concentrations of chemical carcinogens were recorded in their preparation for consumption. The geographic epidemiology of colorectal cancer seems to correspond to regions with a high rate of beef consumption. Countries with a virtual absence of beef in the diet (India) or where preferably lamb or goat meat is consumed (several Arabic countries) reveal low rates of colorectal cancer. In China, pork consumption has a long tradition, with an intermediate colorectal cancer rate. In Japan and Korea, large scale beef and pork imports started after World War II or after the Korean War. A steep rise in colorectal cancer incidence was noted after 1970 in Japan and 1990 in Korea. The consumption of undercooked beef (e.g., shabu-shabu, Korean yukhoe and Japanese yukke) became very popular in both countries. The available data are compatible with the interpretation that a specific beef factor, suspected to be one or more thermoresistant potentially oncogenic bovine viruses (e.g., polyoma-, papilloma- or possibly single-stranded DNA viruses) may contaminate beef preparations and lead to latent infections in the colorectal tract. Preceding, concomitant or subsequent exposure to chemical carcinogens arising during cooking procedures should result in increased risk for colorectal cancer synergistic with these infections. Copyright \u00a9 2011 UICC."], ["TRP channel blamed for burning cold after a tropical fish meal EMBO J (2012) 31 19, 3795\u20133808 doi:10.1038/emboj.2012.207; published online July312012 Ciguatera is one of the most common forms of food poisoning, occurring after consumption of fish contaminated with ciguatoxins. New work by Vetter et al (2012) reveals the key molecular players that underlie the altered temperature sensation associated with ciguatera. In particular, they show that ciguatoxins act on sensory neurons that express TRPA1, an ion channel implicated in the detection of noxious cold.", "The case of the purple colon. Purple discoloration of the large bowel at autopsy was related to beetroot ingestion and post-mortem changes.", "Esophageal injury by apple cider vinegar tablets and subsequent evaluation of products. Apple cider vinegar products are advertised in the popular press and over the Internet for treatment of a variety of conditions. After an adverse event was reported to the authors, eight apple cider vinegar tablet products were tested for pH, component acid content, and microbial growth. Considerable variability was found between the brands in tablet size, pH, component acid content, and label claims. Doubt remains as to whether apple cider vinegar was in fact an ingredient in the evaluated products. The inconsistency and inaccuracy in labeling, recommended dosages, and unsubstantiated health claims make it easy to question the quality of the products.", "An archaeologic dig: a rice-fruit diet reverses ECG changes in hypertension. In 1940, a young German refugee physician scientist at Duke University in Durham, North Carolina began to treat patients with accelerated or \\\"malignant\\\" hypertension with a radical diet consisting of only white rice and fruit, with strikingly favorable results. He reported rapid reduction in blood pressure, rapid improvement in renal failure, papilledema, congestive heart failure and other manifestations of this previously fatal illness. This treatment was based on his theory that the kidney had both an excretory and a metabolic function, and that removing most of the sodium and protein burden from this organ enabled it to regain its normal ability to perform its more important metabolic functions. It was also effective in \\\"ordinary\\\" hypertension, in the absence of the dramatic vasculopathy of the accelerated form. The results were so dramatic that many experienced physicians suspected him of falsifying data. Among these results was the normalization of the ECG changes seen with hypertension. This paper reviews his published experience with this radical therapy, its controversial rise to fame, and its decline in popularity with the advent of effective antihypertensive drugs. It features the ECG changes seen in this then fatal disease, and the reversal of these changes by the rice diet. This treatment, though very difficult for the patient, produced effects which make it equal or superior to current multi-drug treatment of hypertension. A poorly known but important observation was that patients who were able to follow the regime, and who were slowly guided through a gradual modification of the diet over many months, were able to transition into a very tolerable low fat, largely vegetarian diet, while leading a normal, active life, without medications, indicating that the disease state had been permanently modified. Copyright \u00a9 2014 Elsevier Inc. All rights reserved.", "Effectiveness of devices purported to reduce flatus odor. OBJECTIVE: A variety of charcoal-containing devices are purported to minimize problems with odoriferous rectal gas; however, the evidence supporting the efficacy of these products is virtually all anecdotal. We objectively evaluated the ability of these devices to adsorb two malodorous, sulfide gases (hydrogen sulfide and methylmercaptan) instilled at the anus. METHODS: Via a tube, 100 ml of nitrogen containing 40 ppm of sulfide gases and 0.5% H(2) was instilled at the anus of six healthy volunteers who wore gas impermeable Mylar pantaloons over their garments. Since H(2) is not adsorbed by charcoal, the fraction of the sulfide gases removed could be determined from the concentration ratio of sulfide gas: H(2) in the pantaloon space relative to the ratio in instilled gas. RESULTS: Measurements with no device in place showed that subjects' garments removed 22.0 +/- 5.3% of the sulfide gases, and results obtained with each device were corrected for this removal. The only product that adsorbed virtually all of the sulfide gases was briefs constructed from an activated carbon fiber fabric. Pads worn inside the underwear removed 55-77% of the sulfide gases. Most cushions were relatively ineffective, adsorbing about 20% of the gases. CONCLUSIONS: The ability of charcoal-containing devices to adsorb odoriferous rectal gases is limited by incomplete exposure of the activated carbon to the gases. Briefs made from carbon fiber are highly effective; pads are less effective, removing 55-77% of the odor; cushions are relatively ineffective."], ["Erectile dysfunction prevalence, time of onset and association with risk factors in 300 consecutive patients with acute chest pain and angiographic... OBJECTIVES: The aim of this study was to assess erectile dysfunction prevalence, time of onset and association with risk factors in patients with acute chest pain and angiographically documented coronary artery disease. METHODS: 300 consecutive patients with acute chest pain and angiographically documented coronary artery disease were assessed using a semi-structured interview investigating their medical and sexual histories, the International Index of Erectile Function and other instruments. RESULTS: Patient mean age was 62.5+/-8 years (range 33-86 years). Mean duration of symptoms or signs of myocardial ischaemia prior to enrollment in the study was 49 months (range 1-200). Coronary angiography showed 1-, 2- and 3-vessel disease in 98 (32.6%), 88 (29.3%) and 114 (38%) patients, respectively. The prevalence of ED among all patients was 49% (147/300). Erectile dysfunction was scored as mild, mild to moderate, moderate and severe in 21 (14%), 31 (21%), 20 (14%), and 75 (51%) of patients, respectively. There was no significant difference between patients with ED (n=147) or without ED (n=153) as far as clinical and angiographic characteristics were concerned. In the 147 patients with co-existing ED and CAD, ED symptoms were reported as having become clinically evident prior to CAD symptoms by 99/147 (67%) patients. The mean time interval between the onset of ED and CAD was 38.8 months (range 1-168). There was no significant difference in terms of risk factor distribution and clinical and angiographic characteristics between patients with the onset of ED before vs. after CAD diagnosis. Interestingly, all patients with type I diabetes and ED actually developed sexual dysfunction before CAD onset (p<0.001). CONCLUSIONS: Our study suggests that a significant proportion of patients with angiographically documented coronary artery disease have erectile dysfunction and that this latter condition may become evident prior to angina symptoms in almost 70% of cases. Future studies including a control group of patients with coronary artery disease and normal erectile function are required in order to verify whether erectile dysfunction may be considered a real predictor of ischemic heart disease.", "Heart disease risk factors predict erectile dysfunction 25 years later: the Rancho Bernardo Study. OBJECTIVES: We examined whether common coronary heart disease (CHD) risk factors measured in mid-life predict erectile dysfunction (ED) 25 years later. BACKGROUND: Retrospective and cross-sectional studies have suggested that ED is associated with classic CHD risk factors, but few prospective studies have studied these associations. METHODS: In this prospective study of community-dwelling men age 30 to 69 years, seven classic CHD risk factors (age, smoking, hypertension, diabetes, hypercholesterolemia, hypertriglyceridemia, and obesity) were assessed from 1972 to 1974. In 1998, after an average follow-up of 25 years, surviving male participants were asked to complete the International Index of Erectile Function (IIEF-5), which allows stratification of ED into five groups. RESULTS: Sixty-eight percent of the surviving men returned, and 60% completed the IIEF-5 questionnaire. Respondents had more favorable levels of all heart disease risk factors at baseline than non-respondents. At baseline, the average age of the 570 ED study participants was 46 years; at follow-up, their average age was 72 years. Mean age, body mass index, cholesterol, and triglycerides were each significantly associated with an increased risk of ED. Cigarette smoking was marginally more common in those with severe/complete ED, as compared with those without ED. Blood pressure and fasting blood glucose were not significantly associated with ED, likely due to selective mortality. CONCLUSIONS: Improving CHD risk factors in mid-life may decrease the risk of ED as well as CHD. Erectile dysfunction should be included as an outcome in clinical trials of lipid-lowering agents and lifestyle modifications.", "Male sexuality and cardiovascular risk. A cohort study in patients with erectile dysfunction. INTRODUCTION: Although penile blood flow (PBF) has been recommended as an additional diagnostic test in identifying erectile dysfunction (ED) patients at risk for latent cardiovascular disease, no study has ever assessed the possible association of PBF and the relational component of sexual function with incident major cardiovascular events (MACE). AIM: The aim of this study is to investigate whether severity of ED, PBF, and other factors related to a couple's relationship predict incident MACE. METHODS: A consecutive series of 1,687 patients was studied. Different clinical, biochemical, and instrumental (penile flow at color Doppler ultrasound) parameters were evaluated. MAIN OUTCOME MEASURES: Information on MACE was obtained through the City of Florence Registry Office. RESULTS: During a mean follow-up of 4.3 +/- 2.6 years, 139 MACE, 15 of which were fatal, were observed. Cox regression analysis, after adjustment for age and Chronic Disease Score, showed that severe ED predicted MACE (hazard ratio [HR] 1.75; 95% confidence interval 1.10-2.78; P < 0.05). In addition, lower PBF, evaluated both in flaccid (before) and dynamic (after prostaglandin-E1 stimulation) conditions, was associated with an increased risk of MACE (HR = 2.67 [1.42-5.04] and 1.57 [1.01-2.47], respectively, for flaccid [<13 cm/second] and dynamic [<25 cm/second] peak systolic velocity; both P < 0.05). Reported high sexual interest in the partner and low sexual interest in the patient proved to have a protective effect against MACE. CONCLUSIONS: The investigation of male sexuality, and in particular PBF, and sexual desire, could provide insights not only into present cardiovascular status but also into prospective risk.", "Erectile dysfunction and coronary disease: evaluating the link. Erectile dysfunction (ED) is common, affecting 40% of men over 40 years of age (so-called 40 over 40) and 1 in 3 men over 70 years of age. It is predominantly a vascular condition, often preceding a cardiovascular event by 3-5 years. ED is associated as a consequence with acute coronary syndromes and increased cardiovascular and all-cause mortality. Its early identification therefore offers a window of opportunity for cardiovascular risk reduction. ED has for many a devastating impact on a couple's relationship. Its treatment is often successful, maintaining quality of life in the middle aged and elderly. ED should always be queried as part of the ongoing health care worker and patient relationship - its early detection may prevent early death. Copyright \u00a9 2012 Elsevier Ireland Ltd. All rights reserved.", "Calcium absorption in Australian osteopenic post-menopausal women: an acute comparative study of fortified soymilk to cows' milk. Calcium loss after menopause increases the risk of osteoporosis in aging women. Soymilk is often consumed to reduce menopausal symptoms, although in its native form, it contains significantly less calcium than cow's milk. Moreover, when calcium is added as a fortificant, it may not be absorbed efficiently. This study compares calcium absorption from soymilk fortified with a proprietary phosphate of calcium versus absorption from cow's milk. Preliminary studies compared methods for labelling the calcium fortificant either before or after its addition to soymilk. It was established that fortificant labelled after it was added to soymilk had a tracer distribution pattern very similar to that shown by fortificant labelled before adding to soymilk, provided a heat treatment (90?C for 30 min) was applied. This method was therefore used for further bioavailability studies. Calcium absorption from fortified soy milk compared to cow's milk was examined using a randomised single-blind acute cross-over design study in 12 osteopenic post-menopausal women aged (mean +/- SD) 56.7+/-5.3 years, with a body mass index of 26.5+/-5.6 kg/m2. Participants consumed 20 mL of test milk labelled after addition of fortificant with 185 kBq of 45Ca in 44 mg of calcium carrier, allowing the determination of the hourly fractional calcium absorption rate (alpha) using a single isotope radiocalcium test. The mean hourly fractional calcium absorption from fortified soymilk was found to be comparable to that of cows' milk: alpha = 0.65+/-0.19 and alpha =0.66+/-0.22, p>0.05, respectively."], ["Herbal does not mean innocuous: ten cases of severe hepatotoxicity associated with dietary supplements from Herbalife products. BACKGROUND/AIMS: Herbal agents are popular and perceived as safe because they are supposedly 'natural'. We report 10 cases of toxic hepatitis implicating Herbalife products. METHODS: To determine the prevalence and outcome of hepatotoxicity due to Herbalife products. A questionnaire was sent to all public Swiss hospitals. Reported cases were subjected to causality assessment using the CIOMS criteria. RESULTS: Twelve cases of toxic hepatitis implicating Herbalife preparations (1998-2004) were retrieved, 10 sufficiently documented to permit causality analysis. Median age of patients was 51 years (range 30-69) and latency to onset was 5 months (0.5-144). Liver biopsy (7/10) showed hepatic necrosis, marked lymphocytic/eosinophilic infiltration and cholestasis in five patients. One patient with fulminant liver failure was successfully transplanted; the explant showed giant cell hepatitis. Sinusoidal obstruction syndrome was observed in one case. Three patients without liver biopsy presented with hepatocellular (2) or mixed (1) liver injury. Causality assessment of adverse drug reaction was classified as certain in two, probable in seven and possible in one case(s), respectively. CONCLUSIONS: We present a case series of toxic hepatitis implicating Herbalife products. Liver toxicity may be severe. A more detailed declaration of components and pro-active role of regulatory agencies would be desirable.", "Association between consumption of Herbalife nutritional supplements and acute hepatotoxicity. BACKGROUND/AIMS: Nutritional supplements are frequently considered to be harmless but indiscriminate use of unlabelled ingredients may lead to significant adverse reactions. METHODS: In 2004, identification of four index cases of acute hepatitis associated with Herbalife intake led to a ministry of health investigation in all Israeli hospitals. Twelve patients with acute idiopathic liver injury in association with consumption of Herbalife products were investigated. RESULTS: Eleven of the patients were females, aged 49.5+/-13.4 y. One patient had stage I primary biliary cirrhosis and another had hepatitis B. Acute liver injury was diagnosed after 11.9+/-11.1 months of initiation of Herbalife consumption. Liver biopsies demonstrated active hepatitis, portal inflammation rich with eosinophils, ductular reaction and parenchymal inflammation with peri-central accentuation. One patient developed sub-fulminant and two fulminant episodes of hepatic failure. Hepatitis resolved in eleven patients, while one patient succumbed to complications following liver transplantation. Three patients resumed consumption of Herbalife products following normalization of liver enzymes, resulting in a second bout of hepatitis. CONCLUSIONS: An association between intake of Herbalife products and acute hepatitis was identified in Israel. We call for prospective evaluation of Herbalife products for possible hepatotoxicity. Until then, caution should be exercised by consumers, especially among individuals suffering from underlying liver disease.", "Hypervitaminosis A inducing intra-hepatic cholestasis--a rare case report. The use of over-the-counter supplements is commonplace in today's health conscious society. We present an unusual case of intrahepatic cholestasis caused by vitamin A intoxication. The patient consumed one Herbalife shake with two multivitamin tablets of the same brand for 12 years. When calculated this equated to more than the recommended daily allowance for vitamin A consumption. Deranged liver function tests were consistent with a cholestatic process. Liver biopsy was obtained and revealed features pathognomonic of vitamin A toxicity, without the usual fibrosis. When the supplements were ceased, his jaundice and alkaline phosphatase completely normalized. This case highlights the importance of health care providers documenting non-prescribed dietary supplements and considering them in the etiology of cholestatic liver disease. Copyright 2009 Elsevier Inc. All rights reserved.", "Vomiting from multivitamins: a potential drug interaction. A commercial weight loss program with a client base composed of >95% women experienced sporadic complaints of nausea and vomiting after changing its multivitamin supplier. This retrospective and observational study was designed to determine if related adverse event reports were significant, and to investigate potential mechanism for their occurrence in this group of subjects, many of whom were concurrently receiving oral contraceptives or hormone replacement therapy. Incidence of nausea, vomiting, rash, and total complaints in the 3 months following the change of the multivitamin formulation was compared with the same complaints in the 3 months before the change. In the 3 months following the multivitamin change, there were 166 complaints of nausea and vomiting, 9 complaints of rash and 194 total complaints from a group of 88,468 patients. In the 3 months before the change in the multivitamin, there had been 2 complaints of nausea and vomiting, no complaints of rash, and 11 total complaints from 88,252 patients. The difference detected by a chi-squared test was significant for all events studied; nausea and vomiting (P < 0.0001), rash (P < 0.02), and total complaints (P < 0.0001). The altered multivitamins contained added citrus bioflavanoids not included in the original formula. Citrus bioflavanoids decrease the clearance of exogenous estrogens by inhibiting cytochrome P450 enzyme systems. Elevated estrogen levels could account for the increased incidence of nausea and vomiting. This experience demonstrates that adding dietary herbal supplements to multivitamins may be associated with adverse interactions with prescription drugs.", "Updates on human papillomavirus and genital warts and counseling messages from the 2010 Sexually Transmitted Diseases Treatment Guidelines. BACKGROUND: In April 2009, experts on sexually transmitted diseases (STDs) were convened to review updates on STD prevention and treatment in preparation for the revision of the Centers for Disease Control and Prevention (CDC) STD Treatment Guidelines. At this meeting, there was a discussion of important updates on human papillomavirus (HPV), genital warts, and cervical cancer screening. METHODS: Key questions were identified with assistance from an expert panel, and systematic reviews of the literature were conducted searching the English-language literature of the PubMed computerized database (US National Library of Medicine). The available evidence was reviewed, and new information was incorporated in the 2010 CDC STD Treatment Guidelines. RESULTS: Two HPV vaccines are now available, the quadrivalent HPV vaccine and the bivalent HPV vaccine; either vaccine is recommended routinely for girls aged 11 or 12 years. The quadrivalent HPV vaccine may be given to boys and men aged 9-26 years. A new patient-applied treatment option for genital warts, sinecatechins 15% ointment, is available and recommended for treatment of external genital warts. This product is a mixture of active ingredients (catechins) from green tea. Finally, updated counseling guidelines and messages about HPV, genital warts, and cervical cancer are included. CONCLUSIONS: This manuscript highlights updates to the 2010 CDC STD Treatment Guidelines for HPV and genital warts. Important additions to the 2010 STD Treatment Guidelines include information on prophylactic HPV vaccine recommendations, new patient-applied treatment options for genital warts, and counseling messages for patients on HPV, genital warts, cervical cancer screening, and HPV tests."], ["Saturated fatty acid metabolism is key link between cell division, cancer, and senescence in cellular and whole organism aging Cellular senescence is an in vivo and in vitro phenomenon, accompanied by physiological changes including cessation of division and disturbances of organelle structure and function. Review of the literature was undertaken to determine whether there is evidence that whole organism aging and cell senescence share a common initiation pathway. In vivo aged cells of different lineages, including aged T lymphocytes, show high expression of the INK4A-p16 gene. In cell culture when telomeres are shortened past a key length or state, the Arf/Ink gene system (p16/p14 humans, p16/p19 mice) switches on and activates p53, which suppresses further cell division. The p53 gene is a key tumor suppressor and its deletion or mutation allows cancerous growth. The switching on of p53 also causes changes in fatty acid metabolism, especially down-regulation of both fatty acid synthase and stearoyl-CoA (delta-9) desaturase. The co-suppression of these genes together with enhanced uptake of extracellular fatty acids, leads to raised levels of cellular palmitate and induction of either apoptosis or senescence. In senescent cells, the fatty acid composition of the cellular membranes alters and leads to changes in both structure and function of organelles, especially mitochondria. Animal models of accelerated aging exhibit repression of stearoyl-CoA desaturase activity while anti-aging calorie restriction stimulates the same enzyme system. It is concluded that aging in cells and whole organisms share a common initiation pathway and that cellular senescence is protective against cancer. Healthy longevity is likely to be most enhanced by factors that actively suppress excessive cell division.", "Molecular Mechanisms and the Role of Saturated Fatty Acids in the Progression of Non-Alcoholic Fatty Liver Disease The steady rise in Western obesity rates has been closely linked to significant increases in a multitude of accompanying health problems including Non-Alcoholic Fatty Liver Disease (NAFLD). NAFLD severity ranges from simple steatosis to acute steatohepatitis, but the molecular mechanisms controlling progression of this disease are poorly understood. Recent literature suggests that elevated free fatty acids (FFAs), especially saturated FFAs, may play an important role in lipotoxic mechanisms, both in experimental models and in NAFLD patients. This review highlights important cellular pathways involved in hepatic lipotoxicity and how the degree of intrahepatic lipid saturation controls cell fate in response to an elevated FFA load. Relevant cellular processes that have been causally linked to lipid-induced apoptosis, known as lipoapoptosis, include endoplasmic reticulum (ER) stress, oxidative stress, mitochondrial dysfunction, and Jun N-terminal kinase (JNK) signaling. In contrast, increased triglyceride synthesis has been shown to have a protective effect against lipotoxicity, despite being one of the hallmark traits of NAFLD. Developing a more nuanced understanding of the molecular mechanisms underlying NAFLD progression will lead to more targeted and effective therapeutics for this increasingly prevalent disease, which to date has no proven pharmacologic treatment to prevent or reverse its course.", "Lipotoxicity: Effects of Dietary Saturated and Transfatty Acids The ingestion of excessive amounts of saturated fatty acids (SFAs) and transfatty acids (TFAs) is considered to be a risk factor for cardiovascular diseases, insulin resistance, dyslipidemia, and obesity. The focus of this paper was to elucidate the influence of dietary SFA and TFA intake on the promotion of lipotoxicity to the liver and cardiovascular, endothelial, and gut microbiota systems, as well as on insulin resistance and endoplasmic reticulum stress. The saturated and transfatty acids favor a proinflammatory state leading to insulin resistance. These fatty acids can be involved in several inflammatory pathways, contributing to disease progression in chronic inflammation, autoimmunity, allergy, cancer, atherosclerosis, hypertension, and heart hypertrophy as well as other metabolic and degenerative diseases. As a consequence, lipotoxicity may occur in several target organs by direct effects, represented by inflammation pathways, and through indirect effects, including an important alteration in the gut microbiota associated with endotoxemia. Interactions between these pathways may perpetuate a feedback process that exacerbates an inflammatory state. The importance of lifestyle modification, including an improved diet, is recommended as a strategy for treatment of these diseases.", "Relationship between saturated fatty acids and periodontal disease. Saturated fatty acids (SFAs) produce an inflammatory response. Hyperinflammation is now recognized as one of the key underlying etiologic factors in periodontal disease. The longitudinal relationship between dietary SFAs and periodontal disease in 264 Japanese individuals, aged 75 years, for whom data were available for the years 2003-2004, was investigated. SFA intake was assessed with a brief self-administered diet history questionnaire. Participants were classified by quartiles of SFA intake. Full-mouth periodontal status, measured as the clinical attachment level (CAL), was recorded at baseline and follow-up examinations. The number of teeth with a loss of CAL\u22653 mm at any site over a year was calculated as 'periodontal disease events'. Poisson regression analysis was conducted, with dietary SFAs as the primary predictor of interest, to estimate their influence on periodontal disease events. High dietary SFA intake was significantly associated with a greater number of periodontal disease events among non-smokers. The multivariate adjusted relative risk (95% confidence intervals) in the 1st, 2nd, 3rd, and 4th quartiles of dietary SFAs was 1.00, 1.19 (0.72-1.97), 1.55 (0.95-2.52), and 1.92 (1.19-3.11), respectively. These findings suggest an independent association of dietary SFA intake to the progression of periodontal disease in older Japanese non-smokers. ABBREVIATIONS: saturated fatty acid (SFA); clinical attachment level (CAL); Toll-like receptor (TLR); lipopolysaccharide (LPS); brief self-administered diet history questionnaire (BDHQ); decayed, missing, and filled teeth (DMFT); clinical attachment level (CAL); body mass index (BMI); relative risk (RR); confidence intervals (CI); nuclear factor-kappa B (NF-\u03baB).", "Saturated fat intake and insulin resistance in men with coronary artery disease. The Stanford Coronary Risk Intervention Project Investigators and ... BACKGROUND: To determine whether there is an association between diet and plasma insulin concentration that is independent of obesity, we studied the relation of dietary composition and caloric intake to obesity and plasma insulin concentrations in 215 nondiabetic men aged 32-74 years with angiographically proven coronary artery disease. METHODS AND RESULTS: After adjusting for age, the intake of saturated fatty acids and cholesterol were positively correlated (p less than 0.05) with body mass index (r = 0.18, r = 0.16), waist-to-hip circumference ratio (r = 0.21, r = 0.22), and fasting insulin (r = 0.26, r = 0.23). Carbohydrate intake was negatively correlated with body mass index (r = -0.21), waist-to-hip ratio (r = -0.21), and fasting insulin (r = -0.16). Intake of monounsaturated fatty acids did not correlate significantly with body mass index or waist-to-hip circumference ratio but did correlate positively with fasting insulin (r = 0.24). Intake of dietary calories was negatively correlated with body mass index (r = -0.15). In multivariate analysis, intake of saturated fatty acids was significantly related to elevated fasting insulin concentration independently of body mass index. CONCLUSIONS: These cross-sectional findings in nondiabetic men with coronary artery disease suggest that increased consumption of saturated fatty acids is associated independently with higher fasting insulin concentrations."], ["Aluminum bioavailability from basic sodium aluminum phosphate, an approved food additive emulsifying agent, incorporated in cheese Oral aluminum (Al) bioavailability from drinking water has been previously estimated, but there is little information on Al bioavailability from foods. It was suggested that oral Al bioavailability from drinking water is much greater than from foods. The objective was to further test this hypothesis. Oral Al bioavailability was determined in the rat from basic [26Al]-sodium aluminum phosphate (basic SALP) in a process cheese. Consumption of ~ 1 gm cheese containing 1.5 or 3% basic SALP resulted in oral Al bioavailability (F) of ~ 0.1 and 0.3%, respectively, and time to maximum serum 26Al concentration (Tmax) of 8 to 9 h. These Al bioavailability results were intermediate to previously reported results from drinking water (F ~ 0.3%) and acidic-SALP incorporated into a biscuit (F ~ 0.1%), using the same methods. Considering the similar oral bioavailability of Al from food vs. water, and their contribution to the typical human\u2019s daily Al intake (~ 95 and 1.5%, respectively), these results suggest food contributes much more Al to systemic circulation, and potential Al body burden, than does drinking water. These results do not support the hypothesis that drinking water provides a disproportionate contribution to total Al absorbed from the gastrointestinal tract.", "Prevalence and public health significance of aluminum residues in milk and some dairy products. Sixty random samples of bulk farm milk, market milk, locally manufactured processed cheese, and milk powder were collected to be analyzed for aluminum (Al) concentration using graphite furnace atomic absorption spectrometry (GFAAS). The results were compared with provisional acceptable permissible limits (PAPLs). The maximum estimated dietary intake (MEDI) of Al for the examined samples was calculated. In addition, an experimental study was conducted to determine the possible leaching of Al from cookware in milk during boiling. The obtained results showed that Al concentration in examined bulk farm milk samples was found to be negligible. In contrast, market milk revealed higher concentration, 65.0% of the examined samples were above the PAPLs. The results revealed significant difference of Al concentration among them. The Al levels in processed cheese wrapped in Al foil were significantly higher than those found in samples packed in glass containers with a significant difference of Al concentration between them. Also, 20% of the examined milk powder samples exceeded the PAPLs (0.01 to 0.4 mg/kg). The MEDI for Al in bulk farm milk, control market milk, market milk boiled in Al cookware, market milk boiled in stainless-steel cookware, processed cheese wrapped in Al foil, processed cheese packed in glass containers, and milk powder were calculated as 3.0%, 61.0%, 63.0%, 61.0%, 428.0%, 220.0%, and 166.0% from \\\"PTDI,\\\" respectively. The results of the experimental study showed no marked significant differences of Al concentration between market milk (control group) and those boiled in Al cookware, as well as to those boiled in stainless-steel cookware. PRACTICAL APPLICATION: \u2002 The results of the present study indicate that Al level in milk kept in Al containers and dairy products packed in Al foil is beyond the permissible limits, suggesting health hazard. Therefore, all milk cans should be constructed of stainless steel, prevent the entrance of tap water into milk, and the processed cheese should be packed in glass containers and not wrapped in Al foil. Leaching of Al increased to a significant percent more during storage than during boiling, so milk should be kept in stainless steel or glass containers in the refrigerator.", "Plasma levels of aluminium after tea ingestion in healthy volunteers. 12 healthy volunteers on a controlled aluminium (Al) diet each consumed a tea infusion (500 ml/70 kg body weight), with either milk or lemon juice as additives, or mineral water, following a three-way crossover design. The concentrations of Al were determined in the diet, mineral water and tea infusions, and in plasma samples collected before and up to 24 hr after consumption of tea or water, using graphite-furnace atomic absorption spectrophotometry or inductively coupled plasma emission spectrometry. Consumption of up to 1.60 mg Al from tea with milk or lemon juice did not increase plasma Al levels compared with consumption of approximately 0.001 mg Al from mineral water. The results suggest that, in the short-term, drinking tea does not contribute significantly to the total body burden of Al.", "Urine levels of aluminum after drinking tea. A microwave-assisted acid digestion procedure coupled with a graphite furnace atomic absorption method has been applied in the determination of aluminum (Al) in urine to verify the correlation of free forms of Al in tea infusions and urinary excretion of Al. Significant urinary Al excretion has been found in 24-h urine of four volunteers after tea drinking. However, the difference in amount of Al excretion in urine between the consumption of Oolong (black tea) and Long-Jin (green tea), each of them with unique Al contents and species, was not significant. These findings indicated that the high levels of free Al species in tea infusions did not result in significant change in urinary excretion of the metal, possibly owing to the transformation by ligands present in food and the gastrointestinal tract (GIT). However, it could not be assumed that there was no big difference in absorption of the metal in the human body if fractions of consumed Al retained in the body or excreted by bile or feces were considered.", "Gastro-intestinal availability of aluminium from tea. The in vitro speciation of aluminium (Al) in black tea infusion (pH 4.8) was assessed using 3000, 10,000 and 30,000 Da cut-off ultrafilters, and the effect of adding human gastric juice (pH 2.3) and then raising the pH to 6.5 were also studied. 78% Al in the tea infusion passed through the 3000-Da ultrafilter; this percentage increased to more than 90% with the addition of gastric juice at pH 2.3, but then reduced to approximately 5% when the incubate was adjusted to pH 6.5. The breakdown of tea-derived polyphenols to low molecular weight phenols in vivo was measured using high-resolution 1H nuclear magnetic resonance spectroscopic analysis of ileostomy effluent, but there was no evidence of low molecular weight breakdown products from the polyphenols of ingested tea in this effluent. These results suggest that only a small proportion of Al in tea is potentially available for absorption throughout the small bowel. It may be misleading to estimate systemic Al absorption from tea drinking simply from total urinary aluminium excretion as has been done previously."], ["Multivitamin-multimineral supplementation and mortality: a meta-analysis of randomized controlled trials. BACKGROUND: Multivitamins are the most commonly used supplement in the developed world. Recent epidemiologic findings suggest that multivitamin use increases the risk of mortality. OBJECTIVE: We aimed to determine whether multivitamin-multimineral treatment, used for primary or secondary prevention, increases the risk of mortality in independently living adults. DESIGN: We performed a meta-analysis of randomized controlled trials. Multiple electronic databases were systematically searched from March to October 2012. Randomized controlled primary or secondary prevention trials were considered for inclusion. Eligible trials investigated daily multivitamin-multimineral supplementation for \u22651 y. Cohorts described as institutionalized or as having terminal illness (tertiary prevention) were excluded. The number of deaths and the sample size of each study arm were extracted independently by 2 researchers. Twenty-one articles were included in the analysis, which generated a total pooled sample of 91,074 people and 8794 deaths. These trials were pooled in a meta-analysis, and the outcomes were expressed as RRs and 95% CIs. RESULTS: The average age of the pooled sample was 62 y, and the average duration of supplementation was 43 mo. Across all studies, no effect of multivitamin-multimineral treatment on all-cause mortality (RR: 0.98; 95% CI: 0.94, 1.02) was observed. There was a trend for a reduced risk of all-cause mortality across primary prevention trials (RR: 0.94; 95% CI: 0.89, 1.00). Multivitamin-multimineral treatment had no effect on mortality due to vascular causes (RR: 1.01; 95% CI: 0.93, 1.09) or cancer (RR: 0.96; 95% CI: 0.88, 1.04). No statistical evidence of heterogeneity or publication bias was observed. CONCLUSION: Multivitamin-multimineral treatment has no effect on mortality risk.", "Vitamin and mineral supplements in the primary prevention of cardiovascular disease and cancer: An updated systematic evidence review for the U.S. ... BACKGROUND: Vitamin and mineral supplements are commonly used to prevent chronic diseases. PURPOSE: To systematically review evidence for the benefit and harms of vitamin and mineral supplements in community-dwelling, nutrient-sufficient adults for the primary prevention of cardiovascular disease (CVD) and cancer. DATA SOURCES: MEDLINE, Embase, Cochrane Central Register of Controlled Trials, Cochrane Database of Systematic Reviews, and Database of s of Reviews of Effects were searched from January 2005 to 29 January 2013, with manual searches of reference lists and gray literature. STUDY SELECTION: Two investigators independently selected and reviewed fair- and good-quality trials for benefit and fair- and good-quality trials and observational studies for harms. DATA EXTRACTION: Dual quality assessments and data abstraction. DATA SYNTHESIS: Two large trials (n = 27 658) reported lower cancer incidence in men taking a multivitamin for more than 10 years (pooled unadjusted relative risk, 0.93 [95% CI, 0.87 to 0.99]). The study that included women showed no effect in that group. High-quality studies (k = 24; n = 324 653) of single and paired nutrients (such as vitamins A, C, or D; folic acid; selenium; or calcium) were scant and heterogeneous and showed no clear evidence of benefit or harm. Neither vitamin E nor \u03b2-carotene prevented CVD or cancer, and \u03b2-carotene increased lung cancer risk in smokers. LIMITATIONS: The analysis included only primary prevention studies in adults without known nutritional deficiencies. Studies were conducted in older individuals and included various supplements and doses under the set upper tolerable limits. Duration of most studies was less than 10 years. CONCLUSION: Limited evidence supports any benefit from vitamin and mineral supplementation for the prevention of cancer or CVD. Two trials found a small, borderline-significant benefit from multivitamin supplements on cancer in men only and no effect on CVD. PRIMARY FUNDING SOURCE: Agency for Healthcare Research and Quality.", "Essentials of Healthy Eating: A Guide Enough solid evidence now exists to offer women several fundamental strategies for healthy eating. They include emphasizing healthful unsaturated fats, whole grains, good protein \u201cpackages,\u201d and fruits and vegetables; limiting consumption of trans and saturated fats, highly refined grains, and sugary beverages; and taking a multivitamin with folic acid and extra vitamin D as a nutritional safety net. A diet based on these principles is healthy through virtually all life stages, from young adulthood through planning for pregnancy, pregnancy, and on into old age.", "Fostering antioxidant defences: up-regulation of antioxidant genes or antioxidant supplementation? Vitamins have traditionally been considered as food components that are required in the normal diet to prevent deficiencies. However, a newer concept of the function of vitamins in nutrition has taken them beyond simply prevention of deficiency symptoms. This concept considers that many vitamins, when taken in relatively large doses, have important functions beyond preventing deficiencies. Linus Pauling was instrumental in putting forward this concept, particularly for vitamin C. Thus, relatively high intakes of vitamins, and in particular vitamins C and E which are antioxidants, are considered to be healthy for the human population. This may be true in some special situations such as, for instance, the prevention of Alzheimer's disease progression. However, recent epidemiological evidence has not supported the claim that antioxidant vitamins increase well-being and prolong life span. In fact, vitamin supplementation may be even detrimental and reduce life span. A new concept that we would like to put forward is that nutrients up-regulate the endogenous antioxidant defences. This is particularly true in the case of phytoestrogens for example, which bind to oestrogen receptors and eventually up-regulate the expression of antioxidant genes. In this review we discuss the pros and cons of antioxidant vitamin supplementation and also the possibility that the ingestion of some nutrients may be very effective in increasing antioxidant defences by up-regulating the activity of antioxidant enzymes which are normally present in the cell.", "Safety considerations and potential interactions of vitamins: should vitamins be considered drugs? OBJECTIVE: To examine adverse effects, adverse events, and potential interactions of vitamins in light of their current prevalence of use, and to discuss whether vitamins should be considered over-the-counter drugs or natural health products/dietary supplements. DATA SOURCES: We performed a MEDLINE/PubMed search, explored 4 online databases (Medline Plus, Drug Digest, Natural Medicine Comprehensive Database, and the database of the University of Maryland), and examined reference lists of included studies published from 1966 through October 2009. STUDY SELECTION AND DATA EXTRACTION: The studies were reviewed, with an emphasis on randomized controlled clinical trials. We included articles with the most clinically important information with regard to adverse events and interactions. DATA SYNTHESIS: Vitamins are used by over one third of the North American population. Vitamins have documented adverse effects and toxicities, and most have documented interactions with drugs. While some vitamins (biotin, pantothenic acid, riboflavin, thiamine, vitamin B(12), vitamin K) have minor and reversible adverse effects, others, such as fat-soluble vitamins (A, E, D), can cause serious adverse events. Two water-soluble vitamins, folic acid and niacin, can also have significant toxicities and adverse events. CONCLUSIONS: Our recommendation is that vitamins A, E, D, folic acid, and niacin should be categorized as over-the-counter medications. Labeling of vitamins, especially those intended for children and other vulnerable groups, should include information on possible toxicities, dosing, recommended upper intake limits, and concurrent use with other products. Vitamin A should be excluded from multivitamin supplements and food fortificants."], ["Fish odour syndrome Fish odour syndrome (trimethylaminuria) is a metabolic syndrome caused by abnormal excretion of trimethylamine in the breath, urine, sweat, saliva and vaginal secretions. Trimethylamine is derived from the intestinal bacterial degradation of foods rich in choline and carnitine and is normally oxidised by the liver to odourless trimethylamine N-oxide which is then excreted in the urine. Impaired oxidation of trimethylamine is thought to be the cause of the fish odour syndrome and is responsible for the smell of rotting fish. Certain foods rich in choline exacerbate the condition and the patients have a variety of psychological problems. Recognition of the condition is important as dietary adjustments reduce the excretion of trimethylamine and may reduce the odour. Occasionally, a short course of metronidazole, neomycin and lactulose may suppress production of trimethylamine by reducing the activity of gut microflora. Keywords: fish odour syndrome; trimethylaminuria", "Fish-induced keriorrhea. Many deep-sea fishes store large amounts of wax esters in their body for buoyancy control. Some of them are frequently caught as by-catch of tuna and other fishes. The most noteworthy ones include escolar and oilfish. The accumulation of the indigestible wax esters in the rectum through consumption of these fish engenders discharges or leakage per rectum as orange or brownish green oil, but without noticeable loss of water. This physiological response is called keriorrhea, which is variously described as \\\"oily diarrhea,\\\" \\\"oily orange diarrhea,\\\" or \\\"orange oily leakage\\\" by the mass media and bloggers on the internet. Outbreaks of keriorrhea have been repeatedly reported across continents. Additional symptoms including nausea, vomiting, abdominal cramps, and diarrhea were complained by the victims. They are probably due to anxiety or panic when suffering from keriorrhea. Escolar and oilfish are banned from import and sale in Italy, Japan, and South Korea. Rapid detection of the two fishes is imperative to ensure proper labeling and safeguarding of the public before and after any keriorrhea outbreak.", "A fishy cause of sudden near fatal hypotension. Seafood-borne illnesses are a common but under recognised source of morbidity. We report the case of an 80-year-old woman who presented to hospital after collapsing in a restaurant following lunch consisting of mackerel fish. A detailed food history and clinical exclusion helped diagnose the condition as scombroid poisoning. The patient made a complete recovery following antihistamine therapy.", "Pictorial essay: Complications of a swallowed fish bone Unintentional ingestion of a fishbone (FB) is common, especially in populations with a high consumption of seafood. In most instances, the ingested FB passes uneventfully through the gastrointestinal (GI) tract, usually within a week. However, in certain cases, the FB may become impacted and lead to complications. Awareness of these complications is important as patients usually present with nonspecific symptoms and could be unaware of having ingested an FB.", "Migrating fish bone presenting as acute onset of neck lump. We encountered a 62-year-old woman with a progressively worsening sore throat and a sharp lump located in her left upper neck, which appeared several hours before admission. After questioning, she underwent rigid esophagoscopy at a local hospital for suspected fish bone impaction but this gave a negative result. Unusual signs caused us to arrange a computed tomography scan, which showed that a foreign body had penetrated the left sternocleidomastoid muscle to the subcutaneous layer, with extensive emphysema in the neck. We extracted the foreign body with a 1-cm horizontal incision of the neck under general anesthesia. The patient returned to a normal diet and was discharged on day 5 of hospitalization without further morbidity. This is another rare case of a migrating foreign body presenting as a neck lump. On reviewing the literature, most cases involving subcutaneously migrating fish bones show development of a neck lump several weeks to months after ingestion, with relatively stable conditions. However, our case showed a neck lump 1 day after ingestion with acute toxic symptoms."], ["Can ciguatera be a sexually transmitted disease? Ciguatera is a type of food poisoning associated with the consumption of contaminated marine fish. We report two cases in which painful ejaculation in an affected male and dyspareunia in an unaffected female following her partner's ejaculation suggest the sexual transfer of the responsible agent, ciguatoxin (CTX). Immunoassay of semen samples for CTX were not diagnostic, but the sensitivity and timing of the test employed may have precluded detection of small quantities of the toxin. We conclude that CTX may be present in the semen of men affected with ciguatera toxicity and be capable of producing symptomatology in both males and females during sexual intercourse.", "Cluster of ciguatera fish poisoning--North Carolina, 2007. Ciguatera fish poisoning (CFP) is a distinctive type of foodborne disease that results from eating predatory ocean fish contaminated with ciguatoxins. As many as 50,000 cases are reported worldwide annually, and the condition is endemic in tropical and subtropical regions of the Pacific basin, Indian Ocean, and Caribbean. In the United States, 5--70 cases per 10,000 persons are estimated to occur yearly in ciguatera-endemic states and territories. CFP can cause gastrointestinal symptoms (nausea, vomiting, abdominal cramps, or diarrhea) within a few hours of eating contaminated fish. Neurologic symptoms, with or without gastrointestinal disturbance, can include fatigue, muscle pain, itching, tingling, and (most characteristically) reversal of hot and cold sensation. This report describes a cluster of nine cases of CFP that occurred in North Carolina in June 2007. Among the nine patients, six experienced reversal of hot and cold sensations, five had neurologic symptoms only, and overall symptoms persisted for more than 6 months in three patients. Among seven patients who were sexually active, six patients also complained of painful intercourse. This report highlights the potential risks of eating contaminated ocean fish. Local and state health departments can train emergency and urgent care physicians in the recognition of CFP and make them aware that symptoms can persist for months to years.", "Ciguatera: recent advances but the risk remains. Ciguatera is an important form of human poisoning caused by the consumption of seafood. The disease is characterised by gastrointestinal, neurological and cardiovascular disturbances. In cases of severe toxicity, paralysis, coma and death may occur. There is no immunity, and the toxins are cumulative. Symptoms may persist for months or years, or recur periodically. The epidemiology of ciguatera is complex and of central importance to the management and future use of marine resources. Ciguatera is an important medical entity in tropical and subtropical Pacific and Indian Ocean regions, and in the tropical Caribbean. As reef fish are increasingly exported to other areas, it has become a world health problem. The disease is under-reported and often misdiagnosed. Lipid-soluble, polyether toxins known as ciguatoxins accumulated in the muscles of certain subtropical and tropical marine finfish cause ciguatera. Ciguatoxins arise from biotransformation in the fish of less polar ciguatoxins (gambiertoxins) produced by Gambierdiscus toxicus, a marine dinoflagellate that lives on macroalgae, usually attached to dead coral. The toxins and their metabolites are concentrated in the food chain when carnivorous fish prey on smaller herbivorous fish. Humans are exposed at the end of the food chain. More than 400 species of fish can be vectors of ciguatoxins, but generally only a relatively small number of species are regularly incriminated in ciguatera. Ciguateric fish look, taste and smell normal, and detection of toxins in fish remains a problem. More than 20 precursor gambiertoxins and ciguatoxins have been identified in G. toxicus and in herbivorous and carnivorous fish. The toxins become more polar as they undergo oxidative metabolism and pass up the food chain. The main Pacific ciguatoxin (P-CTX-1) causes ciguatera at levels=0.1 microg/kg in the flesh of carnivorous fish. The main Caribbean ciguatoxin (C-CTX-1) is less polar and 10-fold less toxic than P-CTX-1. Ciguatoxins activate sodium ion (Na ) channels, causing cell membrane excitability and instability. Worldwide coral bleaching is now well documented, and there is a strong association between global warming and the bleaching and death of coral. This, together with natural environmental factors such as earthquakes and hurricanes, and man-made factors such as tourism, dock construction, sewage and eutrophication, may create more favourable environments for G. toxicus. While low levels of G. toxicus are found throughout tropical and subtropical waters, the presence of bloom numbers is unpredictable and patchy. Only certain genetic strains produce ciguatoxins, and environmental triggers for increasing toxin production are unknown.", "Ciguatera fish poisoning. A southern California epidemic. Ciguatera fish poisoning results from the bioconcentration of a variety of toxins produced by marine dinoflagellates. Signs and symptoms vary widely, but it usually presents as gastrointestinal and neurologic complaints beginning shortly after the ingestion of fish containing the toxins. Symptoms may persist for months and sometimes even years. Although cases have been reported throughout the United States, epidemics are most common along tropical and subtropical coasts and usually involve the ingestion of large carnivorous fish. We review the literature and report the first epidemic of 25 cases of ciguatera fish poisoning presenting to area hospitals in Southern California that were successfully tracked by the Department of Health Services and isolated to fish caught off the coast of Baja California, Mexico.", "Haff disease after eating salmon. While fish consumption is considered a component of a heart-healthy diet, many illnesses have been associated with eating contaminated fish. The authors describe two cases of muscle weakness and rhabdomyolysis that occurred after eating salmon. Cases of rhabdomyolysis and muscle weakness after consumption of fresh water fish have rarely been reported in the United States but have been frequently reported from the Baltic region. This illness is known as Haff disease. While the etiology is unknown, it is felt to be a toxin. Palytoxin, found in marine fish, has been associated with rhabdomyolysis, and may serve as a model for further study of the suspected toxin responsible for rhabdomyolysis after consumption of fresh water fish. If a case of Haff disease is suspected, contact the Centers for Disease Control and Prevention and collect any uneaten fish, which may be sent for laboratory analysis."], ["VEGETARIAN DIETS AND THE INCIDENCE OF CANCER IN A LOW-RISK POPULATION Background Cancer is the second leading cause of death in the US. Dietary factors account for at least 30% of all cancers in Western countries. Since people do not consume individual foods but rather combinations of them, the assessment of dietary patterns may offer valuable information when determining associations between diet and cancer risk. Methods We examined the association between dietary patterns (non-vegetarians, lacto, pesco, vegan, and semi-vegetarian) and the overall cancer incidence among 69,120 participants of the Adventist Health Study-2. Cancer cases were identified by matching to cancer registries. Cox-proportional hazard regression analysis was performed to estimate hazard ratios, with \u201cattained age\u201d as the time variable. Results 2,939 incident cancer cases were identified. The multivariate HR of overall cancer risk among vegetarians compared to non-vegetarians was statistically significant (HR=0.92; 95%CI: 0.85, 0.99) for both genders combined. Also, a statistically significant association was found between vegetarian diet and cancers of the gastrointestinal tract (HR=0.76; 95%CI: 0.63, 0.90). When analyzing the association of specific vegetarian dietary patterns, vegan diets showed statistically significant protection for overall cancer incidence (HR=0.84; 95%CI: 0.72, 0.99) in both genders combined and for female-specific cancers (HR=0.66; 95%CI: 0.47, 0.92). Lacto-ovo-vegetarians appeared to be associated with decreased risk of cancers of the gastrointestinal system (HR=0.75; 95%CI: 0.60, 0.92). Conclusion Vegetarian diets seem to confer protection against cancer. Impact Vegan diet seems to confer lower risk for overall and female-specific cancer compared to other dietary patterns. The lacto-ovo-vegetarian diets seem to confer protection from cancers of the gastrointestinal tract.", "Diet and cancer of the colon and rectum: a case-control study in China. A case-control study was carried out in Harbin city to assess the role of diet in the aetiology of colorectal cancer. A total of 336 incident cases of histologically confirmed colorectal cancer (111 colon cancer and 225 rectal cancer) and an equal number of controls with other non-neoplastic diseases were interviewed in hospital wards. Data concerning the average frequency of consumption and amount consumed of single food items were obtained by a dietary history questionnaire. Odds ratios and their confidence limits were computed. Multiple regression for risk status was also used. Vegetables, particularly green vegetables, chives and celery, have a strong protective effect against colorectal cancer. Reduced consumption of meat, eggs, bean products and grain was associated with increasing risk for cancer of the rectum. Alcohol intake was found to be an important risk factor for developing colon cancer and male rectal cancer.", "Anti-proliferative activity and chemoprotective effects towards DNA oxidative damage of fresh and cooked Brassicaceae. Epidemiological evidence shows that regular consumption of Brassicaceae is associated with a reduced risk of cancer and heart disease. Cruciferous species are usually processed before eating and the real impact of cooking practices on their bioactive properties is not fully understood. We have evaluated the effect of common cooking practices (boiling, microwaving, and steaming) on the biological activities of broccoli, cauliflower and Brussels sprouts. Anti-proliferative and chemoprotective effects towards DNA oxidative damage of fresh and cooked vegetable extracts were evaluated by 3-(4,5-dimethylthiazol-2-yl)-5-(3-carboxymethoxyphenyl)-2-(4-sulfophenyl)-2H-tetrazolium and Comet assays on HT-29 human colon carcinoma cells. The fresh vegetable extracts showed the highest anti-proliferative and antioxidant activities on HT-29 cells (broccoli>cauliflower = Brussels sprouts). No genotoxic activity was detected in any of the samples tested. The cooking methods that were applied influenced the anti-proliferative activity of Brassica extracts but did not alter considerably the antioxidant activity presented by the raw vegetables. Raw, microwaved, boiled (except broccoli) and steamed vegetable extracts, at different concentrations, presented a protective antioxidative action comparable with vitamin C (1 mm). These data provide new insight into the influence of domestic treatment on the quality of food, which could support the recent epidemiological studies suggesting that consumption of cruciferous vegetables, mainly cooked, may be related to a reduced risk of developing cancer.", "Vegetarian diets: what do we know of their effects on common chronic diseases? A number of studies have evaluated the health of vegetarians. Others have studied the health effects of foods that are preferred or avoided by vegetarians. The purpose of this review is to look critically at the evidence on the health effects of vegetarian diets and to seek possible explanations where results appear to conflict. There is convincing evidence that vegetarians have lower rates of coronary heart disease, largely explained by low LDL cholesterol, probable lower rates of hypertension and diabetes mellitus, and lower prevalence of obesity. Overall, their cancer rates appear to be moderately lower than others living in the same communities, and life expectancy appears to be greater. However, results for specific cancers are much less convincing and require more study. There is evidence that risk of colorectal cancer is lower in vegetarians and in those who eat less meat; however, results from British vegetarians presently disagree, and this needs explanation. It is probable that using the label \u201cvegetarian\u201d as a dietary category is too broad and that our understanding will be served well by dividing vegetarians into more descriptive subtypes. Although vegetarian diets are healthful and are associated with lower risk of several chronic diseases, different types of vegetarians may not experience the same effects on health.", "Targeting cancer stem cells with sulforaphane, a dietary component from broccoli and broccoli sprouts. Many studies have supported the protective effects of broccoli and broccoli sprouts against cancer. The chemopreventive properties of sulforaphane, which is derived from the principal glucosinolate of broccoli and broccoli sprouts, have been extensively studied. Recent research into the effects of sulforaphane on cancer stem cells (CSCs) has drawn lots of interest. CSCs are suggested to be responsible for initiating and maintaining cancer, and to contribute to recurrence and drug resistance. A number of studies have indicated that sulforaphane may target CSCs in different types of cancer through modulation of NF-\u03baB, SHH, epithelial-mesenchymal transition and Wnt/\u03b2-catenin pathways. Combination therapy with sulforaphane and chemotherapy in preclinical settings has shown promising results. In this article, we focus on the effects of sulforaphane on CSCs and self-renewal pathways, as well as giving a brief review of recent human studies using broccoli sprout preparations."], ["The positive and negative health effects of alcohol- and the public health implications. In this paper, the negative and the positive effects of alcohol on health are reviewed. It is first of all established facts that a high alcohol intake implies an increased risk of a large number of health outcomes, such as dementia, breast cancer, colorectal cancer, cirrhosis, upper digestive tract cancer and alcohol dependency. Second, it is justified that alcohol has beneficial effects for some individuals, especially with regard to prevention of thrombosis of the heart. The public health relevance of these results is considered. The sensible drinking limits, used in both the UK and Denmark, of a maximum of 21 drinks per week for men and 14 drinks per week for women seem valid. A broader public health message of the beneficial effects of alcohol does not seem to be of interest in Western societies, where only a very small fraction of the population are non drinkers and may have very good reasons therefore.", "Who benefits most from the cardioprotective properties of alcohol consumption--health freaks or couch potatoes? BACKGROUND: The cardioprotective properties of moderate alcohol consumption, compared with abstinence or heavy drinking, are widely reported, but whether the benefits are experienced equally by all moderate drinkers is less well known. AIMS: To examine the association between average alcohol intake per week and the incidence of fatal and non-fatal myocardial infarction during 17 years of follow-up for 9655 men and women without prevalent disease in the general population; and to test whether the level of cardioprotection differs according to subjects' other health behaviours (healthy, moderately healthy, unhealthy) at entry to the study. METHOD: A longitudinal, British civil service-based cohort study, baseline in 1985-8. RESULTS: A significant benefit of moderate drinking compared with abstinence or heavy drinking was found among those with poor health behaviours (little exercise, poor diet and smokers). No additional benefit from alcohol was found among those with the healthiest behaviour profile (> or =3 hours of vigorous exercise per week, daily fruit or vegetable consumption and non-smokers). CONCLUSION: The cardioprotective benefit from moderate drinking does not apply equally to all drinkers, and this variability should be emphasised in public health messages.", "Molecular mechanisms of alcohol-mediated carcinogenesis. Approximately 3.6% of cancers worldwide derive from chronic alcohol drinking, including those of the upper aerodigestive tract, the liver, the colorectum and the breast. Although the mechanisms for alcohol-associated carcinogenesis are not completely understood, most recent research has focused on acetaldehyde, the first and most toxic ethanol metabolite, as a cancer-causing agent. Ethanol may also stimulate carcinogenesis by inhibiting DNA methylation and by interacting with retinoid metabolism. Alcohol-related carcinogenesis may interact with other factors such as smoking, diet and comorbidities, and depends on genetic susceptibility.", "A risk-benefit analysis of French high fish consumption: a QALY approach. The health risk and the nutritional benefit of a food are usually assessed separately. Toxicologists recommend limiting the consumption of certain fish because of methylmercury; while nutritionists recommend eating more oily fish because of omega 3. A common evaluation is imperative to provide coherent recommendations. In order to evaluate the risks along with the benefits related to fish consumption, a common metric based on the quality-adjusted life year (QALY) method has been used. The impact of a theoretical change from a medium n-3 PUFAs intake to a high intake is studied, in terms of the cardiovascular system (CHD mortality, stroke mortality and morbidity) and on fetal neuronal development (IQ loss or gain). This application can be considered as a sensitive analysis of the model used and looks at the impact of changing the dose-response relationships between cardiovascular diseases and n-3 PUFAs intakes. Results show that increasing fish consumption may have a beneficial impact on health. However, the confidence interval of the overall estimation has a negative lower bound, which means that this increase in fish consumption may have a negative impact due to MeHg contamination. Some limits of the QALY approach are identified. The first concerns determination of the dose-response relationships. The second concerns the economic origins of the approach and of individual preferences. Finally, since only one beneficial aspect and one risk element were studied, consideration should be given to how other beneficial and risk components may be integrated in the model.", "Energy and Fructose From Beverages Sweetened With Sugar or High-Fructose Corn Syrup Pose a Health Risk for Some People Sugar intake in the United States has increased by >40 fold since the American Revolution. The health concerns that have been raised about the amounts of sugar that are in the current diet, primarily as beverages, are the subject of this review. Just less than 50% of the added sugars (sugar and high-fructose corn syrup) are found in soft drinks and fruit drinks. The intake of soft drinks has increased 5-fold between 1950 and 2000. Most meta-analyses have shown that the risk of obesity, diabetes, cardiovascular disease, and metabolic syndrome are related to consumption of beverages sweetened with sugar or high-fructose corn syrup. Calorically sweetened beverage intake has also been related to the risk of nonalcoholic fatty liver disease, and, in men, gout. Calorically sweetened beverages contribute to obesity through their caloric load, and the intake of beverages does not produce a corresponding reduction in the intake of other food, suggesting that beverage calories are \u201cadd-on\u201d calories. The increase in plasma triglyceride concentrations by sugar-sweetened beverages can be attributed to fructose rather than glucose in sugar. Several randomized trials of sugar-containing soft drinks versus low-calorie or calorie-free beverages show that either sugar, 50% of which is fructose, or fructose alone increases triglycerides, body weight, visceral adipose tissue, muscle fat, and liver fat. Fructose is metabolized primarily in the liver. When it is taken up by the liver, ATP decreases rapidly as the phosphate is transferred to fructose in a form that makes it easy to convert to lipid precursors. Fructose intake enhances lipogenesis and the production of uric acid. By worsening blood lipids, contributing to obesity, diabetes, fatty liver, and gout, fructose in the amounts currently consumed is hazardous to the health of some people."], ["The intravenous use of coconut water. Medical resources routinely used for intravenous hydration and resuscitation of critically ill patients may be limited in remote regions of the world. When faced with these shortages, physicians have had to improvise with the available resources, or simply do without. We report the successful use of coconut water as a short-term intravenous hydration fluid for a Solomon Island patient, a laboratory analysis of the local coconuts, and a review of previously documented intravenous coconut use.", "Evidence for acne-promoting effects of milk and other insulinotropic dairy products. Acne vulgaris, the most common skin disease of western civilization, has evolved to an epidemic affecting more than 85% of adolescents. Acne can be regarded as an indicator disease of exaggerated insulinotropic western nutrition. Especially milk and whey protein-based products contribute to elevations of postprandial insulin and basal insulin-like growth factor-I (IGF-I) plasma levels. It is the evolutional principle of mammalian milk to promote growth and support anabolic conditions for the neonate during the nursing period. Whey proteins are most potent inducers of glucose-dependent insulinotropic polypeptide secreted by enteroendocrine K cells which in concert with hydrolyzed whey protein-derived essential amino acids stimulate insulin secretion of pancreatic \u03b2-cells. Increased insulin/IGF-I signaling activates the phosphoinositide-3 kinase/Akt pathway, thereby reducing the nuclear content of the transcription factor FoxO1, the key nutrigenomic regulator of acne target genes. Nuclear FoxO1 deficiency has been linked to all major factors of acne pathogenesis, i.e. androgen receptor transactivation, comedogenesis, increased sebaceous lipogenesis, and follicular inflammation. The elimination of the whey protein-based insulinotropic mechanisms of milk will be the most important future challenge for nutrition research. Both, restriction of milk consumption or generation of less insulinotropic milk will have an enormous impact on the prevention of epidemic western diseases like obesity, diabetes mellitus, cancer, neurodegenerative diseases and acne. Copyright \u00a9 2011 S. Karger AG, Basel.", "Milk is not just food but most likely a genetic transfection system activating mTORC1 signaling for postnatal growth Milk has been recognized to represent a functionally active nutrient system promoting neonatal growth of mammals. Cell growth is regulated by the nutrient-sensitive kinase mechanistic target of rapamycin complex 1 (mTORC1). There is still a lack of information on the mechanisms of mTORC1 up-regulation by milk consumption. This review presents milk as a materno-neonatal relay system functioning by transfer of preferential amino acids, which increase plasma levels of glucose-dependent insulinotropic polypeptide (GIP), glucagon-like peptide-1 (GLP-1), insulin, growth hormone (GH) and insulin-like growth factor-1 (IGF-1) for mTORC1 activation. Importantly, milk exosomes, which regularly contain microRNA-21, most likely represent a genetic transfection system enhancing mTORC1-driven metabolic processes. Whereas human breast milk is the ideal food for infants allowing appropriate postnatal growth and species-specific metabolic programming, persistent high milk signaling during adolescence and adulthood by continued cow\u00b4s milk consumption may promote mTORC1-driven diseases of civilization.", "Milk is not just food but most likely a genetic transfection system activating mTORC1 signaling for postnatal growth Milk has been recognized to represent a functionally active nutrient system promoting neonatal growth of mammals. Cell growth is regulated by the nutrient-sensitive kinase mechanistic target of rapamycin complex 1 (mTORC1). There is still a lack of information on the mechanisms of mTORC1 up-regulation by milk consumption. This review presents milk as a materno-neonatal relay system functioning by transfer of preferential amino acids, which increase plasma levels of glucose-dependent insulinotropic polypeptide (GIP), glucagon-like peptide-1 (GLP-1), insulin, growth hormone (GH) and insulin-like growth factor-1 (IGF-1) for mTORC1 activation. Importantly, milk exosomes, which regularly contain microRNA-21, most likely represent a genetic transfection system enhancing mTORC1-driven metabolic processes. Whereas human breast milk is the ideal food for infants allowing appropriate postnatal growth and species-specific metabolic programming, persistent high milk signaling during adolescence and adulthood by continued cow\u00b4s milk consumption may promote mTORC1-driven diseases of civilization.", "Does Flavanol Intake Influence Mortality from Nitric Oxide-Dependent Processes? Ischemic Heart Disease, Stroke, Diabetes Mellitus, and Cancer in Panama Substantial data suggest that flavonoid-rich food could help prevent cardiovascular disease and cancer. Cocoa is the richest source of flavonoids, but current processing reduces the content substantially. The Kuna living in the San Blas drink a flavanol-rich cocoa as their main beverage, contributing more than 900 mg/day and thus probably have the most flavonoid-rich diet of any population. We used diagnosis on death certificates to compare cause-specific death rates from year 2000 to 2004 in mainland and the San Blas islands where only Kuna live. Our hypothesis was that if the high flavanoid intake and consequent nitric oxide system activation were important the result would be a reduction in the frequency of ischemic heart disease, stroke, diabetes mellitus, and cancer \u2013 all nitric oxide sensitive processes. There were 77,375 deaths in mainland Panama and 558 deaths in the San Blas. In mainland Panama, as anticipated, cardiovascular disease was the leading cause of death (83.4 \u00b1 0.70 age adjusted deaths/100,000) and cancer was second (68.4 \u00b1 1.6). In contrast, the rate of CVD and cancer among island-dwelling Kuna was much lower (9.2 \u00b1 3.1) and (4.4 \u00b1 4.4) respectively. Similarly deaths due to diabetes mellitus were much more common in the mainland (24.1 \u00b1 0.74) than in the San Blas (6.6 \u00b1 1.94). This comparatively lower risk among Kuna in the San Blas from the most common causes of morbidity and mortality in much of the world, possibly reflects a very high flavanol intake and sustained nitric oxide synthesis activation. However, there are many risk factors and an observational study cannot provide definitive evidence."], ["Effect of endurance exercise training and curcumin intake on central arterial hemodynamics in postmenopausal women: pilot study. BACKGROUND: Lifestyle modification (i.e., regular physical activity and diet) is effective in preventing the age-related increase in cardiovascular disease risks. Potential therapeutic effects of curcumin (diferuloylmethane) have been confirmed on various diseases, including cancer and Alzheimer's disease, but the effects of curcumin have not been tested on central arterial hemodynamics. The aim of this pilot study was to test the hypothesis that the regular endurance exercise combined with daily curcumin ingestion lowers the age-related increase in left ventricular (LV) afterload to a greater extent than monotherapy with either intervention alone in postmenopausal women using a randomized, double-blind, placebo-controlled, parallel manner. METHODS: Forty-five women were randomly assigned to four interventions: \\\"placebo ingestion\\\" (n = 11), \\\"curcumin ingestion\\\" (n = 11), \\\"exercise training with placebo ingestion\\\" (n = 11), or \\\"exercise training with curcumin ingestion\\\" (n = 12). Curcumin or placebo pills (150 mg/day) were administered for 8 weeks. Aortic blood pressure (BP) and augmentation index (AIx), an index of LV afterload, were evaluated by pulse wave analysis from tonometrically measured radial arterial pressure waveforms. RESULTS: There were no significant differences in baseline hemodynamic variables among four groups. After the interventions, brachial systolic BP (SBP) significantly decreased in both exercise-trained groups (P < 0.05 for both), whereas aortic SBP significantly decreased only in the combined-treatment (e.g., exercise and curcumin) group (P < 0.05). Heart rate (HR) corrected aortic AIx significantly decreases only in the combined-treatment group. CONCLUSIONS: These findings suggest that regular endurance exercise combined with daily curcumin ingestion may reduce LV afterload to a greater extent than monotherapy with either intervention alone in postmenopausal women.", "The link between erectile and cardiovascular health: the canary in the coal mine. Lifestyle and nutrition have been increasingly recognized as central factors influencing vascular nitric oxide (NO) production and erectile function. This review underscores the importance of NO as the principal mediator influencing cardiovascular health and erectile function. Erectile dysfunction (ED) is associated with smoking, excessive alcohol intake, physical inactivity, abdominal obesity, diabetes, hypertension, and decreased antioxidant defenses, all of which reduce NO production. Better lifestyle choices; physical exercise; improved nutrition and weight control; adequate intake of or supplementation with omega-3 fatty acids, antioxidants, calcium, and folic acid; and replacement of any testosterone deficiency will all improve vascular and erectile function and the response to phosphodiesterase-5 inhibitors, which also increase vascular NO production. More frequent penile-specific exercise improves local endothelial NO production. Excessive intake of vitamin E, calcium, l-arginine, or l-citrulline may impart significant cardiovascular risks. Interventions discussed also lower blood pressure or prevent hypertension. Certain angiotensin II receptor blockers improve erectile function and reduce oxidative stress. In men aged <60 years and in men with diabetes or hypertension, erectile dysfunction can be a critical warning sign for existing or impending cardiovascular disease and risk for death. The antiarrhythmic effect of omega-3 fatty acids may be particularly crucial for these men at greatest risk for sudden death. In conclusion, by better understanding the complex factors influencing erectile and overall vascular health, physicians can help their patients prevent vascular disease and improve erectile function, which provides more immediate motivation for men to improve their lifestyle habits and cardiovascular health. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Treatment of migraine: update on new therapies. PURPOSE OF REVIEW: This review provides a comprehensive selection of the latest clinical trial results in antimigraine treatment. RECENT FINDINGS: The oral calcitonine gene-related peptide antagonist telcagepant is efficacious in acute treatment. Compared to triptans, its efficacy is almost comparable but its tolerance is superior. The same is true for the 5HT-1F agonist lasmiditan, another agent devoid of vascular effects. Triptans, as other drugs, are more efficient if taken early but nonsteroidal anti-inflammatory drugs and analgesics remain useful for acute treatment, according to several meta-analyses. Single-pulse transcranial magnetic stimulation during the aura rendered more patients pain-free (39%) than sham stimulation (22%) in one study. Topiramate could be effective for migrainous vertigo, but it did not prevent transformation to chronic migraine in patients with high attack frequency. Onabotulinumtoxin A was effective for chronic migraine and well tolerated, but the therapeutic gain over placebo was modest; the clinical profile of responders remains to be determined before widespread use. Occipital nerve stimulation was effective in intractable chronic migraine with 39% of responders compared to 6% after sham stimulation. This and other neuromodulation techniques, such as sphenopalatine ganglion stimulation, are promising treatments for medically refractory patients but large controlled trials are necessary. One study suggests that outcome of patent foramen ovale closure in migraine might depend on anatomic and functional characteristics. SUMMARY: Drugs with a better efficacy or side-effect profile than triptans may soon become available for acute treatment. The future may also look brighter for some of the very disabled chronic migraineurs thanks to novel drug and neuromodulation therapies.", "Sensing an improvement: an experimental study to evaluate the use of aromatherapy, massage and periods of rest in an intensive care unit. There is widespread belief that the use of aromatherapy and massage in an intensive care environment offers a means of increasing the quality of sensory input that patients receive, as well as reducing levels of stress and anxiety. Despite a wealth of anecdotal evidence in support of these claims, there have been few objective studies to evaluate the effects of these therapies. In this experimental study 122 patients admitted to a general intensive care unit were randomly allocated to receive either massage, aromatherapy using essential oil of lavender, or a period of rest. Both pre- and post-therapy assessments included physiological stress indicators and patients' evaluation of their anxiety levels, mood and ability to cope with their intensive care experience. Ninety-three patients (77%) were able to complete subjective assessments. There were no statistically significant differences in the physiological stress indicators or observed or reported behaviour of patients' ability to cope following any of the three interventions. However, those patients who received aromatherapy reported significantly greater improvement in their mood and perceived levels of anxiety. They also felt less anxious and more positive immediately following the therapy, although this effect was not sustained or cumulative.", "The role of nerve blocks and botulinum toxin injections in the management of cluster headaches. Cluster headache (CH) is a primary headache syndrome that is classified with the trigeminal autonomic cephalalgias. CH treatment involves three steps: acute attack management, transitional therapy, and preventive therapy. Greater occipital nerve block has been shown to be an effective alternative bridge therapy to oral steroids in CH. Botulinum toxin type A has recently been studied as a new preventive treatment for patients with chronic CH, with limited success."], ["Does Flavanol Intake Influence Mortality from Nitric Oxide-Dependent Processes? Ischemic Heart Disease, Stroke, Diabetes Mellitus, and Cancer in Panama Substantial data suggest that flavonoid-rich food could help prevent cardiovascular disease and cancer. Cocoa is the richest source of flavonoids, but current processing reduces the content substantially. The Kuna living in the San Blas drink a flavanol-rich cocoa as their main beverage, contributing more than 900 mg/day and thus probably have the most flavonoid-rich diet of any population. We used diagnosis on death certificates to compare cause-specific death rates from year 2000 to 2004 in mainland and the San Blas islands where only Kuna live. Our hypothesis was that if the high flavanoid intake and consequent nitric oxide system activation were important the result would be a reduction in the frequency of ischemic heart disease, stroke, diabetes mellitus, and cancer \u2013 all nitric oxide sensitive processes. There were 77,375 deaths in mainland Panama and 558 deaths in the San Blas. In mainland Panama, as anticipated, cardiovascular disease was the leading cause of death (83.4 \u00b1 0.70 age adjusted deaths/100,000) and cancer was second (68.4 \u00b1 1.6). In contrast, the rate of CVD and cancer among island-dwelling Kuna was much lower (9.2 \u00b1 3.1) and (4.4 \u00b1 4.4) respectively. Similarly deaths due to diabetes mellitus were much more common in the mainland (24.1 \u00b1 0.74) than in the San Blas (6.6 \u00b1 1.94). This comparatively lower risk among Kuna in the San Blas from the most common causes of morbidity and mortality in much of the world, possibly reflects a very high flavanol intake and sustained nitric oxide synthesis activation. However, there are many risk factors and an observational study cannot provide definitive evidence.", "Traditional non-Western diets. In traditional cultures, balancing health with a balanced lifestyle was a core belief. The diseases of modern civilization were rare. Indigenous people have patterns of illness very different from Western civilization; yet, they rapidly develop diseases once exposed to Western foods and lifestyles. Food and medicine were interwoven. All cultures used special or functional foods to prevent disease. Food could be used at different times either as food or medicine. Foods, cultivation, and cooking methods maximized community health and well-being. With methods passed down through generations, cooking processes were utilized that enhanced mineral and nutrient bioavailability. This article focuses on what researchers observed about the food traditions of indigenous people, their disease patterns, the use of specific foods, and the environmental factors that affect people who still eat traditional foods.", "Blood pressure, sodium intake, and sodium related hormones in the Yanomamo Indians, a \\\"no-salt\\\" culture. The Yanomamo Indians are an unacculturated tribe inhabiting the tropical equatorial rain forest of northern Brazil and southern Venezuela who do not use salt in their diet. The group therefore presented an unusual opportunity to study the hormonal regulation of sodium metabolism in a culture with life-long extreme restriction of dietary sodium, with parallel observations on blood pressure. Blood pressures increased from the first to second decade but, in constrast to civilized populations, do not systematically increase during subsequent years of life. In twenty-four hour urine collections on adult male Indians, excretion of sodium averaged only 1 plus or minus 1.5 (SD) mEq. Simultaneous plasma renin activities were elevated and comparable to those of civilized subjects placed for brief periods on 10 mEq sodium diets. Similarly, excretion rates of aldosterone equaled those of acculturated subjects on low sodium diets. The findings suggest that the hormonal adjustments to life-long low sodium intakes are similar to those achieved in acute sodium restriction of civilized man. Parenthetically, these elevated levels of aldosterone and renin were probably the norm for man during much of human evolution and suggest that the values observed in civilized controls are depressed by an excessive salt intake in contemporary diets.", "The Yanomami Indians in the INTERSALT Study. OBJECTIVE: To study the distribution and interrelationship among constitutional and biochemical variables with blood pressure (BP) in an population of Yanomami indians. To compare these findings with those of other populations. METHODS: The Yanomami indians were part of the INTERSALT, a study comprising 10,079 males and females, aged from 20 to 59 years, belonging to 52 populations in 32 countries in Africa, the Americas, Asia, and Europe. Each of the 52 centers was required to accrue 200 individuals, 25 participants in each age group. The variables analyzed were as follows: age, sex, arterial BP, urinary sodium and potassium excretion (24-hour urine), body mass index, and alcohol ingestion. RESULTS: The findings in the Yanomami population were as follows: a very low urinary sodium excretion (0.9 mmol/24 h); mean systolic and diastolic BP levels of 95.4 mmHg and 61.4 mmHg, respectively; no cases of hypertension or obesity; and they have no knowledge of alcoholic beverages. Their BP levels do not elevate with age. The urinary sodium excretion relates positively and the urinary potassium excretion relates negatively to systolic BP. This correlation was maintained even when controlled for age and body mass index. CONCLUSION: A positive relation between salt intake and blood pressure was detected in the analysis of a set of diverse populations participating in the INTERSALT Study, including populations such as the Yanomami Indians. The qualitative observation of their lifestyle provided additional information.", "Amla (Emblica officinalis Gaertn), a wonder berry in the treatment and prevention of cancer. Emblica officinalis Gaertn. or Phyllanthus emblica Linn, commonly known as Indian gooseberry or amla, is arguably the most important medicinal plant in the Indian traditional system of medicine, the Ayurveda. Various parts of the plant are used to treat a range of diseases, but the most important is the fruit. The fruit is used either alone or in combination with other plants to treat many ailments such as common cold and fever; as a diuretic, laxative, liver tonic, refrigerant, stomachic, restorative, alterative, antipyretic, anti-inflammatory, hair tonic; to prevent peptic ulcer and dyspepsia, and as a digestive. Preclinical studies have shown that amla possesses antipyretic, analgesic, antitussive, antiatherogenic, adaptogenic, cardioprotective, gastroprotective, antianemia, antihypercholesterolemia, wound healing, antidiarrheal, antiatherosclerotic, hepatoprotective, nephroprotective, and neuroprotective properties. In addition, experimental studies have shown that amla and some of its phytochemicals such as gallic acid, ellagic acid, pyrogallol, some norsesquiterpenoids, corilagin, geraniin, elaeocarpusin, and prodelphinidins B1 and B2 also possess antineoplastic effects. Amla is also reported to possess radiomodulatory, chemomodulatory, chemopreventive effects, free radical scavenging, antioxidant, anti-inflammatory, antimutagenic and immunomodulatory activities, properties that are efficacious in the treatment and prevention of cancer. This review for the first time summarizes the results related to these properties and also emphasizes the aspects that warrant future research to establish its activity and utility as a cancer preventive and therapeutic drug in humans."], ["Stevia (Stevia rebaudiana) a bio-sweetener: a review. Studies revealed that Stevia has been used throughout the world since ancient times for various purposes; for example, as a sweetener and a medicine. We conducted a systematic literature review to summarize and quantify the past and current evidence for Stevia. We searched relevant papers up to 2007 in various databases. As we know that the leaves of Stevia plants have functional and sensory properties superior to those of many other high-potency sweeteners, Stevia is likely to become a major source of high-potency sweetener for the growing natural food market in the future. Although Stevia can be helpful to anyone, there are certain groups who are more likely to benefit from its remarkable sweetening potential. These include diabetic patients, those interested in decreasing caloric intake, and children. Stevia is a small perennial shrub that has been used for centuries as a bio-sweetener and for other medicinal uses such as to lower blood sugar. Its white crystalline compound (stevioside) is the natural herbal sweetener with no calories and is over 100-300 times sweeter than table sugar.", "Sugar substitutes: Health controversy over perceived benefits Sugar is an inseparable part of the food we consume. But too much sugar is not ideal for our teeth and waistline. There have been some controversial suggestions that excessive sugar may play an important role in certain degenerative diseases. So artificial sweeteners or artificially sweetened products continue to attract consumers. A sugar substitute (artificial sweetener) is a food additive that duplicates the effect of sugar in taste, but usually has less food energy. Besides its benefits, animal studies have convincingly proven that artificial sweeteners cause weight gain, brain tumors, bladder cancer and many other health hazards. Some kind of health related side effects including carcinogenicity are also noted in humans. A large number of studies have been carried out on these substances with conclusions ranging from \u201csafe under all conditions\u201d to \u201cunsafe at any dose\u201d. Scientists are divided in their views on the issue of artificial sweetener safety. In scientific as well as in lay publications, supporting studies are often widely referenced while the opposing results are de-emphasized or dismissed. So this review aims to explore the health controversy over perceived benefits of sugar substitutes.", "The effects of high fructose syrup. High fructose corn syrup (HFCS) has become an increasingly common food ingredient in the last 40 years. However, there is concern that HFCS consumption increases the risk for obesity and other adverse health outcomes compared to other caloric sweeteners. The most commonly used types of HFCS (HFCS-42 and HFCS-55) are similar in composition to sucrose (table sugar), consisting of roughly equal amounts of fructose and glucose. The primary difference is that these monosaccharides exist free in solution in HFCS, but in disaccharide form in sucrose. The disaccharide sucrose is easily cleaved in the small intestine, so free fructose and glucose are absorbed from both sucrose and HFCS. The advantage to food manufacturers is that the free monosaccharides in HFCS provide better flavor enhancement, stability, freshness, texture, color, pourability, and consistency in foods in comparison to sucrose. Because the composition of HFCS and sucrose is so similar, particularly on absorption by the body, it appears unlikely that HFCS contributes more to obesity or other conditions than sucrose does. Nevertheless, few studies have evaluated the potentially differential effect of various sweeteners, particularly as they relate to health conditions such as obesity, which develop over relatively long periods of time. Improved nutrient databases are needed to analyze food consumption in epidemiologic studies, as are more strongly designed experimental studies, including those on the mechanism of action and relationship between fructose dose and response. At the present time, there is insufficient evidence to ban or otherwise restrict use of HFCS or other fructose-containing sweeteners in the food supply or to require the use of warning labels on products containing HFCS. Nevertheless, dietary advice to limit consumption of all added caloric sweeteners, including HFCS, is warranted.", "The potential toxicity of artificial sweeteners. Since their discovery, the safety of artificial sweeteners has been controversial. Artificial sweeteners provide the sweetness of sugar without the calories. As public health attention has turned to reversing the obesity epidemic in the United States, more individuals of all ages are choosing to use these products. These choices may be beneficial for those who cannot tolerate sugar in their diets (e.g., diabetics). However, scientists disagree about the relationships between sweeteners and lymphomas, leukemias, cancers of the bladder and brain, chronic fatigue syndrome, Parkinson's disease, Alzheimer's disease, multiple sclerosis, autism, and systemic lupus. Recently these substances have received increased attention due to their effects on glucose regulation. Occupational health nurses need accurate and timely information to counsel individuals regarding the use of these substances. This article provides an overview of types of artificial sweeteners, sweetener history, chemical structure, biological fate, physiological effects, published animal and human studies, and current standards and regulations.", "A critical review of the genetic toxicity of steviol and steviol glycosides. Extracts of the leaves of the stevia plant (Stevia rebaudiana Bertoni) are used to sweeten food and beverages in South America, Japan and China. The components responsible for the sweet properties of the plant are glycosides of steviol, primary stevioside (ent-13-hydroxykaur-16-en-18-oic acid), which is 250-300 times sweeter than sucrose and rebaudiosides A and C. Stevioside and steviol have been subjected to extensive genetic testing. The majority of the findings show no evidence of genotoxic activity. Neither stevioside nor its aglycone steviol have been shown to react directly with DNA or demonstrate genotoxic damage in assays relevant to human risk. The mutagenic activity of steviol and some of its derivatives, exhibited in strain TM677, was not reproduced in the same bacteria having normal DNA repair processes. The single positive in vivo study measuring single-strand DNA breaks in Wistar rat tissues by stevioside, was not confirmed in experiments in mice and appears to be measuring processes other than direct DNA damage. Neither stevioside nor steviol-induced clastogenic effects at extremely high dose levels in vivo. Application of a Weight-of-Evidence approach to assess the genetic toxicology database concludes that these substances do not pose a risk of genetic damage following human consumption."], ["Toxicology of food dyes. BACKGROUND: Food dyes, synthesized originally from coal tar and now petroleum, have long been controversial because of safety concerns. Many dyes have been banned because of their adverse effects on laboratory animals or inadequate testing. CONCLUSIONS: This review finds that all of the nine currently US-approved dyes raise health concerns of varying degrees. Red 3 causes cancer in animals, and there is evidence that several other dyes also are carcinogenic. Three dyes (Red 40, Yellow 5, and Yellow 6) have been found to be contaminated with benzidine or other carcinogens. At least four dyes (Blue 1, Red 40, Yellow 5, and Yellow 6) cause hypersensitivity reactions. Numerous microbiological and rodent studies of Yellow 5 were positive for genotoxicity. Toxicity tests on two dyes (Citrus Red 2 and Orange B) also suggest safety concerns, but Citrus Red 2 is used at low levels and only on some Florida oranges and Orange B has not been used for several years. The inadequacy of much of the testing and the evidence for carcinogenicity, genotoxicity, and hypersensitivity, coupled with the fact that dyes do not improve the safety or nutritional quality of foods, indicates that all of the currently used dyes should be removed from the food supply and replaced, if at all, by safer colorings. It is recommended that regulatory authorities require better and independent toxicity testing, exercise greater caution regarding continued approval of these dyes, and in the future approve only well-tested, safe dyes.", "Synthetic Food Colors and Neurobehavioral Hazards: The View from Environmental Health Research Background: The proposition that synthetic food colors can induce adverse behavioral effects in children was first enunciated in 1975 by Feingold [Why Your Child Is Hyperactive. New York:Random House (1975)], who asserted that elevated sensitivity to food additives underlies the signs of hyperactivity observed in some children. Although the evidence suggested that some unknown proportion of children did respond to synthetic food colors, the U.S. Food and Drug Administration (FDA) interpreted the evidence as inconclusive. A study published in 2007 [McCann et al. Food additives and hyperactive behaviour in 3-year-old and 8/9-year-old children in the community: a randomised, double-blinded, placebo-controlled trial. Lancet 370:1560\u20131567 (2007)] drew renewed attention to the hypothesis because of the study\u2019s size and scope. It led the FDA to review the evidence, hold a public hearing, and seek the advice of its Food Advisory Committee. In preparation for the hearing, the FDA reviewed the available evidence and concluded that it did not warrant further agency action. Objectives: In this commentary I examine the basis of the FDA\u2019s position, the elements of the review that led to its decision and that of the Food Advisory Committee, and the reasons that this is an environmental health issue. Discussion: The FDA review confined itself, in essence, to the clinical diagnosis of hyperactivity, as did the charge to the committee, rather than asking the broader environmental question of behavioral effects in the general population; it failed to recognize the significance of vulnerable subpopulations; and it misinterpreted the meaning of effect size as a criterion of risk. The FDA\u2019s response would have benefited from adopting the viewpoints and perspectives common to environmental health research. At the same time, the food color debate offers a lesson to environmental health researchers; namely, too narrow a focus on a single outcome or criterion can be misleading.", "Food additives and hyperactivity Evidence supports a trial period of eliminating colourings and preservatives from the diet", "Carcinogenicity and regulation of caramel colorings. 2- and 4-methylimidazoles are present as contaminants in caramel colorings manufactured with ammonia catalysts. Both contaminants have been shown to induce cancer in animals and may be present in caramel colorings in amounts that exceed federal guidelines. California requires warning notices on products that could lead to consumption of more than 30 micrograms per day. The US Food and Drug Administration should bar the use of excessively contaminated caramel coloring in food.", "The significance of azo-reduction in the mutagenesis and carcinogenesis of azo dyes. Azo dyes are widely used in textile, printing, cosmetic, drug and food-processing industries. They are also used extensively in laboratories as either biological stains or pH indicators. The extent of such use is related to the degree of industrialization. Since intestinal cancer is more common in highly industrialized countries, a possible connection may exist between the increase in the number of cancer cases and the use of azo dyes. Azo dyes can be reduced to aromatic amines by the intestinal microflora. The mutagenicity of a number of azo dyes is reviewed in this paper. They include Trypan Blue, Ponceau 3R, Pinceau 2R, Methyl Red, Methyl Yellow, Methyl Orange, Lithol Red, Orange I, Orange II, 4-Phenylazo-Naphthylamine, Sudan I, Sudan IV, Acid Alizarin Violet N, Fast Garnet GBC, Allura Red, Ponceau SX, Sunset Yellow, Tartrazine, Citrus Red No. 2, Orange B, Yellow AB, Carmoisine, Mercury Orange, Ponceau S, Versatint Blue, Phenylazophenol, Evan's Blue and their degraded aromatic amines. The significance of azo reduction in the mutagenesis and carcinogenesis of azo dyes is discussed."], ["A new proposed guidance system for beverage consumption in the United States. The Beverage Guidance Panel was assembled to provide guidance on the relative health and nutritional benefits and risks of various beverage categories. The beverage panel was initiated by the first author. The Panel's purpose is to attempt to systematically review the literature on beverages and health and provide guidance to the consumer. An additional purpose of the Panel is to develop a deeper dialog among the scientific community on overall beverage consumption patterns in the United States and on the great potential to change this pattern as a way to improve health. Over the past several decades, levels of overweight and obesity have increased across all population groups in the United States. Concurrently, an increased daily intake of 150-300 kcal (for different age-sex groups) has occurred, with approximately 50% of the increased calories coming from the consumption of calorically sweetened beverages. The panel ranked beverages from the lowest to the highest value based on caloric and nutrient contents and related health benefits and risks. Drinking water was ranked as the preferred beverage to fulfill daily water needs and was followed in decreasing value by tea and coffee, low-fat (1.5% or 1%) and skim (nonfat) milk and soy beverages, noncalorically sweetened beverages, beverages with some nutritional benefits (fruit and vegetable juices, whole milk, alcohol, and sports drinks), and calorically sweetened, nutrient-poor beverages. The Panel recommends that the consumption of beverages with no or few calories should take precedence over the consumption of beverages with more calories.", "High dietary antioxidant intakes are associated with decreased chromosome translocation frequency in airline pilots Background: Dietary antioxidants may protect against DNA damage induced by endogenous and exogenous sources, including ionizing radiation (IR), but data from IR-exposed human populations are limited. Objective: The objective was to examine the association between the frequency of chromosome translocations, as a biomarker of cumulative DNA damage, and intakes of vitamins C and E and carotenoids in 82 male airline pilots. Design: Dietary intakes were estimated by using a self-administered semiquantitative food-frequency questionnaire. Translocations were scored by using fluorescence in situ hybridization with whole chromosome paints. Negative binomial regression was used to estimate rate ratios and 95% CIs, adjusted for potential confounders. Results: Significant and inverse associations were observed between translocation frequency and intakes of vitamin C, \u03b2-carotene, \u03b2-cryptoxanthin, and lutein-zeaxanthin from food (P < 0.05). Translocation frequency was not associated with the intake of vitamin E, \u03b1-carotene, or lycopene from food; total vitamin C or E from food and supplements; or vitamin C or E or multivitamin supplements. The adjusted rate ratios (95% CI) for \u2265median compared with 40 fold since the American Revolution. The health concerns that have been raised about the amounts of sugar that are in the current diet, primarily as beverages, are the subject of this review. Just less than 50% of the added sugars (sugar and high-fructose corn syrup) are found in soft drinks and fruit drinks. The intake of soft drinks has increased 5-fold between 1950 and 2000. Most meta-analyses have shown that the risk of obesity, diabetes, cardiovascular disease, and metabolic syndrome are related to consumption of beverages sweetened with sugar or high-fructose corn syrup. Calorically sweetened beverage intake has also been related to the risk of nonalcoholic fatty liver disease, and, in men, gout. Calorically sweetened beverages contribute to obesity through their caloric load, and the intake of beverages does not produce a corresponding reduction in the intake of other food, suggesting that beverage calories are \u201cadd-on\u201d calories. The increase in plasma triglyceride concentrations by sugar-sweetened beverages can be attributed to fructose rather than glucose in sugar. Several randomized trials of sugar-containing soft drinks versus low-calorie or calorie-free beverages show that either sugar, 50% of which is fructose, or fructose alone increases triglycerides, body weight, visceral adipose tissue, muscle fat, and liver fat. Fructose is metabolized primarily in the liver. When it is taken up by the liver, ATP decreases rapidly as the phosphate is transferred to fructose in a form that makes it easy to convert to lipid precursors. Fructose intake enhances lipogenesis and the production of uric acid. By worsening blood lipids, contributing to obesity, diabetes, fatty liver, and gout, fructose in the amounts currently consumed is hazardous to the health of some people.", "Dietary sugar and body weight: have we reached a crisis in the epidemic of obesity and diabetes?: health be damned! Pour on the sugar. Sugar-sweetened drinks have been associated with several health problems. In the point narrative as presented below, we provide our opinion and review of the data to date that we need to reconsider consumption of dietary sugar based on the growing concern of obesity and type 2 diabetes. In the counterpoint narrative following our contribution, Drs. Kahn and Sievenpiper provide a defense and suggest that dietary sugar is not the culprit. Data from the National Health and Nutrition Examination Survey and U.S. Department of Agriculture dietary surveys along with commercial Homescan data on household purchases were used to understand changes in sugar and fructose consumption. Meta-analyses and randomized clinical trials were used to evaluate outcomes of beverage and fructose intake. About 75% of all foods and beverages contain added sugar in a large array of forms. Consumption of soft drinks has increased fivefold since 1950. Meta-analyses suggest that consumption of sugar-sweetened beverages (SSBs) is related to the risk of diabetes, the metabolic syndrome, and cardiovascular disease. Drinking two 16-ounce SSBs per day for 6 months induced features of the metabolic syndrome and fatty liver. Randomized controlled trials in children and adults lasting 6 months to 2 years have shown that lowering the intake of soft drinks reduced weight gain. Recent studies suggest a gene-SSB potential relationship. Consumption of calorie-sweetened beverages has continued to increase and plays a role in the epidemic of obesity, the metabolic syndrome, and fatty liver disease. Reducing intake of soft drinks is associated with less weight gain.", "Asthma induced by sulphur dioxide, benzoate and tartrazine contained in orange drinks. Of 272 patients with asthma, thirty (11%) gave a history of exacerbations occurring after ingestion, solutions of orange orange drinks. Fourteen of these were given provocation tests by drinking, on separate occasions of sulphur dioxide, sodium benzoate and tartrazine, which are present in all orange drinks. Eight reacted to sulphur dioxide with a fall in FEV1, four to sodium benzoate and one to tartrazine, and four did not react to any of these agents. Three of the benzoate patients were also sensitive to sulphur dioxide. The sulphur dioxide sensitive patients were predominantly young, with extrinsic asthma. The benzoate sensitive patients were predominantly middle-aged and the proportion with intrinsic asthma was higher. Prior inhalation of sodium cromoglycate by four patients inhibited the reaction to these substances. Sulphur dioxide has not previously been reported to cause exacerbations of asthma when ingested as a food preservative. It is used as a preservative in a wide range of acidic beverages and foods, and should be considered as possibly causal in patients suffering from apparently cryptogenic asthma, and asthma seemingly due to food allergy."], ["The total antioxidant content of more than 3100 foods, beverages, spices, herbs and supplements used worldwide Background A plant-based diet protects against chronic oxidative stress-related diseases. Dietary plants contain variable chemical families and amounts of antioxidants. It has been hypothesized that plant antioxidants may contribute to the beneficial health effects of dietary plants. Our objective was to develop a comprehensive food database consisting of the total antioxidant content of typical foods as well as other dietary items such as traditional medicine plants, herbs and spices and dietary supplements. This database is intended for use in a wide range of nutritional research, from in vitro and cell and animal studies, to clinical trials and nutritional epidemiological studies. Methods We procured samples from countries worldwide and assayed the samples for their total antioxidant content using a modified version of the FRAP assay. Results and sample information (such as country of origin, product and/or brand name) were registered for each individual food sample and constitute the Antioxidant Food Table. Results The results demonstrate that there are several thousand-fold differences in antioxidant content of foods. Spices, herbs and supplements include the most antioxidant rich products in our study, some exceptionally high. Berries, fruits, nuts, chocolate, vegetables and products thereof constitute common foods and beverages with high antioxidant values. Conclusions This database is to our best knowledge the most comprehensive Antioxidant Food Database published and it shows that plant-based foods introduce significantly more antioxidants into human diet than non-plant foods. Because of the large variations observed between otherwise comparable food samples the study emphasizes the importance of using a comprehensive database combined with a detailed system for food registration in clinical and epidemiological studies. The present antioxidant database is therefore an essential research tool to further elucidate the potential health effects of phytochemical antioxidants in diet.", "The total antioxidant content of more than 3100 foods, beverages, spices, herbs and supplements used worldwide Background A plant-based diet protects against chronic oxidative stress-related diseases. Dietary plants contain variable chemical families and amounts of antioxidants. It has been hypothesized that plant antioxidants may contribute to the beneficial health effects of dietary plants. Our objective was to develop a comprehensive food database consisting of the total antioxidant content of typical foods as well as other dietary items such as traditional medicine plants, herbs and spices and dietary supplements. This database is intended for use in a wide range of nutritional research, from in vitro and cell and animal studies, to clinical trials and nutritional epidemiological studies. Methods We procured samples from countries worldwide and assayed the samples for their total antioxidant content using a modified version of the FRAP assay. Results and sample information (such as country of origin, product and/or brand name) were registered for each individual food sample and constitute the Antioxidant Food Table. Results The results demonstrate that there are several thousand-fold differences in antioxidant content of foods. Spices, herbs and supplements include the most antioxidant rich products in our study, some exceptionally high. Berries, fruits, nuts, chocolate, vegetables and products thereof constitute common foods and beverages with high antioxidant values. Conclusions This database is to our best knowledge the most comprehensive Antioxidant Food Database published and it shows that plant-based foods introduce significantly more antioxidants into human diet than non-plant foods. Because of the large variations observed between otherwise comparable food samples the study emphasizes the importance of using a comprehensive database combined with a detailed system for food registration in clinical and epidemiological studies. The present antioxidant database is therefore an essential research tool to further elucidate the potential health effects of phytochemical antioxidants in diet.", "Lipophilic and hydrophilic antioxidant capacities of common foods in the United States. Both lipophilic and hydrophilic antioxidant capacities were determined using the oxygen radical absorbance capacity (ORAC(FL)) assay with fluorescein as the fluorescent probe and 2,2'-azobis(2-amidinopropane) dihydrochloride as a peroxyl radical generator on over 100 different kinds of foods, including fruits, vegetables, nuts, dried fruits, spices, cereals, infant, and other foods. Most of the foods were collected from four different regions and during two different seasons in U.S. markets. Total phenolics of each sample were also measured using the Folin-Ciocalteu reagent. Hydrophilic ORAC(FL) values (H-ORAC(FL)) ranged from 0.87 to 2641 micromol of Trolox equivalents (TE)/g among all of the foods, whereas lipophilic ORAC(FL) values (L-ORAC(FL)) ranged from 0.07 to 1611 micromol of TE/g. Generally, L-ORAC(FL) values were <10% of the H-ORAC(FL) values except for a very few samples. Total antioxidant capacity was calculated by combining L-ORAC(FL) and H-ORAC(FL). Differences of ORAC(FL) values in fruits and vegetables from different seasons and regions were relatively large for some foods but could not be analyzed in detail because of the sampling scheme. Two different processing methods, cooking and peeling, were used on selected foods to evaluate the impact of processing on ORAC(FL). The data demonstrated that processing can have significant effects on ORAC(FL). Considering all of the foods analyzed, the relationship between TP and H-ORAC(FL) showed a very weak correlation. Total hydrophilic and lipophilic antioxidant capacity intakes were calculated to be 5558 and 166 micromol of TE/day, respectively, on the basis of data from the USDA Continuing Survey of Food Intakes by Individuals (1994-1996).", "A systematic screening of total antioxidants in dietary plants. A predominantly plant-based diet reduces the risk for development of several chronic diseases. It is often assumed that antioxidants contribute to this protection, but results from intervention trials with single antioxidants administered as supplements quite consistently do not support any benefit. Because dietary plants contain several hundred different antioxidants, it would be useful to know the total concentration of electron-donating antioxidants (i.e., reductants) in individual items. Such data might be useful in the identification of the most beneficial dietary plants. We have assessed systematically total antioxidants in a variety of dietary plants used worldwide, including various fruits, berries, vegetables, cereals, nuts and pulses. When possible, we analyzed three or more samples of dietary plants from three different geographic regions in the world. Total antioxidants was assessed by the reduction of Fe(3+) to Fe(2+) (i.e., the FRAP assay), which occurred rapidly with all reductants with half-reaction reduction potentials above that of Fe(3+)/Fe(2+). The values, therefore, expressed the corresponding concentration of electron-donating antioxidants. Our results demonstrated that there is more than a 1000-fold difference among total antioxidants in various dietary plants. Plants that contain most antioxidants included members of several families, such as Rosaceae (dog rose, sour cherry, blackberry, strawberry, raspberry), Empetraceae (crowberry), Ericaceae (blueberry), Grossulariaceae (black currant), Juglandaceae (walnut), Asteraceae (sunflower seed), Punicaceae (pomegranate) and Zingiberaceae (ginger). In a Norwegian diet, fruits, berries and cereals contributed 43.6%, 27.1% and 11.7%, respectively, of the total intake of plant antioxidants. Vegetables contributed only 8.9%. The systematic analysis presented here will facilitate research into the nutritional role of the combined effect of antioxidants in dietary plants.", "Creation of a databank for content of antioxidants in food products by an amperometric method. Oxidative stress, i.e. excessive content of reactionary, oxygen, and nitrogen compounds (ROAC), including free radicals, is one of the causes of various dangerous diseases as well as premature aging. The adverse effect of free radicals can be neutralized by antioxidants. In order to carry out antioxidant therapy, one needs to know the contents of antioxidants in food products. We have created the databank for the contents of antioxidants in 1,140 food products, beverages, etc. Apart from water-soluble antioxidants, fat-soluble antioxidants in dairy and fish products, cacao, chocolate, nuts etc. were determined for the first time using an amperometric method."], ["Calcium absorption in Australian osteopenic post-menopausal women: an acute comparative study of fortified soymilk to cows' milk. Calcium loss after menopause increases the risk of osteoporosis in aging women. Soymilk is often consumed to reduce menopausal symptoms, although in its native form, it contains significantly less calcium than cow's milk. Moreover, when calcium is added as a fortificant, it may not be absorbed efficiently. This study compares calcium absorption from soymilk fortified with a proprietary phosphate of calcium versus absorption from cow's milk. Preliminary studies compared methods for labelling the calcium fortificant either before or after its addition to soymilk. It was established that fortificant labelled after it was added to soymilk had a tracer distribution pattern very similar to that shown by fortificant labelled before adding to soymilk, provided a heat treatment (90?C for 30 min) was applied. This method was therefore used for further bioavailability studies. Calcium absorption from fortified soy milk compared to cow's milk was examined using a randomised single-blind acute cross-over design study in 12 osteopenic post-menopausal women aged (mean +/- SD) 56.7+/-5.3 years, with a body mass index of 26.5+/-5.6 kg/m2. Participants consumed 20 mL of test milk labelled after addition of fortificant with 185 kBq of 45Ca in 44 mg of calcium carrier, allowing the determination of the hourly fractional calcium absorption rate (alpha) using a single isotope radiocalcium test. The mean hourly fractional calcium absorption from fortified soymilk was found to be comparable to that of cows' milk: alpha = 0.65+/-0.19 and alpha =0.66+/-0.22, p>0.05, respectively.", "Comparative fracture risk in vegetarians and nonvegetarians in EPIC-Oxford. OBJECTIVE: To compare fracture rates in four diet groups (meat eaters, fish eaters, vegetarians and vegans) in the Oxford cohort of the European Prospective Investigation into Cancer and Nutrition (EPIC-Oxford). DESIGN: Prospective cohort study of self-reported fracture risk at follow-up. SETTING: The United Kingdom. SUBJECTS: A total of 7947 men and 26,749 women aged 20-89 years, including 19,249 meat eaters, 4901 fish eaters, 9420 vegetarians and 1126 vegans, recruited by postal methods and through general practice surgeries. METHODS: Cox regression. RESULTS: Over an average of 5.2 years of follow-up, 343 men and 1555 women reported one or more fractures. Compared with meat eaters, fracture incidence rate ratios in men and women combined adjusted for sex, age and non-dietary factors were 1.01 (95% CI 0.88-1.17) for fish eaters, 1.00 (0.89-1.13) for vegetarians and 1.30 (1.02-1.66) for vegans. After further adjustment for dietary energy and calcium intake the incidence rate ratio among vegans compared with meat eaters was 1.15 (0.89-1.49). Among subjects consuming at least 525 mg/day calcium the corresponding incidence rate ratios were 1.05 (0.90-1.21) for fish eaters, 1.02 (0.90-1.15) for vegetarians and 1.00 (0.69-1.44) for vegans. CONCLUSIONS: In this population, fracture risk was similar for meat eaters, fish eaters and vegetarians. The higher fracture risk in the vegans appeared to be a consequence of their considerably lower mean calcium intake. An adequate calcium intake is essential for bone health, irrespective of dietary preferences. SPONSORSHIP: The EPIC-Oxford study is supported by The Medical Research Council and Cancer Research UK.", "Differences among total and in vitro digestible phosphorus content of meat and milk products. OBJECTIVE: Meat and milk products are important sources of dietary phosphorus (P) and protein. The use of P additives is common both in processed cheese and meat products. Measurement of in\u00a0vitro digestible phosphorus (DP) content of foods may reflect absorbability of P. The objective of this study was to measure both total phosphorus (TP) and DP contents of selected meat and milk products and to compare amounts of TP and DP and the proportion of DP to TP among different foods. METHODS: TP and DP contents of 21 meat and milk products were measured by inductively coupled plasma optical emission spectrometry (ICP-OES). In DP analysis, samples were digested enzymatically, in principle, in the same way as in the alimentary canal before the analyses. The most popular national brands of meat and milk products were chosen for analysis. RESULTS: The highest TP and DP contents were found in processed and hard cheeses; the lowest, in milk and cottage cheese. TP and DP contents in sausages and cold cuts were lower than those in cheeses. Chicken, pork, beef, and rainbow trout contained similar amounts of TP, but slightly more variation was found in their DP contents. CONCLUSIONS: Foods containing P additives have a high content of DP. Our study confirms that cottage cheese and unenhanced meats are better choices than processed or hard cheeses, sausages, and cold cuts for chronic kidney disease patients, based on their lower P-to-protein ratios and sodium contents. The results support previous findings of better P absorbability in foods of animal origin than in, for example, legumes. Copyright \u00a9 2012 National Kidney Foundation, Inc. Published by Elsevier Inc. All rights reserved.", "Differences among total and in\u00a0vitro digestible phosphorus content of plant foods and beverages. OBJECTIVE: Among plant foods, grain products, legumes, and seeds are important sources of phosphorus (P). Current data on P content and absorbability of P from these foods are lacking. Measurement of in\u00a0vitro digestible P (DP) content of foods may reflect absorbability of P. The objective of this study was to measure both total phosphorus (TP) and DP contents of selected foods and to compare the amounts of TP and DP and the proportion of DP to TP among different foods. METHODS: TP and DP content of 21 foods and drinks of plant origin were measured by inductively coupled plasma optical emission spectrometry. In DP analysis, samples were digested enzymatically in principle in the same way as in the alimentary canal before P analyses. The most popular national brands were chosen for analysis. RESULTS: The highest amount of TP (667 mg/100 g) was found in sesame seeds with hull, which also had the lowest percentage of DP (6%) to TP. Instead, in cola drinks and beer, the percentage of DP to TP was 87 to 100% (13 to 22 mg/100 g). In cereal products, the highest TP content (216 mg/100 g) and DP proportion (100%) were present in industrial muffins, which contain sodium phosphate as a leavening agent. Legumes contained an average DP content of 83 mg/100 g (38% of TP). CONCLUSION: Absorbability of P may differ substantially among different plant foods. Despite high TP content, legumes may be a relatively poor P source. In foods containing phosphate additives, the proportion of DP is high, which supports previous conclusions of the effective absorbability of P from P additives. Copyright \u00a9 2012 National Kidney Foundation, Inc. Published by Elsevier Inc. All rights reserved.", "Cadmium bioavailability from vegetable and animal-based foods assessed with in vitro digestion/caco-2 cell model. BACKGROUND: Chronic dietary cadmium (Cd) exposure results in kidney dysfunction and decrease in bone mineral density. OBJECTIVE: To determine and compare the bioavailability of Cd from vegetable and animal-based foods. MATERIAL AND METHOD: Caco-2 cells were exposed to Cd in boiled pig kidney, ark shell, kale, raw kale, mixed boiled pig kidney with raw kale and CdCl2 after in vitro digestion. Then cellular Cd uptake from the digests and reference CdCl2 solution was measured by atomic absorption spectrometry. RESULTS: Cd bioavailability from animal-based foods was higher than that from vegetable-based foods. In addition, raw kale exhibited an inhibitory effect on Cd bioavailability when mixed with boiled pig kidney. However Cd in kale was increasingly absorbed after boiling. CONCLUSION: Cd binding to different molecular species, other food components in vegetable and animal-based foods, food combination, as well as cooking processes influenced the uptake of dietary Cd. A relative bioavailability factor accounted for the food matrix might be necessary for exposure assessment and consequently for estimation and prevention of the risk of dietary Cd."], ["Vitamin and mineral supplements in the primary prevention of cardiovascular disease and cancer: An updated systematic evidence review for the U.S. ... BACKGROUND: Vitamin and mineral supplements are commonly used to prevent chronic diseases. PURPOSE: To systematically review evidence for the benefit and harms of vitamin and mineral supplements in community-dwelling, nutrient-sufficient adults for the primary prevention of cardiovascular disease (CVD) and cancer. DATA SOURCES: MEDLINE, Embase, Cochrane Central Register of Controlled Trials, Cochrane Database of Systematic Reviews, and Database of s of Reviews of Effects were searched from January 2005 to 29 January 2013, with manual searches of reference lists and gray literature. STUDY SELECTION: Two investigators independently selected and reviewed fair- and good-quality trials for benefit and fair- and good-quality trials and observational studies for harms. DATA EXTRACTION: Dual quality assessments and data abstraction. DATA SYNTHESIS: Two large trials (n = 27 658) reported lower cancer incidence in men taking a multivitamin for more than 10 years (pooled unadjusted relative risk, 0.93 [95% CI, 0.87 to 0.99]). The study that included women showed no effect in that group. High-quality studies (k = 24; n = 324 653) of single and paired nutrients (such as vitamins A, C, or D; folic acid; selenium; or calcium) were scant and heterogeneous and showed no clear evidence of benefit or harm. Neither vitamin E nor \u03b2-carotene prevented CVD or cancer, and \u03b2-carotene increased lung cancer risk in smokers. LIMITATIONS: The analysis included only primary prevention studies in adults without known nutritional deficiencies. Studies were conducted in older individuals and included various supplements and doses under the set upper tolerable limits. Duration of most studies was less than 10 years. CONCLUSION: Limited evidence supports any benefit from vitamin and mineral supplementation for the prevention of cancer or CVD. Two trials found a small, borderline-significant benefit from multivitamin supplements on cancer in men only and no effect on CVD. PRIMARY FUNDING SOURCE: Agency for Healthcare Research and Quality.", "Multivitamin-multimineral supplementation and mortality: a meta-analysis of randomized controlled trials. BACKGROUND: Multivitamins are the most commonly used supplement in the developed world. Recent epidemiologic findings suggest that multivitamin use increases the risk of mortality. OBJECTIVE: We aimed to determine whether multivitamin-multimineral treatment, used for primary or secondary prevention, increases the risk of mortality in independently living adults. DESIGN: We performed a meta-analysis of randomized controlled trials. Multiple electronic databases were systematically searched from March to October 2012. Randomized controlled primary or secondary prevention trials were considered for inclusion. Eligible trials investigated daily multivitamin-multimineral supplementation for \u22651 y. Cohorts described as institutionalized or as having terminal illness (tertiary prevention) were excluded. The number of deaths and the sample size of each study arm were extracted independently by 2 researchers. Twenty-one articles were included in the analysis, which generated a total pooled sample of 91,074 people and 8794 deaths. These trials were pooled in a meta-analysis, and the outcomes were expressed as RRs and 95% CIs. RESULTS: The average age of the pooled sample was 62 y, and the average duration of supplementation was 43 mo. Across all studies, no effect of multivitamin-multimineral treatment on all-cause mortality (RR: 0.98; 95% CI: 0.94, 1.02) was observed. There was a trend for a reduced risk of all-cause mortality across primary prevention trials (RR: 0.94; 95% CI: 0.89, 1.00). Multivitamin-multimineral treatment had no effect on mortality due to vascular causes (RR: 1.01; 95% CI: 0.93, 1.09) or cancer (RR: 0.96; 95% CI: 0.88, 1.04). No statistical evidence of heterogeneity or publication bias was observed. CONCLUSION: Multivitamin-multimineral treatment has no effect on mortality risk.", "Fostering antioxidant defences: up-regulation of antioxidant genes or antioxidant supplementation? Vitamins have traditionally been considered as food components that are required in the normal diet to prevent deficiencies. However, a newer concept of the function of vitamins in nutrition has taken them beyond simply prevention of deficiency symptoms. This concept considers that many vitamins, when taken in relatively large doses, have important functions beyond preventing deficiencies. Linus Pauling was instrumental in putting forward this concept, particularly for vitamin C. Thus, relatively high intakes of vitamins, and in particular vitamins C and E which are antioxidants, are considered to be healthy for the human population. This may be true in some special situations such as, for instance, the prevention of Alzheimer's disease progression. However, recent epidemiological evidence has not supported the claim that antioxidant vitamins increase well-being and prolong life span. In fact, vitamin supplementation may be even detrimental and reduce life span. A new concept that we would like to put forward is that nutrients up-regulate the endogenous antioxidant defences. This is particularly true in the case of phytoestrogens for example, which bind to oestrogen receptors and eventually up-regulate the expression of antioxidant genes. In this review we discuss the pros and cons of antioxidant vitamin supplementation and also the possibility that the ingestion of some nutrients may be very effective in increasing antioxidant defences by up-regulating the activity of antioxidant enzymes which are normally present in the cell.", "Safety considerations and potential interactions of vitamins: should vitamins be considered drugs? OBJECTIVE: To examine adverse effects, adverse events, and potential interactions of vitamins in light of their current prevalence of use, and to discuss whether vitamins should be considered over-the-counter drugs or natural health products/dietary supplements. DATA SOURCES: We performed a MEDLINE/PubMed search, explored 4 online databases (Medline Plus, Drug Digest, Natural Medicine Comprehensive Database, and the database of the University of Maryland), and examined reference lists of included studies published from 1966 through October 2009. STUDY SELECTION AND DATA EXTRACTION: The studies were reviewed, with an emphasis on randomized controlled clinical trials. We included articles with the most clinically important information with regard to adverse events and interactions. DATA SYNTHESIS: Vitamins are used by over one third of the North American population. Vitamins have documented adverse effects and toxicities, and most have documented interactions with drugs. While some vitamins (biotin, pantothenic acid, riboflavin, thiamine, vitamin B(12), vitamin K) have minor and reversible adverse effects, others, such as fat-soluble vitamins (A, E, D), can cause serious adverse events. Two water-soluble vitamins, folic acid and niacin, can also have significant toxicities and adverse events. CONCLUSIONS: Our recommendation is that vitamins A, E, D, folic acid, and niacin should be categorized as over-the-counter medications. Labeling of vitamins, especially those intended for children and other vulnerable groups, should include information on possible toxicities, dosing, recommended upper intake limits, and concurrent use with other products. Vitamin A should be excluded from multivitamin supplements and food fortificants.", "Review of the efficacy of green tea, isoflavones and aloe vera supplements based on randomised controlled trials. We assess the evidence for health benefits of three commonly consumed plant food supplements (PFS), green tea, isoflavone and aloe vera, based on published systematic reviews of randomised controlled trials (RCTs). Whilst the potential benefits of green tea have been reported in a wide range of health areas, it is only in the area of the metabolic syndrome that the number of RCTs is approaching sufficient to judge such efficacy. Isoflavone supplements are widely used, and RCTs indicate that they affect bone resorption at lower doses in postmenopausal women undergoing estrogen-related bone loss, but this is only translated to attenuation of bone loss at higher doses of isoflavones. A systematic review on RCTs concluded that the effects of isoflavones on hot flashes in postmenopausal women were highly variable and no conclusions could be drawn. Despite the popularity of aloe vera as a PFS, the evaluation of its efficacy as a coadjuvant therapy for certain metabolic or digestive pathologies remains scarce; it constitutes a typical example of a naturally occurring ingredient whose efficacy in topical applications presupposes its efficacy in systemic applications. Nevertheless, its possible toxic effects on oral consumption call for caution in its utility as a PFS. Since 2007, efficacy evaluation of PFS in Europe has been covered by European Union Nutrition and Health Claims legislation. The European Food Safety Authority has adopted an approach relying on RCTs, while medicinal effects are accepted based on traditional use. In general, there are insufficient RCTs for claims to be made, and conclusive results on PFS should be obtained in the future by conducting studies with more homogeneous populations, by using supplements with optimised and measured bioavailability, and by conducting larger RCTs."], ["Chocolate, lifestyle, and health. Interest in the biological activities of cocoa polyphenols is increasing steadily. In fact, the high polyphenol content of cocoa, coupled with its widespread presence in many food items, render this food of particular interest from the nutritional and \\\"pharmacological\\\" viewpoints. This paper summarizes the new findings and developments regarding the effects of cocoa and chocolate consumption on human health as presented at the International Conference \\\"Chocolate, Lifestyle, and Health\\\" (Milan, Italy, March 2, 2007) regarding the effects of cocoa and chocolate consumption on human health.", "Chocolate/cocoa and human health: a review. Chocolate/cocoa has been known for its good taste and proposed health effects for centuries. Earlier, chocolate used to be criticised for its fat content and its consumption was a sin rather than a remedy, associated with acne, caries, obesity, high blood pressure, coronary artery disease and diabetes. Therefore, many physicians tended to warn patients about the potential health hazards of consuming large amounts of chocolate. However, the recent discovery of biologically active phenolic compounds in cocoa has changed this perception and stimulated research on its effects in ageing, oxidative stress, blood pressure regulation, and atherosclerosis. Today, chocolate is lauded for its tremendous antioxidant potential. However, in many studies, contradictory results and concerns about methodological issues have made it hard for health professionals and the public to understand the available evidence on chocolate's effects on health. The purpose of this review is to interpret research done in the last decade on the benefits and risks of chocolate consumption.", "Habitual Chocolate Consumption May Increase Body Weight in a Dose-Response Manner Objective Habitual chocolate intake was recently found to be associated with lower body weight in three cross-sectional epidemiological studies. Our objective was to assess whether these cross-sectional results hold up in a more rigorous prospective analysis. Methods We used data from the Atherosclerosis Risk in Communities cohort. Usual dietary intake was assessed by questionnaire at baseline (1987\u201398), and after six years. Participants reported usual chocolate intake as the frequency of eating a 1-oz (\u223c28 g) serving. Body weight and height were measured at the two visits. Missing data were replaced by multiple imputation. Linear mixed-effects models were used to evaluate cross-sectional and prospective associations between chocolate intake and adiposity. Results Data were from 15,732 and 12,830 participants at the first and second visit, respectively. More frequent chocolate consumption was associated with a significantly greater prospective weight gain over time, in a dose-response manner. For instance, compared to participants who ate a chocolate serving less often than monthly, those who ate it 1\u20134 times a month and at least weekly experienced an increase in Body Mass Index (kg/m2) of 0.26 (95% CI 0.08, 0.44) and 0.39 (0.23, 0.55), respectively, during the six-year study period. In cross-sectional analyses the frequency of chocolate consumption was inversely associated with body weight. This inverse association was attenuated after excluding participants with preexisting obesity-related illness. Compared to participants without such illness, those with it had higher BMI and reported less frequent chocolate intake, lower caloric intake, and diets richer in fruits and vegetables. They tended to make these dietary changes after becoming ill. Conclusions Our prospective analysis found that a chocolate habit was associated with long-term weight gain, in a dose-response manner. Our cross-sectional finding that chocolate intake was associated with lower body weight did not apply to participants without preexisting serious illness.", "Candy consumption was not associated with body weight measures, risk factors for cardiovascular disease, or metabolic syndrome in US adults: NHANES... There is limited research examining the relationship of candy consumption by adults on diet and health. The purpose of this study was to determine total, chocolate, or sugar candy consumption and their effect on energy, saturated fatty acid and added sugar intake, weight, risk factors for cardiovascular disease, metabolic syndrome (MetS), and diet quality in adults 19 years and older (n = 15,023) participating in the 1999-2004 National Health and Nutrition Examination Survey. Twenty-four-hour dietary recalls were used to determine intake. Covariate-adjusted means \u00b1 SE and prevalence rates were determined for candy consumption groups. Odds ratios were used to determine the likelihood of cardiovascular risk factors and MetS. A total of 21.8%, 12.9%, and 10.9% of adults consumed total, chocolate, and sugar candy, respectively. Mean daily per capita intake of total, chocolate, and sugar candy was 9.0 \u00b1 0.3, 5.7 \u00b1 0.2, and 3.3 \u00b1 0.2 g, respectively; intake in consumers was 38.3 \u00b1 1.0, 39.9 \u00b1 1.1, and 28.9 \u00b1 1.3 g, respectively. Energy (9973 \u00b1 92 vs 9027 \u00b1 50 kJ; P < .0001), saturated fatty acid (27.9 \u00b1 0.26 vs 26.9 \u00b1 0.18 g; P = .0058), and added sugar (25.7 \u00b1 0.42 vs 21.1 \u00b1 0.41 g; P < .0001) intake were higher in candy consumers than nonconsumers. Body mass index (27.7 \u00b1 0.15 vs 28.2 \u00b1 0.12 kg/m(2); P = .0092), waist circumference (92.3 \u00b1 0.34 vs 96.5 \u00b1 0.29 cm; P = .0051), and C-reactive protein (0.40 \u00b1 0.01 vs 0.43 \u00b1 0.01 mg/dL; P = .0487) levels were lower in candy consumers than nonconsumers. Candy consumers had a 14% decreased risk of elevated diastolic blood pressure (P = .0466); chocolate consumers had a 19% decreased risk of lower high-density lipoprotein cholesterol (P = .0364) and a 15% reduced risk of MetS (P = .0453). Results suggest that the current level of candy consumption was not associated with health risks. Copyright \u00a9 2011 Elsevier Inc. All rights reserved.", "Skim milk, whey, and casein increase body weight and whey and casein increase the plasma C-peptide concentration in overweight adolescents. In adults, dietary protein seems to induce weight loss and dairy proteins may be insulinotropic. However, the effect of milk proteins in adolescents is unclear. The objective was to test whether milk and milk proteins reduce body weight, waist circumference, homeostatic model assessment, plasma insulin, and insulin secretion estimated as the plasma C-peptide concentration in overweight adolescents. Overweight adolescents (n = 203) aged 12-15 y with a BMI of 25.4 \u00b1 2.3 kg/m(2) (mean \u00b1 SD) were randomized to 1 L/d of skim milk, whey, casein, or water for 12 wk. All milk drinks contained 35 g protein/L. Before randomization, a subgroup of adolescents (n = 32) was studied for 12 wk before the intervention began as a pretest control group. The effects of the milk-based test drinks were compared with baseline (wk 0), the water group, and the pretest control group. Diet and physical activity were registered. Outcomes were BMI-for-age Z-scores (BAZs), waist circumference, plasma insulin, homeostatic model assessment, and plasma C-peptide. We found no change in BAZ in the pretest control and water groups, whereas it was greater at 12 wk in the skim milk, whey, and casein groups compared with baseline and with the water and pretest control groups. The plasma C-peptide concentration increased from baseline to wk 12 in the whey and casein groups and increments were greater than in the pretest control (P < 0.02). There were no significant changes in plasma C-peptide in the skim milk or water group. These data suggest that high intakes of skim milk, whey, and casein increase BAZs in overweight adolescents and that whey and casein increase insulin secretion. Whether the effect on body weight is primary or secondary to the increased insulin secretion remains to be elucidated."], ["New metrics of affordable nutrition: which vegetables provide most nutrients for least cost? Measuring food prices per gram, rather than per calorie, is one way to make healthful vegetables appear less expensive. However, a better measure of affordability would take the nutrient content of vegetables into account. This study, based on analyses of US Department of Agriculture datasets, aimed to identify which vegetables, including juices and soups, provided the most nutrients per unit cost. Nutrient density was measured using the Nutrient Rich Foods (NRF) index, based on nine nutrients to encourage: protein; fiber; vitamins A, C, and E; calcium; iron; magnesium; and potassium; and on three nutrients to limit: saturated fat, added sugar, and sodium. Food cost in dollars was calculated per 100 g, per 100 kcal, per serving, and per nutrient content. One-way analyses of variance with post hoc tests were used to determine statistical significance. Results showed that tomato juices and tomato soups, dark green leafy and nonleafy vegetables, and deep yellow vegetables, including sweet potatoes, had the highest NRF scores overall. Highest NRF scores per dollar were obtained for sweet potatoes, white potatoes, tomato juices and tomato soups, carrots, and broccoli. Tomato sauces, raw tomatoes, and potato chips were eaten more frequently than were many other vegetables that were both more affordable and more nutrient-rich. These new measures of affordable nutrition can help foodservice and health professionals identify those vegetables that provide the highest nutrient density per unit cost. Processed vegetables, including soups and juices, can contribute to the quality and the affordability of the diet. Copyright \u00a9 2013 Academy of Nutrition and Dietetics. Published by Elsevier Inc. All rights reserved.", "Steam cooking significantly improves in vitro bile acid binding of collard greens, kale, mustard greens, broccoli, green bell pepper, and cabbage. Bile acid binding capacity has been related to the cholesterol-lowering potential of foods and food fractions. Lowered recirculation of bile acids results in utilization of cholesterol to synthesize bile acid and reduced fat absorption. Secondary bile acids have been associated with increased risk of cancer. Bile acid binding potential has been related to lowering the risk of heart disease and that of cancer. Previously, we have reported bile acid binding by several uncooked vegetables. However, most vegetables are consumed after cooking. How cooking would influence in vitro bile acid binding of various vegetables was investigated using a mixture of bile acids secreted in human bile under physiological conditions. Eight replicate incubations were conducted for each treatment simulating gastric and intestinal digestion, which included a substrate only, a bile acid mixture only, and 6 with substrate and bile acid mixture. Cholestyramine (a cholesterol-lowering, bile acid binding drug) was the positive control treatment and cellulose was the negative control. Relative to cholestyramine, in vitro bile acid binding on dry matter basis was for the collard greens, kale, and mustard greens, 13%; broccoli, 10%; Brussels sprouts and spinach, 8%; green bell pepper, 7%; and cabbage, 5%. These results point to the significantly different (P < or = .05) health-promoting potential of collard greens = kale = mustard greens > broccoli > Brussels sprouts = spinach = green bell pepper > cabbage as indicated by their bile acid binding on dry matter basis. Steam cooking significantly improved the in vitro bile acid binding of collard greens, kale, mustard greens, broccoli, green bell pepper, and cabbage compared with previously observed bile acid binding values for these vegetables raw (uncooked). Inclusion of steam-cooked collard greens, kale, mustard greens, broccoli, green bell pepper, and cabbage in our daily diet as health-promoting vegetables should be emphasized. These green/leafy vegetables, when consumed regularly after steam cooking, would lower the risk of cardiovascular disease and cancer, advance human nutrition research, and improve public health.", "Effects of different cooking methods on nutritional and physicochemical characteristics of selected vegetables. The objective of the present study was to evaluate the effect of three common cooking practices (i.e., boiling, steaming, and frying) on phytochemical contents (i.e., polyphenols, carotenoids, glucosinolates, and ascorbic acid), total antioxidant capacities (TAC), as measured by three different analytical assays [Trolox equivalent antioxidant capacity (TEAC), total radical-trapping antioxidant parameter (TRAP), ferric reducing antioxidant power (FRAP)] and physicochemical parameters of three vegetables (carrots, courgettes, and broccoli). Water-cooking treatments better preserved the antioxidant compounds, particularly carotenoids, in all vegetables analyzed and ascorbic acid in carrots and courgettes. Steamed vegetables maintained a better texture quality than boiled ones, whereas boiled vegetables showed limited discoloration. Fried vegetables showed the lowest degree of softening, even though antioxidant compounds were less retained. An overall increase of TEAC, FRAP, and TRAP values was observed in all cooked vegetables, probably because of matrix softening and increased extractability of compounds, which could be partially converted into more antioxidant chemical species. Our findings defy the notion that processed vegetables offer lower nutritional quality and also suggest that for each vegetable a cooking method would be preferred to preserve the nutritional and physicochemical qualities.", "Anti-proliferative activity and chemoprotective effects towards DNA oxidative damage of fresh and cooked Brassicaceae. Epidemiological evidence shows that regular consumption of Brassicaceae is associated with a reduced risk of cancer and heart disease. Cruciferous species are usually processed before eating and the real impact of cooking practices on their bioactive properties is not fully understood. We have evaluated the effect of common cooking practices (boiling, microwaving, and steaming) on the biological activities of broccoli, cauliflower and Brussels sprouts. Anti-proliferative and chemoprotective effects towards DNA oxidative damage of fresh and cooked vegetable extracts were evaluated by 3-(4,5-dimethylthiazol-2-yl)-5-(3-carboxymethoxyphenyl)-2-(4-sulfophenyl)-2H-tetrazolium and Comet assays on HT-29 human colon carcinoma cells. The fresh vegetable extracts showed the highest anti-proliferative and antioxidant activities on HT-29 cells (broccoli>cauliflower = Brussels sprouts). No genotoxic activity was detected in any of the samples tested. The cooking methods that were applied influenced the anti-proliferative activity of Brassica extracts but did not alter considerably the antioxidant activity presented by the raw vegetables. Raw, microwaved, boiled (except broccoli) and steamed vegetable extracts, at different concentrations, presented a protective antioxidative action comparable with vitamin C (1 mm). These data provide new insight into the influence of domestic treatment on the quality of food, which could support the recent epidemiological studies suggesting that consumption of cruciferous vegetables, mainly cooked, may be related to a reduced risk of developing cancer.", "Glucosinolates in Brassica vegetables: the influence of the food supply chain on intake, bioavailability and human health. Glucosinolates (GLSs) are found in Brassica vegetables. Examples of these sources include cabbage, Brussels sprouts, broccoli, cauliflower and various root vegetables (e.g. radish and turnip). A number of epidemiological studies have identified an inverse association between consumption of these vegetables and the risk of colon and rectal cancer. Animal studies have shown changes in enzyme activities and DNA damage resulting from consumption of Brassica vegetables or isothiocyanates, the breakdown products (BDP) of GLSs in the body. Mechanistic studies have begun to identify the ways in which the compounds may exert their protective action but the relevance of these studies to protective effects in the human alimentary tract is as yet unproven. In vitro studies with a number of specific isothiocyanates have suggested mechanisms that might be the basis of their chemoprotective effects. The concentration and composition of the GLSs in different plants, but also within a plant (e.g. in the seeds, roots or leaves), can vary greatly and also changes during plant development. Furthermore, the effects of various factors in the supply chain of Brassica vegetables including breeding, cultivation, storage and processing on intake and bioavailability of GLSs are extensively discussed in this paper."], ["Defecation frequency and timing, and stool form in the general population: a prospective study. Because the range of bowel habits and stool types in the community is unknown we questioned 838 men and 1059 women, comprising 72.2% of a random stratified sample of the East Bristol population. Most of them kept records of three consecutive defecations, including stool form on a validated six point scale ranging from hard, round lumps to mushy. Questionnaire responses agreed moderately well with recorded data. Although the most common bowel habit was once daily this was a minority practice in both sexes; a regular 24 hour cycle was apparent in only 40% of men and 33% of women. Another 7% of men and 4% of women seemed to have a regular twice or thrice daily bowel habit. Thus most people had irregular bowels. A third of women defecated less often than daily and 1% once a week or less. Stools at the constipated end of the scale were passed more often by women than men. In women of child bearing age bowel habit and the spectrum of stool types were shifted towards constipation and irregularity compared with older women and three cases of severe slow transit constipation were discovered in young women. Otherwise age had little effect on bowel habit or stool type. Normal stool types, defined as those least likely to evoke symptoms, accounted for only 56% of all stools in women and 61% in men. Most defecations occurred in the early morning and earlier in men than in women. We conclude that conventionally normal bowel function is enjoyed by less than half the population and that, in this aspect of human physiology, younger women are especially disadvantaged.", "Bowel movement and constipation frequencies and the risk of colorectal cancer among men in the Netherlands Cohort Study on Diet and Cancer. The authors investigated the associations between bowel movement and constipation frequencies and colorectal cancer (CRC) endpoints among men in the Netherlands Cohort Study on Diet and Cancer (n = 58,279) and explored whether dietary fiber intake may modify associations. After 13.3 years (1986-1999), 1,207 CRC cases and 1,753 subcohort members were available for case-cohort analyses. Multivariate analyses showed a significantly increased hazard ratio for CRC overall and rectal cancer in men who reported having a bowel movement 1-2 times per day (second-highest category) as compared with once a day (CRC: hazard ratio (HR) = 1.29, 95% confidence interval (CI): 1.09, 1.53 (P(trend) < 0.001); rectal cancer: HR = 1.50, 95% CI: 1.15, 1.95 (P(trend) = 0.001)). Hazard ratios for CRC overall and rectal cancer were significantly decreased and lowest in men who reported suffering from constipation sometimes or more often versus never (CRC: HR = 0.76, 95% CI: 0.58, 0.98 (P(trend) = 0.02); rectal cancer: HR = 0.57, 95% CI: 0.35, 0.90 (P(trend) = 0.01)). No trends in the associations with proximal or distal colon cancer risk were observed. Interactions with dietary fiber intake were not significant. In this study, frequent bowel movements were associated with an increased risk of rectal cancer in men, and constipation was associated with a decreased risk.", "Insights Into Normal and Disordered Bowel Habits From Bowel Diaries Background While symptom questionnaires provide a snapshot of bowel habits, they may not reflect day-to-day variations or the relationship between bowel symptoms and stool form. Aim To assess bowel habits by daily diaries in women with and without functional bowel disorders. Method From a community-based survey among Olmsted County, MN, women, 278 randomly selected subjects were interviewed by a gastroenterologist, who completed a bowel symptom questionnaire. Subjects also maintained bowel diaries for 2 wk. Results Among 278 subjects, questionnaires revealed diarrhea (26%), constipation (21%), or neither (53%). Asymptomatic subjects reported bowel symptoms (e.g., urgency) infrequently (i.e., <25% of the time) and generally for hard or loose stools. Urgency for soft, formed stools (i.e., Bristol form = 4) was more prevalent in subjects with diarrhea (31%) and constipation (27%) than in normals (16%). Stool form, straining to begin (odds ratio [OR] 4.1, 95% confidence interval [CI] 1.7\u201310.2) and end (OR 4.7, 95% CI 1.6\u201315.2) defecation increased the odds for constipation. Straining to end defecation (OR 3.7, 95% CI 1.2\u201312.0), increased stool frequency (OR 1.9, 95% CI 1.02\u20133.7), incomplete evacuation (OR 2.2, 95% CI 1.04\u20134.6), and rectal urgency (OR 3.1, 95% CI 1.4\u20136.6) increased the odds for diarrhea. In contrast, variations in stool frequency and form were not useful for discriminating between health and disease. Conclusions Bowel symptoms occur in association with, but are only partly explained by, stool form disturbances. These observations support a role for other pathophysiological mechanisms in functional bowel disorders.", "Bowel movement: the sixth vital sign. Bowel movements provide vital information on how the body is functioning, and constipation among older adults is especially problematic. Although we do not like hearing the details of someone else's bowel movement, it is a function that nurses need to assess, support, and treat with the same attitude as when caring for patients with pain.", "How trustworthy are bowel histories? Comparison of recalled and recorded information. One hundred and fifty hospital outpatients were questioned about their bowel habits and then asked to record these in diary booklets for two weeks. Overall, recalled and recorded figures for frequency of defecation agreed fairly closely, but in 16% of patients there was a discrepancy of three or more bowel actions per week. This was usually an exaggeration of the difference from the norm of one a day. Patients were bad at predicting episodes of changed bowel frequency. These findings cast doubt on the value of population surveys of bowel habit based solely on questionnaires. They also suggest that the irritable bowel syndrome might be correctly diagnosed more often if patients were routinely asked to record their bowel actions."], ["The role of virgin olive oil components in the modulation of endothelial function. The endothelium is involved in many of the processes related to the development of atherosclerosis, which is considered an inflammatory disease. Actually, traditional risk factors for atherosclerosis predispose to endothelial dysfunction, which is manifested as an increase in the expression of specific cytokines and adhesion molecules. There are firm evidence supporting the beneficial effects of olive oil, the most genuine component of the Mediterranean diet. Although the effects of olive oil and other oleic acid-rich dietary oils on atherosclerosis and plasma lipids are well known, the roles of minor components have been less investigated. Minor components constitute only 1-2% of virgin olive oil (VOO) and are composed of hydrocarbons, polyphenols, tocopherols, sterols, triterpenoids and other components usually found in traces. Despite their low concentration, non-fatty acid constituents may be of importance because studies comparing monounsaturated dietary oils have reported different effects on cardiovascular disease. Most of these compounds have demonstrated antioxidant, anti-inflammatory and hypolipidemic properties. In this review, we summarize current knowledge on the effects of these compounds contained in VOO on vascular dysfunction and the mechanisms by which they modulate endothelial activity. Such mechanisms involve the release of nitric oxide, eicosanoids (prostaglandins and leukotrienes) and adhesion molecules, in most cases by activation of nuclear factor kappaB by reactive oxygen species.", "Phenolic content of virgin olive oil improves ischemic reactive hyperemia in hypercholesterolemic patients. OBJECTIVES: The goal of this study was to evaluate the effects of the phenolic content of virgin olive oil on endothelial reactivity. BACKGROUND: Endothelial-dependent vasodilatation is impaired during the postprandial state, and oxidative stress could play a key role in its development. METHODS: Twenty-one hypercholesterolemic volunteers received two breakfasts, using a randomized sequential crossover design. Both arms received the same olive oil, but one had its phenolic acid content reduced from 400 to 80 ppm. Ischemic reactive hyperemia (IRH) was measured with a laser-Doppler procedure at baseline and 2 h and 4 h after oil intake. Postprandial plasma concentrations of lipid fractions, lipoperoxides (LPO), 8-epi prostaglandin-F(2alpha), and nitrates/nitrites (NO(x)) were obtained at baseline and after 2 h of the fat meal. RESULTS: The intake of the polyphenol-rich breakfast was associated with an improvement in endothelial function, as well as a greater increase in concentrations of NO(x) (p < 0.001) and a lower increase in LPO (p < 0.005) and 8-epi prostaglandin-F2alpha (p < 0.001) than the ones induced by the low polyphenol fat meal. A positive correlation was found to exist between NO(x) and enhanced endothelial function at the second hour (r = 0.669; p < 0.01). Furthermore, a negative correlation was found between IRH and LPO (r = -0.203; p < 0.05) and 8-epi prostaglandin-F2alpha levels (r = -0.440; p < 0.05). CONCLUSIONS: A meal containing high-phenolic virgin olive oil improves ischemic reactive hyperemia during the postprandial state. This phenomenon might be mediated via reduction in oxidative stress and the increase of nitric oxide metabolites.", "Olive oil polyphenols decrease blood pressure and improve endothelial function in young women with mild hypertension. BACKGROUND: Olive oil polyphenols have been associated with several cardiovascular health benefits. This study aims to examine the influence of a polyphenol-rich olive oil on blood pressure (BP) and endothelial function in 24 young women with high-normal BP or stage 1 essential hypertension. METHODS: We conducted a double-blind, randomized, crossover dietary-intervention study. After a run-in period of 4 months (baseline values), two diets were used, one with polyphenol-rich olive oil (\u223c30 mg/day), the other with polyphenol-free olive oil. Each dietary period lasted 2 months with a 4-week washout between diets. Systolic and diastolic BP, serum or plasma biomarkers of endothelial function, oxidative stress, and inflammation, and ischemia-induced hyperemia in the forearm were measured. RESULTS: When compared to baseline values, only the polyphenol-rich olive oil diet led to a significant (P < 0.01) decrease of 7.91 mm Hg in systolic and 6.65 mm Hg of diastolic BP. A similar finding was found for serum asymmetric dimethylarginine (ADMA) (-0.09 \u00b1 0.01 \u00b5mol/l, P < 0.01), oxidized low-density lipoprotein (ox-LDL) (-28.2 \u00b1 28.5 \u00b5g/l, P < 0.01), and plasma C-reactive protein (CRP) (-1.9 \u00b1 1.3 mg/l, P < 0.001). The polyphenol-rich olive oil diet also elicited an increase in plasma nitrites/nitrates (+4.7 \u00b1 6.6 \u00b5mol/l, P < 0.001) and hyperemic area after ischemia (+345 \u00b1 386 perfusion units (PU)/sec, P < 0.001). CONCLUSIONS: We concluded that the consumption of a diet containing polyphenol-rich olive oil can decrease BP and improve endothelial function in young women with high-normal BP or stage 1 essential hypertension.", "Acute effects of high-fat meals enriched with walnuts or olive oil on postprandial endothelial function. OBJECTIVES: We sought to investigate whether the addition of walnuts or olive oil to a fatty meal have differential effects on postprandial vasoactivity, lipoproteins, markers of oxidation and endothelial activation, and plasma asymmetric dimethylarginine (ADMA). BACKGROUND: Compared with a Mediterranean diet, a walnut diet has been shown to improve endothelial function in hypercholesterolemic patients. We hypothesized that walnuts would reverse postprandial endothelial dysfunction associated with consumption of a fatty meal. METHODS: We randomized in a crossover design 12 healthy subjects and 12 patients with hypercholesterolemia to 2 high-fat meal sequences to which 25 g olive oil or 40 g walnuts had been added. Both test meals contained 80 g fat and 35% saturated fatty acids, and consumption of each meal was separated by 1 week. Venipunctures and ultrasound measurements of brachial artery endothelial function were performed after fasting and 4 h after test meals. RESULTS: In both study groups, flow-mediated dilation (FMD) was worse after the olive oil meal than after the walnut meal (p = 0.006, time-period interaction). Fasting, but not postprandial, triglyceride concentrations correlated inversely with FMD (r = -0.324; p = 0.024). Flow-independent dilation and plasma ADMA concentrations were unchanged, and the concentration of oxidized low-density lipoproteins decreased (p = 0.051) after either meal. The plasma concentrations of soluble inflammatory cytokines and adhesion molecules decreased (p < 0.01) independently of meal type, except for E-selectin, which decreased more (p = 0.033) after the walnut meal. CONCLUSIONS: Adding walnuts to a high-fat meal acutely improves FMD independently of changes in oxidation, inflammation, or ADMA. Both walnuts and olive oil preserve the protective phenotype of endothelial cells.", "Chronic effects of a high-fat diet enriched with virgin olive oil and a low-fat diet enriched with alpha-linolenic acid on postprandial endothelial... Traditional cardiovascular risk factors are associated with endothelial dysfunction. The vascular endothelium plays a key role in local vascular tone regulation and can be modulated by dietary fat. We propose to determine the chronic effect of three diets with different fat compositions on postprandial endothelial function and inflammatory biomarkers. Twenty healthy men followed three 4-week diets in a randomised cross-over design: a Western diet, rich in saturated fat (22% SFA, 12% MUFA and 0.4% alpha-linolenic acid (ALA), all fractions are % of energy); a Mediterranean diet, rich in MUFA ( < 10 % SFA, 24 % MUFA and 0.4% ALA); a low-fat diet enriched in ALA ( < 10% SFA, 12% MUFA and 2% ALA). At the end of each dietary period all subjects underwent a postprandial study. Plasma concentrations of lipid parameters, soluble intercellular cell-adhesion molecule-1, soluble vascular cell-adhesion molecule-1 (sVCAM-1), nitrates and nitrites (NOx) and endothelial function studied by laser Doppler were examined at 0, 2, 4, 6 and 8 h. The endothelium-dependent vasodilatory response was greater 4 h after the ingestion of the MUFA-rich diet than after the SFA or ALA low-fat diets (P = 0.031). The 4 h postprandial plasma sVCAM-1 levels were lower after the MUFA meals than after the ALA low-fat diet (P = 0.043). The bioavailability of NOx was higher following the MUFA diet than after the SFA and ALA low-fat diets (P = 0.027). We found no differences in the other parameters measured. Chronic ingestion of a Mediterranean diet avoids the postprandial deterioration of endothelial function associated with Westernised diets in healthy individuals."], ["Current perception of nutrition education in U.S. medical schools. Historically, physicians have perceived the quality of nutrition training during medical school as inadequate. A literature review suggests that this perception has not significantly changed since the 1950s. Many schools have worked to create clinical nutrition curricula for use during medical school. Interestingly, data suggest that medical students' perception of the importance of clinical nutrition can decrease during medical school. Recent data support the importance of targeted nutritional therapy to reduce morbidity and mortality, yet the number of physicians interested in nutrition appears to be declining, and fewer hours of nutrition training are occurring in medical school. One possible solution to improve both training and awareness of the problem is to implement a certification program for both students and preceptors modeled after the Cardiac Life Support training offered by the American Heart Association.", "Death by polonium-210: lessons learned from the murder of former Soviet spy Alexander Litvinenko. The medical response to radiation--whether the result of radiological warfare, terrorist deployment of improvised radiation dispersal weapons, political assassination, occupational or industrial accidents or the medically radiated patient remains one of the least taught among all disciplines within medical education. In the aftermath of 9/11 among medical vulnerabilities to toxicant threats, of all the categories of weapons of mass destruction (WMD)--whether using the CBRNE (chemical, biological, radiological, nuclear, explosive) or NBC (nuclear, biological, chemical) acronym--radiation is the least taught in professional schools, responder cultures or civil preparedness organizations. To date, few health care professionals (HCP) possess the fundamental knowledge or skills to identify and diagnose, let alone treat a radiation victim; this vulnerability made even more obvious in the aftermath of the high profile assassination of former Russian agent Alexander Litvinenko. He was poisoned with Polonium210. Radioactive substances are ubiquitous with radiation sources being in or transported through virtually every region nationwide. It is essential to increase preparedness among community and rural health care facilities as well as urban and university hospitals. Managing radiation injuries effectively requires access to specialized equipment and expertise. Radiation sickness is progressive and may require acute, critical and long-term care throughout the course of illness. Regardless of the source, preparedness rests upon acknowledging a threat exists and dedicating the resources to address the risks including the enhancement of training and equipment. Mass or individual exposures to radiation present unique challenges to the entire response continuum from law enforcement, first responders and emergency medical care. Increased education about and practice in responding to radiological threats is essential to enhance preparedness.", "Richard Pearson Strong and the iatrogenic plague disaster in Bilibid Prison, Manila, 1906. In November 1906, Richard Pearson Strong, then head of the Philippine Biological Laboratory, inoculated 24 men--inmates of Manila's Bilibid Prison--with a cholera vaccine that somehow had been contaminated with plague organisms; 13 men died. The governor-general of the Philippines appointed a general committee to investigate the affair, and the U.S. Senate demanded information about the episode. Although the Senate, the secretary of war, and even the president were kept informed of developments, no mainland investigations ensued. The general committee concluded that Strong was negligent for not having locks on his incubators and for leaving a visiting physician alone in the laboratory, where he might have mixed up the cholera and plague cultures on the fateful day. The committee's charge was referred to the attorney general, who found Strong innocent of criminal negligence, whereupon the governor-general exonerated Strong. Strong was despondent over Bilibid but recovered and developed a noteworthy career in American tropical medicine. In retrospect, the disaster at Bilibid presents an epitome of the problems surrounding the use of prisoner-subjects without authorization and without their voluntary consent. Far ahead of its time, the general committee recognized and condemned the shortcomings and urged reform, pleas the government ignored. The Bilibid episode remains, however, as a cautionary tale for those engaged in clinical research.", "US medical researchers, the Nuremberg Doctors Trial, and the Nuremberg Code. A review of findings of the Advisory Committee on Human Radiation Expe... The Advisory Committee on Human Radiation Experiments (ACHRE), established to review allegations of abuses of human subjects in federally sponsored radiation research, was charged with identifying appropriate standards to evaluate the ethics of cold war radiation experiments. One central question for ACHRE was to determine what role, if any, the Nuremberg Code played in the norms and practices of US medical researchers. Based on the evidence from ACHRE's Ethics Oral History Project and extensive archival research, we conclude that the Code, at the time it was promulgated, had little effect on mainstream medical researchers engaged in human subjects research. Although some clinical investigators raised questions about the conduct of research involving human beings, the medical profession did not pursue this issue until the 1960s.", "Pediatric CT research elevates public health concerns: low-dose radiation issues are highly politicized. This article presents an analysis of issues related to low-dose radiation, with a focus on pediatric computed tomography (CT). It references several early studies that are seldom quoted in radiation research papers, then quantifies the excess lifetime fatal cancer yield attributable to an estimated 6.5 million pediatric abdominal CT scans. The authors highlight an important policy document issued jointly by the National Cancer Institute and the Society for Pediatric Radiology--specifically, its conclusion that a small dose from CT represents \\\"a public health concern.\\\" Finally, the article identifies several contentious issues and proposes policy initiatives that, if implemented, could result in significant reductions of future radiogenic cancers and chronic injuries. The authors call for discussions between professional radiology societies and public interest health organizations, thereby involving all stakeholders."]], "scores": [[23.8125, 19.0625, 13.296875, 11.9453125, 1.08203125], [-2.138671875, -2.89453125, -3.87890625, -5.56640625, -6.73046875], [7.328125, 7.328125, 0.1591796875, -0.7421875, -2.392578125], [5.41015625, -3.0078125, -3.3515625, -4.73046875, -6.56640625], [7.91015625, -0.9765625, -2.2265625, -2.80859375, -3.09765625], [11.890625, 11.265625, 4.171875, 1.23046875, -7.5859375], [18.171875, -4.75390625, -8.1015625, -10.984375, -15.3828125], [-15.0, -16.875, -18.484375, -19.75, -20.96875], [6.69140625, 0.71826171875, -4.828125, -5.3359375, -5.578125], [-2.80078125, -4.46484375, -4.46484375, -4.484375, -6.1328125], [15.71875, 12.296875, 11.734375, 4.703125, -6.7734375], [-13.0625, -13.6015625, -16.09375, -16.6875, -20.703125], [-4.0234375, -4.234375, -5.390625, -5.5390625, -7.10546875], [8.8125, 6.34765625, -6.015625, -9.8203125, -11.5859375], [4.0546875, -5.62890625, -6.19921875, -6.4296875, -8.03125], [17.625, 14.6015625, 14.546875, 12.5625, 8.0546875], [4.37890625, 0.2373046875, -2.685546875, -4.41015625, -7.0], [8.546875, 5.76953125, 5.421875, 2.548828125, -0.1630859375], [5.25390625, -3.1171875, -10.9765625, -12.328125, -12.53125], [5.3359375, 3.39453125, 3.3046875, 2.5390625, -1.9013671875], [-0.96435546875, -1.970703125, -3.390625, -4.21484375, -5.59765625], [-9.90625, -10.2265625, -10.5546875, -12.2109375, -14.078125], [-1.056640625, -5.51171875, -5.8046875, -6.40625, -8.53125], [13.2890625, 9.7890625, 5.47265625, 1.796875, 0.0361328125], [4.5390625, -0.041015625, -6.1015625, -7.7265625, -9.96875], [14.7578125, -3.90625, -6.75390625, -10.203125, -11.1328125], [8.015625, -0.2998046875, -1.6572265625, -3.23046875, -3.970703125], [1.5263671875, -1.0595703125, -1.4111328125, -1.4111328125, -1.8671875], [4.7578125, 3.470703125, 1.314453125, 1.05859375, 0.05712890625], [26.421875, 19.703125, 15.71875, 14.1796875, 13.9140625], [21.71875, 0.94873046875, 0.22412109375, -2.505859375, -6.3671875], [7.859375, 5.55859375, 4.35546875, 0.34375, -0.4443359375], [2.33984375, -7.34765625, -7.7890625, -9.3984375, -10.1015625], [4.0078125, -10.109375, -10.6640625, -11.953125, -13.515625], [-3.36328125, -3.75, -5.953125, -8.6015625, -13.3125], [-11.9765625, -14.0078125, -14.0703125, -14.734375, -16.46875], [13.40625, 2.16796875, -2.4765625, -2.845703125, -3.921875], [5.609375, 3.12890625, 0.42333984375, -0.69287109375, -4.52734375], [7.6484375, -2.4765625, -3.958984375, -5.03125, -5.140625], [-3.58984375, -4.7890625, -4.86328125, -10.546875, -11.6796875], [-4.921875, -7.046875, -8.9453125, -8.9453125, -10.140625], [17.34375, 15.1875, 13.40625, 13.1640625, 4.5078125], [-0.54736328125, -1.484375, -6.421875, -6.58984375, -9.0859375], [17.046875, 16.28125, 15.015625, 13.421875, 11.6484375], [-0.12646484375, -3.353515625, -8.265625, -13.8515625, -15.578125], [-7.0625, -7.546875, -8.3203125, -13.0546875, -14.2421875], [-4.39453125, -10.3984375, -10.8359375, -11.8828125, -13.3671875], [5.40234375, 1.787109375, 1.0703125, -0.08447265625, -0.9462890625], [-5.13671875, -7.71875, -8.546875, -9.28125, -10.234375], [2.78125, -2.142578125, -3.6640625, -5.0390625, -5.3359375], [5.39453125, -0.2021484375, -5.375, -6.40234375, -6.421875], [13.90625, 9.4921875, 7.90234375, 7.44140625, 6.18359375], [4.53515625, -5.2421875, -5.5703125, -5.859375, -7.16015625], [-7.48828125, -9.2890625, -10.5546875, -10.8671875, -11.6796875], [-9.53125, -11.65625, -11.7109375, -13.203125, -14.03125], [7.23046875, 4.88671875, 4.296875, 3.306640625, -0.376953125], [3.96484375, 3.158203125, -1.052734375, -6.7109375, -8.3359375], [8.15625, 8.15625, -3.20703125, -8.390625, -10.328125], [-8.90625, -10.75, -11.2421875, -12.953125, -13.625], [10.7421875, 9.1484375, 7.64453125, 6.71484375, 6.20703125], [8.25, -3.71875, -6.3671875, -6.9609375, -7.4296875], [8.8984375, -8.2578125, -8.359375, -8.78125, -9.5625], [4.5078125, 4.13671875, 3.923828125, 3.916015625, 3.548828125], [9.7734375, 6.81640625, 5.05859375, -3.337890625, -5.578125], [0.07763671875, -0.01904296875, -2.40234375, -2.798828125, -3.3046875], [18.78125, 11.34375, 10.890625, 7.29296875, 6.55078125], [1.4697265625, 0.0869140625, -1.1396484375, -3.845703125, -3.9765625], [7.828125, 6.62890625, -8.8125, -8.9296875, -10.6328125], [5.48046875, 1.921875, 0.158203125, -6.90625, -9.796875], [13.21875, 11.640625, 8.671875, 5.98828125, 3.546875], [12.7421875, 8.890625, 4.8203125, -7.19921875, -8.1796875], [5.19140625, -11.5546875, -12.0625, -13.9296875, -15.9921875], [7.5859375, 6.1328125, -8.1796875, -9.359375, -9.9296875], [14.2734375, 11.59375, 10.6484375, 7.41015625, 6.16015625], [-7.13671875, -8.65625, -9.0703125, -9.609375, -10.5703125], [6.43359375, 5.2265625, 4.5625, 2.259765625, 0.80029296875], [16.1875, 11.7265625, 11.3984375, -8.0546875, -9.953125], [2.083984375, -0.21337890625, -0.22314453125, -1.44921875, -5.3671875], [-0.276611328125, -4.61328125, -5.0, -5.80078125, -12.6015625], [-1.3291015625, -6.046875, -6.15625, -7.8359375, -7.921875], [12.2265625, 1.5595703125, -3.3046875, -3.671875, -4.26953125], [6.30859375, -0.466064453125, -5.0859375, -7.65625, -7.7421875], [15.7265625, 9.90625, 9.90625, 8.34375, 8.2109375], [-4.015625, -5.078125, -7.5390625, -8.421875, -10.671875], [12.9375, 9.640625, 8.0390625, 8.0390625, 5.7421875], [-3.69921875, -4.390625, -5.265625, -6.21875, -6.32421875], [8.9765625, 2.078125, 0.51708984375, -0.3447265625, -0.49462890625], [-0.71484375, -2.71484375, -4.53125, -6.453125, -6.9140625], [-4.109375, -5.421875, -6.77734375, -7.046875, -7.140625], [-1.177734375, -3.3203125, -3.384765625, -5.15234375, -7.4453125], [-11.859375, -12.3984375, -13.984375, -15.0703125, -15.75], [-1.6328125, -7.38671875, -9.6015625, -9.71875, -11.140625], [8.2265625, 6.96484375, 3.689453125, 2.2578125, -9.0546875], [4.0546875, 1.56640625, 0.314453125, -1.8798828125, -3.236328125], [19.671875, 11.4921875, -10.203125, -10.75, -14.484375], [-10.671875, -12.8359375, -15.578125, -15.8984375, -16.71875], [-10.828125, -12.203125, -14.296875, -14.4453125, -16.359375], [6.37109375, 3.845703125, -10.4609375, -11.796875, -12.265625], [-8.8046875, -11.796875, -13.0234375, -13.5, -13.8515625], [19.015625, 13.03125, 9.359375, 8.4140625, 5.4453125], [1.208984375, -5.5390625, -7.30859375, -7.703125, -8.6015625], [-5.53125, -9.078125, -10.4609375, -10.9375, -12.4296875], [11.5078125, -0.84716796875, -2.634765625, -4.1015625, -4.1796875], [-2.234375, -2.78515625, -3.08203125, -4.75390625, -9.3359375], [6.85546875, -3.1328125, -4.05859375, -4.4765625, -4.64453125], [5.4296875, -5.4453125, -6.59765625, -8.7109375, -9.6484375], [-0.84814453125, -1.58984375, -6.6953125, -7.421875, -10.59375], [7.0859375, 6.75390625, 6.48046875, 5.73046875, 2.787109375], [7.11328125, 2.1796875, 0.73681640625, -0.75390625, -2.646484375], [-10.1484375, -10.9375, -11.890625, -13.296875, -13.609375], [12.71875, 9.578125, 9.078125, 6.640625, 3.625], [0.48583984375, -1.765625, -2.037109375, -3.2109375, -4.6484375], [-0.88037109375, -3.369140625, -3.369140625, -3.64453125, -5.140625], [6.078125, 4.73828125, -2.783203125, -4.3671875, -4.7578125], [16.296875, 10.890625, 1.3984375, -3.06640625, -7.0859375], [3.484375, -2.716796875, -4.75390625, -4.75390625, -5.61328125, -7.13671875], [7.11328125, -3.6328125, -5.6875, -7.6015625, -8.6015625], [-5.72265625, -7.09765625, -7.125, -11.40625, -13.109375], [6.43359375, 5.32421875, -1.40625, -4.23046875, -12.8984375], [-8.625, -9.4375, -9.78125, -10.2421875, -11.8359375], [3.75, -3.671875, -4.25, -7.51171875, -8.671875], [-0.6650390625, -6.328125, -8.578125, -9.4140625, -9.6875], [-8.0078125, -8.859375, -10.9375, -11.03125, -11.0859375], [-0.09326171875, -2.857421875, -2.912109375, -3.392578125, -3.595703125], [4.94140625, 2.931640625, 2.611328125, 1.857421875, 0.15478515625], [8.6484375, 7.359375, 4.28515625, 2.09765625, -0.14892578125], [0.54638671875, -2.603515625, -2.67578125, -5.1953125, -5.5390625], [2.84375, -1.521484375, -2.341796875, -4.55078125, -5.2109375], [2.119140625, -6.875, -6.875, -7.55859375, -7.609375], [-1.908203125, -3.5234375, -3.845703125, -4.8515625, -7.44140625], [1.677734375, 0.26708984375, -1.30078125, -2.36328125, -3.46484375], [5.12109375, 2.306640625, 0.97314453125, -2.283203125, -5.8984375], [-12.8515625, -13.453125, -14.15625, -14.1796875, -15.625], [-5.8359375, -6.4296875, -8.953125, -9.6875, -11.6640625], [-8.4375, -10.2109375, -11.546875, -12.3359375, -13.625], [9.015625, 7.51171875, 0.5615234375, -5.08984375, -9.2265625], [1.0830078125, -10.2265625, -11.5546875, -12.484375, -13.9921875], [1.8525390625, 1.69140625, 1.591796875, 0.9658203125, -0.49072265625], [10.84375, 7.3515625, 7.19921875, 6.73046875, -2.50390625], [4.47265625, 2.142578125, -3.921875, -5.7890625, -11.578125], [-0.4736328125, -0.583984375, -2.71484375, -9.6640625, -11.6796875], [2.56640625, 1.5107421875, -7.28125, -8.9296875, -10.6484375], [3.8203125, 1.8330078125, -4.125, -4.6953125, -4.6953125], [10.7578125, 5.6640625, 2.755859375, 2.45703125, -0.35009765625], [6.796875, 5.01953125, 3.767578125, 0.3076171875, 0.14013671875], [-11.53125, -12.0703125, -12.265625, -13.6640625, -14.3203125], [-8.9375, -12.296875, -12.53125, -13.0, -13.9375], [10.3125, 8.609375, 7.76171875, 7.00390625, 6.9296875], [2.939453125, -8.125, -9.8828125, -10.1640625, -12.65625], [6.23046875, 4.64453125, 3.8125, 3.34765625, 2.595703125], [-1.505859375, -1.974609375, -3.271484375, -4.109375, -4.38671875], [-0.90478515625, -7.234375, -7.61328125, -8.1484375, -9.2578125], [-8.9765625, -9.3828125, -9.9140625, -10.5703125, -12.71875], [-4.48046875, -6.296875, -6.97265625, -7.15625, -8.4296875], [24.953125, 20.125, 15.4375, 11.125, 10.7109375], [-4.94140625, -6.078125, -6.3359375, -6.46875, -6.53125], [6.94921875, 1.0625, 0.28125, -5.6796875, -7.13671875], [11.3359375, 9.8984375, 8.875, 8.1640625, 6.63671875], [-10.125, -10.78125, -11.296875, -11.5859375, -12.28125], [4.92578125, 4.140625, -1.5556640625, -1.625, -2.90234375], [10.6875, 6.9609375, -6.91015625, -7.4140625, -8.6015625], [-5.484375, -7.47265625, -7.7421875, -8.546875, -10.53125], [0.015625, -14.046875, -14.265625, -14.3671875, -14.5078125], [6.48046875, 4.96875, 3.78125, 2.974609375, 2.61328125], [-4.61328125, -8.28125, -8.9609375, -11.4296875, -11.453125], [-12.015625, -13.9296875, -14.7421875, -15.0703125, -16.0625], [14.2265625, 10.96875, 7.1484375, 6.27734375, 5.33203125], [0.47802734375, -7.3125, -9.078125, -9.3515625, -9.78125], [14.984375, 13.921875, 8.1953125, 8.09375, 7.24609375], [-6.4765625, -7.796875, -7.96875, -9.4921875, -10.6328125], [9.734375, 7.3828125, 6.78125, 6.30078125, 6.30078125], [-0.31103515625, -0.6337890625, -0.77197265625, -2.490234375, -6.1953125], [-6.14453125, -6.7109375, -8.1015625, -10.8984375, -12.9921875], [4.70703125, 0.57421875, -3.1796875, -3.3671875, -5.62890625], [12.1953125, 9.0859375, 7.37890625, -4.65234375, -8.828125], [0.72314453125, -0.38623046875, -1.02734375, -1.3125, -1.52734375], [5.6328125, 2.978515625, -1.2431640625, -5.6328125, -7.99609375], [11.90625, 10.1875, -10.0390625, -10.3984375, -11.8515625], [-9.546875, -9.6015625, -11.015625, -11.0625, -11.7890625], [-4.19921875, -8.8984375, -10.2421875, -10.4921875, -10.9921875], [11.671875, 7.34375, 5.76171875, 2.443359375, 0.19384765625], [-0.51025390625, -1.66015625, -3.0859375, -3.55078125, -4.89453125], [12.140625, 11.453125, 4.44921875, -2.763671875, -4.95703125], [-0.7587890625, -3.08203125, -4.2109375, -7.80078125, -8.1015625], [-1.919921875, -2.466796875, -2.60546875, -5.1484375, -6.96875], [5.2734375, -0.35595703125, -2.525390625, -3.8203125, -5.328125], [7.6875, 7.08203125, 7.0390625, 6.37109375, 6.26171875], [3.3671875, 2.6484375, 1.9248046875, 1.412109375, -0.87548828125], [5.2109375, 5.07421875, 3.75390625, 1.818359375, 0.89501953125], [2.880859375, -7.82421875, -8.390625, -9.7109375, -10.203125], [14.0, 12.25, 10.921875, 10.609375, -5.08203125], [4.390625, 3.908203125, 2.75, 0.912109375, 0.39990234375], [1.82421875, -4.15625, -5.78515625, -6.84375, -7.76953125], [10.296875, 9.9375, 3.658203125, -1.4658203125, -1.947265625], [-10.671875, -11.203125, -13.1953125, -14.171875, -14.5390625], [6.19140625, 3.6875, -5.7421875, -10.28125, -12.6796875], [16.578125, 7.6015625, 5.09375, -3.056640625, -4.9296875], [0.72265625, -5.76171875, -7.421875, -8.875, -9.5703125], [-0.0419921875, -1.3203125, -2.7421875, -3.931640625, -4.19921875], [4.3359375, -4.10546875, -5.59375, -6.265625, -6.6484375], [9.65625, 8.296875, 5.87890625, 5.5078125, 2.5625], [-7.61328125, -8.453125, -9.953125, -10.140625, -10.5859375], [1.32421875, -11.4765625, -12.4375, -12.484375, -12.859375], [-0.103515625, -7.48046875, -8.578125, -8.8671875, -9.2421875], [10.4140625, -1.9404296875, -7.50390625, -7.61328125, -9.890625], [-0.037109375, -3.015625, -4.3515625, -6.9140625, -8.34375], [10.75, 8.4453125, 5.765625, 5.12890625, 0.55908203125], [-10.234375, -11.265625, -11.65625, -13.1171875, -13.125], [-4.2421875, -7.8125, -9.171875, -10.140625, -10.21875], [-4.25, -6.41796875, -8.296875, -8.328125, -8.4921875], [-3.41796875, -4.546875, -5.67578125, -6.5859375, -7.7890625], [-7.45703125, -7.90625, -8.734375, -10.3125, -11.515625], [-5.23828125, -7.4296875, -9.25, -9.5859375, -9.7109375], [4.77734375, 0.763671875, -0.28662109375, -0.69921875, -2.591796875], [1.9873046875, 1.8330078125, -6.5, -7.30859375, -7.9375], [5.68359375, 5.19140625, 1.9765625, 0.185546875, -7.60546875], [7.578125, 5.07421875, 4.82421875, 3.228515625, 3.1953125], [-7.53515625, -7.796875, -8.875, -11.7734375, -12.328125], [0.6484375, -2.052734375, -2.318359375, -2.65234375, -3.80078125], [-10.96875, -12.203125, -12.734375, -12.9296875, -13.40625], [-3.8515625, -4.421875, -4.515625, -5.07421875, -5.12890625], [13.5078125, 10.546875, 0.515625, 0.31298828125, -3.58984375], [2.919921875, 1.0546875, -1.91796875, -6.0546875, -7.2421875], [22.15625, 19.46875, 7.68359375, 4.03515625, -1.806640625], [8.140625, 0.3759765625, -0.0322265625, -1.767578125, -2.2890625], [10.3359375, 7.09765625, -1.509765625, -1.9541015625, -1.9541015625, -5.4296875], [11.8125, 11.3203125, 10.09375, 9.15625, 5.41796875], [-2.421875, -3.0546875, -3.703125, -6.421875, -7.1953125], [-3.197265625, -3.630859375, -3.998046875, -5.9453125, -7.296875], [16.484375, 15.921875, 15.09375, 12.2109375, 11.640625], [4.4296875, 3.453125, 1.58203125, 0.23779296875, 0.2119140625], [23.703125, 22.046875, 16.75, 15.6171875, 14.09375], [-1.359375, -3.9375, -4.53515625, -5.26953125, -7.05078125], [3.9609375, 1.8642578125, 1.8642578125, 0.99169921875, -1.734375, -2.625], [21.84375, 21.546875, 21.0, 20.046875, 14.515625], [8.640625, 3.15625, 2.01171875, -2.7734375, -3.66796875], [-2.3671875, -2.94140625, -9.609375, -10.5, -11.5078125], [16.90625, 3.345703125, 1.455078125, 0.09375, -0.1396484375], [18.375, 14.90625, 5.84375, 5.546875, 5.54296875], [1.9033203125, -0.9619140625, -1.712890625, -3.0546875, -5.0], [4.54296875, 4.10546875, 4.05859375, 3.205078125, 1.4541015625], [28.703125, -0.8154296875, -1.203125, -4.60546875, -5.203125], [-4.203125, -5.5, -6.09375, -6.71875, -7.4921875], [26.15625, 17.9375, 13.46875, 10.7890625, 7.9453125], [-2.16796875, -3.533203125, -4.41015625, -5.625, -10.6484375], [27.59375, -0.64111328125, -6.3125, -9.96875, -10.4296875], [18.21875, 13.4140625, 5.57421875, 0.92041015625, -0.4443359375], [8.171875, 4.6484375, -3.1875, -6.40625, -7.15625], [6.34375, 3.2421875, 0.50439453125, -1.185546875, -5.109375], [28.0, 23.15625, 13.0, 11.859375, 11.578125], [-12.546875, -13.7578125, -14.0078125, -16.34375, -18.8125], [3.826171875, 3.375, 1.625, 0.35498046875, -6.484375], [21.875, 18.59375, 17.421875, 11.515625, 10.375], [14.8828125, 12.46875, 12.4609375, -1.24609375, -8.765625], [2.640625, -0.33251953125, -1.669921875, -3.0859375, -7.04296875], [26.875, 12.78125, 10.265625, 0.50537109375, 0.50537109375], [24.65625, 1.857421875, 0.75341796875, -1.5517578125, -1.79296875], [14.625, 9.2421875, 8.046875, 6.8359375, -2.806640625], [-1.29296875, -4.5, -4.78125, -5.109375, -5.328125], [-2.044921875, -3.083984375, -5.734375, -7.703125, -9.390625], [11.3515625, 10.2421875, 8.21875, 5.1875, 4.81640625], [10.2578125, 4.5703125, 3.23828125, 1.90234375, -2.517578125], [-5.703125, -5.93359375, -9.734375, -11.0546875, -12.375], [11.7265625, -2.08984375, -3.22265625, -11.03125, -11.5859375], [21.25, 8.0234375, 1.603515625, -4.05078125, -6.96875], [-6.515625, -6.6875, -6.93359375, -8.734375, -9.21875], [-12.2421875, -14.7890625, -15.5234375, -15.546875, -15.96875], [-0.23291015625, -0.591796875, -1.671875, -2.646484375, -3.734375], [-1.064453125, -2.09765625, -3.072265625, -5.95703125, -7.140625], [3.830078125, -1.6826171875, -3.62109375, -7.30859375, -9.8359375], [6.4140625, 4.54296875, -5.6640625, -7.40625, -10.640625], [30.15625, -0.5615234375, -3.3984375, -3.451171875, -4.40625], [14.671875, 10.8203125, 5.10546875, 1.685546875, 1.1796875], [-6.7578125, -7.5703125, -7.828125, -8.359375, -8.4296875], [8.6640625, 6.96484375, 6.578125, 5.4765625, -8.890625], [16.84375, 4.2421875, -3.7265625, -6.0, -10.6953125], [5.41015625, -10.0625, -13.328125, -14.1953125, -14.8359375], [17.296875, 11.8515625, 9.6953125, 8.109375, 1.501953125], [-8.71875, -12.4140625, -12.78125, -13.875, -15.1171875], [-9.578125, -10.828125, -11.125, -12.4140625, -14.0859375], [-5.296875, -8.1328125, -8.2421875, -10.5390625, -11.890625], [-4.484375, -4.82421875, -5.3515625, -5.5703125, -11.046875], [2.8359375, -10.15625, -11.5, -12.8046875, -13.171875], [1.859375, 0.54248046875, -5.77734375, -8.8984375, -9.3125], [-8.4140625, -8.6015625, -8.65625, -8.7578125, -11.4453125], [4.5625, 2.8046875, 0.76513671875, -0.04638671875, -7.71484375], [15.625, -7.53515625, -7.73046875, -8.8203125, -11.9140625], [-5.77734375, -6.50390625, -7.99609375, -8.234375, -9.9765625], [7.10546875, 7.10546875, -7.828125, -9.65625, -11.015625], [-6.01953125, -6.4921875, -7.64453125, -8.515625, -10.46875], [10.375, 7.84375, 3.4375, 0.483154296875, -3.25], [12.15625, -4.984375, -7.3515625, -8.515625, -11.5625], [-6.15625, -6.5546875, -7.79296875, -8.4765625, -9.1875], [-6.47265625, -8.0546875, -9.4375, -9.59375, -11.65625], [6.15625, -0.44384765625, -3.97265625, -10.109375, -10.875], [17.015625, 3.97265625, -1.7265625, -1.865234375, -2.671875], [-3.625, -4.7890625, -4.890625, -8.828125, -9.5], [14.28125, 6.40234375, 5.16015625, 1.66015625, 0.97998046875], [6.87109375, 4.12109375, -4.05078125, -5.6015625, -5.625], [-9.75, -10.6796875, -11.7265625, -14.0703125, -14.4375], [-3.1640625, -4.66796875, -5.4140625, -7.6875, -10.9453125], [5.046875, 3.474609375, -5.17578125, -8.984375, -8.9921875], [13.0625, 4.375, 3.314453125, 0.810546875, -3.59765625], [6.4375, 0.56884765625, -0.34814453125, -1.9169921875, -2.126953125], [9.8671875, 5.109375, 1.619140625, -0.22607421875, -0.39501953125], [0.978515625, -0.329345703125, -1.53515625, -6.67578125, -6.84375], [20.390625, 3.3203125, -0.74609375, -1.048828125, -4.7578125], [9.2109375, 3.341796875, 3.1484375, 2.787109375, -1.0361328125], [10.9296875, 4.54296875, -4.83984375, -6.921875, -9.296875], [-4.75, -7.1171875, -8.4453125, -8.4453125, -10.078125], [-7.9921875, -9.015625, -11.984375, -12.890625, -14.0], [-0.88671875, -8.03125, -8.9609375, -9.9140625, -11.5234375], [2.73828125, 1.8671875, -2.24609375, -2.28125, -3.59765625], [9.765625, 4.52734375, 2.3203125, -2.5625, -2.599609375], [-5.6796875, -5.921875, -6.93359375, -9.21875, -13.0], [16.921875, 16.921875, 9.1484375, 8.109375, 5.94140625], [2.3359375, -3.6796875, -9.0234375, -10.3671875, -10.8984375], [6.5703125, 3.75390625, 0.68115234375, -0.783203125, -3.685546875], [-6.52734375, -6.59765625, -7.54296875, -9.125, -10.2421875], [10.421875, 2.607421875, -1.5224609375, -2.21484375, -2.69921875], [7.15234375, 6.484375, 4.73828125, 3.400390625, 2.775390625], [13.0234375, 9.7578125, 8.703125, 8.234375, 7.05078125], [-8.234375, -10.78125, -10.9375, -12.453125, -13.0]], "answer": ["According to the retrieved documents, the relationship between cholesterol statin drugs and breast cancer is complex and not fully understood. Some studies suggest that long-term statin use may be associated with an increased risk of breast cancer, particularly invasive ductal carcinoma (IDC) and invasive lobular carcinoma (ILC) (Document 2). However, other studies found no significant association between statin use and breast cancer risk (Document 1).\n\nInterestingly, some studies suggest that statin use after breast cancer diagnosis may be associated with improved survival and reduced mortality due to breast cancer (Documents 3 and 4). However, these findings are not universal and may be influenced by factors such as dosing and duration of statin use.\n\nIt's also worth noting that Document 5 discusses the potential role of plant sterols, which are also known to affect blood cholesterol levels, in mitigating breast cancer risk. However, this document does not specifically discuss the relationship between cholesterol statin drugs and breast cancer.\n\nOverall, more research is needed to fully understand the relationship between cholesterol statin drugs and breast cancer, and to determine whether these medications have a protective or harmful effect on breast cancer risk and survival.", "Unfortunately, the question \"Exploiting Autophagy to Live Longer\" doesn't have a direct answer in the provided documents. However, it can be inferred that exploiting autophagy might be related to understanding the biological basis of the aging process, as mentioned in Document 1, and potentially targeting the mTOR pathway, as mentioned in Document 2, which could lead to a longer lifespan.\n\nHowever, there is no explicit mention of autophagy or exploiting it to live longer in the provided documents. The closest relevant information is related to understanding aging and age-related diseases, and potential treatments that might slow aging, such as dietary restriction mimetics, mTOR inhibitors, and nutrient-sensing pathways.", "To reduce exposure to alkylphenols through your diet, consider the following suggestions based on the retrieved documents:\n\n1. Limit consumption of fish oil capsules, as they have been associated with higher concentrations of 4-nonylphenol (NP) and 4-octylphenol (OP) in human milk (Documents 1 and 2).\n2. Be mindful of cooking oil consumption, as higher intake has been linked to higher OP concentrations in human milk (Documents 1 and 2).\n3. Avoid or limit processed fish products, as they have been associated with higher NP concentrations in human milk (Document 1).\n4. Consider the type of fish you consume, as some species may have higher levels of alkylphenols. For example, crustaceans like Norway lobster and spottail mantis shrimp, and fish like anchovy and Atlantic mackerel, have been found to contain higher levels of NP and OP (Document 3).\n\nIt's essential to note that while these suggestions can help reduce exposure to alkylphenols, they may not eliminate exposure entirely. Additionally, more research is needed to fully understand the impact of dietary habits on alkylphenol exposure.", "Based on the retrieved documents, the main drivers of America's obesity problem appear to be an increase in energy intake, particularly from sugar-sweetened beverages and foods with added sugar, rather than a decrease in physical activity. The documents suggest that a reduction in energy intake, particularly from sugary drinks and foods, is necessary to reverse the obesity epidemic. Additionally, the documents highlight the importance of addressing the root causes of obesity, including the modern, post-industrial environment and lifestyles, rather than just focusing on individual behaviors.", "Based on the documents, curcumin is generally considered safe, but caution is advised, especially with chemotherapy agents, due to theoretical interactions. The documents do not specify specific groups of people who should be careful about taking curcumin, but it can be inferred that individuals undergoing chemotherapy or taking medications that may interact with curcumin should be cautious. Additionally, individuals with sensitive stomachs may experience nausea and diarrhea as side effects of curcumin.", "Based on the retrieved documents, the following foods and nutrients may be beneficial for glaucoma:\n\n* Fruits:\n\t+ Fresh oranges\n\t+ Fresh peaches\n\t+ Carrots\n\t+ Berries (black currant anthocyanins)\n* Vegetables:\n\t+ Collard greens\n\t+ Kale\n\t+ Spinach\n* Nutrients:\n\t+ Vitamin A\n\t+ Vitamin C\n\t+ \u03b1-carotene\n\t+ \u03b2-carotene\n\t+ Lutein/zeaxanthin\n\nIt is also suggested that a higher intake of these foods and nutrients may be associated with a decreased risk of glaucoma. However, it's essential to note that more studies are needed to confirm these findings and to determine the optimal amount of these nutrients for glaucoma prevention.\n\nOn the other hand, the following nutrients may be associated with an increased risk of glaucoma:\n\n* High intake of supplementary calcium (\u2265800 mg/d) and iron (\u226518 mg/d)\n\nOverall, a balanced diet rich in fruits, vegetables, and essential nutrients may be beneficial for maintaining eye health and reducing the risk of glaucoma.", "According to Document 1, chicken nuggets are mostly fat, and their name is a misnomer. The autopsy of chicken nuggets revealed that striated muscle (chicken meat) was not the predominant component, and instead, fat was present in equal or greater quantities along with epithelium, bone, nerve, and connective tissue.", "They both contain high-fructose corn syrup", "Based on the retrieved documents, I can provide the following answer:\n\nThere is a possible connection between chronic headaches and pork parasites. Document 1 discusses the case of a pregnant woman who was infected with Taenia solium, a pork tapeworm, which can cause neurocysticercosis, a serious and potentially devastating infection of the central nervous system. While this document does not specifically mention chronic headaches, it highlights the importance of preventing and treating pork tapeworm infections.\n\nDocument 2 shows that freezing pork muscle can kill cysticerci, the larval stage of the pork tapeworm, which can help prevent the spread of the parasite.\n\nDocuments 3, 4, and 5 describe an outbreak of a novel neurological syndrome, polyradiculoneuropathy, among abattoir workers exposed to aerosolized porcine neural tissue. The syndrome is characterized by sensory-predominant and painful polyradiculoneuropathy, and the investigation suggests an autoimmune reaction to aerosolized porcine neural tissue as the possible etiology.\n\nWhile these documents do not directly link chronic headaches to pork parasites, they suggest that exposure to pork parasites or neural tissue can lead to neurological problems, including pain and neuropathy. Therefore,", "There is no direct answer in the retrieved documents about stopping heart disease in childhood. The documents focus more on the prevention and reversal of heart disease in adults, particularly through diet and lifestyle changes, such as adopting a plant-based diet and lowering cholesterol levels. \n\nHowever, based on the provided information, it can be inferred that the principles of maintaining a healthy diet, exercising regularly, and controlling risk factors such as high cholesterol levels, can also be beneficial in preventing heart disease in childhood. This could involve: \n\n- Encouraging healthy eating habits in children\n- Promoting regular exercise\n- Monitoring and managing cholesterol levels from an early age\n- Educating parents and caregivers about the risks of heart disease and how to prevent it\n\nTherefore, the answer is not explicitly stated in the documents, but it can be inferred that adopting a healthy lifestyle and controlling risk factors from an early age can help prevent heart disease in childhood.", "Based on the retrieved documents, it appears that there is evidence suggesting a link between food dyes and ADHD-like symptoms in children. Document 1 suggests that eliminating colorings and preservatives from the diet may be beneficial for children with hyperactivity. Document 2 presents the results of a randomized controlled trial that found a significant association between artificial food coloring and hyperactivity in 3-year-old and 8/9-year-old children. Document 3 provides a commentary on the FDA's position on the issue, arguing that the agency's review was too narrow and failed to consider the broader environmental health implications. Document 4 reviews the toxicology of food dyes and concludes that many of the currently approved dyes raise health concerns, including cancer and hypersensitivity reactions. Document 5 presents a case report of a patient who developed anaphylaxis due to an allergic reaction to annatto dye, a common food coloring.\n\nOverall, the evidence suggests that some food dyes may be associated with adverse behavioral effects in children, including hyperactivity, and that some individuals may be at risk of severe allergic reactions to certain dyes.", "Citrus, particularly oranges, contain flavonoids like hesperidin, which have been shown to have various health benefits, including anti-inflammatory and antioxidant properties. While the documents do not directly address how citrus can help keep hands warm, it is possible that the consumption of citrus or the application of citrus-based products could have a warming effect on the hands due to improved blood flow and vasodilation. However, more research would be needed to confirm this hypothesis.", "Unfortunately, none of the provided documents directly answer the question about starving tumors of their blood supply. The documents primarily focus on the concept of methionine auxotrophy in cancer, where cancer cells rely on methionine, an essential amino acid, to survive and grow. The idea is to target cancer by depleting methionine or using methioninase to inhibit tumor growth. However, the question of starving tumors of their blood supply is not addressed. \n\nTo answer this question, we would need more information or a different set of documents that focus on vascular targeting or anti-angiogenic therapies for cancer treatment.", "According to the retrieved documents, there is no straightforward answer to whether dental X-rays are safe. However, Document 1 suggests that dentists should \"act as if\" diagnostic radiation, including dental X-rays, can cause cancer, and take steps to minimize exposure. It provides guidelines for reducing radiation doses, such as using low-dose examinations, fast film or digital sensors, and thyroid collars. Document 2 also emphasizes the importance of proper radiographic practices, including patient selection criteria, film selection, and radiation control procedures. While these documents do not explicitly state that dental X-rays are safe, they provide recommendations for minimizing risks associated with them.", "According to the retrieved documents, the best way to take probiotics is with or just prior to a meal containing some fats. Document 1 suggests that taking probiotics with a meal or 30 minutes before a meal can help improve their survival during gastrointestinal transit.", "According to the retrieved documents, the relationship between alcohol consumption and breast cancer risk is not entirely clear, and different studies have reported varying results. Here's a summary of the findings:\n\n* Document 1: Findings suggest that women who consume more than one alcoholic drink per day have a significantly increased risk of breast cancer, with a 4% increase in risk for light drinking and a 40-50% increase for heavy drinking.\n* Document 2: A prospective observational study of over 100,000 women found that increasing alcohol consumption was associated with increased breast cancer risk, even at low levels of consumption (3-6 drinks per week).\n* Document 3: A Swedish study found that moderate alcohol intake (up to one small drink per day) did not negatively impact breast cancer-specific survival, and a half drink per day was associated with a decreased risk of mortality from other causes.\n* Document 4: A study in the Women's Health Study found that moderate alcohol consumption (30g/day or more) was associated with a modest increase in breast cancer risk, particularly for estrogen receptor-positive and progesterone receptor-positive tumors.\n* Document 5: A meta-analysis of 222 articles found that light drinking (up to one drink per day) was associated with an", "Unfortunately, none of the retrieved documents specifically discuss the relationship between diet and cellulite.", "According to the retrieved documents, the best treatment for constipation varies depending on the population and the specific condition. \n\nDocument 1 suggests that dried plums (prunes) are safe, palatable, and more effective than psyllium for the treatment of mild to moderate constipation in adults.\n\nDocument 2 provides evidence that in infants and toddlers, dietary changes, corn syrup, or both resolved constipation in 25% of children, and laxatives such as milk of magnesia or polyethylene glycol 3350 resolved constipation in 92% of children.\n\nDocument 3 mentions Linaclotide (Linzess) as a treatment option for irritable bowel syndrome with constipation and chronic idiopathic constipation.\n\nDocument 4 presents an alternative approach, suggesting that a sweet potato, footbath, and acupressure intervention may be effective in preventing constipation in hospitalized patients with acute coronary syndromes.\n\nDocument 5 focuses on the treatment of abdominal pain in irritable bowel syndrome, rather than constipation specifically. However, it mentions that linaclotide, a guanylate cyclase C agonist, can reduce abdominal pain and improve the stool pattern in laxative-resistant, constipation-predominant IBS.\n\nBased", "Based on the provided documents, there is no direct information that suggests titanium dioxide is harmful to humans. However, Document 1 mentions that titanium dioxide nanoparticles are commonly used in food, personal care, and other products, and that humans are exposed to it through these products. It also suggests that children may have the highest exposure to titanium dioxide due to their consumption of sweets and candies.\n\nOn the other hand, Document 2 mentions that evidence supports a trial period of eliminating colorings and preservatives from the diet, which may imply that some food additives, including possibly titanium dioxide, could be problematic for human health.\n\nOverall, the documents do not provide conclusive evidence that titanium dioxide is harmful, but they do suggest that it is widely used and that humans are exposed to it through various products. Therefore, the answer to the question \"Should we avoid titanium dioxide?\" is not a clear \"yes\" or \"no\", but rather \"it depends on further research and evaluation of its potential health effects\".", "To minimize exposure to cooked meat carcinogens, consider the following strategies: Cook meat at lower temperatures and for shorter durations. Avoid charring or burning meat, as these can produce higher amounts of HCAs and other carcinogens. Use cooking methods like steaming, stewing, or braising instead of high-heat frying or grilling. Consume more plant-based foods, which tend to have lower HCA levels than meat-based foods. Consider incorporating specific dietary supplements like soy-isoflavones to help suppress HCA effects. Choose cooked meat products made using lower-heat methods or those that have been processed to remove or reduce HCAs.", "There is limited information in the retrieved documents about plant-based diets for psoriasis. None of the documents directly address plant-based diets as a treatment for psoriasis. However, Document 1 discusses the effects of a vegetarian diet on symptoms of atopic dermatitis, and Document 2 explores the effects of a vegan diet on rheumatic disorders. Document 2 states that antioxidants in plant-based foods may be beneficial for people with fibromyalgia or rheumatoid arthritis, while Document 3 suggests that a vegetarian diet can be beneficial for patients with rheumatoid arthritis. Document 4 discusses the potential benefits of whole-food vegan diets, fish oil, and other nutritional interventions for autoimmune disorders. Document 5 discusses fatty acid changes and disease activity in patients with rheumatoid arthritis treated with a vegetarian diet.", "None of the retrieved documents provide information on increasing muscle strength with fenugreek.", "Based on the retrieved documents, it is evident that humans are exposed to a wide range of chemical contaminants, including toxicants, endocrine disruptors, and heavy metals, through various sources such as food, dental amalgam, and environmental pollutants.\n\nDocument 1 highlights the exposure of pregnant women and their offspring to toxicants, including mercury, through contaminated seafood.\n\nDocument 2 reviews the epidemiological evidence on the impact of exposure to chemicals such as organophosphate, organochlorine pesticides, polychlorinated biphenyls (PCBs), mercury, and lead on the neurodevelopment of children, suggesting that exposure to these chemicals may impair neurodevelopment.\n\nDocument 3 discusses the effects of environmental chemicals on the endocrine system in children, although it notes that clear effects on endocrine function have been difficult to demonstrate.\n\nDocument 4 emphasizes the growing threat of human exposure to endocrine disrupters and the need for improved cancer risk assessment.\n\nDocument 5 estimates that millions of Americans are exposed to mercury through dental amalgam, with some exceeding the reference exposure levels established by the US Environmental Protection Agency.\n\nOverall, these documents suggest that we are indeed chemically contaminated, and that exposure to these contaminants can have serious health consequences, particularly for vulnerable populations such as children and pregnant", "Based on the retrieved documents, it appears that a diet low in fat and high in fiber, as well as a diet rich in plant-based foods and fish, may be beneficial in treating an enlarged prostate. Additionally, flaxseed supplementation may also have a positive effect on prostate health.\n\nDocument 2 suggests that a low-fat, high-fiber diet and daily exercise can reduce the growth of prostate epithelial cells and lower insulin levels, which may help to slow the progression of benign prostatic hyperplasia (BPH).\n\nDocument 3 found that a flaxseed-supplemented, fat-restricted diet decreased prostate-specific antigen (PSA) levels and reduced the proliferation of benign prostatic epithelium.\n\nDocument 4 showed that a diet emphasizing plant-based foods and fish, accompanied by mindfulness practice, improved quality of life and increased the PSA doubling time in men with recurrent prostate cancer.\n\nDocument 5 found that intensive lifestyle changes, including a diet low in fat and high in fiber, as well as stress management and exercise, may affect the progression of prostate cancer by reducing PSA levels and inhibiting the growth of prostate cancer cells.\n\nOverall, the evidence suggests that dietary changes, particularly a low-fat, high-fiber diet and flaxseed supplementation, may be beneficial in treating", "Based on the retrieved documents, the optimal phytosterol dose and source are not explicitly stated. However, Document 1 suggests that intrinsic phytosterols present in natural food matrices, such as those found in a healthy diet, can have large effects on whole-body cholesterol metabolism. Document 2 reports on the phytosterol composition of nuts and seeds commonly consumed in the United States, with sesame seed and wheat germ having the highest total phytosterol content. Document 3 suggests that a strict uncooked vegan diet can affect serum plant sterols, including increasing the concentration of sitosterol. Document 4 reports on the effects of different dietary fats on plasma lipids and sterols, and Document 5 evaluates the effects of dietary cholesterol on plasma lipids and LDL atherogenicity in an elderly population.\n\nWhile the documents do not provide a consensus on the optimal dose and source of phytosterols, they suggest that dietary phytosterols, particularly those found in plant-based foods, may have beneficial effects on cholesterol metabolism and cardiovascular health. Further research is needed to determine the optimal dose and source of phytosterols for specific health outcomes.", "According to Document 1, no, caffeinated tea is not dehydrating. The study found that black tea, which contains caffeine, has similar hydrating properties to water, and there were no significant differences in blood or urine measurements between tea and water consumption.", "Based on the retrieved documents, the answer to the question \"Mercury Testing Recommended Before Pregnancy\" is:\n\nYes, mercury testing is recommended before pregnancy for certain groups of women, particularly those who consume more than 12 ounces of fish per week. This is because high levels of mercury exposure during pregnancy can harm fetal development, and dietary modification can decrease body burden and ensure fetal safety. (Document 1)", "Unfortunately, none of the retrieved documents directly answer the question about the relationship between stool size and breast cancer risk. However, some documents provide indirect information that may be relevant.\n\nDocument 3 and Document 4 suggest that severe constipation (i.e., having two or fewer bowel movements weekly) may be associated with an increased risk of cytological abnormalities in breast epithelium, which could potentially lead to breast cancer. Additionally, Document 5 discusses the metabolic consequences of slow colonic transit, which may influence bile acid metabolism and increase the risk of breast cancer.\n\nWhile these findings are intriguing, they do not directly address the relationship between stool size and breast cancer risk. To answer this question, further research would be needed to investigate the relationship between stool size, bowel movements, and breast cancer risk.", "Based on the retrieved documents, here are the new recommendations for vitamin D: \n\n1. The Endocrine Society recommends supplementation with vitamin D at suggested daily intake and tolerable upper limit levels, depending on age and clinical circumstances. (Document 1)\n2. The North American Institute of Medicine (IOM) has set dietary reference intakes (DRI) for vitamin D, but these have been the subject of controversy due to knowledge gaps in vitamin D nutrition. (Document 2)\n3. Traditionally living populations in East Africa have a mean serum 25-hydroxyvitamin D concentration of 115 nmol/l, which may be considered optimal from an evolutionary perspective. (Document 3)\n4. Vitamin D supplement doses in the range of 1,100 to 4,000 IU/d and a serum 25-hydroxyvitamin D concentration of 60-80 ng/ml may be needed to reduce cancer risk. (Document 4)\n5. The optimal circulating 25-hydroxyvitamin D level should be around 30-32 ng/ml or above, and daily intakes of at least 1,000 IU or more of vitamin D are required to achieve optimal vitamin D status. (Document 5)", "According to the retrieved documents, the relationship between diet and breast cancer is complex and not fully understood. However, some common findings across the documents suggest that:\n\n1. A diet high in saturated fat may increase the risk of breast cancer, particularly in postmenopausal women (Document 2, Document 4).\n2. A diet high in fiber and low in fat may be weakly protective against breast cancer (Document 1).\n3. Fruit and vegetable intake may have a protective effect against breast cancer, although the evidence is not consistent (Document 2, Document 3).\n4. Obesity is a risk factor for postmenopausal breast cancer, and adult weight gain should be avoided to reduce risk (Document 1).\n5. Dietary habits after breast cancer diagnosis may influence survival, with lower intake of saturated and trans fat associated with improved survival (Document 4).\n\nIt's worth noting that the studies had varying results, and more research is needed to fully understand the relationship between diet and breast cancer.", "According to the retrieved documents, antioxidant-rich spices can counteract the effects of a high-fat meal. Document 1 found that adding a high antioxidant spice blend to a meal reduced postprandial insulin and triglyceride responses and increased plasma measures of antioxidant activity in healthy overweight men. Document 2 also found that certain spices, such as ginger, rosemary, and turmeric, showed protective capacity by both oxidative protection and inflammation measures. Therefore, incorporating antioxidant-rich spices into a meal may help counteract the negative effects of a high-fat meal.", "Yes, dioxins stored in our own fat may increase the risk of developing diabetes. Several studies have found a strong association between exposure to persistent organic pollutants (POPs), such as dioxins, polychlorinated biphenyls (PCBs), and chlorinated pesticides, and an increased risk of developing type 2 diabetes. These chemicals can alter insulin action, induce inflammation, and impair insulin secretion, all of which can contribute to the development of diabetes. Additionally, studies have shown that individuals with higher levels of POPs in their bodies are more likely to develop diabetes, even at low exposure levels.", "The retrieved documents do not provide a clear answer to the question of whether another study showed carnitine was good for the heart. However, Document 1 suggests that L-carnitine, found in red meat, may actually promote atherosclerosis and increase the risk of cardiovascular disease.", "Document 1 contains a study on the genotoxicity of avocado fruit and leaf extracts in human peripheral lymphocytes.", "I couldn't find any information about Dr. Jenkins or his take on paleolithic diets in the retrieved documents. If you could provide more context or clarify which Dr. Jenkins you are referring to, I'll do my best to help.", "According to the retrieved documents, the question about the combination of pepper and turmeric in V8 juice is not directly addressed. However, turmeric is mentioned in all the documents, and its potential health benefits are discussed.\n\nDocument 1 mentions that plants, including turmeric, contain polyphenols that have anti-inflammatory properties and can help reduce the risk of diseases.\n\nDocument 2 discusses the chemical constituents of turmeric, including curcumin, and its potential as an antimicrobial, anticancer, and antidiabetic agent.\n\nDocument 3 highlights the potential of curcumin as a therapeutic agent in various diseases, including cancer, diabetes, and Alzheimer's disease.\n\nDocument 4 discusses the potential of dietary turmeric to reduce the risk of cancer, and Document 5 highlights the anti-inflammatory effects of curcumin.\n\nHowever, none of the documents mention the specific combination of pepper and turmeric in V8 juice, so it is not possible to provide an answer to the question based on the retrieved documents.", "Based on the provided documents, annatto food coloring may not be completely safe. Document 1 reports a case of anaphylaxis caused by annatto dye, which suggests that it can cause severe allergic reactions in some individuals. Additionally, Document 2 mentions that annatto dye is one of the nine currently US-approved dyes that raises health concerns, although the specific concerns are not specified.\n\nIt's worth noting that the FDA has approved annatto dye for use in foods, but this does not necessarily mean that it is completely safe for everyone. As with any food additive, individual tolerance and sensitivity can vary greatly.\n\nTo answer the question, it is recommended to exercise caution when consuming foods containing annatto dye, especially if you have a history of food allergies or sensitivities. If you experience any adverse reactions or concerns, consult a healthcare professional or registered dietitian for personalized advice.", "Based on the retrieved documents, the answer to the question \"Fresh fruit versus frozen--which is better?\" is that both fresh and frozen fruits have similar levels of phytochemicals and antioxidants. \n\nDocument 1 specifically states that freshly picked, fresh commercial, and frozen raspberries all contain similar levels of phytochemicals and antioxidants per serving. The antioxidant capacity of the fruit was not affected by freezing, and the levels of vitamin C and phenolics were similar in fresh and frozen raspberries.\n\nWhile some documents suggest that processing can affect the phytochemical content of fruits (Documents 2, 3, and 5), this is more relevant to products that undergo significant processing, such as juice concentrates, jams, and dried fruits. In general, freezing is considered a minimal processing method that helps preserve the nutritional content of fruits.\n\nTherefore, based on the available evidence, it can be concluded that both fresh and frozen fruits are nutritious options, and the choice between them depends on personal preference, convenience, and availability.", "Based on the retrieved documents, it appears that krill oil supplements may have an advantage over fish oil capsules in terms of bioavailability, but not in terms of their anti-inflammatory effects.\n\nDocument 1 suggests that krill oil has superior bioavailability compared to fish oil, with a higher incorporation of EPA and DHA into plasma phospholipids. However, the study notes that further research is needed to confirm these findings.\n\nDocument 2 provides an overview of the benefits of omega-3 fatty acids, including EPA and DHA, and discusses the limitations of plant-based sources of these nutrients. It does not specifically compare krill oil to fish oil.\n\nDocuments 3 and 4 discuss the bioequivalence of algal oil capsules and cooked salmon as sources of DHA, and the bioequivalence of different algal oils in capsules and in a DHA-fortified food. These studies suggest that algal oil can be a safe and convenient source of DHA, but do not directly compare krill oil to fish oil.\n\nDocument 5 reports on a randomized controlled trial that found no effect of fish oil supplementation on serum inflammatory markers in healthy, middle-aged individuals. This study does not compare krill oil to fish oil, but suggests that fish oil may not have", "Based on the retrieved documents, it appears that apple cider vinegar (ACV) is not directly mentioned in any of the documents. However, the documents provide information on the health benefits of apples and apple products, which may be related to ACV.\n\nFrom Document 1, we can see that apples and apple products have been shown to have antimutagenic, antioxidant, and anti-inflammatory effects, which may contribute to their potential cancer-preventive properties.\n\nDocument 2 suggests that apple phenolics, which are present in apple cider vinegar, have anti-cancer properties and may protect against DNA damage, improve barrier function, and inhibit invasion in colon cells.\n\nDocument 3 indicates that whole apples and cloudy apple juice may have beneficial effects on plasma lipids, while clear apple juice may not be as effective. However, this study does not directly relate to ACV.\n\nDocument 4 discusses the concept of antioxidant vitamins and phytoestrogens up-regulating endogenous antioxidant defenses, but does not specifically mention ACV.\n\nDocument 5 focuses on the effects of vitamin C supplements on physical performance and does not relate to ACV.\n\nWhile the documents do not directly address the question of whether apple cider vinegar is good for you, they suggest that apples and apple products, including the", "Based on the retrieved documents, it is clear that believing in any scientific study requires a critical evaluation of the evidence and the potential biases and conflicts of interest involved. Document 1 highlights the strategy of \"manufacturing uncertainty\" used by industries to challenge scientific evidence and regulation, and notes that financial interests can influence study results. Document 2 shows how low-quality research can be misused to promote products, and Document 3 and 5 demonstrate how systematic reviews can be used to critically evaluate the evidence for specific treatments or products. In order to believe in a scientific study, one should consider the quality of the research, the potential biases and conflicts of interest, and the consistency of the findings with other evidence.", "Based on the retrieved documents, the answer to the question \"Is vitamin D3 (cholecalciferol) preferable to D2 (ergocalciferol)?\" is not a straightforward yes or no. The documents present conflicting results, with some studies suggesting that vitamin D3 is more potent and effective in raising serum 25-hydroxyvitamin D concentrations (Documents 1, 2, and 3), while others find that vitamin D2 is equally effective as vitamin D3 in maintaining circulating concentrations of 25-hydroxyvitamin D (Documents 4 and 5). \n\nDocument 1 concludes that vitamin D3 is more efficacious at raising serum 25(OH)D concentrations than vitamin D2, but notes that additional research is required to examine the metabolic pathways involved. Document 2 suggests that vitamin D3 is approximately 87% more potent than vitamin D2 in raising and maintaining serum 25(OH)D concentrations. Document 3 notes that supplementation with vitamin D3 may be preferable to vitamin D2, but does not provide conclusive evidence.\n\nOn the other hand, Document 4 finds that vitamin D2 is as effective as vitamin D3 in maintaining serum 25-hydroxyvitamin D levels, and does not", "Document 1 and Document 2 are relevant to the query \"accidents\".\n\nAccording to Document 1, approximately 21.8 million persons aged \u226515 years sustained nonfatal, unintentional injuries in the United States in 2008, resulting in lifetime medical costs of approximately $67.3 billion. The document specifically looks at nonfatal injuries in bathrooms among persons aged \u226515 years in the United States.\n\nDocument 2 discusses the long-term health effects of the \"Seveso accident\" in Italy in 1976, where an industrial accident released dioxin into the environment, causing health problems and increased mortality among the exposed population.\n\nDocument 3, Document 4, and Document 5 are not directly related to accidents, but rather discuss occupational exposure to viruses, avian leukosis/sarcoma viruses, and hepatitis C virus infection treatment.\n\nTherefore, the final answer to the user's query \"accidents\" would be information from Document 1 and Document 2.", "Several studies have found a significant association between Ad-36 infection and obesity in both children and adults. The prevalence of Ad-36 infection is higher in obese individuals compared to non-obese individuals, and it has been suggested that Ad-36 may play a role in the etiology of human obesity.", "African-American", "Unfortunately, none of the retrieved documents provide information about airport scanners.", "It appears that there is not enough information in the retrieved documents to answer the question about \"Alli\". The documents seem to be related to various medical topics, such as the antimicrobial properties of garlic, anisakiasis, hepatitis, and antioxidants in food products, but none of them mention \"Alli\" specifically.", "Alternative medicine refers to the use of non-conventional methods of treatment and therapy, often in conjunction with or instead of conventional Western medicine. It encompasses a wide range of practices, including herbal therapies, acupuncture, yoga, and other Eastern traditional medicines. Some people turn to alternative medicine for relief from symptoms and to improve quality of life, particularly for conditions like irritable bowel syndrome (IBS) where conventional treatments may have significant side effects.", "The American Dental Association is not mentioned in any of the provided documents.", "Amnesia is a condition where a person forgets or is unable to recall information or events. None of the retrieved documents provide a direct answer to what amnesia is. However, Document 1 mentions memory loss as a symptom of amnesic shellfish poisoning (ASP), which is caused by consuming shellfish contaminated with domoic acid. Document 2 discusses memory impairment in older adults and its association with sleep duration. Document 3 mentions memory function and its potential relationship with tofu consumption in elderly individuals. Document 4 touches on short-term memory and cognitive function related to vision in the context of dehydration. Document 5 mentions cognitive disorders, including dementia, which can involve memory loss.", "Document 1 is the most relevant to the topic of aneurysm, as it specifically discusses a case of a cerebral aneurysm and its relationship to neurocysticercosis.\n\nDocument 5 also mentions aneurysms, but only briefly in the context of discussing the artery size hypothesis and its relationship to erectile dysfunction and coronary artery disease.\n\nDocument 2 mentions aneurysms in the context of thoracoabdominal aortic aneurysms (TAAA), but the focus of the document is on the anatomy of spinal cord perfusion, not aneurysms specifically.\n\nDocument 3 does not mention aneurysms at all, and Document 4 mentions cholesterol crystals and their role in plaque disruption, but does not mention aneurysms.\n\nTherefore, Document 1 is the most relevant to the topic of aneurysm.", "Anisakis simplex is a parasite that can cause infection and allergic reactions in humans, particularly through the consumption of raw or undercooked fish. It can also be present in chicken meat if the chicken feed is contaminated with fishmeal. The parasite can cause a range of symptoms, including gastrointestinal disease, allergic reactions, and anaphylaxis. In some areas, Anisakis simplex hypersensitivity is associated with chronic urticaria. A real-time polymerase chain reaction (PCR) assay can be used to detect the presence of the parasite in seafood products.", "Antinutrients are substances that can interfere with the absorption of nutrients in the body. They are often found in plant-based foods, such as legumes, and can bind to minerals, making them less available for absorption. One common antinutrient is phytic acid, which is found in legumes and can bind to minerals such as zinc, iron, and calcium. However, it's worth noting that phytic acid also has potential health benefits, such as antioxidant and anti-inflammatory effects. Other methods to reduce or eliminate the chelating ability of phytic acid include cooking, germination, fermentation, soaking, and autolysis.", "apnea", "There is no mention of Arkansas in the retrieved documents.", "Ascorbic acid, also known as vitamin C, is a dietary antioxidant that plays a crucial role in maintaining human health. It is not produced by the human body and must be obtained through diet. Ascorbic acid has been shown to have various effects on the body, including increasing intercourse frequency and improving mood, reducing the formation of carcinogenic compounds, and degrading at high temperatures during cooking. However, excessive intake of ascorbic acid may also increase urinary oxalate excretion and the risk of calcium oxalate crystallization in individuals with kidney stones.", "The Atkins diet is a low-carbohydrate, high-protein, high-fat diet that has been shown to be beneficial for weight loss and reducing the risk of cardiovascular disease. According to the retrieved documents, research has demonstrated that the Atkins diet can lead to improved weight loss, reduced triglycerides, and improved HDL (good) cholesterol levels. Additionally, the diet has been shown to reduce the risk of metabolic syndrome, a condition characterized by high blood pressure, high blood sugar, and high levels of triglycerides. However, it's worth noting that some critics argue that the Atkins diet may be too restrictive and high in saturated fat, which could be detrimental to cardiovascular health.", "The answer to the question \"avocados\" based on the retrieved documents is that avocados have been found to have chemopreventive characteristics, specifically in the context of cancer prevention. The phytochemicals extracted from avocado fruit have been shown to induce cell cycle arrest, inhibit growth, and induce apoptosis in precancerous and cancer cell lines. Additionally, avocado oil has been found to be a rich source of monounsaturated fatty acids, which may have health benefits.", "There is no answer to this question as it is not related to any of the documents.", "Beans are a beneficial food for overall health, associated with greater nutrient intake, reduced body weight and waist circumference, lower systolic blood pressure, and a reduced risk of chronic diseases such as obesity, cardiovascular disease, and cancer.", "Benzene", "Betel nuts are associated with an increased risk of chronic kidney disease (CKD) in men, while regular consumption of nuts, such as peanuts and tree nuts, may lower the risk of cardiovascular disease and improve overall health.", "Bioavailability refers to the extent to which a substance can be absorbed and utilized by the body. The provided documents discuss various aspects of bioavailability, including: \n\n1. The bioavailability of carotenoids in human skin compared to blood, which indicates that carotenoids increase more in the skin than in the blood and have a delayed decrease in the skin after supplementation ends (Document 1). \n\n2. The oral bioavailability of aluminum (Al) from foods, specifically from basic sodium aluminum phosphate incorporated in cheese, which suggests that food contributes more Al to systemic circulation than drinking water (Document 2).\n\n3. The bioavailability of cadmium from vegetable and animal-based foods, which shows that Cd bioavailability from animal-based foods is higher than from vegetable-based foods and that cooking processes can influence Cd bioavailability (Document 3).\n\n4. The bioavailability of omega-3 fatty acids from different formulations, which indicates that krill oil has a higher bioavailability than fish oil (Document 4).\n\n5. The bioavailability of vitamin B12 from different sources, which varies depending on the source, with animal foods generally having higher bioavailability than plant foods, and fortified foods being a valuable source of vitamin B12 for vegans and elderly people (Document 5).", "Black raspberries are a rich natural source of chemopreventive phytochemicals, which have been shown to inhibit the growth of premalignant and malignant human oral cell lines, as well as reduce the development of oral, esophageal, and colon cancer in rodents. The active components responsible for black raspberry chemoprevention include ferulic acid, beta-sitosterol, and ellagic acid.", "Blood clots can form through a process called thrombosis, where platelets in the blood aggregate and form clots in response to activation. Platelet dysfunction can contribute to the development of vascular diseases, such as cardiovascular disease, and can increase the risk of stroke, heart attack, and peripheral arterial thrombosis.", "Based on the retrieved documents, it appears that BMAA (\u03b2-Amino-\u03b2-methylaminopropionic acid) is a neurotoxin produced by cyanobacteria that has been implicated in the development of neurodegenerative diseases such as amyotrophic lateral sclerosis (ALS), Alzheimer's disease, and Parkinson's disease. The documents suggest that BMAA can cause neurodegenerative symptoms and can be found in various environments, including aquatic and terrestrial ecosystems. Additionally, the documents mention that BMAA can biomagnify in food chains and has been detected in humans who have consumed contaminated food.", "Bone fractures refer to any break in a bone, which can be caused by a variety of factors such as trauma, osteoporosis, or repetitive stress. The retrieved documents provide information on the relationship between diet and bone health, particularly focusing on milk consumption, protein intake, and Yerba Mate consumption.\n\nAccording to Document 1, milk consumption during teenage years was not associated with a lower risk of hip fracture in older adults. In fact, the study found that greater milk consumption during teenage years was associated with a higher risk of hip fracture in men.\n\nDocument 2, a meta-analysis of prospective cohort studies, found no overall association between milk intake and hip fracture risk in women, but suggested that more data are needed in men.\n\nDocument 3 discusses the effects of high-protein diets on calcium balance and bone health. While high-protein diets may increase calcium excretion, they do not seem to impair calcium balance or have a detrimental effect on bone health, except in the context of inadequate calcium supply.\n\nDocument 4 found that Yerba Mate consumption was associated with higher bone mineral density in postmenopausal women, suggesting a protective effect of chronic Yerba Mate consumption on bone.\n\nDocument 5 discusses the conflicting theories on the role of dietary protein in bone health. While protein", "BPH stands for Benign Prostatic Hyperplasia, which is a histological diagnosis that can contribute to medical problems, including enlargement of the prostate and bladder outlet obstruction (BPO).", "The BRCA1 and BRCA2 genes are tumor suppressor genes that play a crucial role in maintaining genomic stability. Mutations in these genes can lead to hereditary breast and ovarian cancer. The documents provided discuss the epigenetic regulation of BRCA1 and BRCA2, including the effect of soy phytoestrogens on DNA methylation and the association of BRCA1 promoter methylation with sporadic breast cancer. Additionally, the documents touch on the relationship between BRCA1 and BRCA2 methylation and other tumor suppressor genes, as well as the potential therapeutic targets for breast cancer treatment.", "Breast pain, also known as mastalgia, is a common condition affecting up to two-thirds of women at some point during their reproductive lives. It can be associated with premenstrual syndrome, fibrocystic breast disease, and psychological disturbances, and in rare cases, breast cancer. A thorough clinical evaluation is necessary to assess the cause of the pain. Treatment options include mechanical breast support, a low-fat and high-carbohydrate diet, and topical nonsteroidal anti-inflammatory agents. Hormonal agents like bromocriptine and danazol have also been shown to be effective, but their use is limited due to potential side effects. Surgery is not a common treatment for mastalgia and is usually considered only in severe cases that are resistant to medication.", "Bronchiolitis obliterans, also known as popcorn lung, is a lung disease that can be caused by exposure to diacetyl, a chemical used in the production of butter flavoring for microwave popcorn. It can also be caused by thoracic radiotherapy for breast carcinoma.", "The Bush administration was opposed to the 2004 WHO global strategy on diet, physical activity, and health, as well as the 2003 WHO/FAO expert report on diet, nutrition, and the prevention of chronic diseases, because it was perceived as an impediment to US trade and international policy. The administration was also influenced by the sugar industry, which was critical of the WHO's guidelines on sugar intake. The Sugar Association, representing the US sugar industry, had demanded that Congress end its funding of the WHO unless the organization withdrew its guidelines.", "Cadaverine is a biogenic amine that is found in fish and has been suggested to potentiate histamine toxicity. It has a low acute oral toxicity of more than 2000 mg/kg body weight in rats, but can cause adverse effects such as decreased body weights, diminished food intake, and changes in plasma clinical chemistry at high doses. Cadaverine is also involved in the formation of nitrosamines, which are potentially carcinogenic compounds.", "Based on the retrieved documents, it appears that caloric restriction has been shown to have various health benefits, including reducing the risk of age-related diseases, increasing lifespan, and potentially reducing the risk of cancer. However, the effects of caloric restriction in humans are not yet fully understood and may have different outcomes compared to animal studies. The documents also discuss the potential mechanisms of caloric restriction, such as the role of nutrient sensing pathways and IGF-1 pathways, and the importance of macronutrient balance in determining the relationship between diet and longevity.", "canker sores", "Carcinogens are substances that can cause cancer. According to the retrieved documents, some examples of carcinogens include: \n\n* Heterocyclic amines (HCAs) produced during the cooking of meat and fish (Document 1)\n* 2- and 4-methylimidazoles present as contaminants in caramel colorings (Document 2)\n* Heteroyclic aromatic amines (HAAs) formed during the cooking of meats, fish, and poultry (Document 3)\n* Endocrine disrupters (EDs) (Document 4)\n* N-nitroso compounds (NNC) (Document 5)", "Carrageenan is a sulfated linear polysaccharide extracted from red seaweeds, commonly used as a thickener, stabilizer, and texturizer in processed foods. However, some studies have raised concerns about its potential health effects, including gastrointestinal problems and cancer risk. Research has shown that carrageenan can cause intestinal ulcerations and neoplasms in animal models, and may also induce cell cycle arrest and cell death in human intestinal epithelial cells.", "Cauliflower is a cruciferous vegetable that belongs to the family Brassicaceae. It contains glucoraphanin, a precursor to sulforaphane, which has been shown to have anti-proliferative and antioxidant activities. Cauliflower extracts have been found to have antimutagenic and antiproliferative effects, and may help protect against cancer and heart disease. However, the bioactive properties of cauliflower can be affected by cooking practices, with raw and microwaved cauliflower retaining more of its antioxidant activity than boiled or steamed cauliflower.", "Chanterelle mushrooms are a type of mushroom that is high in vitamin D and has been found to have beneficial effects on immune function. They contain ergosterol, ergosta-5,7-dienol, and ergosta-7-enol, but do not contain brassicasterol or campesterol.", "Unfortunately, the retrieved documents do not provide a direct answer to the question \"Chernobyl\". However, Document 1 mentions Chernobyl in the context of a historical event that released radioactive fallout, which was detected in the United States. According to the document, there were similar preliminary U.S. mortality findings for the four months after Chernobyl fallout arrived in 1986, which approximated final figures.", "Chickpeas are a nutrient-rich food that offers several potential health benefits. They are a good source of carbohydrates, protein, and fiber, and contain important vitamins and minerals such as riboflavin, niacin, thiamin, folate, and potassium. Chickpeas also contain phytochemicals, including enzyme inhibitors, phytohemagglutinins, phytoestrogens, oligosaccharides, saponins, and phenolic compounds, which may provide additional health benefits. Studies have suggested that consuming chickpeas may help to reduce the risk of chronic diseases such as heart disease, type 2 diabetes, and certain cancers. Additionally, chickpeas may help to lower cholesterol levels and improve blood sugar control. Overall, incorporating chickpeas into a balanced diet may have numerous health benefits.", "Chlorophyll", "Cinnamon.", "The retrieved documents do not provide any information about cocaine. The documents discuss various topics such as the relationship between obesity and addiction, brain activation associated with reward processing in smokers and nonsmokers, atrial fibrillation associated with chocolate intake and salbutamol inhalation, and the effects of grapefruit on metabolism and cardiovascular health.", "Coffee may reduce the risk of type 2 diabetes mellitus, hypertension, certain types of cancer, Parkinson's disease, and Alzheimer's disease. Moderate coffee consumption, defined as 3-4 cups per day, may lower the risk of stroke, type 2 diabetes, and certain types of cancer, such as liver and colorectal cancer.", "Based on the retrieved documents, coma is mentioned as a possible consequence of hydrogen peroxide poisoning (Document 2) and as a potential outcome in patients with traumatic brain injury (Document 5).", "The retrieved documents include information on various cooking methods and their effects on food. Document 1 discusses the effects of boiling, steaming, and frying on the nutritional and physicochemical characteristics of vegetables. Document 2 mentions the use of special cooking methods to maximize mineral and nutrient bioavailability in traditional cultures. Document 3 studies the degradation kinetics of ascorbic acid in amla during cooking. Document 4 discusses the production of mutagenic and carcinogenic heterocyclic amines during cooking of meat and fish. Document 5 explores the effect of cooking and germination on the phenolic composition and biological properties of dark beans.", "The hormone cortisol is mentioned in two of the documents: Document 1 and Document 2. In Document 1, it is mentioned that saffron odor significantly decreased cortisol levels after short-term stimulation in both follicular and luteal phases. In Document 2, it is mentioned that potassium supplements appeared to decrease pain intensity and that the elevated serum cortisol and potassium values in the treatment group correlated negatively with patient's assessment of pain intensity, reflecting an anti-pain effect for potassium supplementation.", "None of the retrieved documents mention \"crib death\".", "Black cumin (Nigella sativa) is mentioned in Document 1 as one of the plants that hold immunomodulating properties and may provide protection against various menaces. It is mentioned alongside other plants such as garlic, green tea, and ginger as a natural immune booster.", "Czechoslovakia is not mentioned in any of the retrieved documents.", "deafness is mentioned in Document 1 as one of the symptoms of endemic cretinism, a condition that can be prevented by correcting iodine deficiency before pregnancy.", "DHA stands for Docosahexaenoic acid.", "Based on the retrieved documents, dietary scoring is a method used to evaluate the quality of an individual's diet. There are various dietary scoring systems, such as the Healthy Eating Index (HEI), the Alternative Healthy Eating Index (AHEI), the Mediterranean Diet Score (MDS), and the Dietary Approaches to Stop Hypertension (DASH) score. These systems use different criteria to assess the nutritional quality of a diet, including the intake of fruits, vegetables, whole grains, lean protein, and healthy fats.\n\nThe documents suggest that higher dietary scores are associated with a lower risk of chronic diseases, such as cardiovascular disease and cancer. For example, Document 1 found that higher scores on the HEI, AHEI, and MDS were associated with a 12-28% decreased risk of all-cause, cardiovascular disease, and cancer mortality.\n\nThe documents also highlight the importance of considering the overall dietary pattern rather than just individual nutrients. Document 2 compared the nutritional quality of different diets, including vegan, vegetarian, semi-vegetarian, pesco-vegetarian, and omnivorous diets, and found that the vegan diet had the highest index values and the omnivorous diet had the lowest.\n\nIn addition, the documents suggest that dietary scoring can", "Domoic acid is a neurotoxin produced by certain diatom species that can cause amnesic shellfish poisoning (ASP) in humans.", "There is no information about Dr. Dean Ornish in the retrieved documents.", "Dr. Walter Willett is not mentioned anywhere in the provided documents.", "ECMO stands for Extracorporeal Membrane Oxygenation.", "Eggnog is not mentioned in any of the retrieved documents.", "Endocrine disruptors are chemicals that can interfere with the endocrine system, which regulates various bodily functions, including growth, metabolism, and reproductive processes. They can be found in various products, such as plastics, pesticides, and personal care products. Exposure to endocrine disruptors has been linked to several health problems, including cancer, diabetes, obesity, and reproductive issues. Research suggests that some endocrine disruptors, such as organotins, can act as environmental obesogens, contributing to the development of obesity and metabolic disorders.", "Energy drinks are not explicitly mentioned in the retrieved documents. However, it can be inferred that energy drinks, which often contain high amounts of sugar and other sweeteners, may pose health risks similar to those associated with sugar-sweetened beverages (SSBs) mentioned in Documents 1 and 2. These risks include obesity, type 2 diabetes, and cardiovascular disease. Additionally, Document 3 discusses the potential risks of artificial sweeteners, which are often used in energy drinks, although the focus is on their potential toxicity rather than their contribution to energy drink-related health risks.", "Ergothioneine is not mentioned in the retrieved documents.", "Evidence-based medicine is a approach to medicine that emphasizes the use of evidence from well-designed clinical trials to guide medical decisions.", "Document 2 generally discusses factory farming practices in the context of arsenical drug use in food-animal production. The use of these drugs in animal feed results in residual contamination of food products and environmental contamination, posing a threat to public health and the environment.", "Fava beans are a type of legume that may have various health benefits. They contain active phenolics and have been shown to have antioxidant, chemopreventative, and enzyme inhibitory activities. Fava beans may help protect against DNA damage, inhibit the proliferation of cancer cells, and induce apoptosis in certain cancer cells. They may also have a positive impact on colonic function and fermentation. However, it is worth noting that the perception of increased flatulence and gastrointestinal discomfort from consuming beans may be exaggerated, and individual responses to different bean types can vary.", "Fenugreek", "Finland is mentioned in several documents:\n\n* Document 1: Finland had the highest suicide rate in the European Union in 1997, according to data from the World Health Organisation.\n* Document 2: Finland is the location of a study on spatial clustering of amyotrophic lateral sclerosis, where significant clusters were identified in southeast and south-central Finland.\n* Document 3: Finland is not explicitly mentioned, but the study on biomarkers of fish consumption mentions the Baltic Sea area, which includes Finland.\n\nTherefore, the answer could be:\n\nFinland has high suicide rates, is a location of study on amyotrophic lateral sclerosis, and is part of the Baltic Sea area where fish consumption biomarkers were studied.", "Flax oil, also known as flaxseed oil, is a rich source of omega-3 fatty acids, particularly alpha-linolenic acid (ALA). It has been shown to have various health benefits, including improving skin condition, reducing inflammation, and supporting heart health. Flaxseed oil has also been found to have antioxidant and anti-carcinogenic properties. Additionally, it may help lower blood pressure and improve glycemic control in individuals with type 2 diabetes.", "Folic acid.", "The topic is not found in the retrieved documents.", "Based on the retrieved documents, fructose is a monosaccharide that is found in fruit and is very sweet. It does not generate an insulin response and is metabolized primarily in the liver. However, excessive consumption of fructose has been linked to various health problems, including obesity, metabolic syndrome, diabetes, and cardiovascular disease. Fructose is also found in high-fructose corn syrup and sucrose (table sugar), which are commonly used as sweeteners in foods and beverages. Some studies suggest that 'catalytic' doses of fructose ( \u2264 10 g/meal) may actually decrease the glycaemic response to high-glycaemic index meals and improve glycaemic control. However, the majority of the evidence suggests that excessive fructose consumption is detrimental to health, and dietary advice to limit consumption of all added caloric sweeteners, including fructose-containing sweeteners, is warranted.", "Galactosemia is a genetic disorder that affects how the body processes a type of sugar called galactose. It is not mentioned in the retrieved documents. The documents are related to a novel form of anaphylaxis and urticaria that occurs 3 to 6 hours after eating mammalian meat, associated with IgE antibodies specific for galactose-alpha-1,3-galactose (alpha-gal).", "Based on the retrieved documents, the answer to the question about genetic manipulation is that it is possible to manipulate genes to prevent the transmission of certain viruses, such as porcine endogenous retrovirus (PERV), and to regulate skeletal muscle mass in mice. For example, Document 2 and Document 3 describe a study that used genetic manipulation to express the human APOBEC3G protein in pig cells to prevent PERV transmission. Document 4 describes a study that used gene targeting to disrupt the GDF-8 gene in mice, which led to an increase in skeletal muscle mass. These studies demonstrate the potential of genetic manipulation to prevent disease and regulate cellular processes.", "On the Global Burden of Disease Study", "Goji berries, also known as Lycium barbarum, are a type of fruit that has been traditionally used in East Asian medicine for its medicinal and food value. The fruit, as well as the root bark, has been found to have various pharmacological activities, including antioxidative properties and potential benefits for age-related diseases such as atherosclerosis and diabetes. Some studies have also investigated the effects of goji berry supplementation on macular characteristics and plasma antioxidant levels, with results suggesting that it may help protect against hypopigmentation and soft drusen accumulation in the macula of elderly subjects. Additionally, goji berries have been found to increase plasma zeaxanthin and antioxidant levels, which may have implications for preventing age-related macular degeneration.", "Document 1 discusses the potential health benefits of grapes, specifically Concord grapes, in preventing breast cancer. The study found that an anthocyanin-rich extract from Concord grapes and the anthocyanin delphinidin were able to inhibit DNA adduct formation and suppress reactive oxygen species (ROS) in noncancerous human breast cells.", "Growth promoters are substances that increase the production of muscle meat in animals, often used in the livestock industry. Hormonal growth promoters, such as anabolics, are used to enhance muscle growth, but their use is banned in the EU due to concerns over safety. Instead, the EU focuses on testing for banned substances in animal samples, such as urine and feces, and rarely tests muscle meat. In contrast, the US allows the use of certain hormones in livestock production and tests for regulatory maximum residue levels in edible products.", "Halibut", "Harvard Physicians' Study II", "Hearing is not mentioned in any of the retrieved documents.", "Heme iron is a type of iron found in meat, which is absorbed intact by the body.", "The question \"hernia\" is not directly answered by the retrieved documents, as they mainly discuss diverticular disease, dietary fiber, and bowel movements. However, Document 1 mentions hiatus hernia as one of the conditions that is rarer in developing countries but common in economically more developed communities, and suggests that it may be due to environmental rather than genetic causes, with a deficient intake of dietary fiber being a possible factor.", "Based on the retrieved documents, the answer to the question \"Hiroshima\" is not explicitly mentioned in any of the documents. However, Document 1 mentions \"atomic bomb survivors\" which implies a reference to Hiroshima, as Hiroshima was one of the cities affected by the atomic bombings in 1945.", "Hormonal dysfunction can occur due to exposure to endocrine-disrupting chemicals, which can affect the balance of hormones in the body. Research suggests that exposure to these chemicals has been linked to various health problems, including cancer, diabetes, obesity, and infertility. Additionally, some studies have shown that certain herbal teas, such as spearmint tea, may have anti-androgen effects and potentially help with hormonal imbalances in conditions like polycystic ovarian syndrome (PCOS). However, more research is needed to fully understand the effects of these chemicals and herbal remedies on hormonal function.", "Based on the retrieved documents, the answer to the question \"hyperactivity\" is:\n\nHyperactivity is a common behavioral disorder in children that has been linked to various environmental and genetic risk factors. Research has suggested that artificial food additives, including colorings and preservatives, may play a role in the development of hyperactivity. Eliminating these additives from the diet has been shown to reduce symptoms of hyperactivity in some children. Additionally, exposure to phthalates has also been associated with symptoms of attention-deficit/hyperactivity disorder (ADHD). A trial elimination diet, free from artificial food additives, may be beneficial for children who have not responded to conventional treatment or whose parents wish to pursue a dietary investigation.", "IGF-1 (Insulin-like Growth Factor-1) is a protein that plays a crucial role in cell growth and development.", "Industrial toxins refer to harmful chemicals that are produced or used in industrial processes. Examples of industrial toxins include:\n\n1. MPTP (1-methyl-4-phenyl-1,2,3,6-tetrahydropyridine), a contaminant of illicit narcotics that causes selective destruction of dopaminergic neurons and is linked to Parkinson's disease.\n2. Dieldrin, an organochlorine pesticide that has been found in human postmortem brain tissues and is associated with nigral cell death.\n3. Hydrogen peroxide, a strong oxidizing agent that can cause corrosion, oxygen gas formation, and lipid peroxidation, leading to cellular damage and death.\n4. Cigatoxins, a group of lipid-soluble polyether toxins produced by Gambierdiscus toxicus, a marine dinoflagellate that can accumulate in fish and cause ciguatera poisoning in humans.\n\nThese industrial toxins can have significant health effects, including neurotoxicity, oxidative stress, and cell death, and can be particularly harmful to humans and the environment if not handled and disposed of properly.", "insects", "The Iowa Women's Health Study found an association between nut consumption and decreased risk of ischemic heart disease (IHD).", "Based on the retrieved documents, Japan is mentioned in the following contexts:\n\n* Document 1: Japan is mentioned as a country where traditional Japanese fish dishes like sushi and sashimi are suspected to cause fishborne parasitic zoonoses.\n* Document 2: Japan is mentioned as the country where the Fukushima nuclear meltdowns occurred, releasing radioactive plumes that spread to other nations, including the United States.\n* Document 3: Japan is mentioned as one of the countries where seaweeds have been used as food since ancient times.\n* Document 4: Japan is not explicitly mentioned, but sushi, a traditional Japanese food, is the subject of the study on microbiological quality.\n* Document 5: Japan is mentioned as the location of the Fukushima Dai-ichi Nuclear Power Station, which released fission-product isotopes into the environment, leading to wet deposition in North America.\n\nOverall, Japan is mentioned in the context of its cuisine, particularly sushi, as well as the Fukushima nuclear disaster and its environmental impact.", "Junk food", "Kidney beans may be beneficial in the prevention and treatment of chronic diseases, such as diabetes, cardiovascular disease, and cancer, due to their high fiber content and alpha-amylase inhibitory effect.", "Unfortunately, none of the retrieved documents mention the word \"kohlrabi\". Therefore, I cannot provide a specific answer to the question.", "lard", "There is no mention of leeks in any of the retrieved documents.", "Leucine is an amino acid that plays a crucial role in various biological processes, including protein synthesis, insulin signaling, and adipogenesis. It is a key mediator of mammalian target of rapamycin complex 1 (mTORC1) signaling, which regulates cell growth, proliferation, and metabolism. Excessive leucine intake has been linked to the development of obesity, type 2 diabetes, and other metabolic disorders.", "Lindane", "According to the retrieved documents, liver disease is associated with various factors such as Noni juice consumption (Document 1), obesity (Document 3), metabolic syndrome (Document 5), and hepatitis (Document 2). Document 4 discusses the diagnosis and management of hepatocellular carcinoma.", "Low-carb diets are shown to have favorable effects on body weight and major cardiovascular risk factors, such as reducing body weight, body mass index, abdominal circumference, systolic and diastolic blood pressure, plasma triglycerides, fasting plasma glucose, and glycated hemoglobin.", "Lyme disease is a tick-borne illness caused by the bacterium Borrelia burgdorferi. It is typically transmitted to humans through the bite of an infected blacklegged tick (Ixodes scapularis). The disease is characterized by a distinctive \"bull's-eye\" rash, known as erythema migrans, which appears at the site of the tick bite. Other symptoms of Lyme disease may include fever, headache, and joint pain. If left untreated, Lyme disease can lead to more serious complications, such as arthritis, neurological problems, and heart problems. Antibiotics are commonly used to treat Lyme disease, and early treatment can help prevent long-term damage.", "Magnesium is mentioned in several of the retrieved documents, but the most relevant information about magnesium can be found in Document 1 and Document 2.\n\nAccording to Document 1, magnesium (Mg) was determined in the infusions of herbal tea plant species, and the highest amount was detected in the infusions prepared from Ginkgo biloba leaves. Additionally, the document suggests that the Mg contained in the infusion (up to 106\u00b15 mg/L) may be a contributor to the attenuation of blood pressure.\n\nDocument 2 also mentions magnesium as one of the mineral components analyzed in dried herb samples and prepared infusions. The study found that the contents of individual elements, including magnesium, in herbs and infusions depended on the type of raw material and its origin.\n\nOverall, the retrieved documents suggest that magnesium can be found in herbal infusions and may have potential health benefits, such as contributing to the attenuation of blood pressure. However, the bioavailability and optimal dosage of magnesium from herbal infusions are not explicitly mentioned in the documents.", "Maple syrup", "Mastitis is an inflammation of breast tissue, sometimes caused by infection. It is often seen in lactating women, but can also occur in women who are not breastfeeding.", "Medical ethics involves the study of moral values and principles that guide the behavior of healthcare professionals, including questions of informed consent, deception, and the responsible use of medical treatments. It requires consideration of social history, social theory, and the legitimacy of the social authority exercised by physicians.", "Memory is impaired by factors such as short or long sleep duration, high tofu intake, and dehydration, and may be improved by consuming foods rich in polyphenols, flavonoids, and carotenoids, such as Concord grape juice, lutein, and zeaxanthin.", "There is no mention of \"mesquite\" in the retrieved documents.", "Mevacor is not mentioned in any of the retrieved documents.", "According to the retrieved documents, the relationship between milk consumption and acne is a topic of interest. Document 1 explains that milk consumption can lead to an increase in insulin-like growth factor-1 (IGF-1), which can stimulate cell proliferation and contribute to the development of acne. Document 4 and Document 5 also support the association between milk consumption and acne in adolescent girls and boys, respectively. They found that high intake of milk, including skim milk, is associated with an increased risk of acne. Therefore, the answer to the question is that milk consumption is linked to an increased risk of acne.", "Molasses is mentioned in Document 1, where it is compared to other sweeteners in terms of its total antioxidant content. Dark and blackstrap molasses are found to have the highest antioxidant capacity, with a ferric-reducing ability of plasma (FRAP) value of 4.6 to 4.9 mmol/100 g.", "Oral cancer, also known as mouth cancer, is a type of cancer that occurs in the mouth or oral cavity. According to the retrieved documents, several factors can increase the risk of developing oral cancer. \n\n1. Tobacco and alcohol consumption are established risk factors, and their use can lead to the development of pre-cancerous changes in the oral mucosa. \n2. Betel nut and gutka consumption also increase the risk of oral cancer. \n3. Human papillomavirus (HPV) infection, which can be transmitted through oral sex, is a risk factor for oral cancer, particularly oral squamous cell carcinomas (OSCCs). \n4. Dietary factors also play a role, with a diet high in fruits, vegetables, and plant-based foods potentially reducing the risk of oral cancer. \n5. The use of alcohol-containing mouthwashes can increase the risk of oral cancer due to the production of acetaldehyde, a carcinogen.\n\nOverall, it is essential to adopt a healthy lifestyle, including a balanced diet, avoiding tobacco and alcohol, and practicing safe sex, to reduce the risk of developing oral cancer. Additionally, regular oral mucosal examinations by healthcare professionals can help detect pre-cancerous changes and prevent the development of oral cancer.", "Based on the retrieved documents, I will provide information related to \"muscle health\".\n\n* Maintaining muscle function is an important aspect of overall health, and exercise can help preserve functional reserve in the elderly (Document 2).\n* Creatine supplementation has been reported to have beneficial effects on muscle mass during training, but may also have negative side effects such as muscle cramping (Document 3).\n* A healthy diet, including an alkaline diet, may have benefits for muscle health, although more research is needed (Document 1).\n* Certain foods, such as contaminated fish, can cause muscle weakness and rhabdomyolysis, a condition known as Haff disease (Document 4).\n* Regular exercise, including exercises aimed at improving muscle function, can contribute to overall health and longevity (Documents 2 and 5).", "Myelopathy", "There is no mention of the National Academy of Sciences in the provided documents.", "The searched documents don't provide any specific information about Native Americans' way of living or comparison with Western civilization.", "Neurocysticercosis is a parasitic infection of the central nervous system caused by the metacestode larval form of the Taenia sp. parasite. It is a major public health problem in many countries, particularly in low-income and developing regions. The infection can cause a range of symptoms, including seizures, headaches, and cognitive impairment. Diagnosis is typically made using imaging studies such as CT or MRI scans. Treatment usually involves antiparasitic medications, such as praziquantel or albendazole, and may also include surgical interventions in some cases. Neurocysticercosis can have a significant impact on individuals and communities, including cognitive impairment, dementia, and even death.", "The NIH-AARP study is not explicitly mentioned in any of the provided documents. However, based on the context of the documents, it appears that the NIH-AARP study is not directly related to the topics discussed in the documents, which include lifestyle behaviors and mortality, surveillance for morbidity and mortality among older adults, prevalence and incidence of Alzheimer's disease, and the effects of lifestyle changes on telomerase activity.", "Based on the retrieved documents, here's the answer to your question about norovirus:\n\nNorovirus is a major cause of foodborne illness, with an estimated 10,324 illnesses, 1,247 healthcare provider visits, 156 hospitalizations, and 1 death annually in the United States, according to a study analyzing 2,922 foodborne disease outbreaks from 2001-2008 (Document 1). Infected food handlers were the source of 53% of outbreaks and may have contributed to 82% of outbreaks. Leafy vegetables, fruits/nuts, and mollusks were commonly implicated in outbreaks. Additionally, norovirus has been linked to the development of postinfectious functional gastrointestinal disorders (PI-FGID) in a substantial proportion of patients (Document 2).", "Based on the provided documents, here are some potential answers related to nuts:\n\n* What are the health benefits of nuts? \nNuts are associated with reduced cardiovascular disease risk, improved serum lipid profile, and lower risk of coronary heart disease events. They are also rich in nutrients and phytochemicals that have health benefits.\n\n* Can nuts help with weight loss or maintenance? \nNumerous epidemiological and clinical studies show that nuts are not associated with weight gain, and may even help with weight loss or maintenance due to their high satiety and low metabolizable energy properties.\n\n* What are some potential drawbacks of consuming nuts? \nNuts are high in fat and energy dense, which may be a concern for energy balance and body weight. Additionally, there is a risk of allergic reactions associated with nut consumption.\n\n* Can nuts be part of a healthy diet? \nYes, nuts can be included in the diet in moderation to enhance palatability, nutrient quality, and chronic disease risk reduction without compromising weight loss or maintenance.", "Okra is not mentioned in any of the retrieved documents.", "Based on the retrieved documents, oral intraepithelial neoplasia (IEN) is a premalignant lesion that can progress to oral squamous cell carcinoma. Topical application of a bioadhesive black raspberry gel has been shown to modulate gene expression, reduce cyclooxygenase 2 protein, and induce keratinocyte apoptosis and terminal differentiation in human premalignant oral lesions. Additionally, a diet high in fruits, vegetables, and plant-based foods may help prevent oral cancer. Oral sex has been linked to an increased risk of developing head and neck cancers, particularly oral squamous cell carcinomas, due to the transmission of human papillomavirus (HPV).", "Organotins are a class of persistent organic pollutants with endocrine-disrupting properties that have been linked to adipocyte differentiation and obesity. They are found in various food items, including fish, and the daily intake of these compounds is estimated to be around 2.47 ng/kg body weight, which is 1% of the tolerable daily intake set by the European Food Safety Authority.", "Oxen meat is not directly mentioned in the retrieved documents.", "Panama", "Based on the retrieved documents, here is the answer to the question:\n\nParkinson's disease is a complex neurodegenerative disorder that is influenced by both genetic and environmental factors. While rare genetic mutations can cause Parkinson's disease, environmental factors such as exposure to pesticides and metals may play a more significant role in the development of the disease. Research has identified specific chemicals, such as dieldrin and MPTP, that have been linked to Parkinson's disease through their ability to promote dopaminergic degeneration and oxidative stress. The interplay between genetic and environmental factors is thought to influence an individual's risk of developing Parkinson's disease, and further research is needed to understand the interactions between these factors and how they contribute to the disease.", "There is no answer to the question \"peanut butter\" in the retrieved documents.", "Peoria is not mentioned in any of the retrieved documents.", "Pesticides are substances or mixture of substances used to prevent, destroy, repel or mitigate any pest.", "The Philippines is mentioned only once in the retrieved documents, in Document 1, which discusses the iatrogenic plague disaster in Bilibid Prison, Manila, in 1906.", "It seems you haven't asked a question about phytic acid. Please go ahead and ask your question about phytic acid, and I'll be happy to answer based on the provided documents.", "Pineapples", "A plant-based diet is effective in lowering plasma cholesterol concentrations, reducing the risk of heart disease, and improving overall health. It can also lead to weight loss, improve insulin sensitivity, and may be beneficial in the management of Parkinson's disease.", "Based on the retrieved documents, the following plants are mentioned as being poisonous or toxic:\n\n1. Potato (Document 1) - contains toxic glycoalkaloids that can cause poisoning in humans and livestock.\n2. Aloe (Document 2) - can cause toxic hepatitis, and its pharmacokinetics and toxicity are poorly described in the literature.\n3. Moringa stenopetala (Document 3) - extracts from this plant have been shown to be cytotoxic in vitro, particularly the ethanol extracts of leaves and seeds.\n4. Belladonna (Document 4) - contains toxic alkaloids, although it was used as an antidiabetic agent in the pre-insulin era.\n\nNote that some plants can be both medicinal and toxic, depending on the context and dosage. It's also worth noting that ciguatera, a form of food poisoning, is caused by consuming fish contaminated with ciguatoxins, not by consuming a poisonous plant directly (Document 5).", "Unfortunately, none of the retrieved documents mention \"polypropylene plastic\". If you would like to ask another question or provide more context, I'll do my best to assist you.", "Based on the retrieved documents, the answer to the question \"pork\" is:\n\nPork is a type of meat that can be contaminated with harmful substances such as MRSA, N-Nitroso compounds, and Heterocyclic aromatic amines (HAAs). MRSA can be transmitted to pork through the slaughter process, and recontamination can occur through surface treating machinery or human handling. N-Nitroso compounds, particularly NDMA, have been found in cured meats like bacon, and HAA formation can occur during the cooking of meats. These substances have been linked to various health risks, including cancer.\n\nTherefore, the answer to the question \"pork\" is that it can be a source of harmful substances that can pose health risks to consumers.", "Poultry workers may be at risk of disease due to their high exposure to a variety of transmissible agents present in poultry and their products. Studies have shown that poultry workers have an excess of deaths from certain diseases, such as diabetes, anterior horn disease, and hypertensive disease, and a deficit of deaths from intracerebral hemorrhage. Additionally, poultry workers may be at risk of infection with avian leukosis/sarcoma viruses (ALSV) and reticuloendotheliosis viruses (REV), which can cause cancers in chickens. Industrial hygiene assessment of antibody levels in poultry workers has been used to identify risky job tasks and exposure to these infectious agents.", "According to Document 1, prenatal vitamins should include folic acid and extra vitamin D as a nutritional safety net. Additionally, Document 4 suggests that folic acid and other vitamins may have adverse effects and toxicities, and should be taken with caution. It is recommended that vitamins, especially those intended for children and vulnerable groups, should have labels with information on possible toxicities, dosing, and recommended upper intake limits.", "Based on the retrieved documents, here is the answer to the question:\n\nProlactin is a hormone that has been implicated in various physiological and pathological processes, including cyclical mastalgia, which is a type of breast pain. Research suggests that prolactin may play a central role in the development of cyclical mastalgia, and that inhibiting prolactin secretion may be an effective treatment approach. Additionally, studies have identified a potential link between insulin-like growth factor-I (IGF-I) signaling and the development of acne, which may be influenced by dairy consumption. However, there is limited information on the relationship between prolactin and acne in the provided documents.", "Prunes, also known as dried plums, are a type of fruit that has been traditionally used to treat various health conditions, including constipation and liver disease. According to the retrieved documents, prunes have been shown to be effective in improving liver function and relieving symptoms of constipation.", "Unfortunately, there is no mention of pumpkin in the documents.", "None of the retrieved documents mention the term \"quinine\".", "Rapamycin is an antifungal antibiotic that was isolated from the bacterium Streptomyces hygroscopicus. It has been found to have anti-aging and anti-cancer properties, and is being studied as a potential treatment for various types of cancer.", "Based on the retrieved documents, there is no specific information about \"red tea\". The documents provide information on the erosive potential of brewed teas (Document 1), the antibacterial and antifungal activities of tea flavonoids (Document 2), the potential health benefits of green tea (Document 3), the hydrating properties of black tea (Document 4), and the efficacy of green tea and other plant food supplements (Document 5). However, none of the documents mention \"red tea\" specifically.", "Based on the retrieved documents, it appears that rhabdomyolysis can be caused by various factors, including:\n\n1. Dietary supplements, such as a mislabeled \"acai berry\" supplement (Document 1) or Spirulina (Arthrospira platensis) (Document 2).\n2. Contaminated fish, such as salmon (Document 3), which can cause Haff disease.\n3. Kombucha tea ingestion, which can lead to hyperthermia, lactic acidosis, and acute renal failure (Document 4).\n\nIt's worth noting that rhabdomyolysis is a serious condition that can be life-threatening, and it's essential to seek medical attention if symptoms such as muscle weakness, pain, or swelling occur.\n\nDocument 5 discusses muscle soreness and delayed-onset muscle soreness, which are different conditions from rhabdomyolysis, but can also cause muscle pain and discomfort.", "Rickets is not explicitly mentioned in the provided snippet, but Vitamin D is a crucial nutrient that helps to prevent rickets, a disease caused by Vitamin D deficiency.", "Rutin", "Based on the retrieved documents, the answer to the question \"salmon\" is:\n\nThere are potential health risks associated with consuming salmon. According to Document 1, eating contaminated salmon can cause Haff disease, a rare illness characterized by muscle weakness and rhabdomyolysis. Additionally, Document 2 reports a case of human infection with the tapeworm Diphyllobothrium nihonkaiense after consuming raw Pacific sockeye salmon. Furthermore, Document 3 discusses the risk of methyl mercury exposure from consuming fish, including salmon, and its potential effects on brain development. Therefore, it is essential to ensure that salmon is properly handled, cooked, and consumed to minimize the risk of foodborne illnesses.", "Saturated fat is a type of dietary fat that has been linked to various health effects, including insulin resistance, cardiovascular disease, and periodontal disease. Studies have shown that high intake of saturated fat can impair insulin sensitivity, increase the risk of cardiovascular disease, and contribute to the progression of periodontal disease. In contrast, monounsaturated and polyunsaturated fats have been shown to have more neutral or even beneficial effects on these health outcomes.", "Seafood.", "Based on the retrieved documents, serotonin is a neurotransmitter that plays a crucial role in various physiological processes, including emotion, development, neuronal growth and death, platelet activation, and reproduction. It is also involved in the regulation of appetite, sleep, and pain. Serotonin is found not only in animals but also in plants, where it is involved in flowering, morphogenesis, and protection from environmental changes.\n\nThe documents also discuss the role of serotonin in various diseases and conditions, such as depression, migraine, and cancer. Antidepressants, which are designed to regulate serotonin levels, have been found to have both positive and negative effects on the brain and body. On the one hand, they can reduce depressive symptoms, but on the other hand, they can also cause neuronal damage, disrupt adaptive processes, and increase the risk of certain health problems.\n\nIn addition, the documents highlight the importance of serotonin in the treatment of migraine, where it is involved in the regulation of blood vessels and the transmission of pain signals. Triptans, a class of drugs that act on serotonin receptors, have been found to be effective in aborting migraine attacks.\n\nOverall, the retrieved documents provide a comprehensive overview of the role of serotonin in various physiological and pathological processes, and highlight its importance in the", "The final answer is not explicitly stated in the retrieved documents, but based on the content, the topic of \"shelf life\" is only relevant to Document 1, which discusses the shelf life of various culinary oils. However, the document does not provide a clear and concise answer to a specific question about shelf life.\n\nIf we were to infer an answer based on the content of Document 1, it could be something like:\n\nThe shelf life of culinary oils varies depending on their oxidative stability, with macadamia oil having the longest shelf life and walnut oil having one of the shortest shelf lives.", "Sirtuins are a family of proteins that regulate aging and age-related diseases, including cancers, metabolic disorders, and neurodegenerative diseases. They have been shown to promote longevity and have a neuroprotective effect, particularly in the context of cognitive ageing and Alzheimer's disease. SIRT1, a specific isoform of sirtuins, has been found to regulate transcription, DNA repair, and mitochondrial bioenergetics, and has been implicated in the longevity effect of calorie restriction.", "Smoking has been linked to various health risks, including cancer, cardiovascular disease, and respiratory problems.", "Soil health refers to the ability of soil to function as a living ecosystem that supports plants, animals, and humans. Healthy soil has a balanced ecosystem, good structure, adequate nutrients, and the ability to absorb and filter water. Factors that contribute to soil health include organic matter, microbial activity, and biodiversity. Organic farming practices, such as those mentioned in Document 1, can promote soil health by increasing microbial biomass and activity, improving soil structure, and supporting biodiversity. Additionally, organic farming can reduce soil contamination with pesticides and heavy metals, which can harm human health. Overall, maintaining healthy soil is essential for sustainable agriculture and human well-being.", "Spearmint", "There is no mention of Splenda in any of the retrieved documents.", "St. John's Wort (Hypericum perforatum)", "Stevia is a natural sweetener that is 100-300 times sweeter than table sugar and has been used for centuries as a bio-sweetener and for other medicinal uses such as lowering blood sugar. It is a small perennial shrub that is native to South America and has been used in various forms, including as a sweetener and a medicine. Stevia is considered safe for consumption and has been shown to have no genotoxic activity.", "Document 1 mentions subsidies in the context of reducing cardiovascular disease costs. According to the document, a subsidy on vegetables and whole grains would be an efficient way to reduce CVD expenditures.", "sulfur", "Unfortunately, the retrieved documents do not provide a direct answer to the question about suppositories.", "Based on the retrieved documents, here is an answer to the question \"What are some alternatives to sugar and what are their effects on health?\"\n\nArtificial sweeteners are popular alternatives to sugar, providing sweetness without the calories. However, their safety has been a topic of controversy, with some studies suggesting links to health hazards such as weight gain, brain tumors, and cancers. Despite these concerns, scientists are divided on the issue of artificial sweetener safety, and some studies have found them to be safe.\n\nNatural alternatives to sugar, such as Stevia (Stevia rebaudiana), have also been explored. Stevia is a bio-sweetener that has been used for centuries and has been found to be a potential substitute for sugar, with no calories and up to 300 times the sweetness of table sugar.\n\nAnother type of sweetener, high fructose corn syrup (HFCS), has also been studied. While its effects on health are still debated, research suggests that it may not be more detrimental than sucrose (table sugar) in terms of contributing to obesity and other health conditions.\n\nOverall, while artificial sweeteners are a popular alternative to sugar, their effects on health are still unclear, and natural alternatives such as Stevia may be a safer choice.", "The search term \"taro\" does not appear in any of the retrieved documents, so there is no answer to provide.", "Tempeh is a soy-based food that can be used as a substitute for meat in burgers. When fried, tempeh burgers do not produce airborne mutagens or carcinogens, unlike bacon and beef. This makes tempeh a potentially healthier option for cooking.", "Thiamine", "Titanium dioxide", "It appears that none of the documents directly refer to a \"tongue worm.\" However, Document 1 mentions the nematode worm parasite Anisakis simplex, which can be related to a parasitic infection that affects the gastrointestinal tract, but not specifically the tongue. If you're looking for information on a tongue worm, it might be a different type of parasite or condition not discussed in the provided documents.", "Based on the retrieved documents, here are some key facts about trans fats:\n\n1. **Association with aggression**: Trans fats have been linked to increased aggression and irritability in a study of 945 adult men and women (Document 1).\n2. **Decrease in intake**: The average intake of industrially-produced trans fatty acids (IP-TFA) has decreased from 4.6 g per person per day in 2003 to 1.3 g per person per day in the US population (Document 2).\n3. **Lack of tolerable upper intake level**: The Institute of Medicine did not set a tolerable upper intake level (UL) for trans fat, saturated fat, and cholesterol because any intake level above 0% of energy increases LDL cholesterol concentration (Document 3).\n4. **Health risks**: Trans fats are considered a risk factor for cardiovascular diseases, insulin resistance, dyslipidemia, and obesity, and may contribute to lipotoxicity in various organs (Document 4).\n5. **Historical context**: The introduction of trans fats into the food supply, particularly in the form of margarines and refined oils, may have contributed to the rise of myocardial infarction (heart attacks) in the Western world after", "Unfortunately, I couldn't find any mention of \"tufts\" in the retrieved documents. It's possible that the question is unrelated to the provided documents or that the keyword \"tufts\" is not present in the text. If you could provide more context or clarify the question, I'd be happy to try and assist you further.", "Turnips are a type of vegetable that is mentioned in Document 1, which discusses the microbiological examination of vegetable seed sprouts in Korea. According to the document, turnip seeds were found to have lower populations of total aerobic bacteria and molds or yeasts compared to radish seeds.", "Ultra-processed foods are not directly mentioned in the retrieved documents, but Document 1 discusses the negative health effects of heat-processed foods, which can be related to ultra-processed foods. The document suggests that dietary advanced glycation end products (dAGEs) contribute to increased oxidant stress and inflammation, which are linked to the epidemics of diabetes and cardiovascular disease.", "The documents do not explicitly discuss uterine health, but they do discuss related topics such as endometriosis, bacterial vaginosis, and reproductive health. Here are some relevant points:\n\n* Exposure to environmental toxicants may trigger the development of endometriosis, a condition that affects the uterus (Document 1).\n* Bacterial vaginosis is a common condition that affects the vagina and can increase the risk of acquiring sexually transmitted infections, which can also affect uterine health (Document 2).\n* A healthy diet that includes essential nutrients such as iodine is important for reproductive health, including uterine health (Documents 3 and 4).\n* Mercury exposure, which can be obtained through fish consumption, can affect fetal safety and potentially uterine health (Document 5).\n\nOverall, while the documents do not directly discuss uterine health, they highlight the importance of a healthy diet, avoiding environmental toxicants, and monitoring for infections and nutrient deficiencies to support overall reproductive health, including uterine health.", "Veal is not mentioned in any of the retrieved documents.", "Veggie chicken is a topic that can be associated with the documents retrieved, as they all relate to chicken and vegetables in some manner. However, the specific retrieved documents do not provide a direct answer to the question \"veggie chicken.\" \n\nDocument 1 and Document 2 discuss the composition of chicken nuggets and modern organic and broiler chickens, respectively, revealing high fat content. Document 3 compares the bile acid binding capacity of various vegetables. Document 4 examines cross-contamination of cooked chicken with Salmonella from raw chicken during meal preparation. Document 5 investigates the presence of Clostridium difficile in retail chicken.\n\nThe documents explore chicken and vegetable topics, but none directly relate to \"veggie chicken,\" suggesting a gap in the provided context. A relevant response might require more context or additional information about the intended meaning of \"veggie chicken.\"", "Based on the provided documents, the answer to the question about viral infections is:\n\nViral infections have been linked to obesity in various studies. Adenovirus 36 (AD-36) is the most widely studied infectious agent in animals and humans, and has been associated with childhood obesity. Other viral agents, such as canine distemper virus, rous-associated virus 7, scrapie, Borna disease virus, and SMAM-1, have also been linked to increased body weight and obesity in animal models. While the evidence is not yet conclusive, and more studies are needed to establish a causal link between viral infections and obesity, the available data suggest that viral infections may play a role in the development of obesity.\n\nThe relevant documents that provide this information are:\n\n* Document 1: \"Viral obesity: fact or fiction?\"\n* Document 2: \"Adenovirus 36 infection and obesity\"\n* Document 3: \"Infectobesity: obesity of infectious origin\"\n* Document 4: \"A framework for identification of infections that contribute to human obesity\"\n\nNote that Document 5 is not directly related to viral infections and obesity, but rather discusses the relationship between diet, infection, and wheezy illness in adults.", "Vitamin K is a vitamin that can have minor and reversible adverse effects, and it is recommended to be considered as a dietary supplement rather than a drug. It is also important to note that vitamin K deficiency can occur in newborns who are exclusively breastfed by vegan mothers, and it is essential to detect and prevent vitamin deficiencies in both mothers and children.", "Walnut oil is mentioned in Document 1 as one of the culinary oils studied for its oxidative stability and shelf-life evaluation. Document 2 discusses the acute effects of high-fat meals enriched with walnuts or olive oil on postprandial endothelial function. Document 3 examines the effects of diets enriched with virgin olive oil, walnuts, or almonds on lipids and other cardiovascular risk markers. Document 4 investigates the antiproliferative and antioxidant activities of Juglans regia L. (walnut) extracts. However, the most relevant document for the specific topic of walnut oil is Document 1.", "The answer to the user's question about weight gain is that habitual chocolate consumption may increase body weight in a dose-response manner, and increased food energy supply is more than sufficient to explain the US epidemic of obesity. Additionally, dietary sugar and body weight have been linked, with consumption of sugar-sweetened beverages associated with a higher risk of obesity, diabetes, and cardiovascular disease.", "Whiting", "Worms are a type of parasite that can infect humans and cause various diseases. There are different types of worms, including nematode worms like Anisakis simplex, tapeworms like Diphyllobothrium nihonkaiense, and pork tapeworms like Taenia solium. These worms can cause infections such as anisakiasis, diphyllobothriasis, and neurocysticercosis, which can lead to symptoms like allergic reactions, digestive problems, and even cancer. The worms can be transmitted through the consumption of contaminated food, such as raw or undercooked fish or pork, and can also be spread through contact with contaminated feces or other sources.", "Yale is not mentioned in any of the retrieved documents.", "The best answer is Zoloft is also known as sertraline, which is a selective serotonin reuptake inhibitor (SSRI) and is mentioned in Document 1 and Document 2 as an antidepressant medication.", "According to the retrieved documents, there is evidence to suggest that B vitamins, particularly B6, B12, and folic acid, can help prevent brain loss and slow down cognitive decline in individuals with mild cognitive impairment. The studies show that B-vitamin treatment can reduce the rate of brain atrophy and slow down cognitive decline, especially in individuals with high homocysteine levels.", "Document 1 discusses the potential cancer-preventive effects of apples and their components. Document 2 highlights the complex mixtures of interacting natural chemicals in plant-derived foods that produce powerful health-protective effects. Document 3 emphasizes the need for policies and strategies to prevent noncommunicable diseases (NCDs) by reducing major risk factors. Document 4 explores the relationship between diet, infection, and wheezy illness, with a focus on the importance of vitamins C and E in preventing asthma and atopic disease. Document 5 examines the efficacy of home washing methods in controlling surface microbial contamination on fresh produce, including apples.\n\nThe question \"More Than an Apple a Day: Combating Common Diseases\" asks about the potential health benefits of apples and other foods in preventing common diseases. The best answer can be found in Document 1, which discusses the cancer-preventive effects of apples and their components. Additionally, Document 2 provides context on the complex mixtures of natural chemicals in plant-derived foods that produce health-protective effects, and Document 4 highlights the importance of vitamin C in preventing asthma and atopic disease, which is relevant to the discussion of apples as a food that contains vitamin C.", "Based on the retrieved documents, the answer to the question \"Are Organic Foods Safer?\" is mixed. Some documents suggest that organic foods may be safer than conventional foods in certain aspects, while others find no significant difference.\n\nDocument 1 highlights that organic fruits and vegetables may contain fewer agrochemical residues than conventionally grown alternatives, but the significance of this difference is questionable. Document 2 suggests that consumption of organic foods may reduce exposure to pesticide residues and antibiotic-resistant bacteria, but finds no significant difference in nutrient levels between organic and conventional foods.\n\nDocument 3 finds no association between organic food consumption and the incidence of most types of cancer, but suggests a possible reduction in the risk of non-Hodgkin lymphoma. Document 4, which studied Drosophila melanogaster (fruit flies), found that flies raised on diets made from organically grown produce had greater fertility and longevity.\n\nOn the other hand, Document 1 and Document 2 emphasize that the term \"organic\" does not automatically equal \"safe.\" Document 1 notes that the risks associated with organic foods are difficult to weigh, and Document 2 states that the published literature lacks strong evidence that organic foods are significantly more nutritious than conventional foods.\n\nIn summary, while some studies suggest potential health benefits of", "Based on the retrieved documents, diabetes can be considered a disease of fat toxicity because excessive intake of saturated fatty acids and transfatty acids can lead to lipotoxicity, which contributes to the development of insulin resistance, pancreatic beta-cell dysfunction, and ultimately, Type 2 diabetes. The documents suggest that dietary fat, particularly saturated fat, can impair glucose metabolism, contribute to beta-cell failure, and promote insulin resistance, all of which are key factors in the pathogenesis of Type 2 diabetes.\n\nThe documents also highlight the importance of understanding the molecular mechanisms underlying lipotoxicity, including ER stress, inflammation, and hyperinsulinemia, in order to develop novel and targeted approaches to prevent and treat Type 2 diabetes.\n\nOverall, the evidence suggests that excessive fat consumption, particularly saturated fat, can be toxic to the body and contribute to the development of diabetes, supporting the idea that diabetes can be considered a disease of fat toxicity.", "The answer to whether milk is good for our bones is not a straightforward one based on the retrieved documents. Document 1 suggests that milk intake may not have a significant association with hip fracture risk in women, but more data is needed for men. Document 2 found that greater milk consumption during teenage years was not associated with a lower risk of hip fracture in older adults, and may even be associated with a higher risk of hip fracture in men, possibly due to increased height. \n\nIn contrast, Document 3 suggests that milk consumption during early life (prior to age 5 years) is associated with enhanced growth, and that insulin-like growth factor I (IGF-I) may play a role in mediating the relationship between milk consumption and growth. Document 4 and 5 propose a novel mechanism by which milk consumption may promote growth, via activation of mTORC1 signaling, but also suggest that persistent high milk signaling during adolescence and adulthood may promote diseases of civilization. \n\nDocument 6 does not directly address the relationship between milk and bone health, but rather explores the potential relationship between milk consumption and respiratory tract mucus production. \n\nOverall, it appears that the relationship between milk consumption and bone health is complex and may depend on various factors, including age, sex, and", "Based on the retrieved documents, here are some findings related to preventing ulcerative colitis with diet:\n\n1. **High protein and meat intake may increase risk**: Document 1 suggests that a diet high in protein, particularly animal protein, may be associated with an increased risk of inflammatory bowel disease, including ulcerative colitis. Document 2 also finds that consumption of meat, especially red and processed meat, increases the likelihood of relapse in ulcerative colitis patients.\n2. **n-6 polyunsaturated fatty acids may increase risk**: Document 1 suggests that n-6 polyunsaturated fatty acids, such as arachidonic acid, may confer a risk of ulcerative colitis. Document 5 finds that individuals with high levels of arachidonic acid in adipose tissue have a significantly greater risk of developing ulcerative colitis.\n3. **Dietary fiber may not be beneficial for ulcerative colitis**: While Document 3 finds that high dietary fiber intake is associated with a lower risk of Crohn's disease, it does not find a significant association between fiber intake and risk of ulcerative colitis.\n4. **Fruits and vegetables may be beneficial**: Document 4 suggests that high intakes of fruits and vegetables may be associated with", "In considering the actual benefit of diet vs. drugs, research across various studies suggests that dietary changes can have significant impacts on health outcomes, comparable to or even surpassing the effects of some drug interventions in certain cases. Document 2 illustrates how moderate dietary salt reduction can lower blood pressure substantially, to an extent that could prevent a considerable number of deaths from stroke and ischaemic heart disease, rivaling the impact of fully implementing recommended drug treatments for high blood pressure.\n\nDocument 3's metaepidemiological study comparing exercise and drug interventions on mortality outcomes shows that physical activity can be as effective as, or in some cases more effective than, drug treatments in preventing mortality in conditions such as coronary heart disease, stroke rehabilitation, and the prevention of diabetes. This suggests that lifestyle interventions, including diet, can offer significant health benefits.\n\nMoreover, Document 1 highlights the anti-aging effects of the traditional Mediterranean diet and certain specific foods, emphasizing the beneficial role of diet in aging and longevity. It also notes the importance of socio-economic status in accessing healthy diets, indicating that diet can be a critical factor in health disparities.\n\nDocument 4, focusing on the relationship between diet and sleep quality, indicates that dietary choices can influence sleep patterns, further underscoring the broad impact of diet", "Based on the documents retrieved, the answer to the question is as follows:\n\nThe majority of the studies suggest that saturated fat intake is positively associated with insulin resistance, with Document 1, Document 2 and Document 3 showing significant correlations between saturated fat consumption and insulin concentrations. Document 2 further indicates that substituting saturated fat with monounsaturated fat improves insulin sensitivity.", "Based on the retrieved documents, it appears that coffee has both positive and negative effects on endothelial function, which is a key aspect of cardiovascular health. The negative effects are primarily attributed to caffeine, while the positive effects are attributed to the antioxidant activity of coffee.\n\nDocument 1 suggests that caffeinated coffee has a negative effect on endothelial function, which is offset by the antioxidant activity of coffee. Document 2 shows that caffeinated coffee leads to a decline in endothelial function, while decaffeinated coffee has no significant effect. Document 3 also reports that caffeinated coffee has an unfavorable effect on endothelial function, while decaffeinated coffee does not.\n\nOn the other hand, Document 4 shows that acute caffeine ingestion improves endothelial function in both healthy subjects and those with coronary artery disease, which seems to contradict the findings of the other documents. However, it's worth noting that this study used a different methodology and population, which may affect the results.\n\nDocument 5 shows that decaffeinated coffee has a positive effect on endothelial function, with a dose-dependent increase in flow-mediated dilation (FMD) after ingestion of two cups of decaffeinated coffee.\n\nOverall, the evidence suggests that the effects of coffee on endothelial function are complex and may depend on various", "Based on the retrieved documents, the question of Caloric Restriction vs. Plant-Based Diets is not directly addressed. However, insights from the documents can provide some clues.\n\nDocument 1 discusses the Okinawan diet, which is a traditional plant-based diet, and its potential benefits for healthy aging. It suggests that the low caloric intake and high nutrient density of the Okinawan diet may contribute to its health benefits.\n\nDocument 5 compares the nutritional quality of different diets, including vegan, vegetarian, semi-vegetarian, pesco-vegetarian, and omnivorous diets. It finds that the vegan diet had the highest index values for the Healthy Eating Index 2010 (HEI-2010) and the Mediterranean Diet Score (MDS), indicating a high nutritional quality.\n\nWhile the documents do not directly compare caloric restriction with plant-based diets, they suggest that plant-based diets, particularly those with high nutrient density and low caloric intake, may have health benefits similar to those of caloric restriction. However, more research is needed to directly compare these two approaches.\n\nTherefore, based on the retrieved documents, the answer to the question is that plant-based diets, particularly those with high nutrient density and low caloric intake, may have health benefits similar to", "Based on the retrieved documents, the answer to the question \"Infectobesity: Adenovirus 36 and Childhood Obesity\" is that Adenovirus 36 (Adv36) infection is associated with childhood obesity, and that the prevalence of Adv36 infection is higher in obese children compared to non-obese children. The documents suggest that Adv36 infection may contribute to the development of obesity in children, and that further research is needed to understand the relationship between Adv36 and obesity.\n\nSpecifically, Document 1 states that three published studies and one presented study found that Adv36 infection was more common in obese children (28%) compared to non-obese children (10%). Document 2 reviews the literature on the role of Adv36 in childhood obesity and suggests that more studies are needed to evaluate the association between Adv36 infection and obesity. Document 3 reports a study that found Adv36 infection was associated with pediatric obesity and severe obesity in adult females in Sweden. Document 4 reports a study that found a high prevalence of Adv36 infection in obese Korean children, and that infection was correlated with higher BMI z-scores and waist circumferences. Document 5 reports a meta-analysis that found Adv36 infection was associated with the risk of obesity and weight gain in humans.", "Based on the retrieved documents, it appears that the relationship between dietary cholesterol and serum cholesterol is more complex than previously thought, and that the notion that dietary cholesterol is associated with increased risk for coronary heart disease (CHD) may be overstated.\n\nDocument 1 suggests that the crystallization of cholesterol in atherosclerotic plaques can cause mechanical damage to biological membranes, leading to plaque rupture and erosion. However, this document does not discuss the size of cholesterol crystals.\n\nDocument 3 and 4 report that dietary cholesterol does not necessarily lead to an increase in the risk for heart disease, and that the LDL/HDL cholesterol ratio is maintained even in response to dietary cholesterol challenges. Document 4 suggests that the recommendations limiting dietary cholesterol should be reconsidered, based on the evidence that dietary cholesterol is not correlated with increased risk for CHD.\n\nDocument 5 presents a meta-analysis of the effects of dietary cholesterol on serum cholesterol, and reports a complex, asymptotic relationship between added dietary cholesterol and the change in serum cholesterol. This relationship depends on the baseline level of dietary cholesterol.\n\nOverall, the documents suggest that the effect of dietary cholesterol on serum cholesterol is not as straightforward as previously thought, and that individual responsiveness to dietary cholesterol can vary widely. Therefore, a blanket statement about whether", "Barriers to heart disease prevention include a lack of time and compensation for healthcare professionals to provide nutrition counseling, as well as a lack of knowledge and resources. Additionally, patients may face barriers such as difficulties in conciliating a diet with family life, unwillingness to suffer nutritional deprivation, and lack of confidence in lipid-lowering diet efficiency.", "Based on the retrieved documents, the relationship between cow's milk and childhood constipation is a significant one. Studies have shown that cow's milk allergy or intolerance can cause chronic constipation in children, and that a milk-free diet can lead to significant improvement in symptoms. In fact, one study found that 80% of children with chronic constipation had a response to a cow's milk-free diet, suggesting that cow's milk allergy may be a common underlying cause of constipation in children. Other studies have also reported a link between cow's milk consumption and constipation in infants and young children, with higher consumption of cow's milk associated with an increased risk of constipation and anal fissure. Overall, the evidence suggests that cow's milk allergy or intolerance should be considered as a potential cause of childhood constipation, particularly in cases that are unresponsive to laxative treatment.", "Based on the information in Document 1, diabetics may benefit from taking pulses as they have been shown to lower fasting blood glucose and improve markers of glycaemic control.", "The query \"Academy of Nutrition and Dietetics Conflicts of Interest\" does not return any relevant information in the provided documents. The retrieved documents cover various topics related to nutrition and dietetics, such as conflicts of interest in the approval of food additives, the science behind weight loss supplements, the value of current nutrition information, perception of nutrition education in U.S. medical schools, and the potential toxicity of artificial sweeteners. However, none of the documents mention the Academy of Nutrition and Dietetics or conflicts of interest related to the organization.", "According to the retrieved documents, vegetarians may not get enough protein if they consume low amounts of animal protein. A study found that vegetarian women who consumed only 21% of their protein from animal sources had a lower protein digestibility score than the recommended value (Document 1). However, another study found that a vegetarian diet can be beneficial for patients with chronic kidney disease, as it led to lower serum phosphorus levels and decreased FGF23 levels (Document 2).\n\nIt's also worth noting that a well-planned vegetarian diet can provide all the necessary nutrients, but vegetarians may need to pay attention to their intake of certain nutrients, such as vitamin B12, n-3 PUFA, and zinc, which are found in lower levels in plant-based foods (Documents 3 and 5). Overall, the answer to the question \"Do Vegetarians Get Enough Protein?\" is that it depends on the individual's diet and protein intake.", "Based on the retrieved documents, the answer to the question about eggs and arterial function is as follows:\n\nConsuming eggs may have varying effects on arterial function, depending on the population being studied and the specific study design.\n\nDocument 1 suggests that short-term egg consumption (6 weeks) does not adversely affect endothelial function in healthy adults. However, Document 2 found that daily egg consumption had no effect on endothelial function in hyperlipidemic adults, while egg substitute consumption improved endothelial function and lowered serum total cholesterol and LDL.\n\nDocument 3 presents a review of the evidence and suggests that dietary cholesterol, including egg yolks, is harmful to the arteries and increases the susceptibility of low-density lipoprotein to oxidation, postprandial lipemia, and the adverse effects of dietary saturated fat.\n\nDocument 4 found that carotid plaque area increased exponentially with egg-yolk years, suggesting that regular consumption of egg yolk should be avoided by persons at risk of cardiovascular disease.\n\nDocument 5 found that consuming eggs for 3 weeks resulted in increased susceptibility of human plasma and low-density lipoprotein to lipid peroxidation, which may enhance the progression of atherosclerosis.\n\nOverall, the evidence suggests that egg consumption may have negative effects on arterial function, particularly in", "Based on the retrieved documents, I would say that treating asthma with plants (and a diet rich in fruits, vegetables, and whole foods) is more effective than supplements. Here's why:\n\n* Document 1 suggests that a high-antioxidant diet (rich in fruits and vegetables) improves asthma outcomes, while lycopene supplementation does not have a significant effect.\n* Document 2 shows that a vegan diet (rich in whole foods) can significantly improve asthma symptoms and reduce medication needs.\n* Document 3 suggests that lycopene-rich treatments can modify airway inflammation in asthma, but the effects are not as pronounced as those seen with dietary modifications ( Document 1).\n\nOverall, the evidence suggests that a diet rich in whole foods, fruits, and vegetables is more effective in managing asthma than relying on supplements.", "Based on the retrieved documents, here is the answer to the question \"Phytates for the Treatment of Cancer\":\n\nPhytates, specifically inositol hexaphosphate (IP6), have shown potential in the treatment and prevention of cancer. IP6 has been found to have anticancer efficacy in various studies, including inhibiting the growth of human prostate cancer cells and reducing the formation of tumors in mouse models. It has also been shown to have antioxidant and anti-inflammatory properties, which may contribute to its anticancer effects. Additionally, IP6 has been found to have a role in cell cycle arrest, apoptosis, and differentiation of cancer cells.\n\nDocument 2 highlights the potential of IP6 in the prevention and treatment of prostate cancer, while Document 4 discusses the efficacy of IP6 in cancer prevention and control of experimental tumor growth, progression, and metastasis. Document 1 also mentions the potential anticancerogenic activities of phytic acid.\n\nIt is worth noting that while the studies suggest promising results, more research is needed to fully understand the effects of phytates on cancer treatment and prevention.", "Based on the retrieved documents, it appears that alkylphenols, a type of endocrine-disrupting chemical, have been linked to allergic diseases and may play a role in triggering or exacerbating allergic responses. Document 1 specifically mentions that alkylphenols, such as 4-nonylphenol (NP) and 4-octylphenol (OP), have been recognized as common toxic and xenobiotic endocrine disrupters that may accumulate in the human body and be associated with adverse effects of allergic diseases. The document also mentions that new evidence has supported the importance of alkylphenols in the in vitro allergic response.", "Chicken salmonella cases are expect to go up due to loopholes in meat industry lawsuits as large corporations are found to prioritize profit over public health.", "Based on the retrieved documents, here is the answer to the question \"Turmeric Curcumin and Osteoarthritis\":\n\nCurcumin, a yellow pigment isolated from turmeric, has been shown to have potential therapeutic benefits for the management of osteoarthritis (OA). Studies have demonstrated that curcumin has anti-inflammatory, antioxidant, and anti-catabolic properties, which can help alleviate OA symptoms and slow down disease progression. Curcumin has been found to inhibit the production of pro-inflammatory cytokines, such as TNF-\u03b1, and to block the activation of inflammatory pathways. Additionally, curcumin has been shown to protect articular chondrocytes from damage and to promote collagen synthesis. Several clinical trials have also demonstrated the efficacy and safety of curcumin in reducing joint pain and improving joint function in OA patients. Overall, the existing evidence suggests that curcumin may be a valuable complementary treatment for OA, although further research is needed to fully explore its therapeutic potential.", "Based on the provided documents, there is no specific information on how long to detox from fish before pregnancy. However, Document 1 suggests that dietary modification can decrease body burden and ensure fetal safety if analysis of hair mercury is warranted before pregnancy in selected groups of women consuming more than 12 ounces of fish per week.", "Based on the retrieved documents, there is some evidence to suggest that caramel color may be carcinogenic. Document 1 specifically mentions that 2- and 4-methylimidazoles, which are contaminants in caramel colorings manufactured with ammonia catalysts, have been shown to induce cancer in animals and may be present in amounts that exceed federal guidelines. However, it is essential to note that the documents provided do not conclusively prove that caramel color is carcinogenic, but rather highlight the potential risks associated with certain contaminants present in caramel colorings.", "To counteract the effects of dioxins through diet, consider the following strategies based on the retrieved documents:\n\n1. Choose lower-fat versions of meats, poultry, and dairy products, as dioxins tend to accumulate in fatty tissues (Document 1).\n2. Consume flavones and flavonols, which are found in plant foods, as they can inhibit the transformation of aryl hydrocarbon receptor (AhR) induced by dioxin (Document 2).\n3. Eat foods that regulate the AhR transformation and expression of downstream drug-metabolizing enzymes, such as certain food factors that act as antagonists (Document 3).\n4. Limit consumption of offal products, such as liver, kidneys, tongue, and heart, which may contain high levels of dioxins (Document 4).\n5. Consider adopting a vegan diet, as vegans tend to have lower plasma organochlorine concentrations compared to omnivores (Document 5).\n\nIt is essential to note that while these dietary strategies may help counteract the effects of dioxins, they should not be seen as a replacement for other measures to reduce exposure, such as avoiding contaminated foods and reducing environmental pollution.", "Based on the retrieved documents, the answer to the question about the relationship between chronic headaches and pork tapeworms is that there is a possible link between the two. According to Document 2, a study found that calcified parenchymal brain cysticerci, which are a result of the pork tapeworm Taenia solium, were more frequent among patients with primary headache disorders than in those with other neurological disorders. Specifically, the study found that 4.7% of patients with primary headache had calcified parenchymal brain cysticerci, compared to 1.8% of controls.\n\nHowever, it's worth noting that the exact relationship between chronic headaches and pork tapeworms is not fully understood and may require further research. Document 1 mentions that neurocysticercosis, which is caused by the pork tapeworm, can lead to serious consequences, including seizures, hydrocephalus, and death, but it does not specifically mention chronic headaches as a symptom.", "According to the retrieved documents, yes, heart disease starts in childhood. Document 1 states that \"Atherosclerosis begins in childhood and progresses during adolescence and young adulthood.\" Additionally, Document 3 mentions that \"The progression of fatty streaks to fibrous plaques is uncertain, but these data suggest that a rational approach to the prevention of cardiovascular disease should begin early in life.\" This suggests that preventive measures should be taken early in life to prevent the development of heart disease.", "Based on the retrieved documents, the answer to the question \"Artificial Food Colors and ADHD\" is:\n\nThere is evidence to suggest that artificial food colors may contribute to hyperactivity and attention deficit hyperactivity disorder (ADHD) in some children. Studies have shown that a subgroup of children with suspected sensitivities react with ADHD-type symptoms when challenged with artificial food colors (AFCs) and that some children may be sensitive to both AFCs and other common foods. While the evidence is not conclusive, and the FDA has interpreted the evidence as inconclusive, some studies have found significant adverse effects of AFCs on behavior in children, particularly in those with ADHD.\n\nIt is recommended that a trial elimination diet, free from AFCs and other potential triggers, may be beneficial for children who have not responded satisfactorily to conventional treatment or whose parents wish to pursue a dietary investigation.\n\nOverall, the evidence suggests that artificial food colors may be a contributing factor to hyperactivity and ADHD in some children, and further research is needed to fully understand the relationship between AFCs and ADHD.", "Based on the provided documents, there is no direct answer to the question \"Keeping Your Hands Warm With Citrus\" as none of the documents discuss the topic of keeping hands warm with citrus. The documents discuss various topics such as the relaxant effect of orange odor, the molecular players involved in altered temperature sensation, the absorption of aluminum in antacids, gargling for oral hygiene, and the preventive efficacy of strawberry powder in esophageal cancer.", "Based on the retrieved documents, it appears that there are various approaches being explored for anti-angiogenesis, which is the process of cutting off the supply lines of tumors. Document 1 discusses the potential of an antiangiogenic diet for cancer prevention, citing the presence of potent antiangiogenic molecules in dietary sources. Document 2 proposes a \"multifocal angiostatic therapy\" (MAT) that combines different nutritional measures, such as a vegan diet, fish oil, and green tea polyphenols, to impede the angiogenic process. Document 3 presents the anti-angiogenic activity of inositol hexaphosphate (IP6), which has been shown to inhibit the proliferation of endothelial cells and reduce tumor growth. Document 4 explores the inhibitory effects of diet-derived polyphenols on angiogenesis triggered by an inflammatory cytokine (IL-6) and suggests that these polyphenols may modulate the IL-6/STAT3 pathway. Overall, the retrieved documents suggest that a combination of dietary and nutritional approaches may be effective in cutting off the supply lines of tumors and preventing cancer progression.", "According to the retrieved documents, the estimated risk of cancer from CT scan radiation is a significant concern, particularly for pediatric patients and females. Document 1 estimates that approximately 29,000 future cancers could be related to CT scans performed in the US in 2007, with the largest contributions from scans of the abdomen and pelvis, chest, and head. Document 3 estimates that pediatric CT examinations may result in significantly increased lifetime radiation risk, with a rough estimate of 500 individuals under the age of 15 years potentially dying from cancer attributable to CT radiation. Document 4 estimates that the relative risk for breast cancer incidence for girls and women is 1.004-1.042 for a single examination, and the relative risk for lung cancer incidence for men and women is 1.005-1.076 from a single examination. Overall, the documents suggest that the risk of cancer from CT scan radiation is a public health concern, particularly for pediatric patients and females, and that efforts should be made to reduce radiation exposure and mitigate this risk.", "Based on the retrieved documents, the answer to the question \"Preventing the Common Cold with Probiotics?\" is:\n\nProbiotics may help prevent the common cold. According to the studies reviewed, probiotics:\n\n* Reduced the incidence of acquiring one or more common cold episode by 12% (Document 1)\n* Reduced the number of days with common cold symptoms by 28% (Document 1)\n* Reduced the total symptom score by 24% (Document 1)\n* Improved proliferation of B lymphocytes (Document 1)\n* Reduced the number of participants experiencing episodes of acute URTIs by 42% (Document 2)\n* Reduced the rate ratio of episodes of acute URTI by 12% (Document 2)\n* Reduced antibiotic prescription rates for acute URTIs by 33% (Document 2)\n\nAdditionally, Document 3 showed that probiotic supplementation in children reduced fever, coughing, and rhinorrhea incidence and duration, as well as antibiotic use incidence. Document 4 also showed that yeast beta-glucan preparation reduced the number of symptomatic common cold infections by 25% compared to placebo.\n\nOverall, the evidence suggests that probiotics may be beneficial in preventing the common cold, although more research is", "To eat healthy on a budget, consider the following suggestions from the retrieved documents:\n\n1. Focus on nutrient-dense foods that provide the most nutrients per unit cost, such as sweet potatoes, white potatoes, tomato juices and soups, carrots, and broccoli (Document 1).\n2. Choose whole grains, fruits, and vegetables, which are often more affordable and nutrient-rich than processed foods (Documents 2 and 3).\n3. Limit consumption of trans and saturated fats, highly refined grains, and sugary beverages, which tend to be more expensive and less healthy (Document 3).\n4. Consider purchasing smaller item sizes of snack foods to reduce energy intake (Document 5).\n5. Look for culturally acceptable and affordable nutrient-dense foods to replace a portion of meat servings at meals (Document 2).\n6. Support policies that promote affordable access to healthy foods, such as subsidies for vegetables and whole grains (Document 4).\n\nBy implementing these strategies, individuals can make healthier food choices while staying within their budget.", "Based on the retrieved documents, here is the answer to the question:\n\nThere is some clinical evidence that flaxseeds may be beneficial for breast cancer survival. Document 1 suggests that flaxseed may be associated with decreased risk of breast cancer, and may also reduce mortality risk among those living with breast cancer. Document 2 found that dietary flaxseed altered tumor biological markers in postmenopausal breast cancer patients, including reducing tumor cell proliferation and increasing apoptosis. Document 3 found that consumption of flaxseed was associated with a significant reduction in breast cancer risk. While the evidence is not conclusive, and more research is needed, the available data suggest that flaxseeds may have a protective effect on breast cancer.", "Based on the retrieved documents, it appears that the scientific consensus is that fruit and nut bars do not cause weight gain, when consumed in moderation. \n\nAccording to Document 1, a study found that adding two daily fruit and nut bars to an ad libitum diet for 8 weeks did not cause weight gain in overweight adults. \n\nDocument 2 suggests that nuts can be included as part of an energy-controlled diet to assist with weight loss or weight maintenance. \n\nDocument 3 notes that numerous epidemiological and clinical studies have shown that nuts are not associated with weight gain, due to their high satiety and low metabolizable energy properties. \n\nDocument 4, a meta-analysis of clinical trials, found no significant effect on body weight, BMI, or waist circumference when comparing diets that included nuts to control diets. \n\nFinally, Document 5 highlights the health benefits of nut consumption, including body weight control, and notes that available studies support the idea that nuts can be included in the diet without leading to weight gain.\n\nTherefore, the answer is: No, fruit and nut bars do not cause weight gain.", "Based on the retrieved documents, titanium dioxide (TiO2) has been linked to inflammatory bowel disease (IBD) due to its presence in ultrafine particles that can be ingested through food and other consumer products. \n\nDocument 1 discusses how TiO2, a common food additive, can alter intestinal cell responsiveness to lipopolysaccharide (LPS) and stimulate the production of interleukin 1 (IL-1), a pro-inflammatory cytokine, in patients with ulcerative colitis and Crohn's disease. \n\nDocument 2 examines the dietary sources of inorganic microparticles, including TiO2, and their intake in healthy subjects and patients with Crohn's disease. Although the study found no significant difference in TiO2 intake between the two groups, it suggests that exposure to microparticles may be associated with the inflammation of Crohn's disease. \n\nDocument 3 discusses the influence of fine and ultrafine particles, including TiO2, on the mucosal immune response and their association with Crohn's disease. The study suggests that dietary microparticles, including TiO2, may promote toleragenic or immune responses in the gastrointestinal mucosa and exacerbate inflammation in Crohn's disease.\n\nDocument 4 reviews the", "Prolonged liver function enhancement from broccoli can be achieved through the consumption of broccoli sprouts, which are rich in isothiocyanates, particularly sulforaphane. Sulforaphane has been shown to induce phase 2 detoxication enzymes, which can protect against carcinogenesis, mutagenesis, and other forms of toxicity. Additionally, sulforaphane has been found to have anti-inflammatory and antioxidant properties, which can help to reduce oxidative stress and inflammation in the liver. Document 1 discusses the potent inducers of phase 2 detoxication enzymes in broccoli sprouts, while Document 5 discusses the safety and tolerance of broccoli sprout extracts in a clinical phase I study.", "Based on the retrieved documents, it appears that apple juice may indeed be worse than sugar water due to its potential to contain contaminants such as arsenic and lead, as well as its contribution to excessive sugar intake and related health problems. Document 1 reveals that many apple juices contain high levels of arsenic, which is a toxic substance that can have negative health effects. Document 2 suggests that fruit juice consumption, including apple juice, is associated with an increased risk of obesity, metabolic syndrome, and liver injury. Furthermore, Document 3 and Document 4 discuss the negative health effects of excessive sugar consumption, which is a major component of many fruit juices, including apple juice. Therefore, it seems that apple juice may be worse than sugar water due to its potential contamination and contribution to excessive sugar intake.", "Based on the retrieved documents, the answer to the question \"Preventing Strokes with Diet\" is that a diet rich in fruits, vegetables, whole grains, and fiber can help prevent strokes. The documents provide evidence that:\n\n* High dietary fiber intake is inversely associated with the risk of stroke (Document 1)\n* A healthy lifestyle that includes a healthy diet, moderate physical activity, not smoking, and moderate alcohol consumption can reduce the risk of stroke (Document 2)\n* A diet high in total antioxidant capacity, particularly from fruits and vegetables, is associated with a lower risk of stroke (Document 3)\n* Fruit consumption, especially citrus fruits, and cruciferous vegetables are associated with a reduced risk of cerebrovascular diseases (Document 4)\n* Consuming fruits and vegetables, particularly cruciferous and green leafy vegetables and citrus fruit and juice, can lower the risk of ischemic stroke (Document 5)\n\nOverall, the evidence suggests that a diet rich in whole foods, fiber, and antioxidants can help prevent strokes.", "Based on the retrieved documents, here are some key findings related to the neurobiology of artificial sweeteners:\n\n1. **Brain response differs between caloric and non-caloric sweeteners**: Studies suggest that sugar and artificial sweeteners activate different brain pathways, with sugar activating more areas related to reward and pleasure (Documents 1 and 3).\n2. **Aspartame can have neurologic effects**: Aspartame, a widely used artificial sweetener, can cause elevations in plasma and brain phenylalanine levels, which may lead to neurotoxic effects, including seizures and neurologic or behavioral reactions (Documents 2 and 3).\n3. **Artificial sweeteners can alter neurotransmitter regulation**: Aspartame contains phenylalanine, which plays a role in neurotransmitter regulation, and aspartic acid, which is an excitatory neurotransmitter in the central nervous system (Document 3).\n4. **Potential risks of artificial sweeteners**: There is ongoing debate and controversy about the safety of artificial sweeteners, with some studies suggesting potential links to health hazards such as cancer, neurological disorders, and compromised learning and emotional functioning (Documents 3, 4, and 5).\n5. **Uncertainty and controversy surrounding artificial sweetener safety**: The", "The retrieved documents do not provide information on the benefits of fenugreek seeds. The documents discuss the health benefits of flaxseed, chickpea, xenohormesis, docosahexaenoic acid (DHA), and dates, but do not mention fenugreek seeds.", "Based on Document 1, there are higher concentrations of antibiotics in white meat (breast) than in dark meat (thigh) in chickens that were dosed with enrofloxacin. Therefore, the answer is that there are more antibiotics in white meat than in dark meat.", "Bisphenol A (BPA), a chemical used in the manufacturing of plastics, has been linked to male sexual dysfunction and infertility. Studies in both animals and humans have shown that exposure to BPA can lead to problems with sexual function, including decreased libido, difficulty achieving and maintaining an erection, and decreased ejaculation strength. BPA is also associated with an increased risk of cardiovascular disease and prostate cancer in exposed workers. The presence of BPA in food, particularly in canned and packaged foods, is a concern, as it can leach into the food and be ingested.", "What is filled full of lead based on the documents?", "Based on the retrieved documents, the answer to the Pritikin Puzzle is not explicitly stated. However, Document 1 provides information on a nutritional approach to controlling the spread of cancer, which might be related to the Pritikin diet, a low-fat, high-fiber diet developed by Nathan Pritikin.", "Based on the retrieved documents, it appears that snacking can have varying effects on weight, energy intake, and metabolic health, depending on the type and characteristics of the snack food. Here are some key findings:\n\n1. Snacking on nutrient-dense foods like fruit and nut bars may not lead to weight gain, and may even help with weight stabilization (Document 1).\n2. Snacking on candy, which is high in fast-acting carbohydrates, can lead to increased insulin levels, body weight, and negative metabolic effects (Document 2).\n3. Snacking on peanuts, which are high in fat and protein, did not have the same negative metabolic effects as snacking on candy (Document 2).\n4. Snacking on raisins before a meal can decrease mealtime food intake and reduce cumulative energy intake in children (Document 3).\n5. Snacking on dried prunes can increase satiety and reduce energy intake at a subsequent meal (Document 4).\n6. Reducing the item size of snack foods, such as cookies, can lead to a decrease in energy intake in children (Document 5).\n\nOverall, the documents suggest that mindful snacking on nutrient-dense foods, such as fruits, nuts, and whole grain products, can be a", "Boosting good bacteria in the colon can be achieved through dietary means, without the need for probiotics. According to the provided documents, the following methods can help promote beneficial bacteria in the colon:1. Consuming a high-polyphenol diet, which can help increase the proportion of Bacteroidetes to Firmicutes in the gut microbiota, leading to weight loss and improved colon health (Document 2).2. Increasing dietary fiber intake, which can lead to the formation of short-chain fatty acids (SCFAs) such as butyrate, acetate, and propionate through gut flora-mediated fermentation (Document 4). Butyrate has been shown to have chemopreventive properties, slowing growth and activating apoptosis in colon cancer cells.3. Eating foods rich in polyphenols, such as apples, pears, grapefruit, and green tea, which can help reduce body weight in obese individuals by altering the gut microbiota (Document 2).4. Consuming a diet low in meat, as a high-meat diet can lead to the production of toxic products like genotoxic hydrogen sulfide by sulfur-reducing bacteria (Document 1).Overall, a balanced diet rich in fiber, polyphenols, and other nutrients", "It appears that there is no single answer to the question of optimal phytosterol dose based on the retrieved documents. However, Document 1 mentions a study where a phytosterol-abundant diet with 449 mg of phytosterols per 2000 kcal resulted in lower cholesterol absorption and higher fecal cholesterol excretion compared to a phytosterol-poor diet with 126 mg of phytosterols per 2000 kcal.\n\nDocument 2 mentions a study where a portfolio diet that included 1.2 g of plant sterols per 1000 kcal, among other interventions, resulted in a 35% reduction in LDL cholesterol.\n\nDocument 3 provides information on the phytosterol composition of nuts and seeds, but does not provide information on optimal dose.\n\nDocument 4 and Document 5 do not provide information on optimal phytosterol dose.\n\nTherefore, the optimal phytosterol dose may depend on individual circumstances and may need to be established through further research. However, a dose of 1.2 g of plant sterols per 1000 kcal, as mentioned in Document 2, may be a reasonable starting point for further investigation.", "The retrieved documents do not provide direct information on human neurotransmitters in plants. However, Document 1 discusses the presence of melatonin and serotonin, which are human neurotransmitters, in edible plants. According to Document 1, consuming foodstuffs containing melatonin and serotonin could raise their physiologic concentrations in blood and enhance human health. Therefore, the answer to the question is that human neurotransmitters, such as melatonin and serotonin, have been found in edible plants.", "Document 1 suggests that consuming two Hayward green kiwifruits per day for 4 weeks may improve bowel function in adults diagnosed with irritable bowel syndrome with constipation.", "Based on the retrieved documents, the dietary treatment of Crohn's disease involves several approaches, including:\n\n1. Exclusive enteral nutrition (EEN) therapy, which has been shown to be effective in childhood Crohn's disease (Document 1).\n2. Low microparticle diet, which has been found to be effective in reducing symptoms and improving the disease activity index (CDAI) in patients with ileal Crohn's disease (Document 2).\n3. Avoidance of dietary components that may exacerbate the disease, such as animal fat, high sugar intake, gliadin, and emulsifiers, as well as low-fiber diets (Document 1).\n4. Increasing dietary fiber and fruit intake, which has been associated with a decreased risk of Crohn's disease (Document 3).\n5. Avoiding high intakes of saturated fats, monounsaturated fatty acids, and meat, which have been associated with an increased risk of Crohn's disease (Document 3).\n\nIt's worth noting that while these dietary approaches may be beneficial, there is no single \"Crohn's diet\" that is universally recommended, and individual patients may respond differently to different dietary interventions.", "Based on these documents, the answer to the question \"Unsafe at Any Feed\" could be:\n\nYes, food can be a source of infection for various pathogens, including hepatitis C, Clostridium difficile, Salmonella, Escherichia coli, and others. Food can become contaminated during processing, handling, and preparation, and even healthy foods like rice can contain high levels of inorganic arsenic, a known carcinogen.", "Based on the retrieved documents, it appears that health food store employees may not always provide the best advice, especially when compared to pharmacists or healthcare professionals. Document 1 found that 25% of health food store employees offered no advice, and those who did had limited formal training in Complementary and Alternative Medicine (CAM). The products they recommended had limited evidence supporting their efficacy and, in some instances, were potentially harmful.\n\nDocument 2 found that 72% of health food store employees offered advice, but their recommendations were often based on a single reference book, which may not be reliable. Document 3 found that 89% of health food stores offered recommendations for nausea and vomiting during pregnancy, but only 3.6% of respondents recommended correct usage, and 5% of recommendations were for products contraindicated in pregnancy.\n\nIn contrast, pharmacists and healthcare professionals are trained to provide evidence-based advice and are more likely to have a deeper understanding of the products and their potential interactions. Document 5 found that physician advice can have a positive impact on patient behavior, with patients who received physician advice being more likely to make changes to their behavior.\n\nTherefore, it is likely that pharmacists and healthcare professionals give better advice than health food store employees, especially when it", "The question is \"Preventing Cataracts with Diet,\" and based on the retrieved documents, the answer would be that a diet rich in fruits and vegetables, particularly those high in vitamins A and C and carotenoids, may help reduce the risk of cataracts. Specifically, Document 2 suggests that lutein and zeaxanthin, found in leafy green vegetables, can help protect the lens and reduce the risk of cataracts. Document 1 also found that vegetarians, who tend to have a high intake of fruits and vegetables, had a lower risk of cataracts than meat-eaters.", "Cheese Mites and Maggots are not mentioned in any of the documents. However, Document 1 discusses the identification of cheese mites using cryogenic scanning electron microscopy.", "Based on the retrieved documents, the answer to the question \"Is there a relationship between cholesterol levels and lower back pain?\" is yes. Multiple studies have found associations between high cholesterol levels and lower back pain, disc degeneration, and sciatica.\n\nDocument 1 found that patients with occluded arteries or significant disc degeneration did not complain of more severe symptoms, but patients with above-normal serum LDL cholesterol levels scored higher in neurogenic symptoms and complained more often of severe pain.\n\nDocument 2 found that smoking and high serum cholesterol levels were consistently associated with disc degeneration and lower back pain in epidemiological studies.\n\nDocument 3 found that in men, sciatica was associated with total cholesterol, LDL cholesterol, and triglycerides, adjusted for age, BMI, exercise, smoking, heavy physical work, and education.\n\nDocument 4 found that patients with symptomatic herniated lumbar disc had higher triglyceride and total cholesterol concentrations compared to a control group.\n\nDocument 5 found that subjects with one or more occluded/narrowed arteries were 8.5 times more likely to have suffered from chronic low back pain at some time during their life.\n\nOverall, the evidence suggests that high cholesterol levels may be a risk factor for lower back pain, disc degeneration, and sci", "MGUS (Monoclonal gammopathy of undetermined significance) consistently precedes multiple myeloma according to a prospective study by the Prostate, Lung, Colorectal, and Ovarian (PLCO) Cancer Screening Trial.", "Sometimes the Enzyme Myth Is True.", "Vitamin C could potentially be beneficial in reducing the formation of carcinogenic compounds in bacon, as it has been shown to inhibit the formation of N-nitroso compounds in other foods.", "Based on the retrieved documents, it seems that various studies have investigated the effects of different foods and beverages on exercise-induced muscle damage and recovery. From the provided documents, the foods and beverages that have been studied include:\n\n* Blueberries (Document 1)\n* Tart cherry juice (Documents 2 and 3)\n* Watermelon juice (Document 4)\n\nThese studies suggest that these foods and beverages may have anti-inflammatory and antioxidant effects, which can aid in reducing muscle damage and improving recovery after exercise. However, more research is needed to confirm these findings and to fully understand the effects of these foods and beverages on exercise-induced muscle damage and recovery.\n\nTherefore, the answer to the question \"Out of the Lab Onto the Track\" is not explicitly stated in the provided documents, but it can be inferred that foods and beverages with anti-inflammatory and antioxidant properties, such as blueberries, tart cherry juice, and watermelon juice, may be beneficial for athletes looking to reduce muscle damage and improve recovery after exercise.", "Dragon's Blood is the sap of Croton lechleri Muell.-Arg (Euphorbiaceae), which is used in folk medicine as a cicatrizant, anti-inflammatory, and to treat cancer. It has been shown to possess significant antioxidant activity against oxidative damages induced by certain agents, but also exhibits mutagenic activity in certain strains of Salmonella typhimurium and yeast Saccharomyces cerevisiae.", "Better than goji berries are cranberries (Vaccinium macrocarpon) based on Document 4 and black currants (Ribes nigrum) based on Document 5.", "Preventing abdominal aortic aneurysms requires understanding the underlying risk factors. According to Document 1, most adults get atherosclerosis, a major risk factor for abdominal aortic aneurysms, due to consuming too much fat, cholesterol, and calories. This leads to an elevated total cholesterol level, which can be prevented by maintaining a level below 150 mg/dl through a fruit-vegetarian-starch diet and lipid-lowering drugs if necessary. Additionally, Document 4 suggests that maintaining a healthy lifestyle, including physical exercise, weight control, and adequate nutrition, can improve vascular health and prevent cardiovascular disease. It is also mentioned in Document 5 that high levels of low-density lipoprotein cholesterol and systolic blood pressure are strong risk factors for early atherosclerotic lesions in the aorta and coronary arteries. Therefore, to help prevent abdominal aortic aneurysms, it is essential to maintain a healthy lifestyle, manage cholesterol levels, and control blood pressure.", "The difficulty of arriving at a vitamin D recommendation arises from several factors, including the persistence of fundamental knowledge gaps in vitamin D nutrition, such as exposure, metabolism, storage, status, dose-response, function, and beneficial or adverse health effects. Additionally, there is ongoing controversy and debate among experts regarding the optimal levels of vitamin D intake and the definition of vitamin D deficiency. Different organizations and studies have proposed varying recommendations for daily vitamin D intake, ranging from 600-800 IU/day to 1000 IU/day or more, and the optimal circulating 25(OH)D level is also a topic of debate, with some studies suggesting that levels above 30-32 ng/ml are necessary for maximum health.", "The question is a bit unusual, as it seems to be asking about the relationship between amyloid and apple juice. Based on the retrieved documents, I'll do my best to provide an answer.\n\nFrom Document 1, we learn that amyloid-beta (Abeta) is a neurotoxin associated with neurodegenerative conditions such as Alzheimer's disease. Apple juice concentrate (AJC) is shown to prevent the neurotoxic consequences of Abeta exposure in cultured neuronal cells, specifically by preventing the increased generation of reactive oxygen species (ROS), calcium influx, and apoptosis. This suggests that apple juice may have antioxidant properties that can counteract the negative effects of amyloid-beta.\n\nWhile the other documents don't specifically discuss the relationship between amyloid and apple juice, they do highlight the potential health benefits of apple and apple products, including antioxidant and antiproliferative effects, as well as potential protective effects against cancer and cardiovascular disease.\n\nTherefore, based on the limited information available, it seems that apple juice may have some protective effects against amyloid-related toxicity, possibly due to its antioxidant properties. However, more research would be needed to fully understand the relationship between amyloid and apple juice.", "Regarding dietary guidelines, the retrieved documents provide information on various aspects of nutritional recommendations. Document 1 highlights essential strategies for healthy eating such as emphasizing whole grains, fruits, and vegetables and limiting consumption of saturated fats and sugary beverages. Document 2 underscores the value of current nutrition information and the importance of transmitting dietary recommendations to the public in a clear and applicable manner. Document 3 focuses on recommended dietary reference intakes for fat and fatty acids, suggesting that while recommendations vary among countries, most advocate similar intake levels for total fat, saturated fats, and trans fats. Document 4 contrasts Paleolithic diets with modern diets, highlighting differences in protein, fat, and carbohydrate intake, micronutrients, and phytochemicals. Document 5 touches on nutrient profiling of foods, emphasizing the need for a science-driven approach in ranking foods based on their nutrient content. In synopses, dietary guidelines stress the importance of balanced consumption of macronutrients and micronutrients from whole foods while limiting refined and processed foods.", "Based on the retrieved documents, avocados are good for you. Document 1 and Document 2 describe the chemopreventive characteristics of avocado fruit, highlighting its high nutrient content and low calorie, sodium, and fat levels. The documents suggest that phytochemicals extracted from avocados may offer an advantageous dietary strategy in cancer prevention by inducing cell cycle arrest, inhibiting growth, and inducing apoptosis in precancerous and cancer cell lines.\n\nWhile the other documents do not specifically mention avocados, they provide supporting evidence for the benefits of consuming fruits and vegetables, including reducing inflammation (Document 3), antioxidant properties (Document 4), and improving cardiovascular health (Document 5). These findings suggest that avocados, as a fruit, may contribute to these overall health benefits.\n\nTherefore, based on the retrieved documents, the answer to the question \"Are Avocados Good for You?\" is yes.", "To relieve yourself of excess estrogen, consider the following options based on the retrieved documents:\n\n1. **Eat a semi-vegetarian diet**: Document 1 suggests that semi-vegetarians have lower levels of serum oestrogens compared to non-vegetarians.\n2. **Consume phytochemicals that inhibit aromatase**: Document 2 discusses the potential of phytochemicals, such as those found in plant extracts, to inhibit aromatase, an enzyme that converts androgens to estrogens.\n3. **Increase your intake of lignans and isoflavonic phytoestrogens**: Document 3 highlights the potential antiestrogenic and anticarcinogenic effects of lignans and isoflavonic phytoestrogens, which are found in fiber-rich foods such as grains and beans.\n4. **Be cautious of multivitamins that may interact with estrogen**: Document 4 reports a potential drug interaction between multivitamins containing citrus bioflavanoids and oral contraceptives or hormone replacement therapy, which may lead to elevated estrogen levels.\n\nIt is essential to note that these suggestions are based on specific studies and may not be applicable to everyone. Consult with a healthcare professional before making any significant changes to your diet", "Too much iodine can be as bad as too little, as it can cause hypothyroidism in some infants and thyroid dysfunction in adults.", "Based on the retrieved documents, the answer to the question \"Is Milk and Mucus a Myth?\" is not a clear-cut \"yes\" or \"no\". However, Document 1 suggests that the idea that milk increases mucus production is not entirely a myth. While the association between milk consumption and increased mucus production is not fully understood, the document presents a hypothesis that beta-casomorphin-7 (beta-CM-7) from A1 milk could stimulate mucus production in the respiratory tract, particularly in individuals with inflammation. However, it also notes that the relationship is not necessarily cause-and-effect, and more research is needed to confirm the hypothesis.\n\nThe other documents do not directly address the topic of milk and mucus, but they do suggest that milk consumption can be associated with various health effects, such as acne (Document 2), male reproductive disorders (Document 3), and constipation and anal fissure in infants (Document 4). However, these documents do not provide conclusive evidence to support a direct link between milk consumption and mucus production.\n\nTherefore, while the available evidence suggests that milk consumption may be associated with some health effects, the relationship between milk and mucus production remains uncertain and requires further research to confirm or refute the hypothesis.", "Convergence of evidence is demonstrated when different studies, using different methods, arrive at similar conclusions, increasing confidence in the findings. Document 1, Document 2, and Document 3 all demonstrate convergence evidence. Document 1 used a spatial-scan statistic and found significant, neighboring clusters of Amyotrophic Lateral Sclerosis in Finland, both at the time of birth and time of death. Document 2 provides evidence supporting a trial period of eliminating colorings and preservatives from the diet, which may be related to hyperactivity. Document 3 found that Human Papillomavirus is a necessary cause of invasive cervical cancer worldwide, with a prevalence of 99.7%. These studies, despite their differences, all support the idea that certain risk factors or causes can be identified and addressed, leading to better health outcomes.", "No, the retrieved documents do not provide information about the health benefits of dragon fruit. The documents discuss various other fruits, including a\u00e7ai, dates, wolfberries, and kiwifruits, and their potential health benefits, but none of them mention dragon fruit.", "According to the retrieved documents, distilled fish oil may not be completely toxin-free, as it may retain less volatile organic compounds such as polybrominated diphenyl ethers and brominated HNPs (Document 1). Additionally, Document 2 found PCBs in all 13 over-the-counter children's dietary supplements containing fish oils/powders, despite some of them mentioning \"molecular distillation\" as a purification method.", "There appears to be an epidemiological link between acne and an increased risk of certain types of cancer, particularly hormone-responsive cancers such as breast and prostate cancer. The potential link involves insulin-like growth factor-1 (IGF-1) and steroid hormones present in milk, which may stimulate cell growth and proliferation, leading to hyperplasia or neoplasia. Additionally, the consumption of dairy products and a Western diet high in sugar and refined carbohydrates may exacerbate the condition and contribute to the development of more serious diseases.", "It appears that none of the retrieved documents address the issue of \"overdosing on greens\" specifically. However, Document 1 discusses the potential adverse effects of consuming highly concentrated green tea extracts, which could be related to the concept of overdosing on greens.\n\nDocument 3 also mentions the nitrate content in vegetables and how excessive consumption of vegetables with high nitrate content could lead to health risks. However, this document does not specifically discuss the concept of overdosing on greens.\n\nThe other documents (2, 4, and 5) are unrelated to the topic of overdosing on greens. Therefore, the answer to the question would be that there is limited information available in the retrieved documents on the topic of overdosing on greens, with only Document 1 providing some relevant information on the potential adverse effects of consuming highly concentrated green tea extracts.", "Based on the retrieved documents, there are several dietary theories related to Alzheimer's disease. Here are some of them:\n\n1. **Dietary fat and energy**: High intake of dietary fat and energy in old age may increase the risk of Alzheimer's disease, while fish and cereals may have a risk-reducing effect (Document 1).\n2. **Western diet**: Consuming a Western diet, characterized by high intake of saturated fats and simple carbohydrates, may contribute to the development of obesity and Alzheimer's disease by impairing cognitive function and hippocampal integrity (Document 3).\n3. **Aluminum toxicity**: Aluminum, a neurotoxic metal, may accumulate in the brain and contribute to the development of Alzheimer's disease, with dietary aluminum intake being a potential source of exposure (Document 4).\n4. **Copper toxicity**: Copper toxicity, particularly from inorganic sources such as copper plumbing and supplements, may contribute to cognitive decline and Alzheimer's disease in the aging population (Document 5).\n\nOverall, these documents suggest that dietary factors, including the type and amount of fat, carbohydrates, and metals such as aluminum and copper, may play a role in the development of Alzheimer's disease.", "According to Document 1, occupational exposure to beef meat was associated with an increased risk of multiple myeloma (OR 1.40, 95% CI 0.67-2.94). Additionally, exposure to chicken meat was also associated with an increased risk of multiple myeloma (OR 2.05, 95% CI 1.14-3.69).", "The answer is not explicitly stated in the provided documents, as they cover various medical topics unrelated to Apthous Ulcer, and there is no mention of Apthous Ulcer in any of the documents. Therefore, I cannot provide a specific answer to this question based on the information provided.", "The EPIC (Evidence for Prevention and Identification of Cardiovascular disease) Study is not mentioned in any of the retrieved documents.", "Based on the retrieved documents, here are the updates on Herbalife:\n\n* There have been reports of severe hepatotoxicity associated with the use of Herbalife products, including cases of toxic hepatitis, liver failure, and death (Documents 1 and 2).\n* The use of Herbalife products has been linked to an increased risk of liver injury, particularly in individuals with underlying liver disease (Document 2).\n* Vitamin A intoxication has been reported as a rare cause of intrahepatic cholestasis in a patient who consumed Herbalife products (Document 3).\n* There is a potential drug interaction between Herbalife multivitamins and oral contraceptives or hormone replacement therapy, which may lead to nausea and vomiting (Document 4).\n\nIt is essential to note that these updates are based on specific cases and studies, and more research may be needed to fully understand the risks associated with Herbalife products.", "The relationship between saturated fat intake and cancer progression is not directly discussed in the retrieved documents. However, Document 1 suggests that saturated fatty acid metabolism is linked to cell division, cancer, and senescence, and that fatty acid composition of cellular membranes alters in senescent cells. Document 3 mentions that saturated fatty acids can contribute to disease progression in chronic inflammation, autoimmunity, allergy, cancer, and other metabolic and degenerative diseases.\n\nTherefore, while the documents do not provide direct evidence on the relationship between saturated fat intake and cancer progression, they suggest that saturated fatty acid metabolism and composition may play a role in cancer development and progression.", "Aluminum can be found in various products, including vaccines and food items such as cheese and tea infusions.", "Based on the retrieved documents, the answer to the question \"Are Multivitamins Good For You?\" is mixed and depends on the context.\n\nDocument 1 suggests that multivitamin-multimineral treatment has no effect on mortality risk, neither increasing nor decreasing it.\n\nDocument 2 found limited evidence to support any benefit from vitamin and mineral supplementation for the prevention of cancer or cardiovascular disease, although two trials found a small, borderline-significant benefit from multivitamin supplements on cancer in men only.\n\nDocument 3 takes a more positive view, recommending taking a multivitamin with folic acid and extra vitamin D as a nutritional safety net, especially for women.\n\nDocument 4 raises concerns about antioxidant vitamin supplementation, suggesting that it may not increase well-being and prolong life span, and may even be detrimental.\n\nDocument 5 highlights the potential adverse effects and interactions of vitamins, particularly fat-soluble vitamins (A, E, D), and recommends that certain vitamins be categorized as over-the-counter medications with proper labeling.\n\nOverall, the answer to the question is not a straightforward \"yes\" or \"no\". While multivitamins may not be harmful for most people, the evidence for their benefits is limited, and there may be potential risks and interactions to consider, especially for", "There is no document that provides information on the topic of \"Fish Fog\". The retrieved documents discuss different topics related to fish, such as fish odour syndrome, fish-induced keriorrhea, seafood-borne illnesses, and complications of swallowed fish bones.", "Based on the retrieved documents, the answer to the question \"Sexually Transmitted Fish Toxin\" is:\n\nYes, ciguatoxin (CTX), a toxin found in contaminated marine fish, may be present in the semen of men affected with ciguatera toxicity and be capable of producing symptomatology in both males and females during sexual intercourse. However, the sensitivity and timing of the test employed may have precluded detection of small quantities of the toxin.\n\nThis is based on the information provided in Document 1, which reports two cases of ciguatera fish poisoning where the toxin was suspected to have been transmitted sexually, causing symptoms in both males and females. Document 2 also mentions that among seven patients who were sexually active, six patients complained of painful intercourse, which suggests that the toxin may be transmitted sexually.", "Based on the retrieved documents, it can be concluded that a diet rich in vegetables, particularly cruciferous vegetables like broccoli, cauliflower, and Brussels sprouts, may have a protective effect against cancer. The evidence suggests that vegetarians, especially those who follow a vegan diet, may have a lower risk of overall cancer incidence, as well as specific types of cancer such as colon, rectal, and female-specific cancers.\n\nDocument 1 finds a significant association between vegetarian diets and a reduced risk of overall cancer incidence, as well as cancers of the gastrointestinal tract. Vegan diets, in particular, appear to confer a lower risk of overall and female-specific cancer.\n\nDocument 2, a case-control study in China, finds that vegetables, particularly green vegetables, chives, and celery, have a strong protective effect against colorectal cancer.\n\nDocument 3 evaluates the effect of cooking practices on the bioactive properties of Brassicaceae (cruciferous vegetables) and finds that fresh and cooked vegetable extracts exhibit anti-proliferative and antioxidant activities on human colon carcinoma cells.\n\nDocument 4 provides an overview of the health effects of vegetarian diets, citing evidence that vegetarians have lower rates of coronary heart disease, hypertension, diabetes mellitus, and obesity, as well as lower cancer rates", "The discussion regarding alcohol consumption and its associated risks and benefits is a complex one, as seen in the retrieved documents. According to the documents, alcohol consumption can have both negative and positive health effects, depending on various factors such as the level of consumption, individual health behaviors, and genetic susceptibility.\n\nOn the one hand, alcohol consumption has been linked to several health risks, including an increased risk of dementia, breast cancer, colorectal cancer, cirrhosis, upper digestive tract cancer, and alcohol dependency (Document 1). In addition, alcohol may stimulate carcinogenesis by inhibiting DNA methylation and interacting with retinoid metabolism (Document 3). These risks are particularly concerning for individuals who consume high amounts of alcohol or have certain genetic predispositions.\n\nOn the other hand, moderate alcohol consumption (defined as up to 21 drinks per week for men and 14 drinks per week for women) may have beneficial effects, particularly with regard to prevention of thrombosis of the heart (Document 1) and reducing the risk of fatal and non-fatal myocardial infarction (Document 2). However, these benefits may not apply equally to all drinkers, and individuals with poor health behaviors (e.g., little exercise, poor diet, and smoking) may be more likely", "None of the retrieved documents answer the question \"Is Coconut Milk Good For You?\" directly. However, Document 1 mentions the use of coconut water (not coconut milk) as a short-term intravenous hydration fluid, suggesting that coconuts may have some beneficial properties.\n\n Documents 2, 3, and 4 discuss the effects of milk consumption on health, but they do not mention coconut milk specifically. Document 5 discusses the health benefits of flavanol-rich cocoa, but it is not related to coconut milk.\n\nTherefore, based on the retrieved documents, there is no direct answer to the question \"Is Coconut Milk Good For You?\"", "Based on the retrieved documents, there is no information that directly addresses the question of boosting heart nerve control.", "According to the retrieved documents, there is no specific information about a \"Kuna Indian Secret.\" However, Document 1 mentions the Kuna Indians, an indigenous tribe living in the San Blas islands of Panama, who have a unique lifestyle and diet rich in flavanols, which may contribute to their lower risk of cardiovascular disease, stroke, diabetes mellitus, and cancer.", "The healthiest sweetener is Stevia, as mentioned in Document 1. It is a natural sweetener that is 100-300 times sweeter than table sugar, has no calories, and does not raise blood sugar levels. Additionally, Document 5 confirms that Stevia's components, stevioside and steviol, have been extensively tested and show no evidence of genetic toxicity or genotoxic activity.", "Based on the retrieved documents, artificial colors do raise health concerns and may be bad for you. Document 1 finds that all currently US-approved dyes have health concerns, including causing cancer, hypersensitivity reactions, and genotoxicity. Document 2 suggests that synthetic food colors can induce adverse behavioral effects in children, although the evidence is not conclusive. Document 4 reveals that caramel colorings manufactured with ammonia catalysts contain contaminants that have been shown to induce cancer in animals. Document 5 discusses the mutagenicity and carcinogenicity of azo dyes, which are commonly used in food processing.\n\nOverall, while the evidence is not yet conclusive, these documents suggest that artificial colors may be detrimental to human health, particularly in terms of cancer risk and behavioral effects in children. Therefore, it is recommended to exercise caution and consider replacing artificial colors with safer alternatives.", "Based on the documents provided, the healthiest airplane beverage would be water. Document 1, which provides guidance on beverage consumption in the United States, ranks drinking water as the preferred beverage to fulfill daily water needs. It is also the beverage with the lowest caloric and nutrient content, making it a healthy choice. Additionally, none of the other documents mention any potential health risks associated with drinking water.", "Based on the retrieved documents, the antioxidant content of approximately 300 foods has been studied and documented in the Antioxidant Food Table, which is a part of a comprehensive database of the total antioxidant content of more than 3100 foods, beverages, spices, herbs, and supplements used worldwide. The database shows that plant-based foods introduce significantly more antioxidants into the human diet than non-plant foods.", "Studies suggest that the bioavailability and absorption rates of calcium from plant-based sources like fortified soymilk can be comparable to those of cow's milk.", "Based on the retrieved documents, the following vitamins and supplements may be worth taking:\n\n1. Multivitamins: One large trial found a small, borderline-significant benefit from multivitamin supplements on cancer in men, although the evidence is limited. (Document 1)\n2. Vitamin C: Linus Pauling's concept of taking relatively high doses of vitamins, particularly vitamin C, as antioxidants may be beneficial in some special situations, such as preventing Alzheimer's disease progression. However, recent epidemiological evidence has not supported the claim that antioxidant vitamins increase well-being and prolong life span. (Document 3)\n3. Phytoestrogens: These may be effective in increasing antioxidant defenses by up-regulating the activity of antioxidant enzymes. (Document 3)\n4. Isoflavones: RCTs indicate that isoflavones affect bone resorption at lower doses in postmenopausal women undergoing estrogen-related bone loss, but this is only translated to attenuation of bone loss at higher doses of isoflavones. (Document 5)\n5. Green tea: Whilst the potential benefits of green tea have been reported in a wide range of health areas, it is only in the area of the metabolic syndrome that the number of RCTs is approaching sufficient", "Based on the retrieved documents, there is no clear consensus on the effect of chocolate milkshakes on health. Document 1 and Document 2 discuss the potential health benefits of cocoa and dark chocolate, including antioxidant effects and potential cardiovascular benefits. However, Document 3 presents a prospective analysis that found habitual chocolate consumption to be associated with long-term weight gain in a dose-response manner. Document 4 examines candy consumption, including chocolate, and finds no association with body weight measures, risk factors for cardiovascular disease, or metabolic syndrome in US adults. Document 5, which focuses on milk proteins in adolescents, does not directly address chocolate milkshakes.\n\nTherefore, the answer to the question \"Healthy Chocolate Milkshakes\" cannot be conclusively determined based on the provided documents.", "Based on the retrieved documents, the healthiest vegetables are those that are high in nutrient density and have been shown to have various health benefits. According to Document 1, the top ranking vegetables in terms of nutrient density per dollar are sweet potatoes, white potatoes, tomato juices and tomato soups, carrots, and broccoli. Document 2 highlights the health-promoting potential of steam-cooked collard greens, kale, mustard greens, broccoli, green bell pepper, and cabbage, which have been shown to have high bile acid binding capacity. Document 3 suggests that steaming is a cooking method that helps preserve the nutritional and physicochemical qualities of vegetables, particularly carotenoids and ascorbic acid. Document 4 shows that cooking practices such as boiling, microwaving, and steaming do not significantly alter the antioxidant activity of Brassicaceae vegetables, but may influence their anti-proliferative activity. Document 5 discusses the potential health benefits of glucosinolates in Brassica vegetables, including their possible role in reducing the risk of colon and rectal cancer.\n\nOverall, the healthiest vegetables are likely to be those that are high in nutrient density, have high bile acid binding capacity, and are rich in glucosinolates and other bioactive compounds", "Based on the retrieved documents, here are some insights into bowel movement frequency:\n\n1. According to Document 1, the most common bowel habit is once daily, but this is a minority practice in both sexes, and most people have irregular bowels. A third of women defecate less often than daily, and 1% once a week or less.\n2. Document 2 found that men who reported having a bowel movement 1-2 times per day had a significantly increased hazard ratio for colorectal cancer and rectal cancer compared to those who had a bowel movement once a day.\n3. Document 3 found that variations in stool frequency and form were not useful for discriminating between health and disease, and that bowel symptoms occur in association with, but are only partly explained by, stool form disturbances.\n4. Document 5 found that recalled and recorded figures for frequency of defecation agreed fairly closely, but there were discrepancies in 16% of patients, usually an exaggeration of the difference from the norm of one a day.\n\nOverall, these documents suggest that bowel movement frequency can vary widely among individuals, and that there is no one \"normal\" frequency. They also highlight the importance of accurate recording of bowel habits, rather than relying on recalled information, in", "Based on the retrieved documents, here are the answers to the question:\n\n**Does olive oil improve artery function?**\n\nYes, according to the documents, olive oil has been shown to improve artery function. Document 1 discusses the role of virgin olive oil components in modulating endothelial function and suggests that the minor components of olive oil, such as polyphenols, hydrocarbons, and tocopherols, may have beneficial effects on cardiovascular disease.\n\n**How does olive oil improve artery function?**\n\nThe documents suggest that olive oil improves artery function through several mechanisms:\n\n1. **Antioxidant and anti-inflammatory effects**: Olive oil's polyphenolic compounds have antioxidant and anti-inflammatory properties, which can help reduce oxidative stress and inflammation in the arteries (Document 2).\n2. **Improving endothelial function**: Olive oil's polyphenolic compounds can improve endothelial function by increasing nitric oxide production, which helps to relax blood vessels and improve blood flow (Document 2).\n3. **Reducing blood pressure**: Consuming a diet rich in olive oil polyphenols can help lower blood pressure in individuals with mild hypertension (Document 3).\n4. **Improving postprandial endothelial function**: Adding olive oil to a high-fat meal can help preserve endoth", "None of the retrieved documents mention how doctors responded to being named a leading killer."]} diff --git a/services/evaluator/tests/datasets/rag-retriever/small_dataset_with_retrieved_context.jsonl b/services/evaluator/tests/datasets/rag-retriever/small_dataset_with_retrieved_context.jsonl deleted file mode 100644 index 0455850b4d..0000000000 --- a/services/evaluator/tests/datasets/rag-retriever/small_dataset_with_retrieved_context.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"question": ["When did the 2024 SF Taiwan Day take place?", "Where did the 2024 SF Taiwan Day take place?", "Who threw the first pitch during the 2024 SF Taiwan Day take place?"], "contexts": [["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch.", "Taiwan, officially the Republic of China, is a country in East Asia. The main island of Taiwan, also known as Formosa, lies between the East and South China Seas in the northwestern Pacific Ocean, with the People's Republic of China to the northwest, Japan to the northeast, and the Philippines to the south."], ["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch.", "Taiwan, officially the Republic of China, is a country in East Asia. The main island of Taiwan, also known as Formosa, lies between the East and South China Seas in the northwestern Pacific Ocean, with the People's Republic of China to the northwest, Japan to the northeast, and the Philippines to the south."], ["The 2024 SF Taiwan Day was held on May 25th at the Oakland Coliseum. NVIDIA founder and CEO Jensen Huang threw the ceremonial first pitch.", "Taiwan, officially the Republic of China, is a country in East Asia. The main island of Taiwan, also known as Formosa, lies between the East and South China Seas in the northwestern Pacific Ocean, with the People's Republic of China to the northwest, Japan to the northeast, and the Philippines to the south."]], "ground_truth": ["May 25th", "Oakland Coliseum", "NVIDIA founder and CEO Jensen Huang"]} diff --git a/services/evaluator/tests/datasets/tool-calling/case_sensitivity_input.json b/services/evaluator/tests/datasets/tool-calling/case_sensitivity_input.json deleted file mode 100644 index 4b3fa69fb0..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/case_sensitivity_input.json +++ /dev/null @@ -1,47 +0,0 @@ -[ - { - "messages": [{"role": "user", "content": "Find the area of a triangle with a base of 10 units and height of 5 units."}], - "tools": [ - { - "type": "function", - "function": { - "name": "calculate_triangle_area", - "description": "Calculate the area of a triangle given its base and height.", - "parameters": { - "type": "object", - "properties": { - "base": { - "type": "integer", - "description": "The base of the triangle." - }, - "height": { - "type": "integer", - "description": "The height of the triangle." - }, - "unit": { - "type": "string", - "description": "The unit of measure (defaults to \"units\" if not specified)" - } - }, - "required": [ - "base", - "height" - ] - } - } - } - ], - "tool_calls": [ - { - "function": { - "name": "calculate_triangle_area", - "arguments": { - "base": 10, - "height": 5, - "unit": "units" - } - } - } - ] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/case_sensitivity_mock_inference.json b/services/evaluator/tests/datasets/tool-calling/case_sensitivity_mock_inference.json deleted file mode 100644 index 6bb25a3042..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/case_sensitivity_mock_inference.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": null, - "tool_calls": [ - { - "id": "chatcmpl-tool-0a456aa0582f402eb3868bc24efa46e5", - "type": "function", - "function": { - "name": "calculate_TRIANGLE_area", - "arguments": "{\"BASE\": 10, \"height\": 5, \"unit\": \"units\"}" - } - } - ] - }, - "logprobs": null, - "finish_reason": "tool_calls", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/non_json_args_input.json b/services/evaluator/tests/datasets/tool-calling/non_json_args_input.json deleted file mode 100644 index c08c3a1bb8..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/non_json_args_input.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "messages": [{"role": "user", "content": "Find the area of a triangle with a base of 10 units and height of 5 units."}], - "tools": [ - { - "type": "function", - "function": { - "name": "calculate_triangle_area", - "description": "Calculate the area of a triangle given its base and height.", - "parameters": { - "type": "object", - "properties": { - "base": { - "type": "integer", - "description": "The base of the triangle." - }, - "height": { - "type": "integer", - "description": "The height of the triangle." - }, - "unit": { - "type": "string", - "description": "The unit of measure (defaults to \"units\" if not specified)" - } - }, - "required": [ - "base", - "height" - ] - } - } - } - ], - "tool_calls": [ - { - "function": { - "name": "calculate_triangle_area", - "arguments": { - "base": [ - 10 - ], - "height": [ - 5 - ], - "unit": [ - "units", - "" - ] - } - } - } - ] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/non_json_args_mock_inference.json b/services/evaluator/tests/datasets/tool-calling/non_json_args_mock_inference.json deleted file mode 100644 index 82a3701bfb..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/non_json_args_mock_inference.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": null, - "tool_calls": [ - { - "id": "chatcmpl-tool-0a456aa0582f402eb3868bc24efa46e5", - "type": "function", - "function": { - "name": "calculate_triangle_area", - "arguments": "{\"base\": 10, \"height\": 5, \"unit\": \"units\"" - } - } - ] - }, - "logprobs": null, - "finish_reason": "tool_calls", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/parallel_unordered_tools_input.json b/services/evaluator/tests/datasets/tool-calling/parallel_unordered_tools_input.json deleted file mode 100644 index acec46784d..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/parallel_unordered_tools_input.json +++ /dev/null @@ -1,78 +0,0 @@ -[ - { - "messages": [{"role": "user", "content": "Find the sum of all the multiples of 3 and 5 between 1 and 1000. Also find the product of the first five prime numbers."}], - "tools": [ - { - "type": "function", - "function": { - "name": "math_toolkit_sum_of_multiples", - "description": "Find the sum of all multiples of specified numbers within a specified range.", - "parameters": { - "type": "object", - "properties": { - "lower_limit": { - "type": "integer", - "description": "The start of the range (inclusive)." - }, - "upper_limit": { - "type": "integer", - "description": "The end of the range (inclusive)." - }, - "multiples": { - "type": "array", - "items": { - "type": "integer" - }, - "description": "The numbers to find multiples of." - } - }, - "required": [ - "lower_limit", - "upper_limit", - "multiples" - ] - } - } - }, - { - "type": "function", - "function": { - "name": "math_toolkit_product_of_primes", - "description": "Find the product of the first n prime numbers.", - "parameters": { - "type": "object", - "properties": { - "count": { - "type": "integer", - "description": "The number of prime numbers to multiply together." - } - }, - "required": [ - "count" - ] - } - } - } - ], - "tool_calls": [ - { - "function": { - "name": "math_toolkit_sum_of_multiples", - "arguments": { - "lower_limit": 1, - "upper_limit": 1000, - "multiples": [3, 5] - } - } - }, - { - "function": { - "name": "math_toolkit_product_of_primes", - "arguments": { - "count": 5 - } - } - } - ] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/parallel_unordered_tools_mock_inference.json b/services/evaluator/tests/datasets/tool-calling/parallel_unordered_tools_mock_inference.json deleted file mode 100644 index 847d10e9f9..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/parallel_unordered_tools_mock_inference.json +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": null, - "tool_calls": [ - { - "id": "chatcmpl-tool-0a456aa0582f402eb3868bc24efa46e3", - "type": "function", - "function": { - "name": "math_toolkit_product_of_primes", - "arguments": "{\"count\": 5}" - } - }, - { - "id": "chatcmpl-tool-0a456aa0582f402eb3868bc24efa46e4", - "type": "function", - "function": { - "name": "math_toolkit_sum_of_multiples", - "arguments": "{\"lower_limit\": 1, \"upper_limit\": 1000, \"multiples\": [3, 5]}" - } - } - ] - }, - "logprobs": null, - "finish_reason": "tool_calls", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/pyarrow_broken_input.json b/services/evaluator/tests/datasets/tool-calling/pyarrow_broken_input.json deleted file mode 100644 index dbb44ad89e..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/pyarrow_broken_input.json +++ /dev/null @@ -1,103 +0,0 @@ -[ - { - "messages": [ - { - "role": "user", - "content": "Find the area of a triangle with a base of 10 units and height of 5 units." - } - ], - "tools": [ - { - "type": "function", - "function": { - "name": "calculate_triangle_area", - "description": "Calculate the area of a triangle given its base and height.", - "parameters": { - "type": "object", - "properties": { - "base": { - "type": "integer", - "description": "The base of the triangle." - }, - "height": { - "type": "integer", - "description": "The height of the triangle." - }, - "unit": { - "type": "string", - "description": "The unit of measure (defaults to \"units\" if not specified)" - } - }, - "required": [ - "base", - "height" - ] - } - } - } - ], - "tool_calls": [ - { - "function": { - "name": "calculate_triangle_area", - "arguments": { - "base": 10, - "height": 5, - "unit": "units" - } - } - } - ] - }, - { - "messages": [ - { - "role": "user", - "content": "Solve a quadratic equation where a=2, b=6, and c=5" - } - ], - "tools": [ - { - "type": "function", - "function": { - "name": "solve_quadratic_equation", - "description": "Function solves the quadratic equation and returns its roots.", - "parameters": { - "type": "object", - "properties": { - "a": { - "type": "integer", - "description": "Coefficient of x squared" - }, - "b": { - "type": "integer", - "description": "Coefficient of x" - }, - "c": { - "type": "integer", - "description": "Constant term in the quadratic equation." - } - }, - "required": [ - "a", - "b", - "c" - ] - } - } - } - ], - "tool_calls": [ - { - "function": { - "name": "solve_quadratic_equation", - "arguments": { - "a": 2, - "b": 6, - "c": 5 - } - } - } - ] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/pyarrow_broken_mock_inference.json b/services/evaluator/tests/datasets/tool-calling/pyarrow_broken_mock_inference.json deleted file mode 100644 index e8e734ed94..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/pyarrow_broken_mock_inference.json +++ /dev/null @@ -1,70 +0,0 @@ -[ - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": null, - "tool_calls": [ - { - "id": "chatcmpl-tool-0a456aa0582f402eb3868bc24efa46e5", - "type": "function", - "function": { - "name": "calculate_triangle_area", - "arguments": "{\"base\": 10, \"height\": 5, \"unit\": \"units\"}" - } - } - ] - }, - "logprobs": null, - "finish_reason": "tool_calls", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - }, - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": null, - "tool_calls": [ - { - "id": "chatcmpl-tool-0a456aa0582f402eb3868bc24efa46e2", - "type": "function", - "function": { - "name": "solve_quadratic_equation", - "arguments": "{\"a\": 2, \"b\": 6, \"c\": 5}" - } - } - ] - }, - "logprobs": null, - "finish_reason": "tool_calls", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/simple_no_tool_calling_input.json b/services/evaluator/tests/datasets/tool-calling/simple_no_tool_calling_input.json deleted file mode 100644 index 0a01a50bd4..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/simple_no_tool_calling_input.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "messages": [ - { - "role": "user", - "content": "Hello, how are you?" - } - ], - "tools": [ - { - "type": "function", - "function": { - "name": "calculate_triangle_area", - "description": "Calculate the area of a triangle given its base and height.", - "parameters": { - "type": "object", - "properties": { - "base": { - "type": "integer", - "description": "The base of the triangle." - }, - "height": { - "type": "integer", - "description": "The height of the triangle." - }, - "unit": { - "type": "string", - "description": "The unit of measure (defaults to \"units\" if not specified)" - } - }, - "required": [ - "base", - "height" - ] - } - } - } - ], - "tool_calls": [] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/simple_no_tool_calling_mock_inference.json b/services/evaluator/tests/datasets/tool-calling/simple_no_tool_calling_mock_inference.json deleted file mode 100644 index 2d40d18a7e..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/simple_no_tool_calling_mock_inference.json +++ /dev/null @@ -1,27 +0,0 @@ -[ - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": "I'm fine, thank you!", - "tool_calls": null - }, - "logprobs": null, - "finish_reason": "stop", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/simple_tool_calling_input.json b/services/evaluator/tests/datasets/tool-calling/simple_tool_calling_input.json deleted file mode 100644 index 74d80168d7..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/simple_tool_calling_input.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "messages": [ - { - "role": "user", - "content": "Find the area of a triangle with a base of 10 units and height of 5 units." - } - ], - "tools": [ - { - "type": "function", - "function": { - "name": "calculate_triangle_area", - "description": "Calculate the area of a triangle given its base and height.", - "parameters": { - "type": "object", - "properties": { - "base": { - "type": "integer", - "description": "The base of the triangle." - }, - "height": { - "type": "integer", - "description": "The height of the triangle." - }, - "unit": { - "type": "string", - "description": "The unit of measure (defaults to \"units\" if not specified)" - } - }, - "required": [ - "base", - "height" - ] - } - } - } - ], - "tool_calls": [ - { - "function": { - "name": "calculate_triangle_area", - "arguments": { - "base": 10, - "height": 5, - "unit": "units" - } - } - } - ] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/simple_tool_calling_mock_inference.json b/services/evaluator/tests/datasets/tool-calling/simple_tool_calling_mock_inference.json deleted file mode 100644 index e4ad7d5bf9..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/simple_tool_calling_mock_inference.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": null, - "tool_calls": [ - { - "id": "chatcmpl-tool-0a456aa0582f402eb3868bc24efa46e5", - "type": "function", - "function": { - "name": "calculate_triangle_area", - "arguments": "{\"base\": 10, \"height\": 5, \"unit\": \"units\"}" - } - } - ] - }, - "logprobs": null, - "finish_reason": "tool_calls", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/unable_to_choose_tool_input.json b/services/evaluator/tests/datasets/tool-calling/unable_to_choose_tool_input.json deleted file mode 100644 index c08c3a1bb8..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/unable_to_choose_tool_input.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "messages": [{"role": "user", "content": "Find the area of a triangle with a base of 10 units and height of 5 units."}], - "tools": [ - { - "type": "function", - "function": { - "name": "calculate_triangle_area", - "description": "Calculate the area of a triangle given its base and height.", - "parameters": { - "type": "object", - "properties": { - "base": { - "type": "integer", - "description": "The base of the triangle." - }, - "height": { - "type": "integer", - "description": "The height of the triangle." - }, - "unit": { - "type": "string", - "description": "The unit of measure (defaults to \"units\" if not specified)" - } - }, - "required": [ - "base", - "height" - ] - } - } - } - ], - "tool_calls": [ - { - "function": { - "name": "calculate_triangle_area", - "arguments": { - "base": [ - 10 - ], - "height": [ - 5 - ], - "unit": [ - "units", - "" - ] - } - } - } - ] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/unable_to_choose_tool_mock_inference.json b/services/evaluator/tests/datasets/tool-calling/unable_to_choose_tool_mock_inference.json deleted file mode 100644 index fb4822fe34..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/unable_to_choose_tool_mock_inference.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": "Sorry, I don't understand what you mean." - }, - "logprobs": null, - "finish_reason": "stop", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/unexpected_tool_calling_input.json b/services/evaluator/tests/datasets/tool-calling/unexpected_tool_calling_input.json deleted file mode 100644 index 0a01a50bd4..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/unexpected_tool_calling_input.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "messages": [ - { - "role": "user", - "content": "Hello, how are you?" - } - ], - "tools": [ - { - "type": "function", - "function": { - "name": "calculate_triangle_area", - "description": "Calculate the area of a triangle given its base and height.", - "parameters": { - "type": "object", - "properties": { - "base": { - "type": "integer", - "description": "The base of the triangle." - }, - "height": { - "type": "integer", - "description": "The height of the triangle." - }, - "unit": { - "type": "string", - "description": "The unit of measure (defaults to \"units\" if not specified)" - } - }, - "required": [ - "base", - "height" - ] - } - } - } - ], - "tool_calls": [] - } -] \ No newline at end of file diff --git a/services/evaluator/tests/datasets/tool-calling/unexpected_tool_calling_mock_inference.json b/services/evaluator/tests/datasets/tool-calling/unexpected_tool_calling_mock_inference.json deleted file mode 100644 index e4ad7d5bf9..0000000000 --- a/services/evaluator/tests/datasets/tool-calling/unexpected_tool_calling_mock_inference.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "id": "chat-02bc057818ca48d9ad681684930469d3", - "object": "chat.completion", - "created": 1741803156, - "model": "meta/llama3.1-8b-instruct", - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": null, - "tool_calls": [ - { - "id": "chatcmpl-tool-0a456aa0582f402eb3868bc24efa46e5", - "type": "function", - "function": { - "name": "calculate_triangle_area", - "arguments": "{\"base\": 10, \"height\": 5, \"unit\": \"units\"}" - } - } - ] - }, - "logprobs": null, - "finish_reason": "tool_calls", - "stop_reason": null - } - ], - "usage": { - "prompt_tokens": 336, - "total_tokens": 360, - "completion_tokens": 24 - }, - "prompt_logprobs": null - } -] \ No newline at end of file diff --git a/services/evaluator/tests/integration/tasks/conftest.py b/services/evaluator/tests/integration/tasks/conftest.py deleted file mode 100644 index d877f2a3f3..0000000000 --- a/services/evaluator/tests/integration/tasks/conftest.py +++ /dev/null @@ -1,292 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Shared fixtures for integration tests in the tasks module. - -Provides common fixtures for: -- Test workspace constants -- HTTP test clients with various service combinations -- SDK clients (sync and async) -- Temporary directories for test artifacts -- Job lifecycle management (JobContext) -- Utility functions for working with filesets and results -""" - -import tempfile -from pathlib import Path -from typing import Generator -from urllib.parse import urlparse - -import pytest -from fastapi.testclient import TestClient -from httpx import ASGITransport, AsyncClient -from nemo_platform import AsyncNeMoPlatform, NeMoPlatform, NotFoundError -from nmp.core.files.service import FilesService -from nmp.core.jobs.service import JobsService -from nmp.testing.client import create_test_client - -# ============================================================================= -# Constants -# ============================================================================= - -TEST_WORKSPACE = "test-workspace" - - -# ============================================================================= -# Job Context - Handles Creation & Cleanup Tracking -# ============================================================================= - - -class JobContext: - """Tracks created jobs and provides cleanup utilities. - - Ensures test jobs are properly cleaned up even if tests fail mid-way. - """ - - def __init__(self, sdk: NeMoPlatform, workspace: str = TEST_WORKSPACE): - self._sdk = sdk - self._workspace = workspace - self._created_jobs: set[str] = set() - self._cleaned_jobs: set[str] = set() - - def create(self, job_name: str): - """Create a test job and register it for cleanup tracking.""" - job = self._sdk.jobs.create( - workspace=self._workspace, - name=job_name, - source="evaluator", - spec={}, - platform_spec={ - "steps": [ - { - "name": "evaluate", - "executor": { - "provider": "cpu", - "profile": "default", - "container": { - "image": "test:latest", - "entrypoint": ["entrypoint"], - "command": ["command"], - }, - }, - } - ] - }, - ) - self._created_jobs.add(job_name) - return job - - def cleanup(self, job_name: str) -> None: - """Delete job and assert cascade deletion works correctly.""" - fileset_name = f"job-fileset-{job_name}" - - # Delete the job - should cascade to delete the fileset - self._sdk.jobs.delete(workspace=self._workspace, name=job_name) - - # Verify job is gone - with pytest.raises(NotFoundError): - self._sdk.jobs.retrieve(workspace=self._workspace, name=job_name) - - # Verify fileset was cascade deleted - with pytest.raises(NotFoundError): - self._sdk.files.filesets.retrieve(workspace=self._workspace, name=fileset_name) - - self._cleaned_jobs.add(job_name) - - def mark_cleaned(self, job_name: str) -> None: - """Mark a job as manually cleaned (for tests doing their own cleanup assertions).""" - self._cleaned_jobs.add(job_name) - - def safety_cleanup(self) -> None: - """Clean up any jobs that weren't explicitly cleaned (test failed mid-way).""" - for job_name in self._created_jobs - self._cleaned_jobs: - fileset_name = f"job-fileset-{job_name}" - try: - self._sdk.jobs.delete(workspace=self._workspace, name=job_name) - except Exception: - pass - try: - self._sdk.files.filesets.delete(workspace=self._workspace, name=fileset_name) - except Exception: - pass - - -# ============================================================================= -# Fileset Helper Functions -# ============================================================================= - - -def get_fileset_path_from_artifact_url(artifact_url: str, fileset_name: str) -> str: - """Extract the file path within a fileset from an artifact URL. - - Handles various URL formats robustly using urlparse. - Example: "fileset://workspace/fileset-name/path/to/file.json" -> "path/to/file.json" - """ - parsed = urlparse(artifact_url) - - # Handle fileset:// URLs - if parsed.scheme == "fileset": - # Path is like /fileset-name/path/to/file - path_parts = parsed.path.lstrip("/").split("/", 1) - if len(path_parts) > 1: - return path_parts[1] - return "" - - # Handle http(s):// URLs that contain the fileset path - # e.g., http://host/v2/workspaces/ws/filesets/name/-/files/path/to/file - if "filesets" in parsed.path and "/-/" in parsed.path: - # Split on /-/ which separates fileset name from file path - parts = parsed.path.split("/-/") - if len(parts) > 1: - # Remove leading "files/" if present - file_path = parts[1] - if file_path.startswith("files/"): - file_path = file_path[6:] - return file_path - - # Fallback: try to find fileset name in path and extract remainder - if fileset_name in artifact_url: - parts = artifact_url.split(f"{fileset_name}/", 1) - if len(parts) > 1: - return parts[1] - - raise ValueError(f"Could not extract file path from artifact URL: {artifact_url}") - - -def download_result_content( - sdk: NeMoPlatform, - job_name: str, - result_name: str, - workspace: str = TEST_WORKSPACE, -) -> bytes: - """Download the content of a job result from its fileset.""" - fileset_name = f"job-fileset-{job_name}" - - result = sdk.jobs.results.retrieve( - name=result_name, - job=job_name, - workspace=workspace, - ) - - file_path = get_fileset_path_from_artifact_url(result.artifact_url, fileset_name) - - content = sdk.files.download_content( - remote_path=file_path, - fileset=fileset_name, - workspace=workspace, - ) - return content - - -def file_exists_in_fileset( - sdk: NeMoPlatform, - job_name: str, - path: str, - workspace: str = TEST_WORKSPACE, -) -> bool: - """Check if a file exists in a job's fileset by attempting to download it.""" - fileset_name = f"job-fileset-{job_name}" - try: - sdk.files.download_content( - remote_path=path, - fileset=fileset_name, - workspace=workspace, - ) - return True - except Exception: - return False - - -def download_fileset_file( - sdk: NeMoPlatform, - job_name: str, - path: str, - workspace: str = TEST_WORKSPACE, -) -> bytes: - """Download a file from a job's fileset.""" - fileset_name = f"job-fileset-{job_name}" - return sdk.files.download_content( - remote_path=path, - fileset=fileset_name, - workspace=workspace, - ) - - -# ============================================================================= -# HTTP Client Fixtures -# ============================================================================= - - -@pytest.fixture(scope="module") -def files_http_client() -> Generator[TestClient, None, None]: - """Create test client with Files service only.""" - with create_test_client( - FilesService, - client_type=TestClient, - workspaces=[TEST_WORKSPACE], - ) as client: - yield client - - -@pytest.fixture(scope="module") -def jobs_files_http_client() -> Generator[TestClient, None, None]: - """Create test client with Jobs and Files services.""" - with create_test_client( - JobsService, - FilesService, - client_type=TestClient, - workspaces=[TEST_WORKSPACE], - ) as client: - yield client - - -# ============================================================================= -# SDK Fixtures -# ============================================================================= - - -@pytest.fixture(scope="module") -def sdk(jobs_files_http_client: TestClient) -> NeMoPlatform: - """Sync SDK client backed by the Jobs+Files test client.""" - return NeMoPlatform(base_url="http://testserver", http_client=jobs_files_http_client) - - -@pytest.fixture(scope="module") -def async_sdk(files_http_client: TestClient) -> AsyncNeMoPlatform: - """Async SDK client backed by the Files test client.""" - transport = ASGITransport(app=files_http_client.app) - async_client = AsyncClient(transport=transport, base_url="http://testserver") - return AsyncNeMoPlatform(base_url="http://testserver", http_client=async_client) - - -@pytest.fixture(scope="module") -def async_sdk_with_jobs(jobs_files_http_client: TestClient) -> AsyncNeMoPlatform: - """Async SDK client backed by the Jobs+Files test client.""" - transport = ASGITransport(app=jobs_files_http_client.app) - async_client = AsyncClient(transport=transport, base_url="http://testserver") - return AsyncNeMoPlatform(base_url="http://testserver", http_client=async_client) - - -# ============================================================================= -# Job Context Fixture -# ============================================================================= - - -@pytest.fixture -def job_context(sdk: NeMoPlatform) -> Generator[JobContext, None, None]: - """Provides job creation and cleanup with automatic safety cleanup on failure.""" - ctx = JobContext(sdk) - yield ctx - ctx.safety_cleanup() - - -# ============================================================================= -# Temporary Directory Fixture -# ============================================================================= - - -@pytest.fixture -def temp_dir() -> Generator[Path, None, None]: - """Create a temporary directory for test artifacts.""" - with tempfile.TemporaryDirectory() as tmpdir: - yield Path(tmpdir) diff --git a/services/evaluator/tests/integration/tasks/test_agent_inference.py b/services/evaluator/tests/integration/tasks/test_agent_inference.py deleted file mode 100644 index e92fb3f93f..0000000000 --- a/services/evaluator/tests/integration/tasks/test_agent_inference.py +++ /dev/null @@ -1,295 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Integration tests for agent inference in BenchmarkOnlineAgentJob and MetricOnlineAgentJob. - -Verifies that agent inference dispatches HTTP POST requests correctly for both -NAT (nemo_agent_toolkit) and generic agent formats. -""" - -from typing import cast -from unittest.mock import AsyncMock, patch - -import httpx -import pytest -from nemo_evaluator_sdk.agent_inference import make_agent_inference_request -from nemo_evaluator_sdk.enums import AgentFormat -from nemo_evaluator_sdk.execution.metric_execution import ComputeMetricPipeline, generate_online_sample_agent -from nemo_evaluator_sdk.metrics.protocol import Metric, MetricInput, MetricOutputSpec, MetricResult -from nemo_evaluator_sdk.values.agents import Agent -from nmp.evaluator.app.values import BenchmarkOnlineAgentJob -from nmp.evaluator.app.values.metrics_job import MetricOnlineAgentJob - - -def _nat_agent() -> Agent: - return Agent( - url="http://nat-agent.test:8080", - name="test-nat-agent", - format=AgentFormat.NEMO_AGENT_TOOLKIT, - ) - - -def _generic_agent() -> Agent: - return Agent( - url="http://generic-agent.test:9090/run", - name="test-generic-agent", - format=AgentFormat.GENERIC, - body={"input_message": "{{ messages[-1].content }}"}, - response_path="$.output", - trajectory_path="$.trajectory", - ) - - -class _TestMetric: - type = "exact-match" - - def metric(self, item: dict, sample: dict, trace=None) -> float: - del item, sample, trace - return 1.0 - - async def compute_scores(self, input: MetricInput) -> MetricResult: - del input - raise AssertionError("compute_scores is not used in these generation-only tests") - - def output_spec(self) -> list[MetricOutputSpec]: - return [MetricOutputSpec.continuous_score("exact-match")] - - -def _test_metric() -> Metric: - return cast(Metric, _TestMetric()) - - -def _benchmark_agent_job(agent: Agent) -> BenchmarkOnlineAgentJob: - return BenchmarkOnlineAgentJob.model_validate( - { - "benchmark": { - "name": "agent-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/exact-match", - "metric": {"type": "exact-match", "reference": "{{item.expected}}"}, - } - ], - }, - "agent": agent.model_dump(), - "prompt_template": {"messages": [{"role": "user", "content": "{{item.input}}"}]}, - } - ) - - -def _metric_agent_job(agent: Agent) -> MetricOnlineAgentJob: - return MetricOnlineAgentJob.model_validate( - { - "metric": {"type": "exact-match", "reference": "{{item.expected}}"}, - "agent": agent.model_dump(), - "dataset": {"rows": [{"input": "What is 1+1?", "expected": "2"}]}, - "prompt_template": {"messages": [{"role": "user", "content": "{{item.input}}"}]}, - } - ) - - -# --------------------------------------------------------------------------- -# Test 1: BenchmarkOnlineAgentJob with NAT agent — SSE streaming POST -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_benchmark_nat_agent_sends_post_to_generate_full(): - """NAT agent benchmark inference POSTs to /generate/full with SSE streaming.""" - agent = _nat_agent() - job = _benchmark_agent_job(agent) - - captured_calls = [] - - with patch("nemo_evaluator_sdk.agent_inference.httpx.AsyncClient") as MockClient: - client_instance = AsyncMock() - MockClient.return_value = client_instance - client_instance.__aenter__ = AsyncMock(return_value=client_instance) - client_instance.__aexit__ = AsyncMock(return_value=False) - - stream_ctx = AsyncMock() - mock_resp = AsyncMock() - mock_resp.raise_for_status = lambda: None - - async def aiter_lines(): - yield 'data: {"value": "The answer is 2"}' - - mock_resp.aiter_lines = aiter_lines - stream_ctx.__aenter__ = AsyncMock(return_value=mock_resp) - stream_ctx.__aexit__ = AsyncMock(return_value=False) - - def capture_stream(method, url, **kwargs): - captured_calls.append({"method": method, "url": url, **kwargs}) - return stream_ctx - - client_instance.stream = capture_stream - - sample = await generate_online_sample_agent( - agent=agent, - row={"input": "What is 1+1?", "expected": "2"}, - index=0, - prompt_template=job.prompt_template, - agent_inference_fn=make_agent_inference_request, - ) - - assert len(captured_calls) == 1 - call = captured_calls[0] - assert call["method"] == "POST" - assert call["url"] == "http://nat-agent.test:8080/generate/full" - assert call["params"] == {"filter_steps": "none"} - assert call["json"]["input_message"] == "What is 1+1?" - - assert sample["output_text"] == "The answer is 2" - assert sample["response"]["choices"][0]["message"]["content"] == "The answer is 2" - - -# --------------------------------------------------------------------------- -# Test 2: BenchmarkOnlineAgentJob with generic agent — direct POST -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_benchmark_generic_agent_sends_post_with_body_template(): - """Generic agent benchmark inference POSTs rendered body and extracts via JSONPath.""" - agent = _generic_agent() - job = _benchmark_agent_job(agent) - - captured_calls = [] - - with patch("nemo_evaluator_sdk.agent_inference.httpx.AsyncClient") as MockClient: - client_instance = AsyncMock() - MockClient.return_value = client_instance - client_instance.__aenter__ = AsyncMock(return_value=client_instance) - client_instance.__aexit__ = AsyncMock(return_value=False) - - agent_response = { - "output": "The answer is 2", - "trajectory": [{"step": "think", "content": "1+1 = 2"}], - } - - async def capture_post(url, **kwargs): - captured_calls.append({"url": url, **kwargs}) - return httpx.Response(200, json=agent_response, request=httpx.Request("POST", url)) - - client_instance.post = capture_post - - sample = await generate_online_sample_agent( - agent=agent, - row={"input": "What is 1+1?", "expected": "2"}, - index=0, - prompt_template=job.prompt_template, - agent_inference_fn=make_agent_inference_request, - ) - - assert len(captured_calls) == 1 - call = captured_calls[0] - assert call["url"] == "http://generic-agent.test:9090/run" - assert call["json"]["input_message"] == "What is 1+1?" - - assert sample["output_text"] == "The answer is 2" - assert sample["trajectory"] == [{"step": "think", "content": "1+1 = 2"}] - - -# --------------------------------------------------------------------------- -# Test 3: MetricOnlineAgentJob with NAT agent — full pipeline integration -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_metric_nat_agent_pipeline_calls_agent_inference(): - """MetricOnlineAgentJob pipeline dispatches to agent inference, not model inference.""" - agent = _nat_agent() - job = _metric_agent_job(agent) - - captured_calls = [] - - with patch("nemo_evaluator_sdk.agent_inference.httpx.AsyncClient") as MockClient: - client_instance = AsyncMock() - MockClient.return_value = client_instance - client_instance.__aenter__ = AsyncMock(return_value=client_instance) - client_instance.__aexit__ = AsyncMock(return_value=False) - - stream_ctx = AsyncMock() - mock_resp = AsyncMock() - mock_resp.raise_for_status = lambda: None - - async def aiter_lines(): - yield 'data: {"value": "2"}' - - mock_resp.aiter_lines = aiter_lines - stream_ctx.__aenter__ = AsyncMock(return_value=mock_resp) - stream_ctx.__aexit__ = AsyncMock(return_value=False) - - def capture_stream(method, url, **kwargs): - captured_calls.append({"method": method, "url": url, **kwargs}) - return stream_ctx - - client_instance.stream = capture_stream - - pipeline = ComputeMetricPipeline( - rows=[{"input": "What is 1+1?", "expected": "2"}], - parallelism=1, - metric=_test_metric(), - target=agent, - params=job.params, - prompt_template=job.prompt_template, - metric_key="exact-match", - inference_fn=make_agent_inference_request, - ) - - sample = await pipeline.generate_sample(0, {"input": "What is 1+1?", "expected": "2"}) - - assert len(captured_calls) == 1 - assert captured_calls[0]["method"] == "POST" - assert "generate/full" in captured_calls[0]["url"] - assert sample["output_text"] == "2" - - -# --------------------------------------------------------------------------- -# Test 4: MetricOnlineAgentJob with generic agent — full pipeline integration -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_metric_generic_agent_pipeline_calls_agent_inference(): - """MetricOnlineAgentJob pipeline dispatches to generic agent via HTTP POST.""" - agent = _generic_agent() - job = _metric_agent_job(agent) - - captured_calls = [] - - with patch("nemo_evaluator_sdk.agent_inference.httpx.AsyncClient") as MockClient: - client_instance = AsyncMock() - MockClient.return_value = client_instance - client_instance.__aenter__ = AsyncMock(return_value=client_instance) - client_instance.__aexit__ = AsyncMock(return_value=False) - - agent_response = { - "output": "2", - "trajectory": [{"step": "compute", "content": "1+1=2"}], - } - - async def capture_post(url, **kwargs): - captured_calls.append({"url": url, **kwargs}) - return httpx.Response(200, json=agent_response, request=httpx.Request("POST", url)) - - client_instance.post = capture_post - - pipeline = ComputeMetricPipeline( - rows=[{"input": "What is 1+1?", "expected": "2"}], - parallelism=1, - metric=_test_metric(), - target=agent, - params=job.params, - prompt_template=job.prompt_template, - metric_key="exact-match", - inference_fn=make_agent_inference_request, - ) - - sample = await pipeline.generate_sample(0, {"input": "What is 1+1?", "expected": "2"}) - - assert len(captured_calls) == 1 - assert captured_calls[0]["url"] == "http://generic-agent.test:9090/run" - assert sample["output_text"] == "2" - assert sample["response"]["trajectory"] == [{"step": "compute", "content": "1+1=2"}] diff --git a/services/evaluator/tests/integration/tasks/test_download_fileset.py b/services/evaluator/tests/integration/tasks/test_download_fileset.py deleted file mode 100644 index 488d71cdb0..0000000000 --- a/services/evaluator/tests/integration/tasks/test_download_fileset.py +++ /dev/null @@ -1,380 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Integration tests for the download_fileset task. - -These tests verify that the download_fileset task correctly: -- Downloads files from filesets via URN paths -- Handles inline dataset data -- Properly interfaces with the Files API -- Handles edge cases (empty filesets, special characters, nested dirs) -- Reports clear errors for invalid inputs - -Uses task_harness for in-memory service testing. -""" - -import json -from pathlib import Path - -import pytest -from nmp.core.files.service import FilesService -from nmp.evaluator.tasks import download_fileset -from nmp.testing import task_harness - -# Test workspace -TEST_WORKSPACE = "test-workspace" - - -# ============================================================================= -# Integration Tests -# ============================================================================= - - -@pytest.mark.integration -class TestDownloadFilesetTask: - """Integration tests for the download_fileset task.""" - - @pytest.mark.asyncio - async def test_download_inline_dataset(self, tmp_path: Path): - """Test downloading inline dataset writes rows to JSON file.""" - dataset = { - "rows": [ - {"input": "What is Python?", "expected": "A programming language"}, - {"input": "What is 2+2?", "expected": "4"}, - ] - } - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - # Run task with inline dataset - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - # Verify file was created - output_file = tmp_path / "dataset.json" - assert output_file.exists() - - # Verify content - with open(output_file) as f: - content = json.load(f) - - assert len(content) == 2 - assert content[0]["input"] == "What is Python?" - assert content[1]["expected"] == "4" - - @pytest.mark.asyncio - async def test_download_urn_dataset_directory(self, tmp_path: Path): - """Test downloading a directory from a fileset via URN.""" - fileset_name = "test-download-dir-fileset" - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - # Setup: Create fileset with files - ctx.sdk.files.filesets.create( - workspace=TEST_WORKSPACE, - name=fileset_name, - description="Test fileset for directory download", - ) - - ctx.sdk.files.upload_content( - content=b'{"file": 1}', - remote_path="subdir/file1.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - ctx.sdk.files.upload_content( - content=b'{"file": 2}', - remote_path="subdir/file2.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - - # Run task with URN pointing to directory - dataset = f"{TEST_WORKSPACE}/{fileset_name}/subdir/" - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - # Verify files were downloaded - files = list(tmp_path.rglob("*.json")) - assert len(files) >= 2 - - @pytest.mark.asyncio - async def test_download_creates_destination_directory(self, tmp_path: Path): - """Test that download creates nested destination directories.""" - nested_dest = tmp_path / "nested" / "path" / "to" / "data" - dataset = {"rows": [{"key": "value"}]} - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(nested_dest)]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - assert nested_dest.exists() - assert (nested_dest / "dataset.json").exists() - - @pytest.mark.asyncio - async def test_download_urn_fileset_root(self, tmp_path: Path): - """Test downloading from fileset root (no trailing path).""" - fileset_name = "test-root-download" - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - # Setup - ctx.sdk.files.filesets.create( - workspace=TEST_WORKSPACE, - name=fileset_name, - description="Test fileset", - ) - ctx.sdk.files.upload_content( - content=json.dumps([{"id": 1}, {"id": 2}]).encode(), - remote_path="dataset.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - ctx.sdk.files.upload_content( - content=b'{"setting": true}', - remote_path="config.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - - # Run task - dataset = f"{TEST_WORKSPACE}/{fileset_name}" - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - # Verify both files downloaded - files = list(tmp_path.rglob("*.json")) - assert len(files) == 2 - - @pytest.mark.asyncio - async def test_download_urn_nested_subdirectories(self, tmp_path: Path): - """Test downloading nested subdirectories recursively.""" - fileset_name = "test-nested-dirs" - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - # Setup - ctx.sdk.files.filesets.create( - workspace=TEST_WORKSPACE, - name=fileset_name, - description="Test fileset", - ) - ctx.sdk.files.upload_content( - content=b'{"level": 1}', - remote_path="level1/file1.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - ctx.sdk.files.upload_content( - content=b'{"level": 2}', - remote_path="level1/level2/file2.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - ctx.sdk.files.upload_content( - content=b'{"level": 3}', - remote_path="level1/level2/level3/file3.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - - # Run task - dataset = f"{TEST_WORKSPACE}/{fileset_name}/" - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - # Verify all files downloaded - files = list(tmp_path.rglob("*.json")) - assert len(files) == 3 - - @pytest.mark.asyncio - async def test_download_urn_nonexistent_fileset_raises(self, tmp_path: Path): - """Test that downloading from non-existent fileset fails.""" - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - dataset = f"{TEST_WORKSPACE}/nonexistent-fileset-12345" - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - # Task should fail - assert result.exit_code != 0 - - @pytest.mark.asyncio - async def test_download_urn_empty_fileset(self, tmp_path: Path): - """Test downloading from an empty fileset (no files uploaded).""" - fileset_name = "test-empty-fileset" - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - # Setup: empty fileset - ctx.sdk.files.filesets.create( - workspace=TEST_WORKSPACE, - name=fileset_name, - description="Empty fileset", - ) - - dataset = f"{TEST_WORKSPACE}/{fileset_name}/" - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - # Should complete without error - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - assert tmp_path.exists() - - @pytest.mark.asyncio - async def test_download_inline_dataset_preserves_data_types(self, tmp_path: Path): - """Test that inline dataset preserves various JSON data types.""" - dataset = { - "rows": [ - { - "string": "hello", - "number": 42, - "float": 3.14159, - "boolean": True, - "null": None, - "array": [1, 2, 3], - "nested": {"a": {"b": "c"}}, - }, - ] - } - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - with open(tmp_path / "dataset.json") as f: - content = json.load(f) - - row = content[0] - assert row["string"] == "hello" - assert row["number"] == 42 - assert abs(row["float"] - 3.14159) < 0.0001 - assert row["boolean"] is True - assert row["null"] is None - assert row["array"] == [1, 2, 3] - assert row["nested"]["a"]["b"] == "c" - - @pytest.mark.asyncio - async def test_download_urn_with_special_characters_in_path(self, tmp_path: Path): - """Test downloading files with special characters in filenames.""" - fileset_name = "test-special-chars" - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - # Setup - ctx.sdk.files.filesets.create( - workspace=TEST_WORKSPACE, - name=fileset_name, - description="Test fileset", - ) - ctx.sdk.files.upload_content( - content=b'{"type": "dashes"}', - remote_path="data-with-dashes.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - ctx.sdk.files.upload_content( - content=b'{"type": "underscores"}', - remote_path="data_with_underscores.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - ctx.sdk.files.upload_content( - content=b'{"type": "dots"}', - remote_path="data.multiple.dots.json", - fileset=fileset_name, - workspace=TEST_WORKSPACE, - ) - - dataset = f"{TEST_WORKSPACE}/{fileset_name}/" - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - files = list(tmp_path.rglob("*.json")) - assert len(files) == 3 - - @pytest.mark.asyncio - async def test_download_inline_dataset_large_rows(self, tmp_path: Path): - """Test downloading inline dataset with many rows.""" - rows = [{"id": i, "data": f"row-{i}" * 10} for i in range(100)] - dataset = {"rows": rows} - - async with task_harness( - download_fileset, - FilesService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - }, - ) as ctx: - result = ctx.run_task(args=["--dataset", json.dumps(dataset), "--local-dir", str(tmp_path)]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - with open(tmp_path / "dataset.json") as f: - content = json.load(f) - - assert len(content) == 100 - assert content[0]["id"] == 0 - assert content[99]["id"] == 99 diff --git a/services/evaluator/tests/integration/tasks/test_evaluate_benchmark.py b/services/evaluator/tests/integration/tasks/test_evaluate_benchmark.py deleted file mode 100644 index 6a9f973266..0000000000 --- a/services/evaluator/tests/integration/tasks/test_evaluate_benchmark.py +++ /dev/null @@ -1,567 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import json -from typing import Any - -import pytest -from jinja2.exceptions import UndefinedError -from nemo_evaluator_sdk import inference -from nemo_evaluator_sdk.execution.values import EvaluationError, EvaluationPhase -from nemo_evaluator_sdk.values import MetricInput, MetricOutput, MetricOutputSpec, MetricResult, Model -from nmp.evaluator.app.values import BenchmarkOfflineJob, BenchmarkOnlineJob -from nmp.evaluator.tasks.evaluate_benchmark import __main__ as benchmark_task -from pytest_mock import MockerFixture - - -def _metric_result(name: str, value: float) -> MetricResult: - return MetricResult(outputs=[MetricOutput(name=name, value=value)]) - - -def _output_spec(name: str) -> list[MetricOutputSpec]: - return [MetricOutputSpec.continuous_score(name)] - - -@pytest.fixture -def test_offline_job() -> BenchmarkOfflineJob: - return BenchmarkOfflineJob.model_validate( - { - "benchmark": { - "name": "test-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/exact-match", - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - }, - }, - { - "metric_ref": "default/string-check", - "metric": { - "type": "string-check", - "operation": "startswith", - "left_template": "{{item.actual}}", - "right_template": "{{item.expected}}", - }, - }, - ], - }, - } - ) - - -@pytest.fixture -def test_online_job() -> BenchmarkOnlineJob: - return BenchmarkOnlineJob.model_validate( - { - "benchmark": { - "name": "test-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/exact-match", - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - }, - }, - { - "metric_ref": "default/string-check", - "metric": { - "type": "string-check", - "operation": "startswith", - "left_template": "{{item.actual}}", - "right_template": "{{item.expected}}", - }, - }, - ], - }, - "model": {"url": "http://nim.test/v1", "name": "my/model"}, - "prompt_template": "{{item.input}}", - } - ) - - -@pytest.fixture -def test_online_job_f1() -> BenchmarkOnlineJob: - return BenchmarkOnlineJob.model_validate( - { - "benchmark": { - "name": "partial-failure-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/f1-metric", - "metric": { - "type": "f1", - "reference": "{{item.reference}}", - "candidate": "{{item.candidate}}", - }, - }, - ], - }, - "model": { - "url": "http://model.ai", - "name": "my-model", - }, - "prompt_template": {}, - "params": {"ignore_request_failure": True}, - } - ) - - -@pytest.mark.asyncio -async def test_evaluate_benchmark_accumulates_requests_across_metrics(tmp_path, monkeypatch, test_offline_job): - monkeypatch.setattr(benchmark_task, "_load_dataset_items", lambda *args, **kwargs: [{"id": 1}]) - - class _FakeMetric: - def __init__(self, metric_name: str): - self._metric_name = metric_name - - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec(self._metric_name) - - async def compute_scores(self, input: MetricInput) -> MetricResult: - requests_log = inference.requests_log_var.get() - requests_log.append({"metric": self._metric_name, "item_id": input.row.data["id"]}) - return _metric_result(self._metric_name, 1.0) - - async def _fake_new_metric(metric_config, *args, **kwargs): - return _FakeMetric(str(metric_config.type.value)) - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - await benchmark_task.evaluate_benchmark(job=test_offline_job, results_dir=str(tmp_path)) - - row_scores_path = tmp_path / "row-scores.jsonl" - lines = [line for line in row_scores_path.read_text().splitlines() if line.strip()] - assert len(lines) == 1 - row = json.loads(lines[0]) - assert set(row["metrics"]) == {"default/exact-match", "default/string-check"} - assert row["requests"] == [ - {"metric": "exact-match", "item_id": 1}, - {"metric": "string-check", "item_id": 1}, - ] - - -@pytest.mark.asyncio -async def test_evaluate_benchmark_offline_errors_when_metric_fails(tmp_path, monkeypatch, test_offline_job): - # ignore_request_failure is not supported for offline jobs - monkeypatch.setattr(benchmark_task, "_load_dataset_items", lambda *args, **kwargs: [{"id": 1}]) - - class _FakeMetric: - def __init__(self, metric_name: str): - self._metric_name = metric_name - - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec(self._metric_name) - - async def compute_scores(self, input: MetricInput) -> MetricResult: - requests_log = inference.requests_log_var.get() - requests_log.append({"metric": self._metric_name, "item_id": input.row.data["id"]}) - if self._metric_name == "string-check": - raise RuntimeError("boom") - return _metric_result(self._metric_name, 1.0) - - async def _fake_new_metric(metric_config, *args, **kwargs): - return _FakeMetric(str(metric_config.type.value)) - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - with pytest.raises(EvaluationError, match="boom") as exc: - await benchmark_task.evaluate_benchmark(job=test_offline_job, results_dir=str(tmp_path)) - assert exc.value.index == 0 - assert exc.value.metric_key == "default/string-check" - assert exc.value.phase is EvaluationPhase.METRIC_SCORING - assert exc.value.message == "boom" - - -@pytest.mark.asyncio -async def test_evaluate_benchmark_accumulates_requests_when_metric_fails(tmp_path, monkeypatch, test_online_job): - test_online_job.params.ignore_request_failure = True - monkeypatch.setattr(benchmark_task, "_load_dataset_items", lambda *args, **kwargs: [{"id": 1}]) - - class _FakeMetric: - def __init__(self, metric_name: str): - self._metric_name = metric_name - - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec(self._metric_name) - - async def compute_scores(self, input: MetricInput) -> MetricResult: - requests_log = inference.requests_log_var.get() - requests_log.append({"metric": self._metric_name, "item_id": input.row.data["id"]}) - if self._metric_name == "string-check": - raise RuntimeError("boom") - return _metric_result(self._metric_name, 1.0) - - async def _fake_new_metric(metric_config, *args, **kwargs): - return _FakeMetric(str(metric_config.type.value)) - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - await benchmark_task.evaluate_benchmark(job=test_online_job, results_dir=str(tmp_path)) - - row_scores_path = tmp_path / "row-scores.jsonl" - lines = [line for line in row_scores_path.read_text().splitlines() if line.strip()] - assert len(lines) == 1 - row = json.loads(lines[0]) - assert set(row["metrics"]) == {"default/exact-match", "default/string-check"} - assert row["requests"] == [ - {"metric": "exact-match", "item_id": 1}, - {"metric": "string-check", "item_id": 1}, - ] - - -@pytest.mark.asyncio -async def test_evaluate_benchmark_offline_progress_tracking_completes( - tmp_path, - monkeypatch, - mocker: MockerFixture, - test_offline_job, -): - monkeypatch.setattr( - benchmark_task, - "_load_dataset_items", - lambda *args, **kwargs: [{"id": 1, "expected": "yes"}, {"id": 2, "expected": "yes"}], - ) - - class _FakeMetric: - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec("exact-match") - - async def compute_scores(self, input: MetricInput) -> MetricResult: - del input - return _metric_result("exact-match", 1.0) - - async def _fake_new_metric(*_args, **_kwargs): - return _FakeMetric() - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - progress_tracking = mocker.Mock() - progress_tracking.interval = 5 - progress_tracking.total_samples = None - - result = await benchmark_task.evaluate_benchmark( - job=test_offline_job, - results_dir=str(tmp_path), - progress_tracking=progress_tracking, - ) - - assert len(result.results) == 2, result.results - assert progress_tracking.total_samples == 2 - progress_tracking.increment_samples_processed.assert_called_once_with(2) - progress_tracking.update_progress.assert_called_once_with(100) - - -@pytest.mark.asyncio -async def test_evaluate_benchmark_duplicate_metric_types_use_unique_metric_refs(tmp_path, monkeypatch): - job = BenchmarkOfflineJob.model_validate( - { - "benchmark": { - "name": "duplicate-type-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/exact-match-1", - "metric": {"type": "exact-match", "reference": "{{item.expected}}"}, - }, - { - "metric_ref": "default/exact-match-2", - "metric": {"type": "exact-match", "reference": "{{item.expected_alt}}"}, - }, - ], - }, - } - ) - monkeypatch.setattr( - benchmark_task, - "_load_dataset_items", - lambda *args, **kwargs: [{"id": 1, "expected": "yes", "expected_alt": "yes"}], - ) - - class _FakeMetric: - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec("score") - - async def compute_scores(self, input: MetricInput) -> MetricResult: - del input - return _metric_result("score", 1.0) - - async def _fake_new_metric(*_args, **_kwargs): - return _FakeMetric() - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - result = await benchmark_task.evaluate_benchmark(job=job, results_dir=str(tmp_path)) - - metric_refs: list[str] = [] - for metric_result in result.results: - assert metric_result.metric is not None - metric_refs.append(metric_result.metric.root) - assert metric_refs == ["default/exact-match-1", "default/exact-match-2"] - row_scores_path = tmp_path / "row-scores.jsonl" - lines = [line for line in row_scores_path.read_text().splitlines() if line.strip()] - row = json.loads(lines[0]) - assert set(row["metrics"].keys()) == {"default/exact-match-1", "default/exact-match-2"} - - -@pytest.mark.asyncio -async def test_evaluate_benchmark_partial_failures_keep_nan_under_metric_score_name( - tmp_path, monkeypatch, test_online_job_f1 -): - monkeypatch.setattr( - benchmark_task, - "_load_dataset_items", - lambda *args, **kwargs: [ - {"id": 1, "reference": "a", "candidate": "a"}, - {"id": 2, "reference": "b", "candidate": "b"}, - ], - ) - - class _FlakyMetric: - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec("f1_score") - - async def compute_scores(self, input: MetricInput) -> MetricResult: - if input.row.data["id"] == 2: - raise RuntimeError("transient") - return _metric_result("f1_score", 1.0) - - async def _fake_new_metric(*_args, **_kwargs): - return _FlakyMetric() - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - result = await benchmark_task.evaluate_benchmark(job=test_online_job_f1, results_dir=str(tmp_path)) - - assert len(result.results) == 1 - aggregated_scores = result.results[0].scores - assert len(aggregated_scores) == 1 - assert aggregated_scores[0].name == "f1_score" - assert aggregated_scores[0].count == 1 - assert aggregated_scores[0].nan_count == 1 - - -@pytest.mark.asyncio -async def test_evaluate_benchmark_all_failures_use_declared_score_names(tmp_path, monkeypatch, test_online_job_f1): - monkeypatch.setattr( - benchmark_task, - "_load_dataset_items", - lambda *args, **kwargs: [ - {"id": 1, "reference": "a", "candidate": "a"}, - {"id": 2, "reference": "b", "candidate": "b"}, - ], - ) - - class _AlwaysFailMetric: - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec("f1_score") - - async def compute_scores(self, input: MetricInput) -> MetricResult: - del input - raise RuntimeError("transient") - - async def _fake_new_metric(*_args, **_kwargs): - return _AlwaysFailMetric() - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - result = await benchmark_task.evaluate_benchmark(job=test_online_job_f1, results_dir=str(tmp_path)) - aggregated_scores = result.results[0].scores - assert len(aggregated_scores) == 1 - assert aggregated_scores[0].name == "f1_score" - assert aggregated_scores[0].count == 0 - assert aggregated_scores[0].nan_count == 2 - - -@pytest.mark.asyncio -async def test_online_benchmark_reuses_single_inference_sample_across_metrics(tmp_path, monkeypatch, test_online_job): - monkeypatch.setattr( - benchmark_task, - "_load_dataset_items", - lambda *args, **kwargs: [{"id": 1, "input": "prompt", "expected": "answer"}], - ) - - inference_call_count = 0 - - async def _fake_inference_fn(*_args: Any, **_kwargs: Any) -> dict[str, Any]: - nonlocal inference_call_count - inference_call_count += 1 - return {"choices": [{"message": {"role": "assistant", "content": "answer"}}]} - - class _FakeMetric: - def __init__(self, metric_name: str): - self._metric_name = metric_name - - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec(self._metric_name) - - async def compute_scores(self, input: MetricInput) -> MetricResult: - del input - return _metric_result(self._metric_name, 1.0) - - async def _fake_new_metric(metric_config, *_args, **_kwargs): - return _FakeMetric(str(metric_config.type.value)) - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - await benchmark_task.evaluate_benchmark( - job=test_online_job, - results_dir=str(tmp_path), - inference_fn=_fake_inference_fn, - ) - - assert inference_call_count == 1 - - -@pytest.mark.asyncio -async def test_online_benchmark_streams_samples_to_metric_workers(tmp_path, monkeypatch, test_online_job): - test_online_job.params.parallelism = 1 - - monkeypatch.setattr( - benchmark_task, - "_load_dataset_items", - lambda *args, **kwargs: [ - {"id": 1, "input": "prompt-1", "expected": "answer"}, - {"id": 2, "input": "prompt-2", "expected": "answer"}, - ], - ) - - metric_started = asyncio.Event() - inference_call_count = 0 - - async def _fake_inference_fn(*_args: Any, **_kwargs: Any) -> dict[str, Any]: - nonlocal inference_call_count - inference_call_count += 1 - if inference_call_count == 2: - await metric_started.wait() - return {"choices": [{"message": {"role": "assistant", "content": "answer"}}]} - - class _FakeMetric: - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec("exact-match") - - async def compute_scores(self, input: MetricInput) -> MetricResult: - del input - metric_started.set() - return _metric_result("exact-match", 1.0) - - async def _fake_new_metric(*_args, **_kwargs): - return _FakeMetric() - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - result = await asyncio.wait_for( - benchmark_task.evaluate_benchmark( - job=test_online_job, results_dir=str(tmp_path), inference_fn=_fake_inference_fn - ), - timeout=2.0, - ) - assert len(result.results) == 2, result.results - - -@pytest.mark.asyncio -async def test_evaluate_offline_benchmark_surfaces_strict_metric_error_context(tmp_path, monkeypatch, test_offline_job): - monkeypatch.setattr(benchmark_task, "_load_dataset_items", lambda *args, **kwargs: [{"id": 1}]) - - class _FailingMetric: - def output_spec(self) -> list[MetricOutputSpec]: - return _output_spec("exact-match") - - async def compute_scores(self, input: MetricInput) -> MetricResult: - del input - raise ValueError("metric exploded") - - async def _fake_new_metric(*_args, **_kwargs): - return _FailingMetric() - - monkeypatch.setattr(benchmark_task, "new_metric", _fake_new_metric) - - with pytest.raises(EvaluationError, match="metric exploded") as exc: - await benchmark_task.evaluate_benchmark(job=test_offline_job, results_dir=str(tmp_path)) - assert exc.value.index == 0 - assert exc.value.metric_key == "default/exact-match" - assert exc.value.phase is EvaluationPhase.METRIC_SCORING - assert exc.value.message == "metric exploded" - - # One metric still uses the same typed benchmark strict-mode contract. - test_offline_job.benchmark.metrics = test_offline_job.benchmark.metrics[:1] - with pytest.raises(EvaluationError, match="metric exploded") as single_exc: - await benchmark_task.evaluate_benchmark(job=test_offline_job, results_dir=str(tmp_path)) - assert single_exc.value.metric_key == "default/exact-match" - - -@pytest.mark.asyncio -async def test_evaluate_online_benchmark_surfaces_strict_sample_generation_context( - tmp_path, monkeypatch, test_online_job -): - monkeypatch.setattr(benchmark_task, "_load_dataset_items", lambda *args, **kwargs: [{"id": 1}]) - - with pytest.raises(EvaluationError, match="'dict object' has no attribute 'input'") as exc: - await benchmark_task.evaluate_benchmark(job=test_online_job, results_dir=str(tmp_path)) - assert exc.value.index == 0 - assert exc.value.metric_key is None - assert exc.value.phase is EvaluationPhase.SAMPLE_GENERATION - assert isinstance(exc.value.__cause__, UndefinedError) - - -@pytest.mark.asyncio -async def test_evaluate_benchmark_attaches_platform_headers_to_judge_model( - tmp_path, - monkeypatch, - mocker: MockerFixture, -): - job = BenchmarkOfflineJob.model_validate( - { - "benchmark": { - "name": "judge-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/llm-judge", - "metric": { - "type": "llm-judge", - "model": { - "url": "http://nemo-platform-api.default.svc.cluster.local/v1/chat/completions", - "name": "judge-model", - }, - "scores": [ - { - "name": "quality", - "minimum": 1, - "maximum": 5, - "parser": {"type": "json", "json_path": "quality"}, - } - ], - }, - } - ], - } - } - ) - monkeypatch.setattr(benchmark_task, "_load_dataset_items", lambda *args, **kwargs: [{"prompt": "hi"}]) - captured_model_headers: list[dict[str, str] | None] = [] - - async def capturing_inference( - model: Model, - request: dict, - max_retries: int | None, - **kwargs, - ) -> dict: - captured_model_headers.append(model.default_headers) - return {"choices": [{"message": {"content": '{"quality": 5}'}}]} - - mocker.patch( - "nmp.evaluator.app.metrics.metric.app_inference.get_platform_headers", - return_value={"X-NMP-Principal-Id": "service:evaluator"}, - ) - - await benchmark_task.evaluate_benchmark(job=job, results_dir=str(tmp_path), inference_fn=capturing_inference) - - assert captured_model_headers - assert captured_model_headers == [{"X-NMP-Principal-Id": "service:evaluator"}] * len(captured_model_headers) diff --git a/services/evaluator/tests/integration/tasks/test_evaluate_metric.py b/services/evaluator/tests/integration/tasks/test_evaluate_metric.py deleted file mode 100644 index 1dadeb533e..0000000000 --- a/services/evaluator/tests/integration/tasks/test_evaluate_metric.py +++ /dev/null @@ -1,1287 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Integration tests for the evaluate_metric task. - -These tests verify that the evaluate_metric function correctly: -- Evaluates metrics with mocked model inference -- Writes evaluation artifacts (job.json, results.jsonl, evaluation_results.json) -- Aggregates scores across samples -- Handles offline and online evaluation modes -- Properly handles inference failures with ignore_request_failure flag -- Loads datasets from FilesetRef (downloaded files) as well as inline rows - -Uses create_test_client for testing the results upload flow when -combined with handle_results. -""" - -import json -from pathlib import Path - -import pytest -from nemo_evaluator_sdk.execution.values import EvaluationError, EvaluationPhase -from nemo_evaluator_sdk.inference import InferenceFn -from nemo_evaluator_sdk.values import ( - AggregatedMetricResult, - AggregateRangeScore, - DatasetRows, - Model, -) -from nemo_platform import NeMoPlatform -from nmp.common.jobs.constants import NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, PERSISTENT_JOB_STORAGE_PATH_ENVVAR -from nmp.evaluator.app.evalfactory.convert import INLINE_DATASET_FILENAME -from nmp.evaluator.app.jobs.constants import ( - EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_ROW_SCORES_FILE_NAME, -) -from nmp.evaluator.app.jobs.metric_results import ResultsHandlerConfig, handle_results_async -from nmp.evaluator.app.values import MetricJobAdapter -from nmp.evaluator.tasks.evaluate_metric.__main__ import ( - _json_default, - _load_dataset_items, - evaluate_metric, - main, - metric_evaluation_entrypoint, - metric_evaluation_entrypoint_args, - no_aggregated_metric_scores, - run, -) -from pytest_mock import MockerFixture - -# Test workspace - must match conftest.py -TEST_WORKSPACE = "test-workspace" - - -# ============================================================================= -# Mock Inference Helpers -# ============================================================================= - - -def make_mock_inference(response: dict) -> InferenceFn: - """Create a mock inference function that returns a fixed response.""" - - async def mock_inference( - model: Model, - request: dict, - max_retries: int | None, - **kwargs, - ) -> dict: - return response - - return mock_inference - - -def make_mock_inference_with_side_effects(responses: list[dict | Exception]) -> InferenceFn: - """Create a mock inference function that returns responses in sequence or raises exceptions.""" - call_count = 0 - - async def mock_inference( - model: Model, - request: dict, - max_retries: int | None, - **kwargs, - ) -> dict: - nonlocal call_count - response = responses[call_count % len(responses)] - call_count += 1 - if isinstance(response, Exception): - raise response - return response - - return mock_inference - - -def make_failing_inference(error: Exception) -> InferenceFn: - """Create a mock inference function that always raises an exception.""" - - async def mock_inference( - model: Model, - request: dict, - max_retries: int | None, - **kwargs, - ) -> dict: - raise error - - return mock_inference - - -# ============================================================================= -# Test Data -# ============================================================================= - - -def create_offline_llm_judge_job() -> dict: - """Create an offline LLM Judge metric job config.""" - return { - "dataset": { - "rows": [ - {"input": "What is Python?", "output": "A programming language"}, - {"input": "Explain quantum computing", "output": "Complex physics stuff"}, - ], - }, - "metric": { - "type": "llm-judge", - "model": { - "url": "http://mock-judge:8000/v1/chat/completions", - "name": "mock-judge-model", - }, - "scores": [ - { - "name": "length", - "rubric": [ - {"label": "short", "value": 0}, - {"label": "long", "value": 1}, - ], - } - ], - }, - "params": { - "parallelism": 1, - }, - } - - -def create_online_exact_match_job() -> dict: - """Create an online evaluation job with exact-match metric.""" - return { - "model": { - "name": "test-model", - "url": "http://mock-model:8000/v1/chat/completions", - "format": "nim", - }, - "dataset": { - "rows": [ - {"input": "What is 1+1?", "expected": "2"}, - {"input": "What is 2+2?", "expected": "4"}, - ], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "metric": { - "type": "exact-match", - "name": "qa-exact-match", - "reference": "{{item.expected}}", - }, - "params": { - "parallelism": 1, - "max_retries": 1, - }, - } - - -def create_fileset_urn_llm_judge_job(fileset_urn: str) -> dict: - """Create an offline LLM Judge job that uses FilesetRef dataset. - - This simulates the scenario where a dataset has been downloaded - from a fileset to the JOB_DATASET_DIR. - """ - return { - "dataset": fileset_urn, # FilesetRef as string - "metric": { - "type": "llm-judge", - "model": { - "url": "http://mock-judge:8000/v1/chat/completions", - "name": "mock-judge-model", - }, - "scores": [ - { - "name": "quality", - "rubric": [ - {"label": "poor", "value": 0}, - {"label": "good", "value": 1}, - ], - } - ], - }, - "params": { - "parallelism": 1, - }, - } - - -# Sample dataset rows for FilesetRef tests -FILESET_DATASET_ROWS = [ - {"input": "Explain machine learning", "output": "ML is a subset of AI..."}, - {"input": "What is deep learning?", "output": "Deep learning uses neural networks..."}, - {"input": "Define NLP", "output": "Natural Language Processing is..."}, -] - - -def create_multi_score_llm_judge_job() -> dict: - """Create an LLM Judge job with multiple scores to verify all are captured.""" - return { - "dataset": { - "rows": [ - {"input": "What is Python?", "output": "Python is a programming language."}, - {"input": "Explain AI", "output": "AI stands for Artificial Intelligence."}, - ], - }, - "metric": { - "type": "llm-judge", - "model": { - "url": "http://mock-judge:8000/v1/chat/completions", - "name": "mock-judge-model", - }, - "scores": [ - { - "name": "accuracy", - "rubric": [ - {"label": "wrong", "value": 0}, - {"label": "correct", "value": 1}, - ], - }, - { - "name": "completeness", - "rubric": [ - {"label": "incomplete", "value": 0}, - {"label": "partial", "value": 0.5}, - {"label": "complete", "value": 1}, - ], - }, - { - "name": "clarity", - "rubric": [ - {"label": "unclear", "value": 0}, - {"label": "clear", "value": 1}, - ], - }, - ], - }, - "params": { - "parallelism": 1, - }, - } - - -def create_string_check_job() -> dict: - """Create a string-check metric job for testing non-LLM metrics.""" - return { - "dataset": { - "rows": [ - {"text": "Hello World", "expected_prefix": "Hello"}, - {"text": "Goodbye World", "expected_prefix": "Good"}, - {"text": "Python is great", "expected_prefix": "Python"}, - ], - }, - "metric": { - "type": "string-check", - "left_template": "{{text}}", - "right_template": "{{expected_prefix}}", - "operation": "startswith", - }, - "params": { - "parallelism": 1, - }, - } - - -def create_job_with_invalid_template() -> dict: - """Create a job with invalid Jinja template to test error handling.""" - return { - "model": { - "name": "test-model", - "url": "http://mock-model:8000/v1/chat/completions", - "format": "nim", - }, - "dataset": { - "rows": [ - {"input": "test"}, - ], - }, - # Invalid template - references undefined variable - "prompt_template": {"messages": [{"role": "user", "content": "{{undefined_variable}}"}]}, - "metric": { - "type": "exact-match", - "reference": "test", - }, - "params": { - "parallelism": 1, - }, - } - - -def create_online_job_with_inference_params() -> dict: - """Create an online job with custom inference parameters.""" - return { - "model": { - "name": "test-model", - "url": "http://mock-model:8000/v1/chat/completions", - "format": "nim", - }, - "dataset": { - "rows": [ - {"input": "Hello", "expected": "Hi"}, - {"input": "Goodbye", "expected": "Bye"}, - ], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - }, - "params": { - "parallelism": 1, - "max_retries": 2, - "inference": { - "temperature": 0.7, - "max_tokens": 100, - "top_p": 0.9, - }, - }, - } - - -def create_high_parallelism_job() -> dict: - """Create a job with parallelism > 1 to test concurrent processing.""" - return { - "dataset": { - "rows": [ - {"input": f"Question {i}", "output": f"Answer {i}"} - for i in range(10) # 10 rows to process in parallel - ], - }, - "metric": { - "type": "llm-judge", - "model": { - "url": "http://mock-judge:8000/v1/chat/completions", - "name": "mock-judge-model", - }, - "scores": [ - { - "name": "score", - "rubric": [ - {"label": "bad", "value": 0}, - {"label": "good", "value": 1}, - ], - } - ], - }, - "params": { - "parallelism": 4, # Process 4 items concurrently - }, - } - - -# ============================================================================= -# Integration Tests - evaluate_metric -# ============================================================================= - - -@pytest.mark.integration -class TestEvaluateMetricIntegration: - """Integration tests for the evaluate_metric task.""" - - @pytest.mark.asyncio - async def test_evaluate_metric_offline_llm_judge( - self, - temp_dir: Path, - ): - """Test offline LLM Judge metric evaluation with mocked inference.""" - job_config = create_offline_llm_judge_job() - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"length": "short"}'}}]}) - - result = await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # Verify aggregated result - assert result is not None - assert len(result.scores) > 0 - - # Verify artifacts were written - assert (temp_dir / "job.json").exists() - assert (temp_dir / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).exists() - assert (temp_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME).exists() - - @pytest.mark.asyncio - async def test_evaluate_metric_writes_correct_job_json( - self, - temp_dir: Path, - ): - """Test that job.json contains correct job configuration.""" - job_config = create_offline_llm_judge_job() - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"length": "short"}'}}]}) - - await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # Verify job.json content - with open(temp_dir / "job.json") as f: - saved_job = json.load(f) - - assert saved_job["metric"]["type"] == "llm-judge" - assert len(saved_job["dataset"]["rows"]) == 2 - - @pytest.mark.asyncio - async def test_evaluate_metric_writes_detailed_results( - self, - temp_dir: Path, - ): - """Test that results.jsonl contains row-level evaluation details.""" - job_config = create_offline_llm_judge_job() - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"length": "short"}'}}]}) - - await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # Verify detailed results (JSONL format) - detailed_path = temp_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME - with open(detailed_path) as f: - lines = f.readlines() - - # Should have one line per input row - assert len(lines) == 2 - - for line in lines: - row = json.loads(line) - assert "item" in row - assert "metrics" in row - - @pytest.mark.asyncio - async def test_evaluate_metric_aggregated_scores( - self, - temp_dir: Path, - ): - """Test that evaluation_results.json contains aggregated scores.""" - job_config = create_offline_llm_judge_job() - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"length": "short"}'}}]}) - - await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # Verify aggregated results - with open(temp_dir / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME) as f: - results = json.load(f) - - assert "scores" in results - assert len(results["scores"]) > 0 - - @pytest.mark.asyncio - async def test_evaluate_metric_online_with_model_inference( - self, - temp_dir: Path, - ): - """Test online evaluation that runs model inference then evaluates.""" - job_config = create_online_exact_match_job() - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference_with_side_effects( - [ - {"choices": [{"message": {"content": "2"}}]}, # Correct - {"choices": [{"message": {"content": "5"}}]}, # Wrong - ] - ) - - result = await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # Verify we got results - assert result is not None - assert len(result.scores) > 0 - - # exact-match should have some correct and some wrong - exact_match_score = next( - (s for s in result.scores if "exact" in s.name.lower()), - None, - ) - assert exact_match_score is not None - - @pytest.mark.asyncio - async def test_evaluate_metric_with_inference_failure_ignored( - self, - temp_dir: Path, - ): - """Test that inference failures return NaN when ignored.""" - job_config = create_online_exact_match_job() - job_config["params"]["ignore_request_failure"] = True - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_failing_inference(Exception("Model unavailable")) - - result = await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # Should complete with NaN scores - assert result is not None - # All samples failed, so count should be 0 and nan_count should be 2 - for score in result.scores: - assert score.nan_count == 2 - assert score.count == 0 - - @pytest.mark.asyncio - async def test_evaluate_metric_with_inference_failure_raises( - self, - temp_dir: Path, - ): - """Test that inference failures raise exception by default.""" - job_config = create_online_exact_match_job() - # ignore_request_failure defaults to False - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_failing_inference(Exception("Model unavailable")) - - with pytest.raises(EvaluationError, match="sample generation") as exc_info: - await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - assert exc_info.value.index == 0 - assert exc_info.value.phase is EvaluationPhase.SAMPLE_GENERATION - - @pytest.mark.asyncio - async def test_evaluate_metric_multiple_scores_all_captured( - self, - temp_dir: Path, - ): - """Test that all scores from multi-score LLM Judge are captured.""" - job_config = create_multi_score_llm_judge_job() - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference( - { - "choices": [ - {"message": {"content": '{"accuracy": "correct", "completeness": "complete", "clarity": "clear"}'}} - ] - } - ) - - result = await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # Verify all 3 scores are present - assert result is not None - assert len(result.scores) == 3 - - score_names = {s.name for s in result.scores} - assert "accuracy" in score_names - assert "completeness" in score_names - assert "clarity" in score_names - - # Verify aggregated values are correct (both samples got 1.0) - for score in result.scores: - assert score.mean == 1.0 - assert score.count == 2 - - @pytest.mark.asyncio - async def test_evaluate_metric_string_check( - self, - temp_dir: Path, - ): - """Test string-check metric type (non-LLM metric).""" - job_config = create_string_check_job() - job = MetricJobAdapter.validate_python(job_config) - - # String-check doesn't need inference mocking - it's pure computation - result = await evaluate_metric(job, str(temp_dir)) - - # Verify we got results - assert result is not None - assert len(result.scores) > 0 - - # All 3 rows should pass the "startswith" check - string_check_score = result.scores[0] - assert string_check_score.mean == 1.0 - assert string_check_score.count == 3 - - @pytest.mark.asyncio - async def test_evaluate_metric_parallelism_processes_all_rows( - self, - temp_dir: Path, - ): - """Test that parallelism > 1 processes all rows correctly.""" - job_config = create_high_parallelism_job() - job = MetricJobAdapter.validate_python(job_config) - - call_count = 0 - row_eval_call_count = 0 - - async def counting_inference( - model: Model, - request: dict, - max_retries: int | None, - **kwargs, - ) -> dict: - nonlocal call_count, row_eval_call_count - call_count += 1 - # LLM judge preflight adds probe calls; count only actual row-eval calls here. - extra_body = request.get("extra_body", {}) - guided_json = extra_body.get("guided_json") or extra_body.get("nvext", {}).get("guided_json") - is_preflight = "__nmp_probe_score" in str(guided_json) if guided_json is not None else False - if not is_preflight: - row_eval_call_count += 1 - return {"choices": [{"message": {"content": '{"score": "good"}'}}]} - - result = await evaluate_metric(job, str(temp_dir), inference_fn=counting_inference) - - # Verify all 10 rows were processed (exclude preflight probe requests) - assert row_eval_call_count == 10 - assert call_count >= 10 - - # Verify aggregated result has all samples - assert result is not None - assert result.scores[0].count == 10 - - # Verify detailed results has 10 lines - detailed_path = temp_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME - with open(detailed_path) as f: - lines = f.readlines() - assert len(lines) == 10 - - @pytest.mark.asyncio - async def test_evaluate_metric_template_error_raises( - self, - temp_dir: Path, - ): - """Test that Jinja template errors keep strict metric row context.""" - job_config = create_job_with_invalid_template() - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": "test"}}]}) - - with pytest.raises(EvaluationError, match="sample generation") as exc_info: - await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - assert exc_info.value.index == 0 - assert exc_info.value.phase is EvaluationPhase.SAMPLE_GENERATION - - @pytest.mark.asyncio - async def test_evaluate_metric_online_with_custom_inference_params( - self, - temp_dir: Path, - ): - """Test that custom inference params are passed to the model.""" - job_config = create_online_job_with_inference_params() - job = MetricJobAdapter.validate_python(job_config) - - captured_requests: list[dict] = [] - - async def capturing_inference(model: Model, request: dict, max_retries: int | None, **kwargs) -> dict: - captured_requests.append(request) - return {"choices": [{"message": {"content": "Hi"}}]} - - await evaluate_metric(job, str(temp_dir), inference_fn=capturing_inference) - - # Verify inference params were included in requests - assert len(captured_requests) == 2 - for request in captured_requests: - assert request.get("temperature") == 0.7 - assert request.get("max_tokens") == 100 - assert request.get("top_p") == 0.9 - - @pytest.mark.asyncio - async def test_evaluate_metric_attaches_platform_headers_to_judge_model( - self, - temp_dir: Path, - mocker: MockerFixture, - ): - """Judge-model platform headers should be attached to the runtime metric model.""" - job_config = create_offline_llm_judge_job() - job_config["metric"]["model"]["url"] = "http://nemo-platform-api.default.svc.cluster.local/v1/chat/completions" - job = MetricJobAdapter.validate_python(job_config) - captured_model_headers: list[dict[str, str] | None] = [] - - async def capturing_inference( - model: Model, - request: dict, - max_retries: int | None, - **kwargs, - ) -> dict: - captured_model_headers.append(model.default_headers) - return {"choices": [{"message": {"content": '{"length": "short"}'}}]} - - mocker.patch( - "nmp.evaluator.app.metrics.metric.app_inference.get_platform_headers", - return_value={"X-NMP-Principal-Id": "service:evaluator"}, - ) - - await evaluate_metric(job, str(temp_dir), inference_fn=capturing_inference) - - assert captured_model_headers - assert captured_model_headers == [{"X-NMP-Principal-Id": "service:evaluator"}] * len(captured_model_headers) - - @pytest.mark.asyncio - async def test_evaluate_metric_all_nan_scores_detected( - self, - temp_dir: Path, - ): - """Test that all-NaN scores are properly tracked in aggregation.""" - job_config = create_online_exact_match_job() - job_config["params"]["ignore_request_failure"] = True - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_failing_inference(Exception("Model unavailable")) - - result = await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # All scores should be NaN - assert result is not None - for score in result.scores: - assert score.count == 0 - assert score.nan_count == 2 - - # Verify aggregated results file reflects NaN state - with open(temp_dir / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME) as f: - results = json.load(f) - - for score in results["scores"]: - assert score["count"] == 0 - assert score["nan_count"] == 2 - - -@pytest.mark.integration -class TestEvaluateMetricWithFilesetRef: - """Integration tests for evaluate_metric with FilesetRef datasets. - - These tests verify that the evaluate_metric task can load datasets - from downloaded files (simulating the download_fileset step). - """ - - @pytest.mark.asyncio - async def test_evaluate_metric_with_fileset_urn_dataset( - self, - temp_dir: Path, - ): - """Test evaluation with FilesetRef dataset loads from downloaded file.""" - # Create a "downloaded" dataset directory with dataset.json - # The dataset-download step places files at {dataset_dir}/{workspace}/{fileset-name}/ - fileset_ref = f"{TEST_WORKSPACE}/test-fileset" - dataset_dir = temp_dir / "datasets" - fileset_dir = dataset_dir / fileset_ref - fileset_dir.mkdir(parents=True) - results_dir = temp_dir / "results" - results_dir.mkdir(parents=True) - - # Write dataset.json (simulating what download_fileset would produce) - dataset_file = fileset_dir / INLINE_DATASET_FILENAME - with open(dataset_file, "w") as f: - json.dump(FILESET_DATASET_ROWS, f) - - # Create job with FilesetRef - job_config = create_fileset_urn_llm_judge_job(fileset_ref) - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"quality": "good"}'}}]}) - - result = await evaluate_metric(job, str(results_dir), dataset_dir=str(dataset_dir), inference_fn=mock_inference) - - # Verify we got results for all 3 rows - assert result is not None - assert len(result.scores) > 0 - - # Verify detailed results were written - detailed_path = results_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME - with open(detailed_path) as f: - lines = f.readlines() - assert len(lines) == 3 # One line per dataset row - - @pytest.mark.asyncio - async def test_evaluate_metric_fileset_urn_missing_file_raises( - self, - temp_dir: Path, - ): - """Test that FilesetRef without downloaded file raises clear error.""" - # Create empty dataset directory (no fileset directory) - dataset_dir = temp_dir / "datasets" - dataset_dir.mkdir(parents=True) - results_dir = temp_dir / "results" - results_dir.mkdir(parents=True) - - # Create job with FilesetRef - job_config = create_fileset_urn_llm_judge_job(f"{TEST_WORKSPACE}/missing-fileset") - job = MetricJobAdapter.validate_python(job_config) - - with pytest.raises(ValueError, match="Failed to load dataset"): - await evaluate_metric(job, str(results_dir), dataset_dir=str(dataset_dir)) - - @pytest.mark.asyncio - async def test_evaluate_metric_fileset_urn_empty_dataset_raises( - self, - temp_dir: Path, - ): - """Test that empty downloaded dataset raises clear error.""" - # Create dataset directory with empty dataset.json - # The dataset-download step places files at {dataset_dir}/{workspace}/{fileset-name}/ - fileset_ref = f"{TEST_WORKSPACE}/empty-fileset" - dataset_dir = temp_dir / "datasets" - fileset_dir = dataset_dir / fileset_ref - fileset_dir.mkdir(parents=True) - results_dir = temp_dir / "results" - results_dir.mkdir(parents=True) - - # Write empty dataset.json - dataset_file = fileset_dir / INLINE_DATASET_FILENAME - with open(dataset_file, "w") as f: - json.dump([], f) - - # Create job with FilesetRef - job_config = create_fileset_urn_llm_judge_job(fileset_ref) - job = MetricJobAdapter.validate_python(job_config) - - with pytest.raises(ValueError, match="empty"): - await evaluate_metric(job, str(results_dir), dataset_dir=str(dataset_dir)) - - @pytest.mark.asyncio - async def test_evaluate_metric_fileset_urn_respects_limit_samples( - self, - temp_dir: Path, - ): - """Test that limit_samples parameter works with FilesetRef datasets.""" - # Create dataset with 3 rows - # The dataset-download step places files at {dataset_dir}/{workspace}/{fileset-name}/ - fileset_ref = f"{TEST_WORKSPACE}/test-fileset" - dataset_dir = temp_dir / "datasets" - fileset_dir = dataset_dir / fileset_ref - fileset_dir.mkdir(parents=True) - results_dir = temp_dir / "results" - results_dir.mkdir(parents=True) - - dataset_file = fileset_dir / INLINE_DATASET_FILENAME - with open(dataset_file, "w") as f: - json.dump(FILESET_DATASET_ROWS, f) - - # Create job with limit_samples=2 - job_config = create_fileset_urn_llm_judge_job(fileset_ref) - job_config["params"]["limit_samples"] = 2 - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"quality": "good"}'}}]}) - - await evaluate_metric(job, str(results_dir), dataset_dir=str(dataset_dir), inference_fn=mock_inference) - - # Verify only 2 rows were processed - detailed_path = results_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME - with open(detailed_path) as f: - lines = f.readlines() - assert len(lines) == 2 # Limited to 2 samples - - @pytest.mark.asyncio - async def test_evaluate_metric_fileset_with_fragment_specific_file( - self, - temp_dir: Path, - ): - """Test loading a specific file via fragment (workspace/fileset#file.json).""" - # Create dataset directory with multiple files - fileset_ref = f"{TEST_WORKSPACE}/multi-file-fileset" - dataset_dir = temp_dir / "datasets" - fileset_dir = dataset_dir / fileset_ref - fileset_dir.mkdir(parents=True) - results_dir = temp_dir / "results" - results_dir.mkdir(parents=True) - - # Write multiple dataset files - train_data = [{"input": "train1", "output": "resp1"}, {"input": "train2", "output": "resp2"}] - test_data = [{"input": "test1", "output": "resp1"}] - - with open(fileset_dir / "train.json", "w") as f: - json.dump(train_data, f) - with open(fileset_dir / "test.json", "w") as f: - json.dump(test_data, f) - - # Create job referencing specific file via fragment - job_config = create_fileset_urn_llm_judge_job(f"{fileset_ref}#train.json") - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"quality": "good"}'}}]}) - - await evaluate_metric(job, str(results_dir), dataset_dir=str(dataset_dir), inference_fn=mock_inference) - - # Verify only train.json rows were processed (2 rows) - detailed_path = results_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME - with open(detailed_path) as f: - lines = f.readlines() - assert len(lines) == 2 - - @pytest.mark.asyncio - async def test_evaluate_metric_fileset_with_glob_pattern( - self, - temp_dir: Path, - ): - """Test loading files matching a glob pattern (workspace/fileset#*.jsonl).""" - # Create dataset directory with multiple file types - fileset_ref = f"{TEST_WORKSPACE}/glob-fileset" - dataset_dir = temp_dir / "datasets" - fileset_dir = dataset_dir / fileset_ref - fileset_dir.mkdir(parents=True) - results_dir = temp_dir / "results" - results_dir.mkdir(parents=True) - - # Write JSONL files (should match *.jsonl) - jsonl_data = [ - {"input": "jsonl1", "output": "resp1"}, - {"input": "jsonl2", "output": "resp2"}, - ] - with open(fileset_dir / "data.jsonl", "w") as f: - for row in jsonl_data: - f.write(json.dumps(row) + "\n") - - # Write JSON file (should not match *.jsonl) - json_data = [{"input": "json1", "output": "resp1"}] - with open(fileset_dir / "other.json", "w") as f: - json.dump(json_data, f) - - # Create job with glob pattern - job_config = create_fileset_urn_llm_judge_job(f"{fileset_ref}#*.jsonl") - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"quality": "good"}'}}]}) - - await evaluate_metric(job, str(results_dir), dataset_dir=str(dataset_dir), inference_fn=mock_inference) - - # Verify only JSONL rows were processed (2 rows) - detailed_path = results_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME - with open(detailed_path) as f: - lines = f.readlines() - assert len(lines) == 2 - - @pytest.mark.asyncio - async def test_evaluate_metric_fileset_loads_all_files_when_no_fragment( - self, - temp_dir: Path, - ): - """Test that all parsable files are loaded when no fragment is specified.""" - # Create dataset directory with multiple files - fileset_ref = f"{TEST_WORKSPACE}/all-files-fileset" - dataset_dir = temp_dir / "datasets" - fileset_dir = dataset_dir / fileset_ref - fileset_dir.mkdir(parents=True) - results_dir = temp_dir / "results" - results_dir.mkdir(parents=True) - - # Write multiple dataset files in different formats - json_data = [{"input": "json1", "output": "resp1"}] - jsonl_data = [{"input": "jsonl1", "output": "resp1"}] - - with open(fileset_dir / "data.json", "w") as f: - json.dump(json_data, f) - with open(fileset_dir / "train.jsonl", "w") as f: - for row in jsonl_data: - f.write(json.dumps(row) + "\n") - # Also add a non-data file that should be skipped - (fileset_dir / "README.md").write_text("# This should be skipped") - - # Create job without fragment (should load all parsable files) - job_config = create_fileset_urn_llm_judge_job(fileset_ref) - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"quality": "good"}'}}]}) - - await evaluate_metric(job, str(results_dir), dataset_dir=str(dataset_dir), inference_fn=mock_inference) - - # Verify all data rows from both files were processed (1 + 1 = 2 rows) - detailed_path = results_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME - with open(detailed_path) as f: - lines = f.readlines() - assert len(lines) == 2 - - @pytest.mark.asyncio - async def test_evaluate_metric_fileset_with_subdirectory_path( - self, - temp_dir: Path, - ): - """Test loading a file from a subdirectory via fragment.""" - # Create dataset directory with nested structure - fileset_ref = f"{TEST_WORKSPACE}/nested-fileset" - dataset_dir = temp_dir / "datasets" - fileset_dir = dataset_dir / fileset_ref - subdir = fileset_dir / "data" / "train" - subdir.mkdir(parents=True) - results_dir = temp_dir / "results" - results_dir.mkdir(parents=True) - - # Write dataset in subdirectory - train_data = [{"input": "nested1", "output": "resp1"}, {"input": "nested2", "output": "resp2"}] - with open(subdir / "dataset.json", "w") as f: - json.dump(train_data, f) - - # Create job referencing file in subdirectory - job_config = create_fileset_urn_llm_judge_job(f"{fileset_ref}#data/train/dataset.json") - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"quality": "good"}'}}]}) - - await evaluate_metric(job, str(results_dir), dataset_dir=str(dataset_dir), inference_fn=mock_inference) - - # Verify nested file was loaded (2 rows) - detailed_path = results_dir / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME - with open(detailed_path) as f: - lines = f.readlines() - assert len(lines) == 2 - - -@pytest.mark.integration -class TestEvaluateMetricWithResultsUpload: - """Integration tests for evaluate_metric + handle_results flow.""" - - @pytest.mark.asyncio - async def test_evaluate_then_upload_results( - self, - sdk: NeMoPlatform, - async_sdk_with_jobs, - job_context, - temp_dir: Path, - ): - """Test the full flow: evaluate metric -> upload results to Jobs API.""" - job_name = "test-eval-upload-job" - - # Create job using job_context for proper cleanup - job_context.create(job_name) - - # Run evaluation - job_config = create_offline_llm_judge_job() - job = MetricJobAdapter.validate_python(job_config) - - mock_inference = make_mock_inference({"choices": [{"message": {"content": '{"length": "short"}'}}]}) - - await evaluate_metric(job, str(temp_dir), inference_fn=mock_inference) - - # Upload results using handle_results_async - config = ResultsHandlerConfig( - NEMO_JOB_ID=job_name, - NEMO_JOB_WORKSPACE=TEST_WORKSPACE, - ) - await handle_results_async(job, config, str(temp_dir), async_sdk_with_jobs) - - # Verify results were uploaded - results = sdk.jobs.results.list(name=job_name, workspace=TEST_WORKSPACE) - result_names = [r.name for r in results.data] - - assert "artifacts" in result_names - assert "aggregate-scores" in result_names - - # Cleanup - job_context.cleanup(job_name) - - -@pytest.mark.integration -class TestEvaluateMetricHelpers: - def test_json_default_prefers_supported_serializers(self): - class WithDict: - def dict(self): - return {"kind": "dict"} - - class WithModelDump: - def model_dump(self): - return {"kind": "model_dump"} - - class WithToDict: - def to_dict(self): - return {"kind": "to_dict"} - - class Fallback: - def __str__(self) -> str: - return "fallback" - - assert _json_default(WithDict()) == {"kind": "dict"} - assert _json_default(WithModelDump()) == {"kind": "model_dump"} - assert _json_default(WithToDict()) == {"kind": "to_dict"} - assert _json_default(Fallback()) == "fallback" - - def test_no_aggregated_metric_scores_detects_empty_and_nonempty_results(self): - assert no_aggregated_metric_scores(AggregatedMetricResult(scores=[])) is True - - all_nan_result = AggregatedMetricResult( - scores=[ - AggregateRangeScore( - name="score", - count=0, - nan_count=2, - sum=0.0, - mean=None, - min=None, - max=None, - std_dev=None, - variance=None, - ) - ] - ) - assert no_aggregated_metric_scores(all_nan_result) is True - - valid_result = AggregatedMetricResult( - scores=[ - AggregateRangeScore( - name="score", - count=1, - nan_count=0, - sum=1.0, - mean=1.0, - min=1.0, - max=1.0, - std_dev=0.0, - variance=0.0, - ) - ] - ) - assert no_aggregated_metric_scores(valid_result) is False - - def test_metric_evaluation_entrypoint_helpers(self): - assert metric_evaluation_entrypoint() == ["python", "-m", "nmp.evaluator.tasks.evaluate_metric"] - assert metric_evaluation_entrypoint_args() == [] - assert metric_evaluation_entrypoint_args( - progress_tracking_url="https://callback.test", - progress_tracking_interval=10, - ) == [ - "--progress-tracking-url", - "https://callback.test", - "--progress-tracking-interval", - "10", - ] - - def test_load_dataset_items_rejects_empty_inline_rows(self, mocker: MockerFixture): - job = mocker.Mock(dataset=DatasetRows.model_construct(rows=[])) - - with pytest.raises(ValueError, match="DatasetRows has no rows"): - _load_dataset_items(job) - - def test_load_dataset_items_rejects_unsupported_dataset_type(self, mocker: MockerFixture): - job = mocker.Mock(dataset="unsupported") - - with pytest.raises(ValueError, match="Unsupported dataset type: str"): - _load_dataset_items(job) - - @pytest.mark.asyncio - async def test_evaluate_metric_configures_progress_tracking(self, temp_dir: Path, mocker: MockerFixture): - job_config = create_online_exact_match_job() - job = MetricJobAdapter.validate_python(job_config) - progress_tracking = mocker.Mock(total_samples=0, interval=5) - progress_hook = mocker.Mock() - progress_hook.postprocess.side_effect = lambda response, id=None: response - progress_hook_cls = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.ProgressTrackingHook", - return_value=progress_hook, - ) - - await evaluate_metric( - job, - str(temp_dir), - progress_tracking=progress_tracking, - inference_fn=make_mock_inference({"choices": [{"message": {"content": "2"}}]}), - ) - - assert progress_tracking.total_samples == 2 - progress_hook_cls.assert_called_once_with(progress_tracking) - - -@pytest.mark.integration -class TestEvaluateMetricTaskWrapper: - @pytest.mark.asyncio - async def test_main_marks_progress_complete_when_results_exist( - self, temp_dir: Path, mocker, monkeypatch: pytest.MonkeyPatch - ): - config_file = temp_dir / "job.json" - config_file.write_text(json.dumps(create_offline_llm_judge_job())) - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_file)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(temp_dir)) - progress_tracking = mocker.Mock() - progress_tracking.update_progress = mocker.Mock() - progress_tracking.stop = mocker.Mock() - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.initialize_logging") - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.ProgressTracking", - return_value=progress_tracking, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.evaluate_metric", - new_callable=mocker.AsyncMock, - return_value=AggregatedMetricResult( - scores=[ - AggregateRangeScore( - name="score", - count=1, - nan_count=0, - sum=1.0, - mean=1.0, - min=1.0, - max=1.0, - std_dev=0.0, - variance=0.0, - ) - ] - ), - ) - - result = await main( - [ - "--progress-tracking-url", - "https://callback.test", - "--skip-upload-results", - "True", - ] - ) - - assert result == 0 - progress_tracking.update_progress.assert_called_once_with(100) - progress_tracking.stop.assert_called_once() - - @pytest.mark.asyncio - async def test_main_raises_when_no_aggregated_scores_exist( - self, temp_dir: Path, mocker, monkeypatch: pytest.MonkeyPatch - ): - config_file = temp_dir / "job.json" - config_file.write_text(json.dumps(create_offline_llm_judge_job())) - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_file)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(temp_dir)) - progress_tracking = mocker.Mock() - progress_tracking.update_progress = mocker.Mock() - progress_tracking.stop = mocker.Mock() - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.initialize_logging") - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.ProgressTracking", - return_value=progress_tracking, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.evaluate_metric", - new_callable=mocker.AsyncMock, - return_value=AggregatedMetricResult(scores=[]), - ) - - with pytest.raises(ValueError, match="no evaluation results detected"): - await main( - [ - "--progress-tracking-url", - "https://callback.test", - "--skip-upload-results", - "True", - ] - ) - - progress_tracking.update_progress.assert_not_called() - progress_tracking.stop.assert_called_once() - - def test_run_returns_main_result(self, mocker): - register_handlers = mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.register_task_signal_handlers") - - def _run_and_close(coro): - coro.close() - return 7 - - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.asyncio.run", side_effect=_run_and_close) - - assert run([]) == 7 - register_handlers.assert_called_once() - - def test_run_returns_zero_on_keyboard_interrupt(self, mocker): - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.register_task_signal_handlers") - - def _raise_keyboard_interrupt(coro): - coro.close() - raise KeyboardInterrupt - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.asyncio.run", - side_effect=_raise_keyboard_interrupt, - ) - log_mock = mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.log") - - assert run([]) == 0 - log_mock.info.assert_called_once_with("Received termination signal. Exiting task gracefully.") - - def test_run_returns_one_on_unhandled_exception(self, mocker): - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.register_task_signal_handlers") - - def _raise_runtime_error(coro): - coro.close() - raise RuntimeError("boom") - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.asyncio.run", - side_effect=_raise_runtime_error, - ) - log_mock = mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.log") - - assert run([]) == 1 - log_mock.exception.assert_called_once_with("Error in evaluate_metric task") diff --git a/services/evaluator/tests/integration/tasks/test_results_handler.py b/services/evaluator/tests/integration/tasks/test_results_handler.py deleted file mode 100644 index c7ff2e9615..0000000000 --- a/services/evaluator/tests/integration/tasks/test_results_handler.py +++ /dev/null @@ -1,671 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Integration tests for the metric_results task. - -These tests verify that the metric_results task correctly: -- Uploads evaluation results to the Jobs API -- Uploads result artifacts to the Files API -- Parses both EvalFactory and custom result formats -- Handles edge cases (missing files, invalid formats, special characters) - -Uses task_harness for in-memory service testing. -""" - -import json -from pathlib import Path -from unittest.mock import patch - -import pytest -from nemo_evaluator_sdk.enums import MetricType -from nemo_evaluator_sdk.values import MetricScore -from nmp.common.jobs.constants import ( - NEMO_JOB_STEP_CONFIG_FILE_NAME, - NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, - PERSISTENT_JOB_STORAGE_PATH_ENVVAR, -) -from nmp.core.files.service import FilesService -from nmp.core.jobs.service import JobsService -from nmp.evaluator.app.jobs.constants import ( - EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_ROW_SCORES_FILE_NAME, - JOB_RESULTS_AGGREGATE_SCORES, - JOB_RESULTS_ROW_SCORES, -) -from nmp.evaluator.service import EvaluatorService -from nmp.evaluator.tasks import metric_results -from nmp.testing import task_harness - -# Test workspace and job ID -TEST_WORKSPACE = "test-workspace" -TEST_JOB_ID = "test-job-12345" - - -def task_runtime_env(tmp_path: Path, extra: dict[str, str] | None = None) -> dict[str, str]: - """Build the job runtime env consumed by the metric_results task.""" - storage_dir = tmp_path / "storage" - storage_dir.mkdir(exist_ok=True) - results_link = storage_dir / "results" - if not results_link.exists(): - results_link.symlink_to(tmp_path, target_is_directory=True) - env = { - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - "NEMO_JOB_ID": TEST_JOB_ID, - NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR: f"{tmp_path}/{NEMO_JOB_STEP_CONFIG_FILE_NAME}", - PERSISTENT_JOB_STORAGE_PATH_ENVVAR: str(storage_dir), - } - if extra: - env.update(extra) - return env - - -def create_test_job(sdk, workspace: str, job_id: str): - """Create a test job for result uploads.""" - # Create a minimal job that the results handler can reference - sdk.jobs.create( - workspace=workspace, - name=job_id, - source="evaluator", - spec={}, - platform_spec={ - "steps": [ - { - "name": "evaluate", - "executor": { - "provider": "cpu", - "profile": "default", - "container": { - "image": "test:latest", - "entrypoint": ["entrypoint"], - "command": ["command"], - }, - }, - } - ] - }, - ) - - -def download_json_result(sdk, name: str) -> dict: - response = sdk.jobs.results.download(name=name, job=TEST_JOB_ID, workspace=TEST_WORKSPACE) - return json.loads(response.read().decode()) - - -def download_jsonl_result(sdk, name: str) -> list[dict]: - response = sdk.jobs.results.download(name=name, job=TEST_JOB_ID, workspace=TEST_WORKSPACE) - return [json.loads(line) for line in response.read().decode().splitlines() if line.strip()] - - -@pytest.fixture -def metric_job_spec() -> dict: - return {"metric": {"type": "bleu", "references": []}, "dataset": {"rows": [{"data": "value"}]}} - - -@pytest.fixture -def retriever_metric_job_spec() -> dict: - return { - "metric": {"type": MetricType.SYSTEM_RETRIEVER, "name": "retriever-map"}, - "dataset": {"rows": [{"data": "value"}]}, - } - - -@pytest.fixture -def benchmark_job_spec() -> dict: - return {"benchmark": {"name": "some-system-benchmark"}, "dataset": {"rows": [{"data": "value"}]}} - - -# ============================================================================= -# Integration Tests -# ============================================================================= - - -@pytest.mark.integration -class TestMetricResultsTask: - """Integration tests for the metric_results task.""" - - @pytest.mark.asyncio - async def test_upload_custom_results(self, tmp_path: Path, metric_job_spec): - """Test uploading custom evaluation results format.""" - # Create results files - agg_scores = {"scores": [{"name": "accuracy", "mean": 0.85, "count": 100, "nan_count": 0}]} - metric_ref = f"{TEST_WORKSPACE}/my-acc-metric" - row_scores = [ - { - "item": {"row_id": 0}, - "sample": {}, - "metrics": {metric_ref: [{"name": "accuracy", "value": 0.9}]}, - "requests": [], - }, - { - "item": {"row_id": 1}, - "sample": {}, - "metrics": {metric_ref: [{"name": "accuracy", "value": 0.8}]}, - "requests": [], - }, - ] - - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - (tmp_path / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text(json.dumps(agg_scores)) - (tmp_path / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME).write_text( - "\n".join(json.dumps(row) for row in row_scores) - ) - - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path), - ) as ctx: - # Setup: Create the job that results will be uploaded to - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - # Run task - result = ctx.run_task(args=[]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - # Verify results were uploaded to Jobs API - job_results = ctx.sdk.jobs.results.list(TEST_JOB_ID, workspace=TEST_WORKSPACE) - result_names = [r.name for r in job_results.data] - - assert JOB_RESULTS_AGGREGATE_SCORES in result_names - assert JOB_RESULTS_ROW_SCORES in result_names - - # Verify result download serializes - agg_scores_resp = download_json_result(ctx.sdk, JOB_RESULTS_AGGREGATE_SCORES) - assert len(agg_scores_resp["scores"]) == 1 - assert agg_scores_resp["scores"][0]["name"] == "accuracy" - - row_scores = download_jsonl_result(ctx.sdk, JOB_RESULTS_ROW_SCORES) - assert len(row_scores) == 2, "unexpected number of row scores" - for row in row_scores: - assert len(row["metrics"]) == 1 - assert metric_ref in row["metrics"] - - @pytest.mark.asyncio - @pytest.mark.skip( - reason="EvalFactory format requires YAML with specific schema - covered by separate EvalFactory tests" - ) - async def test_upload_evalfactory_results(self, tmp_path: Path): - """Test uploading EvalFactory format results.""" - # EvalFactory uses a complex YAML format with tasks/groups structure - # This is covered by dedicated EvalFactory integration tests - pass - - @pytest.mark.asyncio - async def test_missing_results_directory(self, tmp_path: Path, metric_job_spec): - """Test handling of non-existent results directory.""" - nonexistent_dir = tmp_path / "nonexistent" - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - - async with task_harness( - metric_results, - FilesService, - JobsService, - config={}, - env={ - "NEMO_JOB_WORKSPACE": TEST_WORKSPACE, - "NEMO_JOB_ID": TEST_JOB_ID, - NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR: f"{tmp_path}/{NEMO_JOB_STEP_CONFIG_FILE_NAME}", - PERSISTENT_JOB_STORAGE_PATH_ENVVAR: str(nonexistent_dir), - }, - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - - # Task should fail gracefully - assert result.exit_code != 0 - assert "FileNotFoundError" in result.stderr - - @pytest.mark.asyncio - async def test_empty_results_directory(self, tmp_path: Path, metric_job_spec): - """Test handling of empty results directory (no result files).""" - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - - async with task_harness( - metric_results, - FilesService, - JobsService, - config={}, - env=task_runtime_env(tmp_path), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - - # Should complete but may warn about missing files - # The behavior depends on implementation - just verify it doesn't crash - assert result.exit_code in (0, 1) - assert "No custom evaluation results file 'aggregate-scores.json' found" in result.stderr - - @pytest.mark.asyncio - async def test_custom_takes_priority_over_evalfactory(self, tmp_path: Path, metric_job_spec): - """Test that custom parser is used by default when no harness env is set.""" - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - - # Create custom results (these should take priority) - custom_scores = {"scores": [{"name": "accuracy", "mean": 0.9, "count": 100, "nan_count": 0}]} - (tmp_path / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text(json.dumps(custom_scores)) - - # Create a dummy EvalFactory file (would fail parsing if actually used) - (tmp_path / EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text("not valid yaml") - - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - - # Should pass because custom format takes priority - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - # Verify the custom scores were uploaded (not EvalFactory) - job_results = ctx.sdk.jobs.results.list(TEST_JOB_ID, workspace=TEST_WORKSPACE) - agg_result = next((r for r in job_results.data if r.name == JOB_RESULTS_AGGREGATE_SCORES), None) - assert agg_result is not None - - # Verify result download serializes - agg_scores_resp = download_json_result(ctx.sdk, JOB_RESULTS_AGGREGATE_SCORES) - assert len(agg_scores_resp["scores"]) == 1 - assert agg_scores_resp["scores"][0]["name"] == "accuracy" - - # No row results uploaded - row_scores_resp = download_jsonl_result(ctx.sdk, JOB_RESULTS_ROW_SCORES) - assert len(row_scores_resp) == 0 - - @pytest.mark.asyncio - async def test_unknown_eval_harness_fails_fast(self, tmp_path: Path, metric_job_spec): - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - (tmp_path / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text(json.dumps({"scores": {}})) - - async with task_harness( - metric_results, - FilesService, - JobsService, - config={}, - env=task_runtime_env(tmp_path, {"NEMO_EVAL_HARNESS": "unknown_harness"}), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - result = ctx.run_task(args=[]) - assert result.exit_code != 0 - assert "Unsupported eval harness 'unknown_harness'" in result.stderr - - @pytest.mark.asyncio - async def test_preserves_stats_metadata(self, tmp_path: Path, metric_job_spec): - """Test that full stats metadata is preserved in results.""" - agg_scores = { - "scores": [ - { - "name": "f1_score", - "mean": 0.78, - "count": 50, - "nan_count": 0, - "min": 0.2, - "max": 1.0, - "sum": 39.0, - } - ], - } - - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - (tmp_path / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text(json.dumps(agg_scores)) - - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - agg_scores_resp = download_json_result(ctx.sdk, JOB_RESULTS_AGGREGATE_SCORES) - assert len(agg_scores_resp["scores"]) == 1 - score = agg_scores_resp["scores"][0] - assert score["name"] == "f1_score" - assert score["mean"] == 0.78 - assert score["count"] == 50 - assert score["min"] == 0.2 - assert score["max"] == 1.0 - assert score["sum"] == 39.0 - assert score.get("std_dev") is None - - @pytest.mark.asyncio - async def test_special_characters_in_score_names(self, tmp_path: Path, metric_job_spec): - """Test handling of special characters in metric/score names.""" - agg_scores = { - "scores": [ - {"name": "metric-with-dashes", "mean": 0.5, "count": 100, "nan_count": 0}, - {"name": "metric_with_underscores", "mean": 0.6, "count": 100, "nan_count": 0}, - {"name": "metric.with.dots", "mean": 0.7, "count": 100, "nan_count": 0}, - ], - } - expected_score_names = [ - "metric-with-dashes", - "metric_with_underscores", - "metric.with.dots", - ] - - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - (tmp_path / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text(json.dumps(agg_scores)) - - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - agg_scores_resp = download_json_result(ctx.sdk, JOB_RESULTS_AGGREGATE_SCORES) - assert len(agg_scores_resp["scores"]) == 3 - assert [score["name"] for score in agg_scores_resp["scores"]] == expected_score_names - - @pytest.mark.asyncio - async def test_multiple_scores_uploaded(self, tmp_path: Path, metric_job_spec): - """Test that multiple scores are all uploaded correctly.""" - agg_scores = { - "scores": [ - {"name": "accuracy", "mean": 0.85, "count": 5, "nan_count": 0}, - {"name": "precision", "mean": 0.80, "count": 5, "nan_count": 0}, - {"name": "recall", "mean": 0.75, "count": 5, "nan_count": 0}, - {"name": "f1", "mean": 0.77, "count": 5, "nan_count": 0}, - ], - } - expected_score_names = ["accuracy", "precision", "recall", "f1"] - - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - (tmp_path / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text(json.dumps(agg_scores)) - - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - # Verify results exist - job_results = ctx.sdk.jobs.results.list(TEST_JOB_ID, workspace=TEST_WORKSPACE) - assert len(job_results.data) > 0 - - agg_scores_resp = download_json_result(ctx.sdk, JOB_RESULTS_AGGREGATE_SCORES) - assert len(agg_scores_resp["scores"]) == 4 - assert [score["name"] for score in agg_scores_resp["scores"]] == expected_score_names - - @pytest.mark.asyncio - async def test_evalfactory_parser_creates_empty_row_scores(self, tmp_path: Path, benchmark_job_spec): - """EvalFactory parser should normalize to aggregate+row artifacts even without row data.""" - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(benchmark_job_spec)) - (tmp_path / EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text("tasks: {}") - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", - return_value=[MetricScore(name="accuracy", value=1.0)], - ): - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path, {"NEMO_EVAL_HARNESS": "simple_evals"}), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - job_results = ctx.sdk.jobs.results.list(TEST_JOB_ID, workspace=TEST_WORKSPACE) - result_names = [r.name for r in job_results.data] - assert JOB_RESULTS_AGGREGATE_SCORES in result_names - assert JOB_RESULTS_ROW_SCORES in result_names - - agg_scores_resp = download_json_result(ctx.sdk, JOB_RESULTS_AGGREGATE_SCORES) - assert len(agg_scores_resp["results"]) == 1 - assert len(agg_scores_resp["results"][0]["scores"]) == 1 - - row_scores_resp = download_jsonl_result(ctx.sdk, JOB_RESULTS_ROW_SCORES) - assert len(row_scores_resp) == 0 - - @pytest.mark.asyncio - async def test_evalfactory_parser_parses_retriever_rows(self, tmp_path: Path, retriever_metric_job_spec): - """EvalFactory parser should convert retriever_cached_outputs.json into row-scores.jsonl.""" - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(retriever_metric_job_spec)) - (tmp_path / EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text("tasks: {}") - retriever_rows = tmp_path / "results" / "retriever_cached_outputs.json" - retriever_rows.parent.mkdir(parents=True, exist_ok=True) - retriever_rows.write_text( - json.dumps( - { - "q1": {"retrieved_docs": [{"doc_id": "d1", "score": 0.11}]}, - "q2": {"retrieved_docs": [{"doc_id": "d2", "score": 0.22}]}, - } - ) - ) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", - return_value=[MetricScore(name="accuracy", value=1.0)], - ): - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path, {"NEMO_EVAL_HARNESS": "retriever"}), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - # Expected RowScores - # RowScore(item={'query_id': 'q1'}, metrics={}, requests=[], sample={}, retriever={'retrieved_docs': [{'doc_id': 'd1', 'score': 0.11}]}) - # RowScore(item={'query_id': 'q2'}, metrics={}, requests=[], sample={}, retriever={'retrieved_docs': [{'doc_id': 'd2', 'score': 0.22}]}) - - parsed = download_jsonl_result(ctx.sdk, JOB_RESULTS_ROW_SCORES) - assert len(parsed) == 2 - assert {row["item"]["query_id"] for row in parsed} == {"q1", "q2"} - assert all(row["row_index"] is None for row in parsed) - assert all(row["metric_errors"] is None for row in parsed) - assert all("error" not in row for row in parsed) - assert [row["retriever"] for row in parsed] == [ - {"retrieved_docs": [{"doc_id": "d1", "score": 0.11}]}, - {"retrieved_docs": [{"doc_id": "d2", "score": 0.22}]}, - ] - - @pytest.mark.asyncio - async def test_evalfactory_parser_fails_on_invalid_retriever_rows(self, tmp_path: Path, retriever_metric_job_spec): - """EvalFactory parser should hard-fail when retriever row artifact is malformed.""" - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(retriever_metric_job_spec)) - (tmp_path / EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text("tasks: {}") - retriever_rows = tmp_path / "results" / "retriever_cached_outputs.json" - retriever_rows.parent.mkdir(parents=True, exist_ok=True) - retriever_rows.write_text(json.dumps({"q1": "invalid"})) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", - return_value=[MetricScore(name="accuracy", value=1.0)], - ): - async with task_harness( - metric_results, - FilesService, - JobsService, - config={}, - env=task_runtime_env(tmp_path, {"NEMO_EVAL_HARNESS": "retriever"}), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - assert result.exit_code != 0 - assert "Invalid EvalFactory retriever row artifact entry" in result.stderr - - @pytest.mark.asyncio - async def test_evalfactory_parser_parses_cached_outputs_jsonl(self, tmp_path: Path, benchmark_job_spec): - """EvalFactory parser should convert cached-output jsonl rows to row-scores.jsonl.""" - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(benchmark_job_spec)) - (tmp_path / EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text("tasks: {}") - cached_rows = tmp_path / "results" / "answer_acc.jsonl" - cached_rows.parent.mkdir(parents=True, exist_ok=True) - cached_rows.write_text("\n".join([json.dumps({"question": "q1"}), json.dumps({"question": "q2"})])) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", - return_value=[MetricScore(name="accuracy", value=1.0)], - ): - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path, {"NEMO_EVAL_HARNESS": "simple_evals"}), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - agg_scores_resp = download_json_result(ctx.sdk, JOB_RESULTS_AGGREGATE_SCORES) - assert len(agg_scores_resp["results"]) == 1 - assert len(agg_scores_resp["results"][0]["scores"]) == 1 - - parsed = download_jsonl_result(ctx.sdk, JOB_RESULTS_ROW_SCORES) - assert len(parsed) == 2 - assert parsed[0]["item"]["question"] == "q1" - assert parsed[1]["item"]["question"] == "q2" - assert all(row["row_index"] is None for row in parsed) - assert all(row["metric_errors"] is None for row in parsed) - assert all("error" not in row for row in parsed) - - @pytest.mark.asyncio - async def test_evalfactory_agentic_uses_harness_cached_output_detection(self, tmp_path: Path): - """Agentic parser should resolve row source from harness-specific cached-output files.""" - job_spec = { - "metric": {"type": MetricType.SYSTEM, "name": "trajectory-evaluation"}, - "dataset": {"rows": [{"data": "value"}]}, - } - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(job_spec)) - (tmp_path / EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text("tasks: {}") - rows_dir = tmp_path / "results" - rows_dir.mkdir(parents=True, exist_ok=True) - (rows_dir / "trajectory_eval_input.jsonl").write_text(json.dumps({"question": "from-config"}) + "\n") - (rows_dir / "other.jsonl").write_text(json.dumps({"question": "not-selected"}) + "\n") - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", - return_value=[MetricScore(name="accuracy", value=1.0)], - ): - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path, {"NEMO_EVAL_HARNESS": "agentic_eval"}), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - parsed = download_jsonl_result(ctx.sdk, JOB_RESULTS_ROW_SCORES) - assert len(parsed) == 1 - parsed = parsed[0] - assert parsed["item"]["question"] == "from-config" - - @pytest.mark.asyncio - async def test_evalfactory_parser_fails_on_invalid_cached_outputs_jsonl(self, tmp_path: Path, benchmark_job_spec): - """EvalFactory parser should hard-fail when cached-output jsonl contains non-object rows.""" - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(benchmark_job_spec)) - (tmp_path / EVALFACTORY_EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text("tasks: {}") - cached_rows = tmp_path / "results" / "answer_acc.jsonl" - cached_rows.parent.mkdir(parents=True, exist_ok=True) - cached_rows.write_text(json.dumps(["invalid"])) - - with patch( - "nmp.evaluator.app.jobs.result_parsers.evalfactory._parse_evalfactory_scores", - return_value=[MetricScore(name="accuracy", value=1.0)], - ): - async with task_harness( - metric_results, - FilesService, - JobsService, - config={}, - env=task_runtime_env(tmp_path, {"NEMO_EVAL_HARNESS": "simple_evals"}), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - assert result.exit_code != 0 - assert "Invalid EvalFactory cached-outputs row" in result.stderr - - @pytest.mark.asyncio - async def test_large_row_scores_file(self, tmp_path: Path, metric_job_spec): - """Test handling of large row scores file.""" - agg_scores = {"scores": [{"name": "accuracy", "mean": 0.85, "count": 1000, "nan_count": 0}]} - row_scores = [ - { - "item": {"row_id": i}, - "sample": {}, - "metrics": {"score": [{"name": "score", "value": 0.8 + (i % 20) / 100}]}, - "requests": [], - } - for i in range(1000) - ] - - (tmp_path / NEMO_JOB_STEP_CONFIG_FILE_NAME).write_text(json.dumps(metric_job_spec)) - (tmp_path / EVALUATION_RESULTS_AGG_SCORES_FILE_NAME).write_text(json.dumps(agg_scores)) - (tmp_path / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME).write_text( - "\n".join(json.dumps(row) for row in row_scores) - ) - - async with task_harness( - metric_results, - FilesService, - JobsService, - EvaluatorService, - config={}, - env=task_runtime_env(tmp_path), - ) as ctx: - create_test_job(ctx.sdk, TEST_WORKSPACE, TEST_JOB_ID) - - result = ctx.run_task(args=[]) - - assert result.exit_code == 0, f"Task failed: {result.stderr}, exception={result.exception}" - - agg_scores_resp = download_json_result(ctx.sdk, JOB_RESULTS_AGGREGATE_SCORES) - assert len(agg_scores_resp["scores"]) == 1 - assert agg_scores_resp["scores"][0]["count"] == 1000 - - row_scores = download_jsonl_result(ctx.sdk, JOB_RESULTS_ROW_SCORES) - assert len(row_scores) == 1000, "unexpected number of row scores" diff --git a/services/evaluator/tests/jobs/test_metrics.py b/services/evaluator/tests/jobs/test_metrics.py deleted file mode 100644 index 0844100c7e..0000000000 --- a/services/evaluator/tests/jobs/test_metrics.py +++ /dev/null @@ -1,75 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import pytest -from nemo_evaluator_sdk import ExactMatchMetric -from nemo_evaluator_sdk.values import DatasetRows, Model, SecretRef -from nmp.evaluator.app.jobs.metrics import EnvironmentVariable, _get_model_env_secret -from nmp.evaluator.app.values import ( - MetricJob, - MetricOfflineJob, - MetricOnlineJob, -) -from pytest_mock import MockerFixture - -test_metric = ExactMatchMetric(reference="reference", candidate="candidate") -test_dataset = DatasetRows(rows=[{"reference": "a", "candidate": "b"}]) - - -@pytest.mark.parametrize( - "desc,job", - [ - ( - "no model to evaluate with offline job", - MetricOfflineJob( - metric=test_metric, - dataset=test_dataset, - ), - ), - ( - "no api key set", - MetricOnlineJob( - metric=test_metric, - dataset=test_dataset, - model=Model(name="workspace/my-model", url="http://nim.test"), - prompt_template="hello world", - ), - ), - ], -) -def test_get_model_env_secret_no_secret(desc: str, job: MetricJob): - secret = _get_model_env_secret(job) - assert secret is None, f"expected no model secret when {desc}" - - -def test_get_model_env_secret(): - job = MetricOnlineJob( - metric=test_metric, - dataset=test_dataset, - model=Model( - name="workspace/my-model", - url="http://nim.test", - api_key_secret=SecretRef(root="my-secret"), - ), - prompt_template="hello world", - ) - secret = _get_model_env_secret(job) - # Env var name uses underscores (launcher converts hyphens to underscores) - assert secret == EnvironmentVariable({"name": "my_secret", "from_secret": {"name": "my-secret"}}) - - -def test_get_model_env_secret_raises_when_secret_has_no_env(mocker: MockerFixture): - mocker.patch.object(Model, "api_key_env", new=property(lambda self: None)) - job = MetricOnlineJob( - metric=test_metric, - dataset=test_dataset, - model=Model( - name="workspace/my-model", - url="http://nim.test", - api_key_secret=SecretRef(root="my-secret"), - ), - prompt_template="hello world", - ) - - with pytest.raises(ValueError, match=r"model\.api_key_env must be set when model\.api_key_secret is configured"): - _get_model_env_secret(job) diff --git a/services/evaluator/tests/jobs/test_progress_tracking.py b/services/evaluator/tests/jobs/test_progress_tracking.py deleted file mode 100644 index fcd4e69fe4..0000000000 --- a/services/evaluator/tests/jobs/test_progress_tracking.py +++ /dev/null @@ -1,232 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import asyncio -import logging -import os -from http.client import HTTPMessage -from unittest import mock -from unittest.mock import patch - -import pytest -from nmp.common.jobs.constants import NEMO_JOB_ID_ENVVAR, NEMO_JOB_WORKSPACE_ENVVAR -from nmp.evaluator.app.jobs.progress_tracking import ProgressTracking, get_progress_tracking_url -from nmp.evaluator.app.values import EvaluationStatusDetails -from nmp.testing.pytest_outcomes import pytest_skip - - -@mock.patch.dict( - os.environ, - { - "NMP_JOBS_URL": "http://localhost:8000", - NEMO_JOB_ID_ENVVAR: "test-job-id", - NEMO_JOB_WORKSPACE_ENVVAR: "default", - }, -) -def test_url_env(): - # Test URL with env var is resolved - url = get_progress_tracking_url() - assert url == "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details" - progress_tracking = ProgressTracking(progress_tracking_url=url) - assert ( - progress_tracking._progress_tracking_url - == "http://localhost:8000/apis/jobs/v2/workspaces/default/jobs/test-job-id/status-details" - ) - - -@pytest.mark.parametrize( - "interval,total_samples,expected_interval,desc", - [ - (None, None, 50, "default"), - (20, None, 20, "set interval"), - (200, None, 200, "set large interval"), - (20, 100, 20, "set interval with total samples"), - (None, 30, 7, "default to total samples // 4"), - (100, 60, 15, "interval defaults to lower total samples // 4"), - ], -) -def test_interval(subtests, interval: int, total_samples: int, expected_interval: int, desc: str): - url = get_progress_tracking_url() - - with subtests.test(msg="init"): - progress_tracking = ProgressTracking(url, progress_tracking_interval=interval, total_samples=total_samples) - assert progress_tracking.interval == expected_interval, desc - - with subtests.test(msg="total_samples setter"): - if total_samples is None: - pytest_skip() - progress_tracking = ProgressTracking(url, progress_tracking_interval=interval) - assert progress_tracking.interval == interval or 50 - progress_tracking.total_samples = total_samples - assert progress_tracking.interval == expected_interval, desc - - -@patch("requests.Session") -@mock.patch.dict( - os.environ, - { - "NMP_JOBS_URL": "http://localhost:8000", - NEMO_JOB_ID_ENVVAR: "test-job-id", - NEMO_JOB_WORKSPACE_ENVVAR: "default", - }, -) -def test_increment(mock_session): - mock_session_request = mock.MagicMock(return_value=mock.MagicMock(status_code=200)) - mock_session.return_value.__enter__.return_value.request = mock_session_request - - url = get_progress_tracking_url() - rendered_url = "http://localhost:8000/apis/jobs/v2/workspaces/default/jobs/test-job-id/status-details" - progress_tracking = ProgressTracking(url, progress_tracking_interval=2) - - assert progress_tracking._status_details.samples_processed == 0 - progress_tracking.increment_samples_processed() - assert progress_tracking._status_details.samples_processed == 1 - progress_tracking.increment_samples_processed() - assert progress_tracking._status_details.samples_processed == 2 - mock_session_request.assert_called_once_with("PATCH", rendered_url, json={"samples_processed": 2}) - - progress_tracking.update_progress(100) - assert progress_tracking._status_details.samples_processed == 2, "post_eval_hook does not increment" - mock_session_request.assert_called_with("PATCH", rendered_url, json={"samples_processed": 2, "progress": 100.0}) - - -@patch("requests.Session") -@mock.patch.dict( - os.environ, - { - "NMP_JOBS_URL": "http://localhost:8000", - NEMO_JOB_ID_ENVVAR: "test-job-id", - NEMO_JOB_WORKSPACE_ENVVAR: "default", - }, -) -def test_update_progress_exclude_unset(mock_session): - mock_session_request = mock.MagicMock(return_value=mock.MagicMock(status_code=200)) - mock_session.return_value.__enter__.return_value.request = mock_session_request - - url = get_progress_tracking_url() - rendered_url = "http://localhost:8000/apis/jobs/v2/workspaces/default/jobs/test-job-id/status-details" - progress_tracking = ProgressTracking(url, progress_tracking_interval=2) - - # Verify "samples_processed": None is not serialized with exclude_unset=True - progress_tracking.update_progress(0) - mock_session_request.assert_called_once_with("PATCH", rendered_url, json={"progress": 0.0}) - - -@patch("requests.Session") -@pytest.mark.asyncio -async def test_timer(mock_session): - mock_session_request = mock.MagicMock(return_value=mock.MagicMock(status_code=200)) - mock_session.return_value.__enter__.return_value.request = mock_session_request - - url = "http://localhost:8080/apis/jobs/v2/workspaces/default/jobs/test-job-id/status-details" - progress_tracking = ProgressTracking(url, progress_tracking_interval_seconds=0.01) - - # Verify first timer interval calls update - assert progress_tracking._status_details.samples_processed == 0 - progress_tracking.increment_samples_processed() - progress_tracking.increment_samples_processed() - assert progress_tracking._status_details.samples_processed == 2 - # Use shorter sleep - just need to wait for timer callback, not real timing - await asyncio.sleep(0.05) - ( - mock_session_request.assert_called_once_with("PATCH", url, json={"samples_processed": 2, "progress": 0.0}), - "update is only called once and not on each interval", - ) - - # Verify subsequent timer interval calls update - progress_tracking.increment_samples_processed() - assert progress_tracking._status_details.samples_processed == 3 - await asyncio.sleep(0.05) - mock_session_request.assert_called_with("PATCH", url, json={"samples_processed": 3, "progress": 0.0}) - assert mock_session_request.call_count == 2, "update is only called on new payloads and not on each interval" - - # No calls to update after timer is stopped - progress_tracking.stop() - progress_tracking.increment_samples_processed() - assert progress_tracking._status_details.samples_processed == 4 - await asyncio.sleep(0.05) - assert mock_session_request.call_count == 2, "update is not called after timer is stopped" - - -@patch("urllib3.connectionpool.HTTPConnectionPool._get_conn") -@pytest.mark.asyncio -async def test_non_retry_status_code(getconn_mock, caplog): - getconn_mock.return_value.getresponse.return_value = mock.MagicMock(status=404, msg=HTTPMessage()) - - url_path = "/apis/jobs/v2/workspaces/default/jobs/test-job-id/status-details" - url = f"http://localhost:8080{url_path}" - - with caplog.at_level(logging.INFO, logger=__name__): - progress_tracking = ProgressTracking(url, logger=logging.getLogger(__name__)) - progress_tracking._send_progress(EvaluationStatusDetails(progress=100)) - assert "Failed to update job progress" in caplog.text - - assert getconn_mock.return_value.request.call_count == 1, "no retry for 404 status code" - - -@patch("urllib3.connectionpool.HTTPConnectionPool._get_conn") -@pytest.mark.asyncio -async def test_retry_status_code(getconn_mock, caplog): - getconn_mock.return_value.getresponse.side_effect = [ - mock.MagicMock(status=409, msg=HTTPMessage(), headers={"Retry-After": "1"}), - mock.MagicMock(status=200, msg=HTTPMessage()), - ] - url_path = "/apis/jobs/v2/workspaces/default/jobs/test-job-id/status-details" - url = f"http://localhost:8080{url_path}" - - with caplog.at_level(logging.INFO, logger=__name__): - progress_tracking = ProgressTracking(url, logger=logging.getLogger(__name__)) - progress_tracking._send_progress(EvaluationStatusDetails(progress=100)) - assert "Failed to update job progress" not in caplog.text - - assert getconn_mock.return_value.request.call_count == 2, "verify retries attempted" - assert getconn_mock.return_value.request.mock_calls == [ - mock.call( - "PATCH", - url_path, - body=b'{"progress": 100.0}', - headers=mock.ANY, - chunked=False, - preload_content=False, - decode_content=False, - enforce_content_length=True, - ), - mock.call( - "PATCH", - url_path, - body=b'{"progress": 100.0}', - headers=mock.ANY, - chunked=False, - preload_content=False, - decode_content=False, - enforce_content_length=True, - ), - ] - - -@patch("urllib3.connectionpool.HTTPConnectionPool._get_conn") -@pytest.mark.asyncio -async def test_retry_fails(getconn_mock, caplog): - getconn_mock.return_value.getresponse.return_value = mock.MagicMock( - status=409, msg=HTTPMessage(), headers={"Retry-After": "1"} - ) - - url_path = "/apis/jobs/v2/workspaces/default/jobs/test-job-id/status-details" - url = f"http://localhost:8080{url_path}" - - with caplog.at_level(logging.INFO, logger=__name__): - progress_tracking = ProgressTracking(url, logger=logging.getLogger(__name__)) - progress_tracking._send_progress(EvaluationStatusDetails(progress=100)) - assert "Failed to communicate with progress tracking server" in caplog.text - - assert getconn_mock.return_value.request.call_count == 6, "verify max retries attempted" - getconn_mock.return_value.request.assert_called_with( - "PATCH", - url_path, - body=b'{"progress": 100.0}', - headers=mock.ANY, - chunked=False, - preload_content=False, - decode_content=False, - enforce_content_length=True, - ) diff --git a/services/evaluator/tests/jobs/test_results.py b/services/evaluator/tests/jobs/test_results.py deleted file mode 100644 index e22a03d143..0000000000 --- a/services/evaluator/tests/jobs/test_results.py +++ /dev/null @@ -1,367 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import math -from typing import Dict, Optional - -import pytest -from nmp.evaluator.app.jobs.results import filter_empty_scores, nan_metrics_present, no_metrics -from nmp.evaluator.app.values import ( - DeprecatedMetricResult, - DeprecatedScoreValue, - EvaluationResult, - GroupResult, - TaskResult, -) -from pydantic import TypeAdapter - - -def test_filter_empty_scores(): - input = { - "task1": { - "metrics": { - "metric with no scores": {}, - "metric with valid score": {"scores": {"Overall Acc": {"value": 1.15, "stats": None}}}, - "metric with scores filtered": { - "scores": { - "Overall Acc": {"value": 1.15, "stats": None}, - "score to be filtered out": { - "value": None, - "stats": None, - }, - } - }, - } - }, - "task2": { - "metrics": { - "metric with score to be filtered out": { - "scores": { - "score to be filtered out": { - "value": None, - "stats": None, - } - } - }, - "metric to be kept": {"scores": {"Overall Acc": {"value": 1.15, "stats": None}}}, - } - }, - "task3": { - "metrics": { - "metric with no scores": {}, - "metric to be kept": {"scores": {"Overall Acc": {"value": 1.15, "stats": None}}}, - } - }, - "task4": {"metrics": {}}, - } - - filtered = filter_empty_scores(input) - - expected = { - "task1": { - "metrics": { - "metric with valid score": {"scores": {"Overall Acc": {"value": 1.15, "stats": None}}}, - "metric with scores filtered": {"scores": {"Overall Acc": {"value": 1.15, "stats": None}}}, - } - }, - "task2": {"metrics": {"metric to be kept": {"scores": {"Overall Acc": {"value": 1.15, "stats": None}}}}}, - "task3": {"metrics": {"metric to be kept": {"scores": {"Overall Acc": {"value": 1.15, "stats": None}}}}}, - "task4": {"metrics": {}}, - } - - assert expected == filtered - - -@pytest.mark.parametrize( - "evaluation_result, expected, description", - [ - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task": TaskResult( - metrics={ - "my-task-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=0.1)} - ) - } - ) - }, - ), - False, - "one task metric", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task": TaskResult( - metrics={ - "my-task-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=0.1)} - ), - "my-task-metric2": DeprecatedMetricResult( - scores={"my-score2": DeprecatedScoreValue(value=0.5)} - ), - } - ) - }, - ), - False, - "multiple task metrics", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - groups={ - "group": GroupResult( - metrics={ - "my-group-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=0.1)} - ) - } - ) - }, - ), - False, - "one group metric", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - groups={ - "group": GroupResult( - metrics={ - "my-group-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=0.1)} - ), - "my-group-metric2": DeprecatedMetricResult( - scores={"my-score2": DeprecatedScoreValue(value=0.5)} - ), - } - ) - }, - ), - False, - "multiple group metrics", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task": TaskResult( - metrics={ - "my-task-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=0.1)} - ), - "my-task-metric2": DeprecatedMetricResult( - scores={"my-score2": DeprecatedScoreValue(value=0.5)} - ), - } - ) - }, - groups={ - "group": GroupResult( - metrics={ - "my-group-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=0.1)} - ), - "my-group-metric2": DeprecatedMetricResult( - scores={"my-score2": DeprecatedScoreValue(value=0.5)} - ), - } - ) - }, - ), - False, - "task and group metrics", - ), - (EvaluationResult(workspace="default", job="job-id"), True, "empty result"), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={"task": TaskResult(metrics={})}, - groups={"group": GroupResult(metrics={})}, - ), - True, - "empty metric", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task": TaskResult( - metrics={ - "my-task-metric": DeprecatedMetricResult(scores={"my-score": DeprecatedScoreValue(value=0)}) - } - ) - }, - groups={ - "group": GroupResult( - metrics={ - "my-group-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=0)} - ) - } - ) - }, - ), - False, - "empty scores", - ), - ], -) -def test_no_metrics(evaluation_result: EvaluationResult, expected: bool, description: str): - raw_result: dict = evaluation_result.model_dump() - if evaluation_result.tasks: - filtered_task_results = filter_empty_scores(raw_result["tasks"]) - evaluation_result.tasks = TypeAdapter(Optional[Dict[str, TaskResult]]).validate_python(filtered_task_results) - if evaluation_result.groups: - filtered_group_results = filter_empty_scores(raw_result["groups"]) - evaluation_result.groups = TypeAdapter(Optional[Dict[str, GroupResult]]).validate_python(filtered_group_results) - assert no_metrics(evaluation_result) is expected, description - - -@pytest.mark.parametrize( - "evaluation_result, expected, description", - [ - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task": TaskResult( - metrics={ - "my-task-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=0.1)} - ) - } - ) - }, - ), - [], - "no NaN values in task metrics", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task": TaskResult( - metrics={ - "my-task-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=math.nan)} - ) - } - ) - }, - ), - ["task.my-task-metric.my-score"], - "NaN value in task metric", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task1": TaskResult( - metrics={ - "metric1": DeprecatedMetricResult(scores={"score1": DeprecatedScoreValue(value=math.nan)}) - } - ), - "task2": TaskResult( - metrics={ - "metric2": DeprecatedMetricResult(scores={"score2": DeprecatedScoreValue(value=math.nan)}) - } - ), - }, - ), - ["task1.metric1.score1", "task2.metric2.score2"], - "NaN values in multiple task metrics", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - groups={ - "group": GroupResult( - metrics={ - "my-group-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=math.nan)} - ) - } - ) - }, - ), - ["group.my-group-metric.my-score"], - "NaN value in group metric", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task": TaskResult( - metrics={ - "my-task-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=math.nan)} - ) - } - ) - }, - groups={ - "group": GroupResult( - metrics={ - "my-group-metric": DeprecatedMetricResult( - scores={"my-score": DeprecatedScoreValue(value=math.nan)} - ) - } - ) - }, - ), - ["task.my-task-metric.my-score", "group.my-group-metric.my-score"], - "NaN values in both task and group metrics", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={ - "task": TaskResult( - metrics={ - "metric1": DeprecatedMetricResult(scores={"score1": DeprecatedScoreValue(value=0.5)}), - "metric2": DeprecatedMetricResult(scores={"score2": DeprecatedScoreValue(value=math.nan)}), - } - ) - }, - ), - ["task.metric2.score2"], - "mixed valid and NaN values in task metrics", - ), - ( - EvaluationResult(workspace="default", job="job-id"), - [], - "empty result - no NaN values", - ), - ( - EvaluationResult( - workspace="default", - job="job-id", - tasks={"task": TaskResult(metrics={})}, - groups={"group": GroupResult(metrics={})}, - ), - [], - "empty metrics - no NaN values", - ), - ], -) -def test_nan_metrics_present(evaluation_result: EvaluationResult, expected: list, description: str): - result = nan_metrics_present(evaluation_result) - assert result == expected, description diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/__init__.py b/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmark_job_result_routes.py b/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmark_job_result_routes.py deleted file mode 100644 index e235b2e5ae..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmark_job_result_routes.py +++ /dev/null @@ -1,115 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for benchmark job result routes configuration.""" - -from fastapi import FastAPI -from fastapi.openapi.utils import get_openapi -from nmp.common.api.utils import tweak_spec -from nmp.evaluator.api.v2.benchmarks.endpoints import _benchmark_jobs_router - - -class TestBenchmarkJobResultRoutes: - """Tests verifying benchmark job result routes are correctly configured.""" - - def test_benchmark_jobs_router_has_typed_result_routes(self): - """Test that benchmark jobs router includes typed routes for aggregate-scores and row-scores.""" - app = FastAPI() - # Use the rebased router which has /jobs prefix removed from paths - app.include_router(_benchmark_jobs_router, prefix="/v2/workspaces/{workspace}/evaluation/benchmark-jobs") - - # Extract all routes from the router - route_paths = {route.path for route in app.routes if hasattr(route, "path")} - - # Verify typed result download routes exist - assert ( - "/v2/workspaces/{workspace}/evaluation/benchmark-jobs/{job}/results/aggregate-scores/download" - in route_paths - ) - assert "/v2/workspaces/{workspace}/evaluation/benchmark-jobs/{job}/results/row-scores/download" in route_paths - - # Verify the fallback wildcard route also exists - assert "/v2/workspaces/{workspace}/evaluation/benchmark-jobs/{job}/results/{name}/download" in route_paths - - def test_benchmark_aggregate_scores_route_returns_json(self): - """Test that aggregate-scores download route is configured for JSON response.""" - app = FastAPI() - app.include_router(_benchmark_jobs_router, prefix="/benchmark-jobs") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - # Find the aggregate-scores download route - agg_scores_path = "/benchmark-jobs/{job}/results/aggregate-scores/download" - assert agg_scores_path in openapi_schema["paths"], f"Path {agg_scores_path} not found in OpenAPI schema" - - route_schema = openapi_schema["paths"][agg_scores_path] - # JSON routes default to application/json content type - assert "get" in route_schema - - def test_benchmark_row_scores_route_returns_jsonl(self): - """Test that row-scores download route is configured for JSONL streaming response.""" - app = FastAPI() - app.include_router(_benchmark_jobs_router, prefix="/benchmark-jobs") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - # Find the row-scores download route - row_scores_path = "/benchmark-jobs/{job}/results/row-scores/download" - assert row_scores_path in openapi_schema["paths"], f"Path {row_scores_path} not found in OpenAPI schema" - - route_schema = openapi_schema["paths"][row_scores_path] - assert "get" in route_schema - - # JSONL routes should have application/jsonl content type - responses = route_schema["get"]["responses"] - assert "200" in responses - content = responses["200"].get("content", {}) - assert "application/jsonl" in content, f"Expected application/jsonl in content, got {content}" - assert content["application/jsonl"]["schema"]["$ref"] == "#/components/schemas/RowScore", content[ - "application/jsonl" - ]["schema"] - - def test_benchmark_row_scores_route_has_limit_parameter(self): - """Test that row-scores download route accepts a limit query parameter.""" - app = FastAPI() - app.include_router(_benchmark_jobs_router, prefix="/benchmark-jobs") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - row_scores_path = "/benchmark-jobs/{job}/results/row-scores/download" - route_schema = openapi_schema["paths"][row_scores_path] - parameters = route_schema["get"].get("parameters", []) - - # Find the limit parameter - limit_params = [p for p in parameters if p.get("name") == "limit"] - assert len(limit_params) == 1, "Expected 'limit' query parameter for JSONL streaming" - assert limit_params[0]["in"] == "query" - - def test_benchmark_row_score_schema_excludes_error(self): - """The derived error summary is hidden from the wire schema.""" - app = FastAPI() - app.include_router(_benchmark_jobs_router, prefix="/benchmark-jobs") - - openapi_schema = tweak_spec( - get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - ) - - row_score_schema = openapi_schema["components"]["schemas"]["RowScore"] - assert "error" not in row_score_schema.get("properties", {}) - assert "error" not in row_score_schema.get("required", []) diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmark_jobs.py b/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmark_jobs.py deleted file mode 100644 index 0b41a29c60..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmark_jobs.py +++ /dev/null @@ -1,479 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import AsyncMock, patch - -import nmp.evaluator.entities as entities -import pytest -from fastapi import FastAPI -from fastapi.testclient import TestClient -from nemo_platform_plugin.jobs.api_factory import _validate_and_resolve_job_output -from nemo_platform_plugin.jobs.image import get_qualified_image -from nmp.common.entities.client import EntityClient -from nmp.evaluator.api.v2.benchmarks.endpoints import ( - get_benchmarks_manager, - platform_job_config_compiler, - router, -) -from nmp.evaluator.api.v2.benchmarks.manager import BenchmarksManager -from nmp.evaluator.api.v2.benchmarks.schemas.benchmarks import BenchmarkRequest -from nmp.evaluator.api.v2.benchmarks.schemas.jobs import ( - BenchmarkJob, - BenchmarkJobAdapter, - BenchmarkOfflineJob, - BenchmarkOnlineAgentJob, - BenchmarkOnlineJob, - SystemBenchmarkOfflineJob, - SystemBenchmarkOnlineJob, -) -from nmp.evaluator.app.evalfactory.bfcl import BFCLHandler -from nmp.evaluator.app.values import FilesetRef, MetricRef -from nmp.evaluator.config import settings - - -def new_test_client(manager: BenchmarksManager, mock_sdk=None) -> TestClient: - """Fast API test client with benchmarks manager""" - - def override_get_benchmarks_manager() -> BenchmarksManager: - return manager - - app = FastAPI() - app.include_router(router, prefix="/apis/evaluation") - app.dependency_overrides[get_benchmarks_manager] = override_get_benchmarks_manager - - from nmp.common.service.dependencies import get_entity_client - - app.dependency_overrides[get_entity_client] = lambda: manager._entity_client - - # Override get_sdk_client if mock_sdk is provided - if mock_sdk is not None: - from nmp.common.service.dependencies import get_sdk_client - - app.dependency_overrides[get_sdk_client] = lambda: mock_sdk - - return TestClient(app) - - -# Mirror the job_route_factory configuration from endpoints.py to derive -# the realistic parameters that create_job passes to the compiler. -_, transformer_func = _validate_and_resolve_job_output( - job_output=None, # not configured in factory - job_input=BenchmarkJob, - input_to_output=None, # not configured in factory -) - - -def _compiler_args( - original_spec: BenchmarkJob, workspace: str, entity_client: EntityClient -) -> tuple[BenchmarkJob, str | None]: - """Derive transformed_spec and job_name as job_route_factory's create_job would.""" - job_name = None - transformed_spec = ( - transformer_func(original_spec, workspace, entity_client, job_name) if transformer_func else original_spec - ) - benchmark_job_types = ( - BenchmarkOfflineJob, - BenchmarkOnlineJob, - BenchmarkOnlineAgentJob, - SystemBenchmarkOfflineJob, - SystemBenchmarkOnlineJob, - ) - assert isinstance(transformed_spec, benchmark_job_types), f"Expected BenchmarkJob, got {type(transformed_spec)}" - return transformed_spec, job_name - - -@pytest.mark.asyncio -async def test_platform_job_config_compiler_system_benchmark(mock_entity_client: EntityClient, mock_sdk): - """High level test for compiling a system benchmark to an EvalFactory job spec""" - original_spec: SystemBenchmarkOnlineJob = BenchmarkJobAdapter.validate_python( - { - "model": { - "url": "http://nim.test/v1/chat/completions", - "name": "my/model", - }, - "benchmark_params": {}, - "benchmark": "system/bfclv3-simple", - "params": { - "limit_samples": 5, - "inference": { - "max_tokens": 100, - }, - }, - } - ) - - benchmarks_manager = BenchmarksManager(mock_entity_client) - benchmark = entities.SystemBenchmark(**BFCLHandler._system_benchmarks[0].model_dump(exclude_none=True)) - await benchmarks_manager._entity_client.create(benchmark) - - with ( - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.dataset_exists", new_callable=AsyncMock - ) as mock_fileset_exists, - patch("nmp.evaluator.app.inference.verify_model_reachable", new_callable=AsyncMock) as mock_verify, - ): - mock_fileset_exists.return_value = True - mock_verify.return_value = {"status": "success"} - - job_spec, _ = _compiler_args(original_spec, "workspace", mock_entity_client) - platform_job_spec = await platform_job_config_compiler( - "workspace", original_spec, job_spec, mock_entity_client, None, mock_sdk - ) - - expected_evalfactory_config_yaml = f"""config: - params: - limit_samples: 5 - max_new_tokens: 100 - max_retries: 3 - parallelism: 8 - task: simple - type: bfclv3 -output_dir: {settings.jobs.results_dir} -target: - api_endpoint: - adapter_config: - interceptors: - - config: - log_failed_requests: true - output_dir: {settings.jobs.results_dir} - name: request_logging - - config: - cache_dir: {settings.jobs.results_dir} - reuse_cached_responses: true - save_requests: true - save_responses: true - name: caching - - name: endpoint - - config: - output_dir: {settings.jobs.results_dir} - name: response_logging - - name: raise_client_errors - - config: - progress_tracking_interval: 1 - progress_tracking_interval_seconds: 60 - progress_tracking_url: ${{NMP_JOBS_URL}}/apis/jobs/v2/workspaces/${{NEMO_JOB_WORKSPACE}}/jobs/${{NEMO_JOB_ID}}/status-details - request_method: PATCH - name: progress_tracking - post_eval_hooks: - - config: - report_types: - - json - name: post_eval_report - - config: - progress_tracking_interval: 1 - progress_tracking_interval_seconds: 60 - progress_tracking_url: ${{NMP_JOBS_URL}}/apis/jobs/v2/workspaces/${{NEMO_JOB_WORKSPACE}}/jobs/${{NEMO_JOB_ID}}/status-details - request_method: PATCH - name: progress_tracking - model_id: my/model - type: chat - url: http://nim.test/v1/chat/completions -""" - expected = { - "steps": [ - { - "name": "evaluation", - "executor": { - "provider": "cpu", - "container": { - "image": settings.evalfactory.bfcl, - "command": [ - "/bin/sh", - "-c", - f'mkdir -p {settings.jobs.configs_dir} && echo "$NEMO_EVAL_FACTORY_JOB_CONFIG" > {settings.jobs.configs_dir}/evaluation_job_file.yaml && exec nemo-evaluator run_eval --run_config {settings.jobs.configs_dir}/evaluation_job_file.yaml --output_dir {settings.jobs.results_dir} --eval_type bfclv3 --model_id my/model --model_url http://nim.test/v1/chat/completions --model_type chat', - ], - }, - }, - "config": { - "target": { - "api_endpoint": { - "url": "http://nim.test/v1/chat/completions", - "model_id": "my/model", - "type": "chat", - "adapter_config": { - "interceptors": [ - { - "name": "request_logging", - "config": { - "output_dir": settings.jobs.results_dir, - "log_failed_requests": True, - }, - }, - { - "name": "caching", - "config": { - "cache_dir": settings.jobs.results_dir, - "reuse_cached_responses": True, - "save_requests": True, - "save_responses": True, - }, - }, - {"name": "endpoint"}, - { - "name": "response_logging", - "config": { - "output_dir": settings.jobs.results_dir, - }, - }, - {"name": "raise_client_errors"}, - { - "name": "progress_tracking", - "config": { - "progress_tracking_interval": 1, - "progress_tracking_interval_seconds": 60, - "progress_tracking_url": "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - "request_method": "PATCH", - }, - }, - ], - "post_eval_hooks": [ - {"name": "post_eval_report", "config": {"report_types": ["json"]}}, - { - "name": "progress_tracking", - "config": { - "progress_tracking_interval": 1, - "progress_tracking_interval_seconds": 60, - "progress_tracking_url": "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - "request_method": "PATCH", - }, - }, - ], - }, - } - }, - "config": { - "type": "bfclv3", - "params": { - "parallelism": 8, - "max_retries": 3, - "limit_samples": 5, - "max_new_tokens": 100, - "task": "simple", - }, - }, - "output_dir": settings.jobs.results_dir, - }, - "environment": [ - {"name": "NEMO_JOB_PERSISTENT_JOB_STORAGE_PATH", "value": settings.jobs.volume_path}, - {"name": "NEMO_EVAL_FACTORY_JOB_CONFIG", "value": expected_evalfactory_config_yaml}, - ], - }, - { - "name": "results", - "config": { - "benchmark": { - "description": "BFCL v3 simple single-turn function calling. Tests basic " - "function call generation.", - "labels": { - "eval_category": "agentic", - "eval_harness": "bfcl", - }, - "name": "bfclv3-simple", - "optional_params": [], - "required_params": [], - "supported_job_types": [ - "online", - ], - }, - "benchmark_params": {}, - "model": { - "format": "nim", - "name": "my/model", - "url": "http://nim.test/v1/chat/completions", - }, - "params": { - "ignore_request_failure": False, - "inference": { - "max_tokens": 100, - }, - "limit_samples": 5, - "max_retries": 3, - "parallelism": 8, - }, - }, - "executor": { - "provider": "cpu", - "container": { - "image": get_qualified_image("nmp-cpu-tasks"), - "entrypoint": ["python", "-m", "nmp.evaluator.tasks.metric_results"], - "command": [ - "--progress-tracking-url", - "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - ], - }, - }, - "environment": [ - {"name": "NEMO_JOB_PERSISTENT_JOB_STORAGE_PATH", "value": settings.jobs.volume_path}, - {"name": "LOG_FORMAT", "value": "json"}, - {"name": "NEMO_EVAL_HARNESS", "value": "bfcl"}, - ], - }, - ] - } - assert platform_job_spec == expected - - -class TestCreateBenchmarkJobEndpoint: - @pytest.mark.asyncio - async def test_create_system_benchmark_unsupported_offline_job(self, benchmarks_manager, mock_sdk): - """Test job spec and serialization of API schemas for system benchmark job.""" - # Populate system benchmark to reference for job. - system_benchmark = entities.SystemBenchmark(**BFCLHandler._system_benchmarks[0].model_dump(exclude_none=True)) - await benchmarks_manager._entity_client.create(system_benchmark) - - job_spec = { - "benchmark": "system/bfclv3-simple", - "dataset": "default/test-dataset", - "params": { - "limit_samples": 5, - }, - } - job = BenchmarkJobAdapter.validate_python(job_spec) - assert isinstance(job, SystemBenchmarkOfflineJob), ( - "unexpected serialization to job type with BenchmarkJobAdapter" - ) - - with patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.dataset_exists", new_callable=AsyncMock - ) as mock_fileset_exists: - mock_fileset_exists.return_value = True - - client = new_test_client(benchmarks_manager, mock_sdk=mock_sdk) - resp = client.post("/apis/evaluation/v2/workspaces/default/benchmark-jobs", json={"spec": job_spec}) - assert resp.status_code == 422, resp.text - assert "benchmark does not support offline evaluations" in resp.text - - @pytest.mark.asyncio - async def test_create_system_benchmark_online_job(self, benchmarks_manager, mock_sdk): - """Test job spec and serialization of API schemas for system benchmark job.""" - # Populate system benchmark to reference for job. - system_benchmark = entities.SystemBenchmark(**BFCLHandler._system_benchmarks[0].model_dump(exclude_none=True)) - await benchmarks_manager._entity_client.create(system_benchmark) - - job_spec = { - "benchmark": "system/bfclv3-simple", - "model": { - "url": "http://nim.test/v1/chat/completions", - "name": "my/model", - }, - "params": { - "limit_samples": 5, - "inference": { - "max_tokens": 100, - }, - }, - } - job = BenchmarkJobAdapter.validate_python(job_spec) - assert isinstance(job, SystemBenchmarkOnlineJob), ( - "unexpected serialization to job type with BenchmarkJobAdapter" - ) - - with patch("nmp.evaluator.app.inference.verify_model_reachable", new_callable=AsyncMock) as mock_verify: - mock_verify.return_value = {"status": "success"} - - client = new_test_client(benchmarks_manager, mock_sdk=mock_sdk) - resp = client.post("/apis/evaluation/v2/workspaces/default/benchmark-jobs", json={"spec": job_spec}) - assert resp.status_code == 201, resp.text - - job_resp_spec = BenchmarkJobAdapter.validate_python(resp.json().get("spec")) - assert isinstance(job_resp_spec, SystemBenchmarkOnlineJob), ( - "unexpected serialization to job type with BenchmarkJobAdapter" - ) - - @pytest.mark.asyncio - async def test_create_custom_benchmark_offline_job(self, benchmarks_manager, mock_sdk): - """Test job spec and serialization of API schemas for custom benchmark job.""" - metric = entities.BLEUMetric( - name="custom-metric", - workspace="default", - references=["{{reference}}"], - ) - await benchmarks_manager._entity_client.create(metric) - await benchmarks_manager.create( - "default", - BenchmarkRequest( - name="custom-benchmark", - description=None, - metrics=[MetricRef(root="default/custom-metric")], - dataset=FilesetRef(root="default/test-dataset"), - ), - mock_sdk, - ) - - job_spec = { - "benchmark": "default/custom-benchmark", - "params": { - "limit_samples": 5, - }, - } - job = BenchmarkJobAdapter.validate_python(job_spec) - assert isinstance(job, BenchmarkOfflineJob), "unexpected serialization to job type with BenchmarkJobAdapter" - - with patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.dataset_exists", new_callable=AsyncMock - ) as mock_fileset_exists: - mock_fileset_exists.return_value = True - - client = new_test_client(benchmarks_manager, mock_sdk=mock_sdk) - resp = client.post("/apis/evaluation/v2/workspaces/default/benchmark-jobs", json={"spec": job_spec}) - assert resp.status_code == 201, resp.text - - job_resp_spec = BenchmarkJobAdapter.validate_python(resp.json().get("spec")) - assert isinstance(job_resp_spec, BenchmarkOfflineJob), ( - "unexpected serialization to job type with BenchmarkJobAdapter" - ) - - @pytest.mark.asyncio - async def test_create_custom_benchmark_online_job(self, benchmarks_manager, mock_sdk): - """Test job spec and serialization of API schemas for custom benchmark job.""" - metric = entities.BLEUMetric( - name="custom-metric", - workspace="default", - references=["{{reference}}"], - ) - await benchmarks_manager._entity_client.create(metric) - await benchmarks_manager.create( - "default", - BenchmarkRequest( - name="custom-benchmark", - description=None, - metrics=[MetricRef(root="default/custom-metric")], - dataset=FilesetRef(root="default/test-dataset"), - ), - mock_sdk, - ) - - job_spec = { - "benchmark": "default/custom-benchmark", - "model": { - "url": "http://nim.test/v1/chat/completions", - "name": "my/model", - }, - "prompt_template": "prompt_template", - "params": { - "limit_samples": 5, - "inference": { - "max_tokens": 100, - }, - }, - } - job = BenchmarkJobAdapter.validate_python(job_spec) - assert isinstance(job, BenchmarkOnlineJob), "unexpected serialization to job type with BenchmarkJobAdapter" - - with ( - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.dataset_exists", new_callable=AsyncMock - ) as mock_fileset_exists, - patch("nmp.evaluator.app.inference.verify_model_reachable", new_callable=AsyncMock) as mock_verify, - ): - mock_fileset_exists.return_value = True - mock_verify.return_value = {"status": "success"} - - client = new_test_client(benchmarks_manager, mock_sdk=mock_sdk) - resp = client.post("/apis/evaluation/v2/workspaces/default/benchmark-jobs", json={"spec": job_spec}) - assert resp.status_code == 201, resp.text - - job_resp_spec = BenchmarkJobAdapter.validate_python(resp.json().get("spec")) - assert isinstance(job_resp_spec, BenchmarkOnlineJob), ( - "unexpected serialization to job type with BenchmarkJobAdapter" - ) diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmarks_filter.py b/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmarks_filter.py deleted file mode 100644 index 86134b647b..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_benchmarks_filter.py +++ /dev/null @@ -1,368 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for benchmarks filter functionality.""" - -import json -from datetime import datetime -from typing import Generator - -import nmp.evaluator.entities as entities -import pytest -import pytest_asyncio -from fastapi import FastAPI -from fastapi.testclient import TestClient -from nemo_evaluator_sdk.enums import MetricType, ModelFormat -from nemo_evaluator_sdk.values import Model, Rubric, RubricScore -from nmp.common.entities.client import EntityClient -from nmp.evaluator.api.v2.benchmarks.endpoints import get_benchmarks_manager, router -from nmp.evaluator.api.v2.benchmarks.manager import BenchmarksManager -from nmp.evaluator.api.v2.benchmarks.schemas.benchmarks import BenchmarkRequest -from nmp.evaluator.app.values import FilesetRef, MetricRef -from nmp.testing import create_test_client - - -@pytest.fixture -def mock_entity_client() -> Generator[EntityClient, None, None]: - workspaces = ["default", "system"] - with create_test_client(client_type=EntityClient, workspaces=workspaces) as client: - yield client - - -@pytest.fixture -def benchmarks_manager(mock_entity_client) -> BenchmarksManager: - return BenchmarksManager(mock_entity_client) - - -@pytest.fixture -def sample_metric_entity() -> entities.Metric: - entity = entities.LLMJudgeMetric( - name="test-metric", - workspace="default", - type=MetricType.LLM_JUDGE, - description="Test metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate the response: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality of response", - rubric=[ - Rubric(label="good", description="Good response", value=1), - Rubric(label="bad", description="Bad response", value=0), - ], - ) - ], - ) - entity._id = "metric-123" - entity._created_at = datetime(2024, 1, 1, 0, 0, 0) - entity._updated_at = datetime(2024, 1, 1, 0, 0, 0) - return entity - - -def new_test_client(manager: BenchmarksManager) -> TestClient: - def override_get_benchmarks_manager() -> BenchmarksManager: - return manager - - app = FastAPI() - app.include_router(router, prefix="/apis/evaluation") - app.dependency_overrides[get_benchmarks_manager] = override_get_benchmarks_manager - return TestClient(app) - - -@pytest_asyncio.fixture -async def create_sample_benchmarks(benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity): - """Create metrics and benchmarks for filter tests.""" - await mock_entity_client.create(sample_metric_entity) - - metric1 = entities.StringCheckMetric( - name="metric-1", - workspace="default", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - await mock_entity_client.create(metric1) - - await benchmarks_manager.create( - "default", - BenchmarkRequest( - name="benchmark-alpha", - description="First benchmark", - metrics=[MetricRef(root="default/test-metric")], - dataset=FilesetRef(root="default/dataset-a"), - labels={"label1": "value1"}, - ), - mock_sdk, - ) - await benchmarks_manager.create( - "default", - BenchmarkRequest( - name="benchmark-beta", - description="Second benchmark", - metrics=[MetricRef(root="default/metric-1")], - dataset=FilesetRef(root="default/dataset-b"), - labels={"label2": "value2"}, - ), - mock_sdk, - ) - - -class TestBenchmarksFilterEndpoints: - """Integration tests for benchmarks filter via HTTP endpoints.""" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_dataset(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test filter by dataset.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[dataset]=default/dataset-a") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test advanced JSON filter.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps({"name": {"$like": "beta"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-beta" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json_combined(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test JSON filter combining dataset and name.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps( - {"$and": [{"dataset": {"$eq": "default/dataset-a"}}, {"name": {"$like": "benchmark"}}]} - ) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_invalid_json(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test invalid JSON filter returns 400.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter={invalid-json}") - assert resp.status_code == 400 - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_bracket_like(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test bracket filter with $like operator.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[name][$like]=beta") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-beta" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_bracket_eq(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test bracket filter with $eq operator.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[name][$eq]=benchmark-alpha") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_bracket_no_operator(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test bracket filter without operator defaults to $eq.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[name]=benchmark-alpha") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_bracket_combined(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test bracket filter combining dataset and name.""" - client = new_test_client(benchmarks_manager) - - resp = client.get( - "/apis/evaluation/v2/workspaces/default/benchmarks?filter[dataset]=default/dataset-a&filter[name][$like]=benchmark" - ) - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_invalid_field(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test invalid filter field returns 400.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[nonexistent]=value") - assert resp.status_code == 400 - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_bracket_label_field(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test bracket filter can filter labels via filter[data.labels.KEY].""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[data.labels.label1]=value1") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_bracket_label_field_no_prefix( - self, benchmarks_manager, create_sample_benchmarks - ): # noqa: ARG002 - """AIRCORE-389: the clean filter[labels.KEY] path returns the same rows as filter[data.labels.KEY].""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[labels.label1]=value1") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json_label_eq(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test JSON filter on data.labels with $eq operator.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps({"data.labels.label1": {"$eq": "value1"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json_label_no_match(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test JSON filter on data.labels returns empty when no match.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps({"data.labels.label1": {"$eq": "nonexistent"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 0 - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json_label_or(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test JSON filter with $or across different labels.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps( - { - "$or": [ - {"data.labels.label1": {"$eq": "value1"}}, - {"data.labels.label2": {"$eq": "value2"}}, - ] - } - ) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 2 - names = {b["name"] for b in data["data"]} - assert names == {"benchmark-alpha", "benchmark-beta"} - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json_label_with_name(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test JSON filter combining label and name conditions.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps( - { - "$and": [ - {"data.labels.label1": {"$eq": "value1"}}, - {"name": {"$like": "alpha"}}, - ] - } - ) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json_description_eq(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test JSON filter on description with $eq operator.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps({"description": {"$eq": "First benchmark"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-alpha" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json_description_like(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test JSON filter on description with $like operator.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps({"description": {"$like": "Second"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-beta" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_json_name_eq(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test JSON filter on name with $eq operator.""" - client = new_test_client(benchmarks_manager) - - filter_json = json.dumps({"name": {"$eq": "benchmark-beta"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?filter={filter_json}") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert len(data["data"]) == 1 - assert data["data"][0]["name"] == "benchmark-beta" - - @pytest.mark.asyncio - async def test_list_benchmarks_rejects_unknown_top_level_query_param( - self, benchmarks_manager, create_sample_benchmarks - ): # noqa: ARG002 - """Test unknown top-level query params are rejected with 400.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?labels=eval_harness.bfcl") - assert resp.status_code == 400, resp.json() - detail = resp.json().get("detail", "") - assert "unsupported query parameter" in detail.lower() - assert "labels" in detail.lower() - - @pytest.mark.asyncio - async def test_list_benchmarks_search_param_rejected(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test that search query param is no longer accepted.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?search[name]=test") - assert resp.status_code == 400 - - @pytest.mark.asyncio - async def test_list_benchmarks_no_search_in_response(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test that response does not include search field.""" - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks") - assert resp.status_code == 200, resp.json() - data = resp.json() - assert "search" not in data diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_endpoints.py b/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_endpoints.py deleted file mode 100644 index 15c6ab4231..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_endpoints.py +++ /dev/null @@ -1,829 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from datetime import datetime - -import nmp.evaluator.entities as entities -import pytest -import pytest_asyncio -from fastapi import FastAPI, HTTPException -from fastapi.testclient import TestClient -from nemo_evaluator_sdk.enums import MetricType, ModelFormat -from nemo_evaluator_sdk.values import Rubric, RubricScore -from nmp.evaluator.api.v2.benchmarks.endpoints import ( - create_benchmark, - delete_benchmark, - get_benchmark, - get_benchmarks_manager, - router, -) -from nmp.evaluator.api.v2.benchmarks.manager import BenchmarksManager -from nmp.evaluator.api.v2.benchmarks.schemas.benchmarks import ( - BenchmarkJobResult, - BenchmarkJobResultsListResponse, - BenchmarkRequest, - BenchmarksListResponse, -) -from nmp.evaluator.api.v2.benchmarks.schemas.jobs import BenchmarkJobAdapter -from nmp.evaluator.api.v2.common.inline_models import Model -from nmp.evaluator.app.values import ( - BenchmarkEvaluationResult, - BenchmarkRef, - FilesetRef, - MetricRef, - ModelRef, -) -from pydantic import ValidationError - - -@pytest.fixture -def sample_metric_entity() -> entities.Metric: - """Sample LLMJudgeMetric entity for testing benchmarks.""" - entity = entities.LLMJudgeMetric( - name="test-metric", - workspace="default", - type=MetricType.LLM_JUDGE, - description="Test metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate the response: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality of response", - rubric=[ - Rubric(label="good", description="Good response", value=1), - Rubric(label="bad", description="Bad response", value=0), - ], - ) - ], - ) - entity._id = "metric-123" - entity._created_at = datetime(2024, 1, 1, 0, 0, 0) - entity._updated_at = datetime(2024, 1, 1, 0, 0, 0) - return entity - - -@pytest.fixture -def sample_benchmark_request(): - """Sample BenchmarkRequest for testing.""" - return BenchmarkRequest( - name="test-benchmark", - description="Test benchmark description", - metrics=[MetricRef(root="default/test-metric")], - dataset=FilesetRef(root="default/test-dataset"), - ) - - -def test_benchmark_job_params_reject_aggregate_fields() -> None: - with pytest.raises(ValidationError, match="Extra inputs are not permitted"): - BenchmarkJobAdapter.validate_python( - { - "benchmark": "default/test-benchmark", - "params": {"aggregate_fields": ["mean"]}, - } - ) - - -@pytest_asyncio.fixture -async def create_sample_benchmarks( - benchmarks_manager: BenchmarksManager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request -): - """Create 3 metrics and 2 benchmarks""" - # Benchmark "default/test-benchmark" - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Benchmark "default/test-benchmark2" - metric1 = entities.StringCheckMetric( - name="metric-1", - workspace="default", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - metric2 = entities.BLEUMetric( - name="metric-2", - workspace="default", - references=["{{reference}}"], - ) - await mock_entity_client.create(metric1) - await mock_entity_client.create(metric2) - try: - await benchmarks_manager.create( - "default", - BenchmarkRequest( - name="test-benchmark2", - description="Test benchmark2 description", - metrics=[MetricRef(root="default/metric-1"), MetricRef(root="default/metric-2")], - dataset=FilesetRef(root="default/test-dataset2"), - labels={"label1": "value1"}, - ), - mock_sdk, - ) - except Exception as e: - print(e) - raise - - -@pytest_asyncio.fixture -async def create_sample_benchmark_job_results(mock_entity_client): - await mock_entity_client.create( - entities.BenchmarkJobResult( - name="result1", - workspace="default", - benchmark=BenchmarkRef(root="default/benchmark"), - metrics=[MetricRef(root="default/metric1"), MetricRef(root="default/metric3")], - dataset=FilesetRef(root="default/dataset"), - results=BenchmarkEvaluationResult.model_validate( - { - "results": [ - { - "scores": [ - { - "name": "accuracy", - "mean": 0.85, - "count": 100, - "nan_count": 0, - "std_dev": 0.2, - "min": 0.1, - "max": 1.0, - } - ] - } - ] - } - ).results, - ) - ) - await mock_entity_client.create( - entities.BenchmarkJobResult( - name="result2", - workspace="default", - benchmark=BenchmarkRef(root="default/benchmark2"), - metrics=[MetricRef(root="default/metric2")], - dataset=FilesetRef(root="default/dataset2"), - results=BenchmarkEvaluationResult.model_validate( - {"results": [{"scores": [{"name": "accuracy", "mean": 0.2, "count": 100, "nan_count": 0, "min": 0.0}]}]} - ).results, - ) - ) - await mock_entity_client.create( - entities.BenchmarkJobResult( - name="result3", - workspace="default", - benchmark=BenchmarkRef(root="default/benchmark"), - metrics=[MetricRef(root="default/metric1"), MetricRef(root="default/metric3")], - dataset=FilesetRef(root="default/dataset"), - model=ModelRef(root="default/model"), - labels={"label": "value"}, - results=BenchmarkEvaluationResult.model_validate( - { - "results": [ - { - "scores": [ - {"name": "accuracy", "mean": 0.1, "count": 100, "nan_count": 0, "min": 0.1, "max": 0.1} - ] - } - ] - } - ).results, - ) - ) - - -def new_test_client(manager: BenchmarksManager) -> TestClient: - """Fast API test client with benchmarks manager""" - - def override_get_benchmarks_manager() -> BenchmarksManager: - return manager - - app = FastAPI() - app.include_router(router, prefix="/apis/evaluation") - app.dependency_overrides[get_benchmarks_manager] = override_get_benchmarks_manager - return TestClient(app) - - -class TestCreateBenchmarkEndpoint: - """Tests for create_benchmark endpoint.""" - - @pytest.mark.asyncio - async def test_create_benchmark_successfully( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test create_benchmark endpoint successfully creates a benchmark.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - - # Act - result = await create_benchmark( - workspace="default", - benchmark=sample_benchmark_request, - benchmarks_manager=benchmarks_manager, - sdk=mock_sdk, - ) - - # Assert - assert result is not None - assert result.name == "test-benchmark" - assert result.workspace == "default" - - @pytest.mark.asyncio - async def test_create_benchmark_rejects_system_workspace( - self, benchmarks_manager, mock_sdk, sample_benchmark_request - ): - """Test create_benchmark rejects requests to system workspace.""" - with pytest.raises(HTTPException) as exc_info: - await create_benchmark( - workspace="system", - benchmark=sample_benchmark_request, - benchmarks_manager=benchmarks_manager, - sdk=mock_sdk, - ) - - err = exc_info.value - assert err.status_code == 403 - assert isinstance(err.detail, str) - assert "system" in err.detail.lower() - assert "reserved" in err.detail.lower() - - @pytest.mark.asyncio - async def test_create_benchmark_returns_404_when_metric_not_found( - self, benchmarks_manager, mock_sdk, sample_benchmark_request - ): - """Test create_benchmark returns 404 when referenced metric not found.""" - with pytest.raises(HTTPException) as exc_info: - await create_benchmark( - workspace="default", - benchmark=sample_benchmark_request, - benchmarks_manager=benchmarks_manager, - sdk=mock_sdk, - ) - - err = exc_info.value - assert err.status_code == 404 - assert isinstance(err.detail, str) - assert "test-metric" in err.detail - - @pytest.mark.asyncio - async def test_create_benchmark_returns_409_when_name_already_exists( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test create_benchmark returns 409 when benchmark name already exists.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await create_benchmark( - workspace="default", - benchmark=sample_benchmark_request, - benchmarks_manager=benchmarks_manager, - sdk=mock_sdk, - ) - - # Act - with pytest.raises(HTTPException) as exc_info: - await create_benchmark( - workspace="default", - benchmark=sample_benchmark_request, - benchmarks_manager=benchmarks_manager, - sdk=mock_sdk, - ) - - # Assert - err = exc_info.value - assert err.status_code == 409 - assert isinstance(err.detail, str) - assert "test-benchmark" in err.detail - - @pytest.mark.asyncio - async def test_create_benchmark_with_extended_response( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test create_benchmark returns extended response when requested.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - - # Act - result = await create_benchmark( - workspace="default", - benchmark=sample_benchmark_request, - benchmarks_manager=benchmarks_manager, - sdk=mock_sdk, - extended_response=True, - ) - - # Assert - assert result is not None - assert result.name == "test-benchmark" - # Extended response should have full metric objects - assert len(result.metrics) == 1 - - def test_create_benchmark_rejects_duplicate_metric_refs(self): - with pytest.raises(ValidationError): - BenchmarkRequest( - name="duplicate-metrics", - description="Benchmark with duplicate metric refs", - metrics=[MetricRef(root="default/test-metric"), MetricRef(root="default/test-metric")], - dataset=FilesetRef(root="default/test-dataset"), - ) - - -class TestGetBenchmarkEndpoint: - """Tests for get_benchmark endpoint.""" - - @pytest.mark.asyncio - async def test_get_benchmark_successfully( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test get_benchmark endpoint returns benchmark when it exists.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Act - result = await get_benchmark( - workspace="default", - name="test-benchmark", - benchmarks_manager=benchmarks_manager, - ) - - # Assert - assert result is not None - assert result.name == "test-benchmark" - assert result.workspace == "default" - - @pytest.mark.asyncio - async def test_get_benchmark_returns_404_when_not_found(self, benchmarks_manager): - """Test get_benchmark returns 404 when benchmark not found.""" - with pytest.raises(HTTPException) as exc_info: - await get_benchmark( - workspace="default", - name="nonexistent", - benchmarks_manager=benchmarks_manager, - ) - - err = exc_info.value - assert err.status_code == 404 - assert isinstance(err.detail, str) - assert "nonexistent" in err.detail - - @pytest.mark.asyncio - async def test_get_benchmark_with_extended_response( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test get_benchmark returns extended response when requested.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Act - result = await get_benchmark( - workspace="default", - name="test-benchmark", - benchmarks_manager=benchmarks_manager, - extended_response=True, - ) - - # Assert - assert result is not None - assert result.name == "test-benchmark" - - -class TestListBenchmarksEndpoint: - """Tests for list_benchmarks endpoint.""" - - @pytest.mark.asyncio - async def test_list_benchmarks_returns_empty_page(self, benchmarks_manager): - """Test list_benchmarks returns empty page when no benchmarks exist.""" - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks") - assert resp.status_code == 200, resp.json() - - result = BenchmarksListResponse.model_validate(resp.json()) - assert result.pagination is not None - - assert result.data == [] - assert result.pagination.total_results == 0 - assert result.pagination.page == 1 - - @pytest.mark.asyncio - async def test_list_benchmarks_returns_benchmarks(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test list_benchmarks returns all benchmarks in workspace.""" - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks") - assert resp.status_code == 200, resp.json() - - result = BenchmarksListResponse.model_validate(resp.json()) - assert result.pagination is not None - - # Assert - assert len(result.data) == 2 - assert result.pagination.total_results == 2 - assert result.pagination.page == 1 - names = {b.name for b in result.data} - assert names == {"test-benchmark", "test-benchmark2"} - - # Verify metric is a reference - for b in result.data: - if hasattr(b, "metrics"): - assert isinstance(b.metrics, list) - for metric in b.metrics: - assert isinstance(metric, MetricRef) - - @pytest.mark.asyncio - async def test_list_benchmarks_with_extended_response(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test list_benchmarks returns extended response when requested.""" - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?extended_response=true") - assert resp.status_code == 200, resp.json() - - result = BenchmarksListResponse.model_validate(resp.json()) - assert result.pagination is not None - - # Assert - assert len(result.data) == 2 - assert result.pagination.total_results == 2 - assert result.pagination.page == 1 - names = {b.name for b in result.data} - assert names == {"test-benchmark", "test-benchmark2"} - - # Verify metric is not a reference - for b in result.data: - if hasattr(b, "metrics"): - metrics = b.metrics - assert isinstance(metrics, list) - for metric in metrics: - assert not isinstance(metric, MetricRef) - - @pytest.mark.asyncio - async def test_list_benchmarks_sort_pagination(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test list_benchmarks returns sorted response.""" - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?page_size=5&sort=name") - assert resp.status_code == 200, resp.json() - - result = BenchmarksListResponse.model_validate(resp.json()) - assert result.pagination is not None - - # Assert - assert len(result.data) == 2 - assert result.pagination.total_results == 2 - assert result.pagination.page == 1 - assert result.pagination.page_size == 5 - names = [b.name for b in result.data] - assert names == ["test-benchmark", "test-benchmark2"] - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_dataset(self, benchmarks_manager, create_sample_benchmarks): # noqa: ARG002 - """Test list_benchmarks returns filtered by dataset.""" - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[dataset]=default/test-dataset2") - assert resp.status_code == 200, resp.json() - - result = BenchmarksListResponse.model_validate(resp.json()) - assert result.pagination is not None - - assert len(result.data) == 1 - assert result.pagination.total_results == 1 - assert result.filter == {"dataset": {"$eq": "default/test-dataset2"}} - assert result.data[0].name == "test-benchmark2" - - @pytest.mark.asyncio - async def test_list_benchmarks_filter_label(self, benchmarks_manager, create_sample_benchmarks): - """Test list_benchmarks returns filtered by label.""" - client = new_test_client(benchmarks_manager) - - # Filter with brackets - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmarks?filter[data.labels.label1]=value1") - assert resp.status_code == 200, resp.json() - - result_bracket = BenchmarksListResponse.model_validate(resp.json()) - assert result_bracket.pagination is not None - - assert len(result_bracket.data) == 1 - assert result_bracket.pagination.total_results == 1 - assert result_bracket.data[0].name == "test-benchmark2" - - # Filter with json - filter_param = 'filter={"data.labels.label1": {"$eq": "value1"}}' - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmarks?{filter_param}") - assert resp.status_code == 200, resp.json() - - result_json = BenchmarksListResponse.model_validate(resp.json()) - assert result_bracket.data == result_json.data - assert result_bracket.pagination == result_json.pagination - - -class TestDeleteBenchmarkEndpoint: - """Tests for delete_benchmark endpoint.""" - - @pytest.mark.asyncio - async def test_delete_benchmark_successfully( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test delete_benchmark endpoint successfully deletes a benchmark.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Act - result = await delete_benchmark( - workspace="default", - name="test-benchmark", - benchmarks_manager=benchmarks_manager, - ) - - # Assert - assert result.message == "Resource deleted successfully" - - # Verify it's deleted - with pytest.raises(HTTPException) as exc_info: - await get_benchmark( - workspace="default", - name="test-benchmark", - benchmarks_manager=benchmarks_manager, - ) - assert exc_info.value.status_code == 404 - - @pytest.mark.asyncio - async def test_delete_benchmark_rejects_system_workspace(self, benchmarks_manager): - """Test delete_benchmark rejects requests to system workspace.""" - with pytest.raises(HTTPException) as exc_info: - await delete_benchmark( - workspace="system", - name="some-benchmark", - benchmarks_manager=benchmarks_manager, - ) - - err = exc_info.value - assert err.status_code == 403 - assert isinstance(err.detail, str) - assert "system" in err.detail.lower() - assert "reserved" in err.detail.lower() - - @pytest.mark.asyncio - async def test_delete_benchmark_returns_404_when_not_found(self, benchmarks_manager): - """Test delete_benchmark returns 404 when benchmark not found.""" - with pytest.raises(HTTPException) as exc_info: - await delete_benchmark( - workspace="default", - name="nonexistent", - benchmarks_manager=benchmarks_manager, - ) - - err = exc_info.value - assert err.status_code == 404 - assert isinstance(err.detail, str) - assert "nonexistent" in err.detail - - -class TestGetBenchmarkJobResultsEndpoint: - @pytest.mark.asyncio - async def test_get_404(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results/dne") - assert resp.status_code == 404, resp.json() - - @pytest.mark.asyncio - async def test_get(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results/result1") - assert resp.status_code == 200, resp.text - - # Verify entity attrs - raw_result = resp.json() - assert "created_at" in raw_result, "missing entity private attributes" - - # doesn't serialize entity attrs, SDK types to though - result = BenchmarkJobResult.model_validate(raw_result) - assert result.name == "result1" - assert result.workspace == "default" - assert result.benchmark is not None - assert result.metrics is not None - assert result.dataset is not None - assert len(result.results) == 1 - assert len(result.results[0].scores) == 1 - assert result.results[0].scores[0].name == "accuracy" - assert result.results[0].scores[0].mean == 0.85 - - @pytest.mark.asyncio - async def test_get_aggregate_fields_invalid(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results/result1?aggregate_fields=dne") - assert resp.status_code == 422, resp.text - - @pytest.mark.asyncio - async def test_get_aggregate_fields(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results/result1") - assert resp.status_code == 200, resp.text - assert "count" in resp.text, "always expect count" - assert "std_dev" in resp.text, "expected for default" - assert "min" in resp.text, "expected for default" - assert "max" in resp.text, "expected for default" - - resp = client.get( - "/apis/evaluation/v2/workspaces/default/benchmark-job-results/result1?aggregate_fields=std_dev" - ) - assert resp.status_code == 200, resp.text - assert "count" in resp.text, "always expect count" - assert "std_dev" in resp.text, "included in filter" - assert "min" not in resp.text, "excluded from filter" - assert "max" not in resp.text, "excluded from filter" - - resp = client.get( - "/apis/evaluation/v2/workspaces/default/benchmark-job-results/result1?aggregate_fields=std_dev,min" - ) - assert resp.status_code == 200, resp.text - - assert "count" in resp.text, "always expect count" - assert "std_dev" in resp.text, "included in filter" - assert "min" in resp.text, "included in filter" - assert "max" not in resp.text, "excluded from filter" - - -class TestDeleteBenchmarkJobResultsEndpoint: - @pytest.mark.asyncio - async def test_delete_404(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.delete("/apis/evaluation/v2/workspaces/default/benchmark-job-results/dne") - assert resp.status_code == 404, resp.json() - - @pytest.mark.asyncio - async def test_delete(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results/result1") - assert resp.status_code == 200 - - resp = client.delete("/apis/evaluation/v2/workspaces/default/benchmark-job-results/result1") - assert resp.status_code == 200, resp.json() - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results/result1") - assert resp.status_code == 404, "expected entity to be deleted" - - -class TestListBenchmarkJobResultsEndpoint: - @pytest.mark.asyncio - async def test_list(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results") - assert resp.status_code == 200, resp.json() - - results = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert len(results.data) == 3 - assert results.pagination is not None - assert results.pagination.total_results == 3 - - # Verify contains all aggregate fields by default - assert "std_dev" in resp.text - assert "min" in resp.text - assert "max" in resp.text - - @pytest.mark.asyncio - async def test_list_filter_empty(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results?filter[model]=ws/dne") - assert resp.status_code == 200, resp.json() - - results = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert len(results.data) == 0 - assert results.pagination is not None - assert results.pagination.total_results == 0 - - @pytest.mark.asyncio - async def test_list_filter_benchmark(self, benchmarks_manager, create_sample_benchmark_job_results): - filter = "filter[benchmark]=default/benchmark" - client = new_test_client(benchmarks_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmark-job-results?{filter}") - assert resp.status_code == 200, resp.json() - - results = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 2 - assert results.pagination.total_results == 2 - for result in results.data: - assert result.name in ["result1", "result3"] - assert result.benchmark.root == "default/benchmark" - - # Filter and Sort - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmark-job-results?{filter}&sort=name") - assert resp.status_code == 200, resp.json() - results = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert results.data[0].name == "result1" - assert results.data[1].name == "result3" - - @pytest.mark.asyncio - async def test_list_filter_dataset(self, benchmarks_manager, create_sample_benchmark_job_results): - filter = "filter[dataset]=default/dataset2" - client = new_test_client(benchmarks_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmark-job-results?{filter}") - assert resp.status_code == 200, resp.json() - - results = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 1 - assert results.pagination.total_results == 1 - assert results.data[0].name == "result2" - assert results.data[0].benchmark.root == "default/benchmark2" - assert results.data[0].dataset is not None - assert results.data[0].dataset.root == "default/dataset2" - - @pytest.mark.asyncio - async def test_list_filter_model(self, benchmarks_manager, create_sample_benchmark_job_results): - filter = "filter[model]=default/model" - client = new_test_client(benchmarks_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmark-job-results?{filter}") - assert resp.status_code == 200, resp.json() - - results = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 1 - assert results.pagination.total_results == 1 - assert results.data[0].name == "result3" - assert results.data[0].model is not None - assert results.data[0].model.root == "default/model" - - @pytest.mark.asyncio - async def test_list_filter_multiple(self, benchmarks_manager, create_sample_benchmark_job_results): - filter = "filter[benchmark]=default/benchmark&filter[model]=default/model" - client = new_test_client(benchmarks_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmark-job-results?{filter}") - assert resp.status_code == 200, resp.json() - - results = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 1 - assert results.pagination.total_results == 1 - assert results.data[0].name == "result3" - assert results.data[0].benchmark.root == "default/benchmark" - assert results.data[0].model is not None - assert results.data[0].model.root == "default/model" - - @pytest.mark.asyncio - async def test_list_filter_metric(self, benchmarks_manager, create_sample_benchmark_job_results): - filter_param = "filter[metrics][$like]=default/metric2" - client = new_test_client(benchmarks_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmark-job-results?{filter_param}") - assert resp.status_code == 200, resp.json() - - results = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 1 - assert results.pagination.total_results == 1 - assert results.data[0].name == "result2" - assert results.data[0].benchmark.root == "default/benchmark2" - assert results.data[0].metrics is not None - assert MetricRef("default/metric2") in results.data[0].metrics - - @pytest.mark.asyncio - async def test_list_filter_label(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - - # Filter with brackets - filter_param = "filter[data.labels.label]=value" - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmark-job-results?{filter_param}") - assert resp.status_code == 200, resp.json() - - results_bracket = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert results_bracket.pagination is not None - assert len(results_bracket.data) == 1 - assert results_bracket.pagination.total_results == 1 - assert results_bracket.data[0].name == "result3" - assert "label" in results_bracket.data[0].labels - assert results_bracket.data[0].labels["label"] == "value" - - # Filter with json - filter_param = 'filter={"data.labels.label": {"$eq": "value"}}' - resp = client.get(f"/apis/evaluation/v2/workspaces/default/benchmark-job-results?{filter_param}") - assert resp.status_code == 200, resp.json() - - result_json = BenchmarkJobResultsListResponse.model_validate(resp.json()) - assert results_bracket.data == result_json.data - assert results_bracket.pagination == result_json.pagination - - @pytest.mark.asyncio - async def test_list_aggregate_fields_invalid(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results?aggregate_fields=dne") - assert resp.status_code == 422, resp.text - - @pytest.mark.asyncio - async def test_list_aggregate_fields(self, benchmarks_manager, create_sample_benchmark_job_results): - client = new_test_client(benchmarks_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results?aggregate_fields=std_dev") - assert resp.status_code == 200, resp.text - assert "count" in resp.text, "always expect count" - assert "std_dev" in resp.text, "included in filter" - assert "min" not in resp.text, "excluded from filter" - assert "max" not in resp.text, "excluded from filter" - - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-job-results?aggregate_fields=std_dev,min") - assert resp.status_code == 200, resp.text - - assert "count" in resp.text, "always expect count" - assert "std_dev" in resp.text, "included in filter" - assert "min" in resp.text, "included in filter" - assert "max" not in resp.text, "excluded from filter" diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_service.py b/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_service.py deleted file mode 100644 index 10e1722d23..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/benchmarks/test_service.py +++ /dev/null @@ -1,445 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from datetime import datetime -from typing import Generator - -import nmp.evaluator.entities as entities -import pytest -from nemo_evaluator_sdk.enums import MetricType, ModelFormat -from nemo_evaluator_sdk.values import Model, Rubric, RubricScore -from nmp.common.entities.client import EntityClient -from nmp.evaluator.api.v2.benchmarks.manager import ( - BenchmarkCreationError, - BenchmarkDeletionError, - BenchmarkRetrievalError, - BenchmarksManager, -) -from nmp.evaluator.api.v2.benchmarks.schemas.benchmarks import ( - Benchmark, - BenchmarkRequest, - ExtendedBenchmark, -) -from nmp.evaluator.app.values import FilesetRef, MetricRef -from nmp.testing import create_test_client - - -@pytest.fixture -def mock_entity_client() -> Generator[EntityClient, None, None]: - """Real EntityClient backed by in-memory storage for integration-style testing.""" - workspaces = ["default", "workspace1", "workspace2", "production"] - with create_test_client(client_type=EntityClient, workspaces=workspaces) as client: - yield client - - -@pytest.fixture -def benchmarks_manager(mock_entity_client) -> BenchmarksManager: - """BenchmarksManager instance with mocked EntityClient.""" - return BenchmarksManager(mock_entity_client) - - -@pytest.fixture -def sample_metric_entity(): - """Sample LLMJudgeMetric entity for testing benchmarks.""" - entity = entities.LLMJudgeMetric( - name="test-metric", - workspace="default", - type=MetricType.LLM_JUDGE, - description="Test metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate the response: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality of response", - rubric=[ - Rubric(label="good", description="Good response", value=1), - Rubric(label="bad", description="Bad response", value=0), - ], - ) - ], - ) - entity._id = "metric-123" - entity._created_at = datetime(2024, 1, 1, 0, 0, 0) - entity._updated_at = datetime(2024, 1, 1, 0, 0, 0) - return entity - - -@pytest.fixture -def sample_benchmark_request(): - """Sample BenchmarkRequest for testing.""" - return BenchmarkRequest( - name="test-benchmark", - description="Test benchmark description", - metrics=[MetricRef(root="default/test-metric")], - dataset=FilesetRef(root="default/test-dataset"), - ) - - -class TestBenchmarksManagerGetAll: - """Tests for BenchmarksManager.get_all method.""" - - @pytest.mark.asyncio - async def test_get_all_returns_empty_list(self, benchmarks_manager): - """Test get_all returns empty list when no benchmarks exist.""" - result = await benchmarks_manager.get_all(workspace="default") - assert len(result.data) == 0 - - @pytest.mark.asyncio - async def test_get_all_returns_benchmarks( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test get_all returns all benchmarks for a workspace.""" - # Arrange - Create metric first, then benchmark - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Create a second benchmark - second_request = BenchmarkRequest( - name="test-benchmark-2", - description="Second benchmark", - metrics=[MetricRef(root="default/test-metric")], - dataset=FilesetRef(root="default/test-dataset-2"), - ) - await benchmarks_manager.create("default", second_request, mock_sdk) - - # Act - result = await benchmarks_manager.get_all(workspace="default") - - # Assert - assert len(result.data) == 2 - assert all(isinstance(b, Benchmark) for b in result.data) - names = {b.name for b in result.data} - assert names == {"test-benchmark", "test-benchmark-2"} - - @pytest.mark.asyncio - async def test_get_all_with_extended_response( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test get_all returns extended benchmarks when requested.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Act - result = await benchmarks_manager.get_all(workspace="default", extended_response=True) - - # Assert - assert len(result.data) == 1 - assert isinstance(result.data[0], ExtendedBenchmark) - assert result.data[0].name == "test-benchmark" - # Extended response should have full metric objects, not just refs - assert len(result.data[0].metrics) == 1 - - -class TestBenchmarksManagerGetByName: - """Tests for BenchmarksManager.get_by_name method.""" - - @pytest.mark.asyncio - async def test_get_by_name_returns_benchmark( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test get_by_name returns the benchmark when it exists.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Act - result = await benchmarks_manager.get_by_name("default", "test-benchmark") - - # Assert - assert result is not None - assert isinstance(result, Benchmark) - assert result.name == "test-benchmark" - assert result.workspace == "default" - - @pytest.mark.asyncio - async def test_get_by_name_raises_error_when_not_found(self, benchmarks_manager): - """Test get_by_name raises BenchmarkRetrievalError when benchmark not found.""" - with pytest.raises(BenchmarkRetrievalError) as exc_info: - await benchmarks_manager.get_by_name("default", "nonexistent") - - err = exc_info.value - assert err.error_code == "BENCHMARK_NOT_FOUND" - assert "default/nonexistent" in err.detail - - @pytest.mark.asyncio - async def test_get_by_name_with_extended_response( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test get_by_name returns extended benchmark when requested.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Act - result = await benchmarks_manager.get_by_name("default", "test-benchmark", extended_response=True) - - # Assert - assert result is not None - assert isinstance(result, ExtendedBenchmark) - assert result.name == "test-benchmark" - - -class TestBenchmarksManagerCreate: - """Tests for BenchmarksManager.create method.""" - - @pytest.mark.asyncio - async def test_create_benchmark_successfully( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test create successfully creates a benchmark.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - - # Act - result = await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Assert - assert result is not None - assert isinstance(result, Benchmark) - assert result.name == "test-benchmark" - assert result.workspace == "default" - assert result.description == "Test benchmark description" - assert result.id is not None - - @pytest.mark.asyncio - async def test_create_benchmark_with_extended_response( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test create returns extended benchmark when requested.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - - # Act - result = await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk, extended_response=True) - - # Assert - assert result is not None - assert isinstance(result, ExtendedBenchmark) - assert result.name == "test-benchmark" - - @pytest.mark.asyncio - async def test_create_benchmark_raises_error_when_metric_not_found( - self, benchmarks_manager, mock_sdk, sample_benchmark_request - ): - """Test create raises BenchmarkCreationError when referenced metric not found.""" - # Act & Assert - metric doesn't exist - with pytest.raises(BenchmarkCreationError) as exc_info: - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - err = exc_info.value - assert err.error_code == "METRIC_NOT_FOUND" - assert "default/test-metric" in err.detail - - @pytest.mark.asyncio - async def test_create_benchmark_with_multiple_metrics( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity - ): - """Test create benchmark with multiple metrics.""" - # Arrange - create two metrics - await mock_entity_client.create(sample_metric_entity) - - second_metric = entities.LLMJudgeMetric( - name="test-metric-2", - workspace="default", - type=MetricType.LLM_JUDGE, - description="Second metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-3.5", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate: {output}", - scores=[ - RubricScore( - name="score", - description="Score", - rubric=[ - Rubric(label="yes", description="Yes", value=1), - Rubric(label="no", description="No", value=0), - ], - ) - ], - ) - await mock_entity_client.create(second_metric) - - request = BenchmarkRequest( - name="multi-metric-benchmark", - description="Benchmark with multiple metrics", - metrics=[ - MetricRef(root="default/test-metric"), - MetricRef(root="default/test-metric-2"), - ], - dataset=FilesetRef(root="default/test-dataset"), - ) - - # Act - result = await benchmarks_manager.create("default", request, mock_sdk) - - # Assert - assert result is not None - assert result.name == "multi-metric-benchmark" - assert len(result.metrics) == 2 - - @pytest.mark.asyncio - async def test_create_benchmark_with_cross_workspace_metric(self, benchmarks_manager, mock_entity_client, mock_sdk): - """Test create benchmark with metric from different workspace.""" - # Arrange - create metric in production workspace - metric = entities.LLMJudgeMetric( - name="prod-metric", - workspace="production", - type=MetricType.LLM_JUDGE, - description="Production metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality", - rubric=[ - Rubric(label="good", description="Good", value=1), - Rubric(label="bad", description="Bad", value=0), - ], - ) - ], - ) - await mock_entity_client.create(metric) - - # Create benchmark in default workspace referencing production metric - request = BenchmarkRequest( - name="cross-workspace-benchmark", - description="Benchmark using production metric", - metrics=[MetricRef(root="production/prod-metric")], - dataset=FilesetRef(root="default/test-dataset"), - ) - - # Act - result = await benchmarks_manager.create("default", request, mock_sdk) - - # Assert - assert result is not None - assert result.name == "cross-workspace-benchmark" - assert result.workspace == "default" - - -class TestBenchmarksManagerDelete: - """Tests for BenchmarksManager.delete method.""" - - @pytest.mark.asyncio - async def test_delete_successful( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test delete successfully deletes a benchmark.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Act - result = await benchmarks_manager.delete("default", "test-benchmark") - - # Assert - assert result.message == "Resource deleted successfully" - - # Verify it's actually deleted - with pytest.raises(BenchmarkRetrievalError): - await benchmarks_manager.get_by_name("default", "test-benchmark") - - @pytest.mark.asyncio - async def test_delete_raises_error_when_not_found(self, benchmarks_manager): - """Test delete raises BenchmarkDeletionError when benchmark not found.""" - with pytest.raises(BenchmarkDeletionError) as exc_info: - await benchmarks_manager.delete("default", "nonexistent") - - err = exc_info.value - assert err.error_code == "BENCHMARK_NOT_FOUND" - assert "default/nonexistent" in err.detail - - -class TestBenchmarksManagerExists: - """Tests for BenchmarksManager.exists method.""" - - @pytest.mark.asyncio - async def test_exists_returns_true_when_benchmark_exists( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test exists returns True when benchmark exists.""" - # Arrange - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Act - result = await benchmarks_manager.exists("default", "test-benchmark") - - # Assert - assert result is True - - @pytest.mark.asyncio - async def test_exists_returns_false_when_benchmark_not_found(self, benchmarks_manager): - """Test exists returns False when benchmark not found.""" - result = await benchmarks_manager.exists("default", "nonexistent") - assert result is False - - -class TestBenchmarksManagerEdgeCases: - """Tests for edge cases and error conditions.""" - - @pytest.mark.asyncio - async def test_get_all_filters_by_workspace( - self, benchmarks_manager, mock_entity_client, mock_sdk, sample_metric_entity, sample_benchmark_request - ): - """Test get_all filters by workspace correctly.""" - # Arrange - create metric and benchmark in default workspace - await mock_entity_client.create(sample_metric_entity) - await benchmarks_manager.create("default", sample_benchmark_request, mock_sdk) - - # Create metric and benchmark in production workspace - prod_metric = entities.LLMJudgeMetric( - name="prod-metric", - workspace="production", - type=MetricType.LLM_JUDGE, - description="Production metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality", - rubric=[ - Rubric(label="good", description="Good", value=1), - Rubric(label="bad", description="Bad", value=0), - ], - ) - ], - ) - await mock_entity_client.create(prod_metric) - - prod_request = BenchmarkRequest( - name="prod-benchmark", - description="Production benchmark", - metrics=[MetricRef(root="production/prod-metric")], - dataset=FilesetRef(root="production/test-dataset"), - ) - await benchmarks_manager.create("production", prod_request, mock_sdk) - - # Act - default_results = await benchmarks_manager.get_all(workspace="default") - prod_results = await benchmarks_manager.get_all(workspace="production") - - # Assert - assert len(default_results.data) == 1 - assert default_results.data[0].name == "test-benchmark" - assert len(prod_results.data) == 1 - assert prod_results.data[0].name == "prod-benchmark" diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/schemas/test_evaluation.py b/services/evaluator/tests/nmp/evaluator/api/v2/metrics/schemas/test_evaluation.py deleted file mode 100644 index 48570141d1..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/schemas/test_evaluation.py +++ /dev/null @@ -1,440 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import pytest -from nemo_evaluator_sdk.values import DatasetRows, MetricOutput, Model, RowScore -from nmp.evaluator.api.v2.metrics.schemas.evaluation import ( - EvaluateDatasetRows, - MetricEvaluationRequest, - MetricEvaluationRowScore, -) -from nmp.evaluator.api.v2.metrics.schemas.metrics import ( - ExactMatchMetric, - LLMJudgeMetric, - StringCheckMetric, -) -from nmp.evaluator.app.values import MetricRef -from pydantic import ValidationError - -ROW: dict[str, str] = {"question": "Q", "answer": "A"} - - -class TestEvaluateDatasetRows: - """Tests for EvaluateDatasetRows validation constraints.""" - - def test_valid_single_row(self): - """EvaluateDatasetRows accepts exactly 1 row (minimum).""" - dataset = EvaluateDatasetRows(rows=[{"key": "value"}]) - assert len(dataset.rows) == 1 - - def test_valid_max_rows(self): - """EvaluateDatasetRows accepts exactly 10 rows (maximum).""" - rows = [{"key": f"value{i}"} for i in range(10)] - dataset = EvaluateDatasetRows(rows=rows) - assert len(dataset.rows) == 10 - - def test_valid_middle_range(self): - """EvaluateDatasetRows accepts rows within the valid range (1-10).""" - rows = [{"key": f"value{i}"} for i in range(5)] - dataset = EvaluateDatasetRows(rows=rows) - assert len(dataset.rows) == 5 - - def test_rejects_empty_rows(self): - """EvaluateDatasetRows rejects empty rows list.""" - with pytest.raises(ValidationError) as exc_info: - EvaluateDatasetRows(rows=[]) - - err = exc_info.value - assert len(err.errors()) == 1 - assert err.errors()[0]["loc"] == ("rows",) - assert err.errors()[0]["type"] == "too_short" - - def test_rejects_more_than_10_rows(self): - """EvaluateDatasetRows rejects more than 10 rows.""" - rows = [{"key": f"value{i}"} for i in range(11)] - - with pytest.raises(ValidationError) as exc_info: - EvaluateDatasetRows(rows=rows) - - err = exc_info.value - assert len(err.errors()) == 1 - assert err.errors()[0]["loc"] == ("rows",) - assert err.errors()[0]["type"] == "too_long" - - def test_rejects_many_more_rows(self): - """EvaluateDatasetRows rejects significantly more than 10 rows.""" - rows = [{"key": f"value{i}"} for i in range(100)] - - with pytest.raises(ValidationError) as exc_info: - EvaluateDatasetRows(rows=rows) - - err = exc_info.value - assert len(err.errors()) == 1 - assert err.errors()[0]["type"] == "too_long" - - -class TestEvaluateDatasetRowsVsDatasetRows: - """Tests verifying EvaluateDatasetRows correctly overrides DatasetRows limits.""" - - def test_base_inline_dataset_allows_more_than_10_rows(self): - """DatasetRows (base class) allows more than 10 rows.""" - rows = [{"key": f"value{i}"} for i in range(50)] - dataset = DatasetRows(rows=rows) - assert len(dataset.rows) == 50 - - def test_evaluate_inline_dataset_stricter_than_base(self): - """EvaluateDatasetRows enforces stricter max_length than DatasetRows.""" - rows = [{"key": f"value{i}"} for i in range(11)] - - # Base class allows it - base_dataset = DatasetRows(rows=rows) - assert len(base_dataset.rows) == 11 - - # Subclass rejects it - with pytest.raises(ValidationError) as exc_info: - EvaluateDatasetRows(rows=rows) - - err = exc_info.value - assert err.errors()[0]["type"] == "too_long" - - def test_both_reject_empty_rows(self): - """Both DatasetRows and EvaluateDatasetRows reject empty rows.""" - with pytest.raises(ValidationError): - DatasetRows(rows=[]) - - with pytest.raises(ValidationError): - EvaluateDatasetRows(rows=[]) - - -class TestMetricEvaluationRequestMetricUnion: - """Tests for MetricEvaluationRequest handling of MetricRef | InlineMetric union. - - This tests the discriminated union pattern that allows the 'metric' field to accept - either a string reference (MetricRef) or an inline metric definition (InlineMetric). - - Regression tests for: union discrimination between RootModel[str] and discriminated - union of BaseModel subclasses. - """ - - def test_metric_field_uses_tagged_union_with_callable_discriminator(self): - """CRITICAL: The metric field MUST use a tagged-union with callable discriminator. - - Without a callable discriminator, the union of MetricRef (string) and InlineMetric - (discriminated union with 'type' field) can cause validation errors in certain - contexts (e.g., FastAPI request parsing) where Pydantic tries to apply the nested - 'type' discriminator at the wrong level. - - This test verifies the fix is in place by checking the Pydantic core schema. - """ - from pydantic import TypeAdapter - - adapter = TypeAdapter(MetricEvaluationRequest) - core_schema = adapter.core_schema - - # Navigate to the metric field schema - # Path: .schema.schema.fields.metric.schema - request_schema = core_schema.get("schema", {}) - assert isinstance(request_schema, dict) - model_schema = request_schema.get("schema", {}) - assert isinstance(model_schema, dict) - fields = model_schema.get("fields", {}) - assert isinstance(fields, dict) - metric_field = fields.get("metric", {}) - assert isinstance(metric_field, dict) - metric_schema = metric_field.get("schema", {}) - assert isinstance(metric_schema, dict) - - # CRITICAL ASSERTION: The metric union MUST be a 'tagged-union', not 'union' - schema_type = metric_schema.get("type") - assert schema_type == "tagged-union", ( - f"Expected metric field to use 'tagged-union' schema type, got '{schema_type}'. " - "This indicates the callable discriminator fix is missing. " - "Without the fix, validation may fail with 'Unable to extract tag using discriminator' errors." - ) - - # CRITICAL ASSERTION: The discriminator MUST be a callable function - discriminator = metric_schema.get("discriminator") - assert callable(discriminator), ( - f"Expected metric field discriminator to be a callable function, got {type(discriminator)}. " - "The discriminator must be a function that returns 'ref' for strings and 'inline' for dicts." - ) - - def test_accepts_metric_ref_string(self): - """MetricEvaluationRequest accepts a string metric reference.""" - request = MetricEvaluationRequest.model_validate( - { - "metric": "my-workspace/my-metric", - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - assert isinstance(request.metric, MetricRef) - assert request.metric.root == "my-workspace/my-metric" - - def test_accepts_metric_ref_system_workspace(self): - """MetricEvaluationRequest accepts system workspace metric references.""" - request = MetricEvaluationRequest.model_validate( - { - "metric": "system/exact-match", - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - assert isinstance(request.metric, MetricRef) - assert request.metric.root == "system/exact-match" - - def test_accepts_inline_string_check_metric(self): - """MetricEvaluationRequest accepts inline string-check metric definition.""" - request = MetricEvaluationRequest.model_validate( - { - "metric": { - "type": "string-check", - "operation": "equals", - "left_template": "{{item.output}}", - "right_template": "{{item.expected}}", - }, - "dataset": {"rows": [{"output": "hello", "expected": "hello"}]}, - } - ) - - assert isinstance(request.metric, StringCheckMetric) - assert request.metric.operation == "equals" - - def test_accepts_inline_exact_match_metric(self): - """MetricEvaluationRequest accepts inline exact-match metric definition.""" - request = MetricEvaluationRequest.model_validate( - { - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - }, - "dataset": {"rows": [{"output": "test", "expected": "test"}]}, - } - ) - - assert isinstance(request.metric, ExactMatchMetric) - assert request.metric.reference == "{{item.expected}}" - - def test_accepts_inline_llm_judge_metric(self): - """MetricEvaluationRequest accepts inline llm-judge metric definition.""" - request = MetricEvaluationRequest.model_validate( - { - "metric": { - "type": "llm-judge", - "model": { - "url": "https://integrate.api.nvidia.com/v1/chat/completions", - "name": "meta/llama-3.1-8b-instruct", - "api_key_secret": "my-api-key", - }, - "scores": [{"name": "quality", "minimum": 1, "maximum": 5}], - }, - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - assert isinstance(request.metric, LLMJudgeMetric) - assert isinstance(request.metric.model, Model) - assert request.metric.model.name == "meta/llama-3.1-8b-instruct" - - def test_rejects_invalid_metric_ref_format(self): - """MetricEvaluationRequest rejects invalid metric reference format.""" - with pytest.raises(ValidationError) as exc_info: - MetricEvaluationRequest.model_validate( - { - "metric": "invalid-no-slash", - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - err = exc_info.value - # Should fail on the MetricRef pattern validation - assert any("metric" in str(e["loc"]) for e in err.errors()) - - def test_rejects_inline_metric_missing_type(self): - """MetricEvaluationRequest rejects inline metric without type field.""" - with pytest.raises(ValidationError) as exc_info: - MetricEvaluationRequest.model_validate( - { - "metric": { - "operation": "equals", - "left_template": "{{item.output}}", - "right_template": "{{item.expected}}", - }, - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - err = exc_info.value - assert len(err.errors()) >= 1 - - def test_rejects_inline_metric_invalid_type(self): - """MetricEvaluationRequest rejects inline metric with unknown type.""" - with pytest.raises(ValidationError) as exc_info: - MetricEvaluationRequest.model_validate( - { - "metric": { - "type": "unknown-metric-type", - "some_field": "value", - }, - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - err = exc_info.value - assert len(err.errors()) >= 1 - - def test_rejects_non_string_non_dict_metric(self): - """MetricEvaluationRequest rejects metric that is neither string nor dict.""" - with pytest.raises(ValidationError) as exc_info: - MetricEvaluationRequest.model_validate( - { - "metric": 12345, - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - err = exc_info.value - assert len(err.errors()) >= 1 - - def test_rejects_list_as_metric(self): - """MetricEvaluationRequest rejects list as metric value.""" - with pytest.raises(ValidationError) as exc_info: - MetricEvaluationRequest.model_validate( - { - "metric": ["not", "a", "metric"], - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - err = exc_info.value - assert len(err.errors()) >= 1 - - def test_serialization_round_trip_metric_ref(self): - """MetricEvaluationRequest with MetricRef survives serialization round-trip.""" - original = MetricEvaluationRequest.model_validate( - { - "metric": "my-workspace/my-metric", - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - serialized = original.model_dump() - restored = MetricEvaluationRequest.model_validate(serialized) - - assert isinstance(restored.metric, MetricRef) - assert restored.metric.root == "my-workspace/my-metric" - - def test_serialization_round_trip_inline_metric(self): - """MetricEvaluationRequest with InlineMetric survives serialization round-trip.""" - original = MetricEvaluationRequest.model_validate( - { - "metric": { - "type": "string-check", - "operation": "contains", - "left_template": "{{item.output}}", - "right_template": "{{item.expected}}", - }, - "dataset": {"rows": [{"input": "test"}]}, - } - ) - - serialized = original.model_dump() - restored = MetricEvaluationRequest.model_validate(serialized) - - assert isinstance(restored.metric, StringCheckMetric) - assert restored.metric.operation == "contains" - - -def _row_score( - *, - index: int = 0, - metrics: dict[str, list[MetricOutput]] | None = None, - metric_errors: dict[str, str] | None = None, -) -> RowScore: - """Build a minimal RowScore with only the fields `from_row_score` reads.""" - return RowScore( - row_index=index, - item=ROW, - sample={}, - metrics=metrics or {}, - requests=[], - metric_errors=metric_errors, - ) - - -class TestMetricEvaluationRowScoreFromRowScore: - """Unit coverage for MetricEvaluationRowScore.from_row_score. - - Exercises the classmethod directly rather than through the /metric-evaluate - route so edge cases (non-finite values, errored rows, empty metrics) are - pinned at the schema layer. - """ - - def test_success_preserves_finite_scores(self) -> None: - """Finite metric values pass through unchanged into the scores dict.""" - row_score = _row_score( - index=3, - metrics={"exact_match": [MetricOutput(name="score", value=1.0)]}, - ) - result = MetricEvaluationRowScore.from_row_score(row_score, row=ROW, index=3) - - assert result.index == 3 - assert result.row == ROW - assert result.scores == {"score": 1.0} - assert result.error is None - - @pytest.mark.parametrize("bad_value", [float("nan"), float("inf"), float("-inf")]) - def test_non_finite_scores_become_none(self, bad_value: float) -> None: - """NaN and ±inf are serialized as None for JSON compatibility.""" - row_score = _row_score( - metrics={"m": [MetricOutput(name="score", value=bad_value)]}, - ) - result = MetricEvaluationRowScore.from_row_score(row_score, row=ROW, index=0) - - assert result.scores == {"score": None} - assert result.error is None - - def test_errored_row_emits_null_scores_and_error(self) -> None: - """Rows with metric_errors surface error text and set scores to None.""" - row_score = _row_score(index=1, metric_errors={"m": "boom"}) - result = MetricEvaluationRowScore.from_row_score(row_score, row=ROW, index=1) - - assert result.scores is None - assert result.error is not None - assert "boom" in result.error - - def test_multiple_metrics_flatten_into_single_scores_dict(self) -> None: - """All MetricOutput entries across metric keys flatten into one dict keyed by name.""" - row_score = _row_score( - index=2, - metrics={ - "a": [MetricOutput(name="precision", value=0.5)], - "b": [MetricOutput(name="recall", value=0.75)], - }, - ) - result = MetricEvaluationRowScore.from_row_score(row_score, row=ROW, index=2) - - assert result.scores == {"precision": 0.5, "recall": 0.75} - - def test_non_numeric_outputs_are_excluded_from_scores_dict(self) -> None: - """Labels and structured outputs stay in row artifacts but not the live scores response.""" - row_score = _row_score( - metrics={ - "judge": [ - MetricOutput(name="quality", value=0.75), - MetricOutput(name="quality.label", value="good"), - MetricOutput(name="details", value={"rationale": "clear"}), - ] - }, - ) - result = MetricEvaluationRowScore.from_row_score(row_score, row=ROW, index=0) - - assert result.scores == {"quality": 0.75} - - def test_empty_metrics_emit_empty_scores_dict(self) -> None: - """Successful rows with no metrics still emit a (possibly empty) scores dict.""" - row_score = _row_score(index=4) - result = MetricEvaluationRowScore.from_row_score(row_score, row=ROW, index=4) - - assert result.scores == {} - assert result.error is None diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_job_result_routes.py b/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_job_result_routes.py deleted file mode 100644 index 4292ef1996..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_job_result_routes.py +++ /dev/null @@ -1,110 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for metrics job result routes configuration.""" - -from fastapi import FastAPI -from fastapi.openapi.utils import get_openapi -from nmp.common.api.utils import tweak_spec -from nmp.evaluator.api.v2.metrics.endpoints import _jobs_router - - -class TestMetricJobResultRoutes: - """Tests verifying metric job result routes are correctly configured.""" - - def test_metric_jobs_router_has_typed_result_routes(self): - """Test that metric jobs router includes typed routes for aggregate-scores and row-scores.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/v2/workspaces/{workspace}/evaluation/metrics") - - # Extract all routes from the router - route_paths = {route.path for route in app.routes if hasattr(route, "path")} - - # Verify typed result download routes exist - assert ( - "/v2/workspaces/{workspace}/evaluation/metrics/jobs/{job}/results/aggregate-scores/download" in route_paths - ) - assert "/v2/workspaces/{workspace}/evaluation/metrics/jobs/{job}/results/row-scores/download" in route_paths - - # Verify the fallback wildcard route also exists - assert "/v2/workspaces/{workspace}/evaluation/metrics/jobs/{job}/results/{name}/download" in route_paths - - def test_metric_aggregate_scores_route_returns_json(self): - """Test that aggregate-scores download route is configured for JSON response.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/metrics") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - # Find the aggregate-scores download route - agg_scores_path = "/metrics/jobs/{job}/results/aggregate-scores/download" - assert agg_scores_path in openapi_schema["paths"], f"Path {agg_scores_path} not found in OpenAPI schema" - - route_schema = openapi_schema["paths"][agg_scores_path] - # JSON routes default to application/json content type - assert "get" in route_schema - - def test_metric_row_scores_route_returns_jsonl(self): - """Test that row-scores download route is configured for JSONL streaming response.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/metrics") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - # Find the row-scores download route - row_scores_path = "/metrics/jobs/{job}/results/row-scores/download" - assert row_scores_path in openapi_schema["paths"], f"Path {row_scores_path} not found in OpenAPI schema" - - route_schema = openapi_schema["paths"][row_scores_path] - assert "get" in route_schema - - # JSONL routes should have application/jsonl content type - responses = route_schema["get"]["responses"] - assert "200" in responses - content = responses["200"].get("content", {}) - assert "application/jsonl" in content, f"Expected application/jsonl in content, got {content}" - - def test_metric_row_scores_route_has_limit_parameter(self): - """Test that row-scores download route accepts a limit query parameter.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/metrics") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - row_scores_path = "/metrics/jobs/{job}/results/row-scores/download" - route_schema = openapi_schema["paths"][row_scores_path] - parameters = route_schema["get"].get("parameters", []) - - # Find the limit parameter - limit_params = [p for p in parameters if p.get("name") == "limit"] - assert len(limit_params) == 1, "Expected 'limit' query parameter for JSONL streaming" - assert limit_params[0]["in"] == "query" - - def test_metric_row_score_schema_excludes_error(self): - """The derived error summary is hidden from the wire schema.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/metrics") - - openapi_schema = tweak_spec( - get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - ) - - row_score_schema = openapi_schema["components"]["schemas"]["RowScore"] - assert "error" not in row_score_schema.get("properties", {}) - assert "error" not in row_score_schema.get("required", []) diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_mapper.py b/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_mapper.py deleted file mode 100644 index 0ed7dc4b5a..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_mapper.py +++ /dev/null @@ -1,282 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for MetricMapper.""" - -from unittest.mock import AsyncMock, patch - -import nmp.evaluator.entities as entities -import pytest -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.metrics.llm_judge import default_judge_prompt_template_chat -from nemo_evaluator_sdk.values import Model, Rubric, RubricScore -from nmp.evaluator.api.v2.metrics.mapper import MetricMapper -from nmp.evaluator.api.v2.metrics.schemas import metrics as schemas -from nmp.evaluator.app.values.common import ModelRef - - -class TestMetricMapperRequestToEntity: - """Tests for MetricMapper.request_to_entity method.""" - - @pytest.mark.asyncio - async def test_request_to_entity_llm_judge(self): - """Test converting LLMJudgeMetric to LLMJudgeMetric entity.""" - # Arrange - request = schemas.LLMJudgeMetric( - description="Test LLM Judge metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate the response: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality of response", - rubric=[ - Rubric(label="good", description="Good response", value=1), - Rubric(label="bad", description="Bad response", value=0), - ], - ) - ], - ) - - # Act - entity = await MetricMapper.request_to_entity(request, name="test-metric", workspace="default") - - # Assert - assert isinstance(entity, entities.LLMJudgeMetric) - assert entity.name == "test-metric" - assert entity.workspace == "default" - assert entity.description == "Test LLM Judge metric" - assert entity.model.name == "gpt-4o" - - @pytest.mark.asyncio - async def test_request_to_entity_bleu(self): - """Test converting BLEUMetric to BLEUMetric entity.""" - # Arrange - request = schemas.BLEUMetric( - references=["{{item.reference}}"], - ) - - # Act - entity = await MetricMapper.request_to_entity(request, name="test-bleu", workspace="default") - - # Assert - assert isinstance(entity, entities.BLEUMetric) - assert entity.name == "test-bleu" - assert entity.workspace == "default" - assert entity.type == "bleu" - assert entity.references == ["{{item.reference}}"] - - @pytest.mark.asyncio - async def test_request_to_entity_rouge(self): - """Test converting ROUGEMetric to ROUGEMetric entity.""" - # Arrange - request = schemas.ROUGEMetric( - reference="{{item.reference}}", - ) - - # Act - entity = await MetricMapper.request_to_entity(request, name="test-rouge", workspace="test-workspace") - - # Assert - assert isinstance(entity, entities.ROUGEMetric) - assert entity.name == "test-rouge" - assert entity.workspace == "test-workspace" - assert entity.type == "rouge" - - @pytest.mark.asyncio - async def test_request_to_entity_string_check(self): - """Test converting StringCheckMetric to StringCheckMetric entity.""" - # Arrange - request = schemas.StringCheckMetric( - operation="contains", - left_template="{{item.response}}", - right_template="{{item.expected}}", - ) - - # Act - entity = await MetricMapper.request_to_entity(request, name="test-string-check", workspace="default") - - # Assert - assert isinstance(entity, entities.StringCheckMetric) - assert entity.name == "test-string-check" - assert entity.workspace == "default" - assert entity.type == "string-check" - assert entity.operation == "contains" - - @pytest.mark.asyncio - async def test_request_to_entity_preserves_all_fields(self): - """Test that all fields from the request are preserved in the entity.""" - # Arrange - request = schemas.BLEUMetric( - references=["{{item.reference1}}", "{{item.reference2}}"], - candidate="{{item.candidate}}", - ) - - # Act - entity = await MetricMapper.request_to_entity(request, name="test-bleu", workspace="default") - - # Assert - assert isinstance(entity, entities.BLEUMetric) - assert entity.references == ["{{item.reference1}}", "{{item.reference2}}"] - assert entity.candidate == "{{item.candidate}}" - - @pytest.mark.asyncio - async def test_request_to_entity_ragas_with_judge_model(self): - """Test converting RAGAS metric with judge_model to entity.""" - # Arrange - TopicAdherence is a RAGAS metric with judge_model - request = schemas.TopicAdherenceMetric( - judge_model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - ) - - # Act - entity = await MetricMapper.request_to_entity(request, name="test-topic", workspace="default") - - # Assert - assert isinstance(entity, entities.TopicAdherenceMetric) - assert entity.name == "test-topic" - assert entity.workspace == "default" - assert entity.type == "topic_adherence" - assert entity.judge_model.name == "gpt-4o" - - @pytest.mark.asyncio - async def test_request_to_entity_response_relevancy_both_models(self): - """Test ResponseRelevancy which has both judge_model and embeddings_model.""" - # Arrange - ResponseRelevancy is unique in having both judge and embeddings models - request = schemas.ResponseRelevancyMetric( - judge_model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - embeddings_model=Model( - url="https://api.openai.com/v1", - name="text-embedding-3-small", - format=ModelFormat.OPEN_AI, - ), - ) - - # Act - entity = await MetricMapper.request_to_entity(request, name="test-relevancy", workspace="default") - - # Assert - assert isinstance(entity, entities.ResponseRelevancyMetric) - assert entity.name == "test-relevancy" - assert entity.workspace == "default" - assert entity.type == "response_relevancy" - assert entity.judge_model.name == "gpt-4o" - assert entity.embeddings_model.name == "text-embedding-3-small" - - @pytest.mark.asyncio - async def test_request_to_entity_resolves_model_ref(self): - """Test that ModelRef fields are resolved via the ResolvableModels protocol.""" - # Arrange - TopicAdherence with a ModelRef instead of inline Model - # Use the API schema type which accepts Model | ModelRef - request = schemas.TopicAdherenceMetric.model_validate({"judge_model": ModelRef(root="my-workspace/my-judge")}) - - resolved_model = Model( - url="http://gateway:8080/v1/my-workspace/my-judge", - name="my-judge", - format=ModelFormat.NVIDIA_NIM, - ) - - # Act - mock resolve_model which is called by the ResolvableModels protocol - with patch( - "nmp.evaluator.api.v2.metrics.mapper.resolve_model", - new_callable=AsyncMock, - return_value=resolved_model, - ): - entity = await MetricMapper.request_to_entity(request, name="test-topic", workspace="default") - - # Assert - entity should have the resolved app.Model - assert isinstance(entity, entities.TopicAdherenceMetric) - assert entity.judge_model.name == "my-judge" - assert entity.judge_model.url == "http://gateway:8080/v1/my-workspace/my-judge" - assert entity.judge_model.format == "nim" - - @pytest.mark.asyncio - async def test_request_to_entity_resolves_multiple_model_refs(self): - """Test that multiple ModelRef fields are all resolved.""" - # Arrange - ResponseRelevancy has both judge_model and embeddings_model - # Use the API schema type which accepts Model | ModelRef - request = schemas.ResponseRelevancyMetric.model_validate( - { - "judge_model": ModelRef(root="ws/judge"), - "embeddings_model": ModelRef(root="ws/embed"), - } - ) - - async def fake_resolve(model): - if isinstance(model, ModelRef) and "judge" in model.root: - return Model(url="http://gw/v1/ws/judge", name="judge", format=ModelFormat.NVIDIA_NIM) - if isinstance(model, ModelRef) and "embed" in model.root: - return Model(url="http://gw/v1/ws/embed", name="embed", format=ModelFormat.NVIDIA_NIM) - return model - - with patch( - "nmp.evaluator.api.v2.metrics.mapper.resolve_model", - side_effect=fake_resolve, - ): - entity = await MetricMapper.request_to_entity(request, name="test-rel", workspace="default") - - assert isinstance(entity, entities.ResponseRelevancyMetric) - assert entity.judge_model.name == "judge" - assert entity.embeddings_model.name == "embed" - - @pytest.mark.asyncio - async def test_request_to_entity_llm_judge_defaults_prompt_template_when_omitted(self): - """LLM Judge should support zero-config prompt templates.""" - request = schemas.LLMJudgeMetric( - model=Model( - url="https://inference-api.nvidia.com/v1/chat/completions", - name="nvidia/openai/gpt-oss-20b", - format=ModelFormat.OPEN_AI, - ), - scores=[ - RubricScore( - name="quality", - rubric=[ - Rubric(label="poor", value=0), - Rubric(label="good", value=1), - ], - ) - ], - ) - assert request.prompt_template == default_judge_prompt_template_chat() - - entity = await MetricMapper.request_to_entity(request, name="test-judge", workspace="default") - - assert isinstance(entity, entities.LLMJudgeMetric) - assert entity.prompt_template == default_judge_prompt_template_chat() - - @pytest.mark.asyncio - async def test_request_to_entity_llm_judge_preserves_optional_fields(self): - request = schemas.LLMJudgeMetric( - model=Model( - url="https://inference-api.nvidia.com/v1/chat/completions", - name="nvidia/openai/gpt-oss-20b", - format=ModelFormat.OPEN_AI, - ), - optional_fields=["reference"], - scores=[ - RubricScore( - name="quality", - rubric=[ - Rubric(label="poor", value=0), - Rubric(label="good", value=1), - ], - ) - ], - ) - - entity = await MetricMapper.request_to_entity(request, name="test-judge", workspace="default") - - assert isinstance(entity, entities.LLMJudgeMetric) - assert entity.optional_fields == ["reference"] diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_metric_job_result_routes.py b/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_metric_job_result_routes.py deleted file mode 100644 index 686eaf3b02..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_metric_job_result_routes.py +++ /dev/null @@ -1,95 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for metrics job result routes configuration.""" - -from fastapi import FastAPI -from fastapi.openapi.utils import get_openapi -from nmp.evaluator.api.v2.metrics.endpoints import _jobs_router - - -class TestMetricJobResultRoutes: - """Tests verifying metric job result routes are correctly configured.""" - - def test_metric_jobs_router_has_typed_result_routes(self): - """Test that metric jobs router includes typed routes for aggregate-scores and row-scores.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/v2/workspaces/{workspace}/evaluation/metrics") - - # Extract all routes from the router - route_paths = {route.path for route in app.routes if hasattr(route, "path")} - - # Verify typed result download routes exist - assert ( - "/v2/workspaces/{workspace}/evaluation/metrics/jobs/{job}/results/aggregate-scores/download" in route_paths - ) - assert "/v2/workspaces/{workspace}/evaluation/metrics/jobs/{job}/results/row-scores/download" in route_paths - - # Verify the fallback wildcard route also exists - assert "/v2/workspaces/{workspace}/evaluation/metrics/jobs/{job}/results/{name}/download" in route_paths - - def test_metric_aggregate_scores_route_returns_json(self): - """Test that aggregate-scores download route is configured for JSON response.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/metrics") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - # Find the aggregate-scores download route - agg_scores_path = "/metrics/jobs/{job}/results/aggregate-scores/download" - assert agg_scores_path in openapi_schema["paths"], f"Path {agg_scores_path} not found in OpenAPI schema" - - route_schema = openapi_schema["paths"][agg_scores_path] - # JSON routes default to application/json content type - assert "get" in route_schema - - def test_metric_row_scores_route_returns_jsonl(self): - """Test that row-scores download route is configured for JSONL streaming response.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/metrics") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - # Find the row-scores download route - row_scores_path = "/metrics/jobs/{job}/results/row-scores/download" - assert row_scores_path in openapi_schema["paths"], f"Path {row_scores_path} not found in OpenAPI schema" - - route_schema = openapi_schema["paths"][row_scores_path] - assert "get" in route_schema - - # JSONL routes should have application/jsonl content type - responses = route_schema["get"]["responses"] - assert "200" in responses - content = responses["200"].get("content", {}) - assert "application/jsonl" in content, f"Expected application/jsonl in content, got {content}" - assert content["application/jsonl"]["schema"]["$ref"] == "#/components/schemas/RowScore", content[ - "application/jsonl" - ]["schema"] - - def test_metric_row_scores_route_has_limit_parameter(self): - """Test that row-scores download route accepts a limit query parameter.""" - app = FastAPI() - app.include_router(_jobs_router, prefix="/metrics") - - openapi_schema = get_openapi( - title="Test API", - version="1.0.0", - routes=app.routes, - ) - - row_scores_path = "/metrics/jobs/{job}/results/row-scores/download" - route_schema = openapi_schema["paths"][row_scores_path] - parameters = route_schema["get"].get("parameters", []) - - # Find the limit parameter - limit_params = [p for p in parameters if p.get("name") == "limit"] - assert len(limit_params) == 1, "Expected 'limit' query parameter for JSONL streaming" - assert limit_params[0]["in"] == "query" diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_metrics_filter.py b/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_metrics_filter.py deleted file mode 100644 index a5b6e87e82..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_metrics_filter.py +++ /dev/null @@ -1,317 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for metrics filter functionality.""" - -import json -from typing import Generator - -import nmp.evaluator.entities as entities -import pytest -from fastapi import FastAPI -from fastapi.testclient import TestClient -from nmp.common.entities import EntityClient -from nmp.evaluator.api.v2.metrics.endpoints import get_metrics_manager, router -from nmp.evaluator.api.v2.metrics.manager import MetricsManager -from nmp.evaluator.api.v2.metrics.schemas.metrics_resp import MetricsListResponse -from nmp.testing import create_test_client - - -@pytest.fixture -def mock_entity_client() -> Generator[EntityClient, None, None]: - workspaces = ["default", "system"] - projects = ["default/project-a", "default/project-b"] - with create_test_client(client_type=EntityClient, workspaces=workspaces, projects=projects) as client: - yield client - - -@pytest.fixture -def metrics_manager(mock_entity_client) -> MetricsManager: - return MetricsManager(mock_entity_client) - - -def new_test_client(manager: MetricsManager, mock_sdk=None) -> TestClient: - def override_get_metrics_manager() -> MetricsManager: - return manager - - app = FastAPI() - app.include_router(router, prefix="/apis/evaluation") - app.dependency_overrides[get_metrics_manager] = override_get_metrics_manager - - if mock_sdk is not None: - from nmp.common.service.dependencies import get_sdk_client - - app.dependency_overrides[get_sdk_client] = lambda: mock_sdk - - return TestClient(app) - - -class TestMetricsFilterEndpoints: - """Integration tests for metrics filter via HTTP endpoints.""" - - async def _create_metrics(self, metrics_manager: MetricsManager, mock_sdk): - metric1 = entities.StringCheckMetric( - name="metric-alpha", - workspace="default", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - project="project-a", - labels={"label1": "value1"}, - ) - metric2 = entities.BLEUMetric( - name="metric-beta", - workspace="default", - references=["{{reference}}"], - project="project-b", - ) - metric3 = entities.ExactMatchMetric( - name="metric-gamma", - workspace="default", - reference="{{reference}}", - project="project-a", - ) - await metrics_manager.create(metric1, sdk=mock_sdk) - await metrics_manager.create(metric2, sdk=mock_sdk) - await metrics_manager.create(metric3, sdk=mock_sdk) - - @pytest.mark.asyncio - async def test_list_metrics_filter_type(self, metrics_manager, mock_sdk): - """Test filter by metric type.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[type]=bleu") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-beta" - - @pytest.mark.asyncio - async def test_list_metrics_filter_project(self, metrics_manager, mock_sdk): - """Test filter by project.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[project]=project-a") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 2 - names = {m.name for m in result.data} - assert names == {"metric-alpha", "metric-gamma"} - - @pytest.mark.asyncio - async def test_list_metrics_filter_json(self, metrics_manager, mock_sdk): - """Test advanced JSON filter.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - filter_json = json.dumps({"name": {"$like": "beta"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metrics?filter={filter_json}") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-beta" - - @pytest.mark.asyncio - async def test_list_metrics_filter_json_combined(self, metrics_manager, mock_sdk): - """Test JSON filter combined with project filter.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - filter_json = json.dumps({"$and": [{"project": {"$eq": "project-a"}}, {"name": {"$like": "metric"}}]}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metrics?filter={filter_json}") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 2 - names = {m.name for m in result.data} - assert names == {"metric-alpha", "metric-gamma"} - - @pytest.mark.asyncio - async def test_list_metrics_filter_invalid_json(self, metrics_manager, mock_sdk): - """Test invalid JSON filter returns 400.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter={invalid-json}") - assert resp.status_code == 400 - - @pytest.mark.asyncio - async def test_list_metrics_filter_bracket_like(self, metrics_manager, mock_sdk): - """Test bracket filter with $like operator.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[name][$like]=beta") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-beta" - - @pytest.mark.asyncio - async def test_list_metrics_filter_bracket_eq(self, metrics_manager, mock_sdk): - """Test bracket filter with $eq operator.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[name][$eq]=metric-alpha") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-alpha" - - @pytest.mark.asyncio - async def test_list_metrics_filter_bracket_no_operator(self, metrics_manager, mock_sdk): - """Test bracket filter without operator defaults to $eq.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[name]=metric-alpha") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-alpha" - - @pytest.mark.asyncio - async def test_list_metrics_filter_bracket_combined(self, metrics_manager, mock_sdk): - """Test bracket filter combining project and name.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get( - "/apis/evaluation/v2/workspaces/default/metrics?filter[project]=project-a&filter[name][$like]=metric" - ) - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 2 - names = {m.name for m in result.data} - assert names == {"metric-alpha", "metric-gamma"} - - @pytest.mark.asyncio - async def test_list_metrics_filter_invalid_field(self, metrics_manager, mock_sdk): - """Test invalid filter field returns 400.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[nonexistent]=value") - assert resp.status_code == 400 - - @pytest.mark.asyncio - async def test_list_metrics_filter_bracket_label_field(self, metrics_manager, mock_sdk): - """Test bracket filter can filter labels via filter[data.labels.KEY].""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[data.labels.label1]=value1") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-alpha" - - @pytest.mark.asyncio - async def test_list_metrics_filter_json_label_eq(self, metrics_manager, mock_sdk): - """Test JSON filter on data.labels with $eq operator.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - filter_json = json.dumps({"data.labels.label1": {"$eq": "value1"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metrics?filter={filter_json}") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-alpha" - - @pytest.mark.asyncio - async def test_list_metrics_filter_json_label_no_match(self, metrics_manager, mock_sdk): - """Test JSON filter on data.labels returns empty when no match.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - filter_json = json.dumps({"data.labels.label1": {"$eq": "nonexistent"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metrics?filter={filter_json}") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 0 - - @pytest.mark.asyncio - async def test_list_metrics_filter_json_label_or(self, metrics_manager, mock_sdk): - """Test JSON filter with $or to match metrics by different criteria.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - filter_json = json.dumps( - { - "$or": [ - {"data.labels.label1": {"$eq": "value1"}}, - {"name": {"$eq": "metric-beta"}}, - ] - } - ) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metrics?filter={filter_json}") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 2 - names = {m.name for m in result.data} - assert names == {"metric-alpha", "metric-beta"} - - @pytest.mark.asyncio - async def test_list_metrics_filter_json_label_with_type(self, metrics_manager, mock_sdk): - """Test JSON filter on labels combined with type filter.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - filter_json = json.dumps( - {"$and": [{"type": {"$eq": "string-check"}}, {"data.labels.label1": {"$eq": "value1"}}]} - ) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metrics?filter={filter_json}") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-alpha" - - @pytest.mark.asyncio - async def test_list_metrics_filter_json_name_eq(self, metrics_manager, mock_sdk): - """Test JSON filter on name with $eq operator.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - filter_json = json.dumps({"name": {"$eq": "metric-gamma"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metrics?filter={filter_json}") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-gamma" - - @pytest.mark.asyncio - async def test_list_metrics_filter_json_type_eq(self, metrics_manager, mock_sdk): - """Test JSON filter on type with $eq operator.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - filter_json = json.dumps({"type": {"$eq": "bleu"}}) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metrics?filter={filter_json}") - assert resp.status_code == 200, resp.json() - result = MetricsListResponse.model_validate(resp.json()) - assert len(result.data) == 1 - assert result.data[0].name == "metric-beta" - - @pytest.mark.asyncio - async def test_list_metrics_rejects_unknown_top_level_query_param(self, metrics_manager, mock_sdk): - """Test unknown top-level query params are rejected with 400.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?labels=eval_harness.bfcl") - assert resp.status_code == 400, resp.json() - detail = resp.json().get("detail", "") - assert "unsupported query parameter" in detail.lower() - assert "labels" in detail.lower() - - @pytest.mark.asyncio - async def test_list_metrics_search_param_rejected(self, metrics_manager, mock_sdk): - """Test that search query param is no longer accepted.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?search[name]=test") - assert resp.status_code == 400 diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_service.py b/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_service.py deleted file mode 100644 index c73d37a552..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_service.py +++ /dev/null @@ -1,636 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from datetime import datetime -from typing import Generator -from unittest.mock import AsyncMock, MagicMock, Mock - -import nmp.evaluator.entities as entities -import pytest -from httpx import Response -from nemo_evaluator_sdk.enums import MetricType, ModelFormat -from nemo_evaluator_sdk.metrics.llm_judge import default_judge_prompt_template_chat -from nemo_evaluator_sdk.values import Model, RemoteScore, Rubric, RubricScore, SecretRef -from nmp.common.entities import SYSTEM_WORKSPACE -from nmp.common.entities.client import EntityClient -from nmp.evaluator.api.v2.metrics.manager import ( - MetricCreationError, - MetricDeletionError, - MetricRetrievalError, - MetricsManager, -) -from nmp.evaluator.api.v2.metrics.schemas.metrics import LLMJudgeMetric -from nmp.evaluator.api.v2.metrics.schemas.metrics_resp import LLMJudgeMetricResponse -from nmp.testing import create_test_client - - -def create_not_found_error(message: str): - """Helper to create a NotFoundError with required arguments.""" - from nemo_platform import NotFoundError - - mock_response = Mock(spec=Response) - mock_response.status_code = 404 - mock_response.headers = {} - return NotFoundError(message=message, response=mock_response, body={"detail": message}) - - -@pytest.fixture -def mock_entity_client() -> Generator[EntityClient, None, None]: - """Real EntityClient backed by in-memory storage for integration-style testing.""" - # Include workspaces needed by tests (default + cross-workspace tests) - workspaces = ["default", "workspace1", "workspace2", "production", SYSTEM_WORKSPACE] - with create_test_client(client_type=EntityClient, workspaces=workspaces) as client: - yield client - - -# mock_sdk fixture is now provided by conftest.py - - -@pytest.fixture -def metrics_service(mock_entity_client) -> MetricsManager: - """MetricsManager instance with mocked EntityClient.""" - return MetricsManager(mock_entity_client) - - -@pytest.fixture -def sample_metric_entity(): - """Sample LLMJudgeMetric entity for testing.""" - entity = entities.LLMJudgeMetric( - name="test-metric", - workspace="default", - type=MetricType.LLM_JUDGE, - description="Test metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate the response: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality of response", - rubric=[ - Rubric(label="good", description="Good response", value=1), - Rubric(label="bad", description="Bad response", value=0), - ], - ) - ], - ) - # Set private attributes that would normally be set by the entity store - entity._id = "metric-123" - entity._created_at = datetime(2024, 1, 1, 0, 0, 0) - entity._updated_at = datetime(2024, 1, 1, 0, 0, 0) - return entity - - -@pytest.fixture -def sample_metric_entity_with_secret(): - """Sample LLMJudgeMetric entity with API key secret for testing.""" - return entities.LLMJudgeMetric( - name="test-metric-with-secret", - workspace="default", - description="Test metric with secret", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - api_key_secret=SecretRef(root="my-secret"), - ), - prompt_template="Rate the response: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality of response", - rubric=[ - Rubric(label="good", description="Good response", value=1), - Rubric(label="bad", description="Bad response", value=0), - ], - ) - ], - ) - - -@pytest.fixture -def sample_metric_request(): - """Sample LLMJudgeMetric for testing create_from_request method.""" - return LLMJudgeMetric( - description="Test metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate the response: {output}", - scores=[ - RubricScore( - name="quality", - description="Quality of response", - rubric=[ - Rubric(label="good", description="Good response", value=1), - Rubric(label="bad", description="Bad response", value=0), - ], - ) - ], - ) - - -@pytest.fixture -def sample_system_metric_entity() -> entities.SystemMetric: - """Sample SystemMetric entity for testing internal system metric helpers.""" - return entities.SystemMetric( - name="system-metric", - description="System metric", - ) - - -class TestMetricsServiceGetAll: - """Tests for MetricsManager.get_all method.""" - - @pytest.mark.asyncio - async def test_get_all_returns_empty_list(self, metrics_service): - """Test get_all returns empty list when no metrics exist.""" - # Act - result = await metrics_service.get_all(workspace="default") - - # Assert - assert len(result.data) == 0 - - @pytest.mark.asyncio - async def test_get_all_returns_metrics(self, metrics_service, mock_entity_client, sample_metric_entity): - """Test get_all returns all metrics for a workspace.""" - # Arrange - Add entities to the mock entity client - await mock_entity_client.create(sample_metric_entity) - - entity2 = entities.LLMJudgeMetric( - name="test-metric-2", - workspace="default", - description="Test metric 2", - model=Model( - url="https://api.openai.com/v1", - name="gpt-3.5", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate: {output}", - scores=[ - RubricScore( - name="score", - description="Score", - rubric=[ - Rubric(label="yes", description="Yes", value=1), - Rubric(label="no", description="No", value=0), - ], - ) - ], - ) - await mock_entity_client.create(entity2) - - # Act - result = await metrics_service.get_all(workspace="default") - - # Assert - assert len(result.data) == 2 - assert all(isinstance(m, LLMJudgeMetricResponse) for m in result.data) - # Results might be in any order - names = {r.name for r in result.data} - assert names == {"test-metric", "test-metric-2"} - - -class TestMetricsServiceGetByName: - """Tests for MetricsManager.get_by_name method.""" - - @pytest.mark.asyncio - async def test_get_by_name_returns_metric(self, metrics_service, mock_entity_client, sample_metric_entity): - """Test get_by_name returns the metric when it exists.""" - # Arrange - Add entity to the mock entity client - await mock_entity_client.create(sample_metric_entity) - - # Act - result = await metrics_service.get_by_name(workspace="default", name="test-metric") - - # Assert - assert result is not None - assert isinstance(result, LLMJudgeMetricResponse) - assert result.created_at is not None, "missing entity private attributes" - assert result.name == "test-metric" - - @pytest.mark.asyncio - async def test_get_by_name_raises_error_when_not_found(self, metrics_service): - """Test get_by_name raises MetricRetrievalError when metric not found.""" - # Act & Assert - with pytest.raises(MetricRetrievalError) as exc_info: - await metrics_service.get_by_name(workspace="default", name="nonexistent") - - assert isinstance(exc_info.value, MetricRetrievalError) - assert exc_info.value.error_code == "METRIC_NOT_FOUND" - assert "default/nonexistent" in exc_info.value.detail - - -class TestMetricsServiceCreate: - """Tests for MetricsManager.create method.""" - - @pytest.mark.asyncio - async def test_create_without_api_key(self, metrics_service, sample_metric_entity, mock_sdk): - """Test create successfully creates a metric without API key.""" - # Act - result = await metrics_service.create(sample_metric_entity, sdk=mock_sdk) - - # Assert - assert result is not None - assert isinstance(result, LLMJudgeMetricResponse) - assert result.created_at is not None, "missing entity private attributes" - assert result.name == sample_metric_entity.name - assert result.id is not None # ID is auto-generated - - @pytest.mark.asyncio - async def test_create_bleu_metric(self, metrics_service, mock_sdk): - """Test create successfully creates a BLEU metric (no model resolution needed). - - Regression test for NVBug 5827225. - """ - # Arrange - bleu_metric = entities.BLEUMetric( - name="test-bleu-metric", - workspace="default", - references=["{{item.reference}}"], - ) - - # Act - result = await metrics_service.create(bleu_metric, sdk=mock_sdk) - - # Assert - assert result is not None - assert result.name == "test-bleu-metric" - assert result.type == "bleu" - assert result.id is not None - - @pytest.mark.asyncio - async def test_create_rouge_metric(self, metrics_service, mock_sdk): - """Test create successfully creates a ROUGE metric (no model resolution needed). - - Regression test for NVBug 5827225. - """ - # Arrange - rouge_metric = entities.ROUGEMetric( - name="test-rouge-metric", - workspace="default", - reference="{{item.reference}}", - ) - - # Act - result = await metrics_service.create(rouge_metric, sdk=mock_sdk) - - # Assert - assert result is not None - assert result.name == "test-rouge-metric" - assert result.type == "rouge" - assert result.id is not None - - @pytest.mark.asyncio - async def test_create_string_check_metric(self, metrics_service, mock_sdk): - """Test create successfully creates a StringCheck metric (no model resolution needed). - - Regression test for NVBug 5827225. - """ - # Arrange - string_check_metric = entities.StringCheckMetric( - name="test-string-check-metric", - workspace="default", - operation="contains", - left_template="{{item.response}}", - right_template="{{item.expected}}", - ) - - # Act - result = await metrics_service.create(string_check_metric, sdk=mock_sdk) - - # Assert - assert result is not None - assert result.name == "test-string-check-metric" - assert result.type == "string-check" - assert result.id is not None - - @pytest.mark.asyncio - async def test_create_with_valid_api_key(self, metrics_service, sample_metric_entity_with_secret, mock_sdk): - """Test create successfully creates a metric with valid API key secret.""" - # Arrange - mock_secret = MagicMock() - mock_secret.root = "my-secret" - mock_sdk.secrets.retrieve = AsyncMock(return_value=mock_secret) - - # Act - result = await metrics_service.create(sample_metric_entity_with_secret, sdk=mock_sdk) - - # Assert - assert result is not None - assert isinstance(result, LLMJudgeMetricResponse) - assert result.created_at is not None, "missing entity private attributes" - assert result.name == sample_metric_entity_with_secret.name - mock_sdk.secrets.retrieve.assert_called_once_with("my-secret", workspace="default") - - @pytest.mark.asyncio - async def test_create_with_invalid_api_key_raises_error( - self, metrics_service, sample_metric_entity_with_secret, mock_sdk - ): - """Test create raises MetricCreationError when API key secret not found.""" - # Arrange - mock_sdk.secrets.retrieve = AsyncMock(side_effect=create_not_found_error("Secret not found")) - - # Act & Assert - with pytest.raises(MetricCreationError) as exc_info: - await metrics_service.create(sample_metric_entity_with_secret, sdk=mock_sdk) - - assert isinstance(exc_info.value, MetricCreationError) - assert exc_info.value.error_code == "SECRET_NOT_FOUND" - assert "default/my-secret" in exc_info.value.detail - assert "test-metric-with-secret" in exc_info.value.detail - mock_sdk.secrets.retrieve.assert_called_once_with("my-secret", workspace="default") - - @pytest.mark.asyncio - async def test_create_remote_metric_validates_api_key_secret(self, metrics_service, mock_sdk): - """Test create validates remote metric API key secrets.""" - metric_entity = entities.RemoteMetric( - name="remote-metric-with-secret", - workspace="default", - url="https://remote.example.test/score", - api_key_secret="remote-secret", - body={"input": "{{sample.output_text}}"}, - scores=[RemoteScore(name="score")], - ) - - await metrics_service.create(metric_entity, sdk=mock_sdk) - - mock_sdk.secrets.retrieve.assert_called_once_with("remote-secret", workspace="default") - - -class TestMetricsServiceCreateFromRequest: - """Tests for MetricsService.create_from_request method.""" - - @pytest.mark.asyncio - async def test_create_from_request_llm_judge(self, metrics_service, sample_metric_request, mock_sdk): - """Test create_from_request creates LLMJudge metric from request DTO.""" - # Act - result = await metrics_service.create_from_request( - name="test-llm-judge", - workspace="default", - request=sample_metric_request, - sdk=mock_sdk, - ) - - # Assert - assert result is not None - assert isinstance(result, LLMJudgeMetricResponse) - assert result.created_at is not None, "missing entity private attributes" - assert result.name == "test-llm-judge" - assert result.workspace == "default" - assert result.id is not None - - @pytest.mark.asyncio - async def test_create_from_request_bleu(self, metrics_service, mock_sdk): - """Test create_from_request creates BLEU metric from request DTO.""" - from nmp.evaluator.api.v2.metrics.schemas.metrics import BLEUMetric - - # Arrange - bleu_request = BLEUMetric( - references=["{{item.reference}}"], - ) - - # Act - result = await metrics_service.create_from_request( - name="test-bleu", - workspace="default", - request=bleu_request, - sdk=mock_sdk, - ) - - # Assert - assert result is not None - assert result.name == "test-bleu" - assert result.workspace == "default" - assert result.type == "bleu" - assert result.id is not None - - @pytest.mark.asyncio - async def test_create_from_request_llm_judge_without_prompt_template( - self, - metrics_service, - mock_sdk, - ): - """Zero-config LLM Judge should auto-populate a prompt template.""" - request = LLMJudgeMetric( - description="Zero config metric", - model=Model( - url="https://inference-api.nvidia.com/v1/chat/completions", - name="nvidia/openai/gpt-oss-20b", - format=ModelFormat.OPEN_AI, - ), - scores=[ - RubricScore( - name="quality", - rubric=[ - Rubric(label="poor", value=0), - Rubric(label="good", value=1), - ], - ) - ], - ) - - result = await metrics_service.create_from_request( - name="test-llm-judge-zero-config", - workspace="default", - request=request, - sdk=mock_sdk, - ) - - assert isinstance(result, LLMJudgeMetricResponse) - assert result.prompt_template == default_judge_prompt_template_chat() - - -class TestMetricsServiceDelete: - """Tests for MetricsManager.delete method.""" - - @pytest.mark.asyncio - async def test_delete_successful(self, metrics_service, mock_entity_client, sample_metric_entity): - """Test delete successfully deletes a metric.""" - # Arrange - Add entity first - await mock_entity_client.create(sample_metric_entity) - - # Act - result = await metrics_service.delete(workspace="default", name="test-metric") - - # Assert - assert result.message == "Resource deleted successfully" - - # Verify it's actually deleted - with pytest.raises(MetricRetrievalError): - await metrics_service.get_by_name(workspace="default", name="test-metric") - - @pytest.mark.asyncio - async def test_delete_raises_error_when_not_found(self, metrics_service): - """Test delete raises MetricDeletionError when metric not found.""" - # Act & Assert - with pytest.raises(MetricDeletionError) as exc_info: - await metrics_service.delete(workspace="default", name="nonexistent") - - assert isinstance(exc_info.value, MetricDeletionError) - assert exc_info.value.error_code == "METRIC_NOT_FOUND" - assert "default/nonexistent" in exc_info.value.detail - - -class TestGetRegisteredSystemMetrics: - """Tests for MetricsManager._get_registered_system_metrics method.""" - - @pytest.mark.asyncio - async def test_returns_only_system_metric_entities( - self, - metrics_service, - mock_entity_client, - sample_metric_entity, - sample_system_metric_entity, - ): - """Test helper returns typed system metrics scoped to the system workspace.""" - await mock_entity_client.create(sample_metric_entity) - await mock_entity_client.create(sample_system_metric_entity) - - result = await metrics_service._get_registered_system_metrics() - - assert len(result.data) == 1 - assert isinstance(result.data[0], entities.SystemMetric) - assert result.data[0].name == sample_system_metric_entity.name - assert result.data[0].workspace == SYSTEM_WORKSPACE - - -class TestDeleteAllSystemMetrics: - """Tests for MetricsManager.delete_all_system_metrics method.""" - - @pytest.mark.asyncio - async def test_deletes_only_system_metrics( - self, - metrics_service, - mock_entity_client, - sample_metric_entity, - sample_system_metric_entity, - ): - """Test helper deletes all system metrics without touching regular metrics.""" - second_system_metric = entities.SystemMetric( - name="system-metric-2", - description="Second system metric", - ) - await mock_entity_client.create(sample_metric_entity) - await mock_entity_client.create(sample_system_metric_entity) - await mock_entity_client.create(second_system_metric) - - await metrics_service.delete_all_system_metrics() - - remaining_system_metrics = await mock_entity_client.list(entities.SystemMetric, workspace=SYSTEM_WORKSPACE) - remaining_regular_metrics = await mock_entity_client.list(entities.Metric, workspace="default") - - assert remaining_system_metrics.data == [] - assert len(remaining_regular_metrics.data) == 1 - assert remaining_regular_metrics.data[0].name == sample_metric_entity.name - - -class TestMetricsServiceExists: - """Tests for MetricsManager.exists method.""" - - @pytest.mark.asyncio - async def test_exists_returns_true_when_metric_exists( - self, metrics_service, mock_entity_client, sample_metric_entity - ): - """Test exists returns True when metric exists.""" - # Arrange - Add entity first - await mock_entity_client.create(sample_metric_entity) - - # Act - result = await metrics_service.exists(workspace="default", name="test-metric") - - # Assert - assert result is True - - @pytest.mark.asyncio - async def test_exists_returns_false_when_metric_not_found(self, metrics_service): - """Test exists returns False when metric not found.""" - # Act - result = await metrics_service.exists(workspace="default", name="nonexistent") - - # Assert - assert result is False - - -class TestMetricsServiceEdgeCases: - """Tests for edge cases and error conditions.""" - - @pytest.mark.asyncio - async def test_get_all_with_different_workspace(self, metrics_service, mock_entity_client, sample_metric_entity): - """Test get_all filters by workspace_id correctly.""" - # Arrange - Add metric to default workspace - await mock_entity_client.create(sample_metric_entity) - - # Add metric to production workspace - prod_entity = entities.LLMJudgeMetric( - name="prod-metric", - workspace="production", - type=MetricType.LLM_JUDGE, - description="Production metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate: {output}", - scores=[ - RubricScore( - name="score", - description="Score", - rubric=[ - Rubric(label="good", description="Good", value=1), - Rubric(label="bad", description="Bad", value=0), - ], - ) - ], - ) - await mock_entity_client.create(prod_entity) - - # Act - default_results = await metrics_service.get_all(workspace="default") - prod_results = await metrics_service.get_all(workspace="production") - - # Assert - each workspace has only its own metrics - assert len(default_results.data) == 1 - assert default_results.data[0].name == "test-metric" - assert len(prod_results.data) == 1 - assert prod_results.data[0].name == "prod-metric" - - @pytest.mark.asyncio - async def test_create_with_malformed_api_key_reference(self, metrics_service, mock_sdk): - """Test create handles malformed API key reference gracefully.""" - # Arrange - This should fail during secret validation because the secret is not found. - # This test verifies the error handling in the service layer. - metric_entity = entities.LLMJudgeMetric( - name="test-metric", - workspace="default", - description="Test", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - api_key_secret=SecretRef(root="valid-secret"), # Valid format - ), - prompt_template="Rate: {output}", - scores=[ - RubricScore( - name="score", - description="Score", - rubric=[ - Rubric(label="good", description="Good", value=1), - Rubric(label="bad", description="Bad", value=0), - ], - ) - ], - ) - - mock_sdk.secrets.retrieve = AsyncMock(side_effect=create_not_found_error("Secret not found")) - - # Act & Assert - with pytest.raises(MetricCreationError): - await metrics_service.create(metric_entity, sdk=mock_sdk) diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_service_evaluate.py b/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_service_evaluate.py deleted file mode 100644 index 093a97345d..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_service_evaluate.py +++ /dev/null @@ -1,1005 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from builtins import ExceptionGroup -from typing import Generator -from unittest.mock import AsyncMock, patch - -import nmp.evaluator.entities as entities -import pytest -from nemo_evaluator_sdk import LLMJudgeMetric, StringCheckMetric -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.metrics.ragas import TopicAdherenceMetric -from nemo_evaluator_sdk.values import ( - AggregatedMetricResult, - DatasetRows, - EvaluationResult, - MetricOutput, - MetricResult, - Model, - RangeScore, - RowScore, -) -from nmp.common.entities import EntityClient -from nmp.evaluator.api.v2.metrics.manager import ( - MetricEvaluationError, - MetricRetrievalError, - MetricsManager, -) -from nmp.evaluator.api.v2.metrics.schemas import metrics as schemas -from nmp.evaluator.api.v2.metrics.schemas import metrics_resp -from nmp.evaluator.api.v2.metrics.schemas.evaluation import MetricEvaluationResponse, MetricEvaluationRowScore -from nmp.evaluator.app.values import MetricRef, ModelRef -from nmp.testing import create_test_client - - -@pytest.fixture -def mock_entity_client() -> Generator[EntityClient, None, None]: - """Real EntityClient backed by in-memory storage.""" - workspaces = ["default", "test-workspace", "system"] - with create_test_client(client_type=EntityClient, workspaces=workspaces) as client: - yield client - - -# mock_sdk fixture is now provided by conftest.py - - -@pytest.fixture -def metrics_service(mock_entity_client, mock_sdk) -> MetricsManager: - """MetricsManager instance with mocked EntityClient.""" - return MetricsManager(mock_entity_client) - - -@pytest.fixture -def sample_metric() -> entities.StringCheckMetric: - """Create a sample string-check metric for testing.""" - return entities.StringCheckMetric( - name="test-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - - -class TestGetMetric: - """Tests for MetricsManager.get_metric method.""" - - @pytest.mark.asyncio - async def test_get_metric_by_urn(self, metrics_service, sample_metric, mock_sdk): - """Test resolving a metric by URN.""" - # First create the metric - await metrics_service.create(sample_metric, sdk=mock_sdk) - - # Resolve by ref - ref = MetricRef(root="test-workspace/test-metric") - resolved = await metrics_service.get_metric(ref) - - assert resolved.type == sample_metric.type - assert isinstance(resolved, StringCheckMetric) - assert resolved.left_template == sample_metric.left_template - assert resolved.right_template == sample_metric.right_template - assert resolved.operation == sample_metric.operation - - @pytest.mark.asyncio - async def test_get_metric_by_urn_not_found(self, metrics_service): - """Test that resolving a non-existent URN raises MetricRetrievalError.""" - ref = MetricRef(root="nonexistent/metric") - - with pytest.raises(MetricRetrievalError) as exc_info: - await metrics_service.get_metric(ref) - - err = exc_info.value - assert err.error_code == "METRIC_NOT_FOUND" - - @pytest.mark.asyncio - async def test_get_inline_metric(self, metrics_service, sample_metric, mock_sdk): - """Test resolving an inline metric definition (entity-based with workspace).""" - # First create the metric - await metrics_service.create(sample_metric, sdk=mock_sdk) - - resolved = await metrics_service.get_by_name(sample_metric.workspace, sample_metric.name) - - assert resolved.type == sample_metric.type - assert isinstance(resolved, metrics_resp.StringCheckMetricResponse), type(resolved) - assert resolved.left_template == sample_metric.left_template - assert resolved.right_template == sample_metric.right_template - assert resolved.operation == sample_metric.operation - - @pytest.mark.asyncio - async def test_get_metric_resolves_model_refs(self, metrics_service): - """Test that get_metric resolves ModelRef fields to Model before returning. - - When an inline metric contains ModelRef strings (e.g. judge_model: "workspace/model"), - get_metric must resolve them to Model instances so the app layer receives - only concrete Model objects. - """ - # Create an API-layer metric with a ModelRef for judge_model - inline_metric = schemas.TopicAdherenceMetric( - judge_model=ModelRef("test-workspace/my-judge-model"), - metric_mode="f1", - ) - - # The resolved Model that should replace the ModelRef - resolved_model = Model( - url="http://resolved-gateway:8000/v1", - name="my-judge-model", - format=ModelFormat.NVIDIA_NIM, - ) - - # Mock resolve_model to return the resolved model - with patch( - "nmp.evaluator.api.v2.metrics.manager.resolve_model", - new_callable=AsyncMock, - return_value=resolved_model, - ) as mock_resolve: - result = await metrics_service.get_metric(inline_metric) - - # resolve_model should have been called with the ModelRef - mock_resolve.assert_called_once() - call_arg = mock_resolve.call_args[0][0] - assert isinstance(call_arg, ModelRef) - assert call_arg.root == "test-workspace/my-judge-model" - - # The returned app-layer metric should have judge_model as a resolved Model - assert isinstance(result, TopicAdherenceMetric) - assert isinstance(result.judge_model, Model) - assert result.judge_model.url == "http://resolved-gateway:8000/v1" - assert result.judge_model.name == "my-judge-model" - - -class TestEvaluate: - """Tests for MetricsManager.evaluate method.""" - - @pytest.mark.asyncio - async def test_evaluate_with_inline_metric(self, metrics_service, mock_sdk): - """Test evaluation with an inline metric definition (entity-based).""" - metric = entities.StringCheckMetric( - name="string-equals", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - - dataset = DatasetRows( - rows=[ - {"expected": "hello", "output": "hello"}, # Match - {"expected": "world", "output": "world"}, # Match - {"expected": "foo", "output": "bar"}, # No match - ], - ) - - result = await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert isinstance(result, MetricEvaluationResponse) - # Response contains the full metric definition - assert len(result.row_scores) == 3 - - # Check individual results have correct indices and scores - # All rows should have scores (no errors expected for this simple metric) - assert result.row_scores[0].index == 0 - assert result.row_scores[0].scores["string-check"] == 1.0 - assert result.row_scores[0].error is None - assert result.row_scores[1].index == 1 - assert result.row_scores[1].scores["string-check"] == 1.0 - assert result.row_scores[1].error is None - assert result.row_scores[2].index == 2 - assert result.row_scores[2].scores["string-check"] == 0.0 - assert result.row_scores[2].error is None - - # Aggregate should be mean: (1 + 1 + 0) / 3 = 0.666... - assert abs(result.aggregate_scores[0].mean - 2 / 3) < 0.01 - - @pytest.mark.asyncio - async def test_evaluate_with_inline_metric_no_workspace_name(self, metrics_service, mock_sdk): - """Test evaluation with InlineMetric that doesn't have workspace/name. - - This is the primary use case for the /evaluate endpoint: users can define - a metric inline without needing to specify workspace or name. - """ - # StringCheckMetric doesn't require workspace or name - metric = StringCheckMetric( - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - - dataset = DatasetRows( - rows=[ - {"expected": "hello", "output": "hello"}, # Match - {"expected": "foo", "output": "bar"}, # No match - ], - ) - - # Workspace is provided by the endpoint, not the metric - result = await metrics_service.evaluate("my-workspace", metric, dataset, sdk=mock_sdk) - - assert isinstance(result, MetricEvaluationResponse) - # Response contains the inline metric definition (no workspace/name) - assert result.metric.model_dump(exclude_none=True) == metric.model_dump(exclude_none=True) - assert result.metric.type == "string-check" - assert len(result.row_scores) == 2 - assert result.row_scores[0].scores["string-check"] == 1.0 - assert result.row_scores[1].scores["string-check"] == 0.0 - - @pytest.mark.asyncio - async def test_evaluate_with_stored_metric(self, metrics_service, sample_metric, mock_sdk): - """Test evaluation with a stored metric referenced by URN.""" - # Store the metric first - await metrics_service.create(sample_metric, sdk=mock_sdk) - - # Reference by URN - ref = MetricRef(root="test-workspace/test-metric") - dataset = DatasetRows( - rows=[{"expected": "match", "output": "match"}], - ) - - result = await metrics_service.evaluate("test-workspace", ref, dataset, sdk=mock_sdk) - - # Response contains the resolved metric definition - assert len(result.row_scores) == 1 - assert result.row_scores[0].scores["string-check"] == 1.0 - - @pytest.mark.asyncio - async def test_evaluate_metric_not_found(self, metrics_service, mock_sdk): - """Test that referencing a non-existent metric raises error.""" - ref = MetricRef(root="nonexistent/metric") - dataset = DatasetRows(rows=[{"input": "test", "output": "test"}]) - - with pytest.raises(MetricRetrievalError) as exc_info: - await metrics_service.evaluate("test-workspace", ref, dataset, sdk=mock_sdk) - - err = exc_info.value - assert err.error_code == "METRIC_NOT_FOUND" - - @pytest.mark.asyncio - async def test_evaluate_fails_fast_by_default(self, metrics_service, mock_sdk): - """Test that evaluation fails fast (raises on first error) by default. - - Non-LLM metrics don't have ignore_request_failure, so they should fail fast. - """ - # Use a metric that will fail due to invalid template - metric = entities.StringCheckMetric( - name="bad-metric", - workspace="test-workspace", - operation="equals", - left_template="{{nonexistent_field}}", - right_template="{{output}}", - ) - - dataset = DatasetRows( - rows=[ - {"input": "test1", "output": "test1"}, # Will fail - {"input": "test2", "output": "test2"}, # Won't be reached - ], - ) - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - # Should fail fast with an error mentioning a row index - err = exc_info.value - assert "Evaluation failed at row" in err.detail - assert "nonexistent_field" in err.detail - - @pytest.mark.asyncio - async def test_evaluate_respects_limit_samples(self, metrics_service, sample_metric, mock_sdk): - """Test that limit_samples limits evaluation.""" - dataset = DatasetRows( - rows=[{"expected": f"val{i}", "output": f"val{i}"} for i in range(50)], - ) - - result = await metrics_service.evaluate("test-workspace", sample_metric, dataset, limit_samples=5, sdk=mock_sdk) - - assert len(result.row_scores) == 5 - - @pytest.mark.asyncio - async def test_evaluate_aggregate_fields_default(self, metrics_service, sample_metric, mock_sdk): - """Test that default aggregate fields are returned.""" - dataset = DatasetRows( - rows=[{"expected": "hello", "output": "hello"}], - ) - - result = await metrics_service.evaluate("test-workspace", sample_metric, dataset, sdk=mock_sdk) - - # Serialize the aggregate score to check fields - agg_dict = result.aggregate_scores[0].model_dump() - - # Required fields should always be present - assert "name" in agg_dict - assert "count" in agg_dict - - # Default optional fields should be present - assert "nan_count" in agg_dict - assert "sum" in agg_dict - assert "mean" in agg_dict - assert "min" in agg_dict - assert "max" in agg_dict - - # Extended fields should NOT be present by default - assert "std_dev" not in agg_dict - assert "variance" not in agg_dict - assert "percentiles" not in agg_dict - assert "histogram" not in agg_dict - - @pytest.mark.asyncio - async def test_evaluate_aggregate_fields_custom(self, metrics_service, sample_metric, mock_sdk): - """Test that custom aggregate fields can be requested.""" - dataset = DatasetRows( - rows=[{"expected": "hello", "output": "hello"}], - ) - - # Request only mean, std_dev, and percentiles - custom_fields = frozenset({"mean", "std_dev", "percentiles"}) - result = await metrics_service.evaluate( - "test-workspace", sample_metric, dataset, aggregate_fields=custom_fields, sdk=mock_sdk - ) - - # Serialize the aggregate score to check fields - agg_dict = result.aggregate_scores[0].model_dump() - - # Required fields are ALWAYS present (name, count) - assert "name" in agg_dict - assert "count" in agg_dict - - # Requested fields should be present - assert "mean" in agg_dict - assert "std_dev" in agg_dict - assert "percentiles" in agg_dict - - # Non-requested optional fields should NOT be present - assert "sum" not in agg_dict - assert "nan_count" not in agg_dict - assert "histogram" not in agg_dict - - @pytest.mark.asyncio - async def test_evaluate_ignored_failures_do_not_leak_synthetic_metric_scores( - self, - metrics_service, - mock_sdk, - mocker, - ): - """Ignored failures should keep failed rows out of API scores and aggregates.""" - metric = entities.LLMJudgeMetric( - name="judge-metric", - workspace="test-workspace", - description="Test judge metric", - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - format=ModelFormat.OPEN_AI, - ), - prompt_template="Rate the response: {output}", - scores=[ - RangeScore( - name="quality", - description="Quality score", - minimum=0.0, - maximum=1.0, - ) - ], - ignore_request_failure=True, - ) - runtime_metric = LLMJudgeMetric( - model=metric.model, - prompt_template=metric.prompt_template, - scores=metric.scores, - ignore_request_failure=metric.ignore_request_failure, - ) - dataset = DatasetRows(rows=[{"output": "good"}, {"output": "bad"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=runtime_metric, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=[ - ( - 0, - MetricResult(outputs=[MetricOutput(name="quality", value=0.8)]), - RowScore( - row_index=0, - item={"output": "good"}, - sample={}, - metrics={"quality": [MetricOutput(name="quality", value=0.8)]}, - requests=[], - ), - ), - ( - 1, - MetricResult(outputs=[MetricOutput(name="llm-judge", value=float("nan"))]), - RowScore( - row_index=1, - item={"output": "bad"}, - sample={}, - metrics={"llm-judge": [MetricOutput(name="llm-judge", value=float("nan"))]}, - requests=[], - metric_errors={"llm-judge": "request timed out"}, - ), - ), - ], - ) - - result = await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert result.row_scores[0].scores == {"quality": 0.8} - assert result.row_scores[0].error is None - assert result.row_scores[1].scores is None - assert result.row_scores[1].error == "llm-judge: request timed out" - assert [score.name for score in result.aggregate_scores] == ["quality"] - - -class TestEvaluateRowScoresFormat: - """Tests for row_scores structure (combined success/error items).""" - - @pytest.mark.asyncio - async def test_successful_row_has_scores_no_error(self, metrics_service, sample_metric, mock_sdk): - """Test that successful rows have scores and null error.""" - dataset = DatasetRows( - rows=[{"expected": "hello", "output": "hello"}], - ) - - result = await metrics_service.evaluate("test-workspace", sample_metric, dataset, sdk=mock_sdk) - - row_score = result.row_scores[0] - assert row_score.scores is not None - assert "string-check" in row_score.scores - assert row_score.error is None - - @pytest.mark.asyncio - async def test_row_includes_original_data(self, metrics_service, sample_metric, mock_sdk): - """Test that row_scores include the original row data.""" - original_row = {"expected": "hello", "output": "hello", "extra_field": "extra_value"} - dataset = DatasetRows(rows=[original_row]) - - result = await metrics_service.evaluate("test-workspace", sample_metric, dataset, sdk=mock_sdk) - - assert result.row_scores[0].row == original_row - - def test_row_scores_serializes_non_finite_values_as_null(self): - """Non-finite per-row scores should be exposed as null for JSON-compliant responses.""" - row_score = RowScore( - row_index=0, - item={"expected": "x", "output": "x"}, - sample={}, - metrics={"string-check": [MetricOutput(name="string-check", value=float("nan"))]}, - requests=[], - ) - - result = MetricEvaluationRowScore.from_row_score( - row_score, - row={"expected": "x", "output": "x"}, - index=0, - ) - - assert result.scores == {"string-check": None} - - def test_failed_row_scores_remain_null_when_pipeline_includes_placeholder_metrics(self): - """Failed rows should keep `scores=null` even if the pipeline attached NaN placeholders.""" - row_score = RowScore( - row_index=1, - item={"expected": "x", "output": "x"}, - sample={}, - metrics={"llm-judge": [MetricOutput(name="llm-judge", value=float("nan"))]}, - requests=[], - metric_errors={"llm-judge": "request timed out"}, - ) - - result = MetricEvaluationRowScore.from_row_score( - row_score, - row={"expected": "x", "output": "x"}, - index=1, - ) - - assert result.scores is None - assert result.error == "llm-judge: request timed out" - - @pytest.mark.asyncio - async def test_evaluate_raises_on_out_of_bounds_row_index(self, metrics_service, mock_sdk, mocker): - """Pipeline returning an out-of-bounds row_index should raise MetricEvaluationError.""" - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - runtime_metric = StringCheckMetric( - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=runtime_metric, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=[ - ( - 0, - MetricResult(outputs=[MetricOutput(name="string-check", value=1.0)]), - RowScore( - row_index=999, # out-of-bounds for a 1-row dataset - item={"expected": "a", "output": "a"}, - sample={}, - metrics={"string-check": [MetricOutput(name="string-check", value=1.0)]}, - requests=[], - ), - ), - ], - ) - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert exc_info.value.detail == "Pipeline returned out-of-bounds row_index=999 for 1 rows" - - def test_row_scores_fall_back_to_list_position_when_sdk_row_index_is_missing(self): - """Missing SDK row_index values should still produce a concrete API index.""" - row_score = RowScore( - row_index=None, - item={"expected": "x", "output": "x"}, - sample={}, - metrics={"string-check": [MetricOutput(name="string-check", value=1.0)]}, - requests=[], - ) - - result = MetricEvaluationRowScore.from_row_score( - row_score, - row={"expected": "x", "output": "x"}, - index=3, - ) - - assert result.index == 3 - assert result.scores == {"string-check": 1.0} - - -class TestFromRowScore: - """Tests for MetricEvaluationRowScore.from_row_score edge cases.""" - - def test_multiple_metrics_flattened(self): - """Multiple metric keys should be flattened into a single scores dict.""" - row_score = RowScore( - row_index=0, - item={}, - sample={}, - metrics={ - "precision": [MetricOutput(name="precision", value=0.9)], - "recall": [MetricOutput(name="recall", value=0.8)], - }, - requests=[], - ) - - result = MetricEvaluationRowScore.from_row_score(row_score, row={"k": "v"}, index=0) - - assert result.scores == {"precision": 0.9, "recall": 0.8} - assert result.error is None - - def test_all_nan_scores_become_all_null(self): - """If every score is NaN the dict should contain only None values.""" - row_score = RowScore( - row_index=0, - item={}, - sample={}, - metrics={"m": [MetricOutput(name="m", value=float("nan"))]}, - requests=[], - ) - - result = MetricEvaluationRowScore.from_row_score(row_score, row={}, index=0) - - assert result.scores == {"m": None} - - def test_inf_score_becomes_null(self): - """Positive and negative infinity should be serialized as null.""" - row_score = RowScore( - row_index=0, - item={}, - sample={}, - metrics={ - "pos": [MetricOutput(name="pos", value=float("inf"))], - "neg": [MetricOutput(name="neg", value=float("-inf"))], - }, - requests=[], - ) - - result = MetricEvaluationRowScore.from_row_score(row_score, row={}, index=0) - - assert result.scores == {"pos": None, "neg": None} - - def test_empty_metrics_dict_yields_empty_scores(self): - """Successful rows with no score entries should yield scores={}. - - Restores the pre-refactor ``/metric-evaluate`` contract where any row - with a ``MetricResult`` emitted ``scores={}`` (rather than ``None``). - Only rows with an ``error`` should serialize with ``scores=null``. - """ - row_score = RowScore( - row_index=0, - item={}, - sample={}, - metrics={}, - requests=[], - ) - - result = MetricEvaluationRowScore.from_row_score(row_score, row={}, index=0) - - assert result.scores == {} - assert result.error is None - - def test_empty_per_metric_score_list_yields_empty_scores(self): - """A metrics dict with empty score lists should still yield scores={}.""" - row_score = RowScore( - row_index=0, - item={}, - sample={}, - metrics={"m": []}, - requests=[], - ) - - result = MetricEvaluationRowScore.from_row_score(row_score, row={}, index=0) - - assert result.scores == {} - assert result.error is None - - def test_error_with_multiple_metric_errors(self): - """Multiple metric_errors should be joined in the error string.""" - row_score = RowScore( - row_index=0, - item={}, - sample={}, - metrics={"a": [MetricOutput(name="a", value=float("nan"))]}, - requests=[], - metric_errors={"a": "timeout", "b": "rate limited"}, - ) - - result = MetricEvaluationRowScore.from_row_score(row_score, row={}, index=0) - - assert result.scores is None - assert result.error is not None - assert "a: timeout" in result.error - assert "b: rate limited" in result.error - - -class TestEvaluateErrorPaths: - """Tests for evaluate() error handling paths.""" - - @pytest.mark.asyncio - async def test_non_evaluation_error_is_wrapped_with_normalize(self, metrics_service, mock_sdk, mocker): - """When pipeline raises a non-EvaluationError, it should be wrapped via normalize_evaluation_failure.""" - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=RuntimeError("internal pipeline failure"), - ) - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert exc_info.value.error_code == "EVALUATION_FAILED" - assert "internal pipeline failure" in exc_info.value.detail - - @pytest.mark.asyncio - async def test_exception_group_with_evaluation_error_extracts_row_detail(self, metrics_service, mock_sdk, mocker): - """ExceptionGroup wrapping an EvaluationError should surface the row index and message.""" - from nemo_evaluator_sdk.execution.values import EvaluationError - - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - inner = EvaluationError(index=3, message="'missing_field' is undefined") - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=ExceptionGroup("tasks", [inner]), - ) - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert "Evaluation failed at row 3" in exc_info.value.detail - assert "missing_field" in exc_info.value.detail - - @pytest.mark.asyncio - async def test_exception_group_with_non_leading_evaluation_error_extracts_row_detail( - self, metrics_service, mock_sdk, mocker - ): - """A sibling EvaluationError past position [0] should still be surfaced.""" - from nemo_evaluator_sdk.execution.values import EvaluationError - - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - inner = EvaluationError(index=2, message="'missing_field' is undefined") - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=ExceptionGroup( - "tasks", - [ - RuntimeError("sibling before"), - inner, - RuntimeError("sibling after"), - ], - ), - ) - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert "Evaluation failed at row 2" in exc_info.value.detail - assert "missing_field" in exc_info.value.detail - - @pytest.mark.asyncio - async def test_nested_exception_group_with_evaluation_error_extracts_row_detail( - self, metrics_service, mock_sdk, mocker - ): - """An EvaluationError nested inside an inner ExceptionGroup should still be surfaced.""" - from nemo_evaluator_sdk.execution.values import EvaluationError - - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - inner = EvaluationError(index=5, message="nested cause") - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=ExceptionGroup( - "outer", - [ - RuntimeError("sibling"), - ExceptionGroup("inner", [RuntimeError("noise"), inner]), - ], - ), - ) - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert "Evaluation failed at row 5" in exc_info.value.detail - assert "nested cause" in exc_info.value.detail - - @pytest.mark.asyncio - async def test_unexpected_error_is_logged(self, metrics_service, mock_sdk, mocker): - """Non-EvaluationError exceptions should trigger a logger.exception call.""" - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=TypeError("unexpected bug"), - ) - mock_logger = mocker.patch("nmp.evaluator.api.v2.metrics.manager._logger") - - with pytest.raises(MetricEvaluationError): - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - mock_logger.exception.assert_called_once() - assert "Unexpected failure" in mock_logger.exception.call_args[0][0] - - @pytest.mark.asyncio - async def test_post_pipeline_finalize_failure_is_wrapped(self, metrics_service, mock_sdk, mocker): - """Unexpected finalize failures should be logged and wrapped as EVALUATION_FAILED.""" - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=[], - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.finalize_evaluation_result", - new_callable=AsyncMock, - side_effect=RuntimeError("post-pipeline finalize failure"), - ) - mock_logger = mocker.patch("nmp.evaluator.api.v2.metrics.manager._logger") - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert exc_info.value.error_code == "EVALUATION_FAILED" - assert exc_info.value.detail == "post-pipeline finalize failure" - mock_logger.exception.assert_called_once() - assert "post-pipeline" in mock_logger.exception.call_args[0][0] - - @pytest.mark.asyncio - async def test_post_pipeline_from_row_score_failure_is_wrapped(self, metrics_service, mock_sdk, mocker): - """Row-score conversion failures should be logged and wrapped as EVALUATION_FAILED.""" - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - evaluation_result = EvaluationResult( - row_scores=[ - RowScore( - row_index=0, - item={"expected": "a", "output": "a"}, - sample={}, - metrics={"string-check": [MetricOutput(name="string-check", value=1.0)]}, - requests=[], - ) - ], - aggregate_scores=AggregatedMetricResult(scores=[]), - ) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=[], - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.finalize_evaluation_result", - new_callable=AsyncMock, - return_value=evaluation_result, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.MetricEvaluationRowScore.from_row_score", - side_effect=RuntimeError("row conversion blew up"), - ) - mock_logger = mocker.patch("nmp.evaluator.api.v2.metrics.manager._logger") - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert exc_info.value.error_code == "EVALUATION_FAILED" - assert exc_info.value.detail == "row conversion blew up" - mock_logger.exception.assert_called_once() - assert "post-pipeline" in mock_logger.exception.call_args[0][0] - - @pytest.mark.asyncio - async def test_post_pipeline_metric_response_validation_failure_is_wrapped(self, metrics_service, mock_sdk, mocker): - """Metric response validation failures should be logged and wrapped as EVALUATION_FAILED.""" - metric = entities.StringCheckMetric( - name="sc-metric", - workspace="test-workspace", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - dataset = DatasetRows(rows=[{"expected": "a", "output": "a"}]) - evaluation_result = EvaluationResult( - row_scores=[], - aggregate_scores=AggregatedMetricResult(scores=[]), - ) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=[], - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.finalize_evaluation_result", - new_callable=AsyncMock, - return_value=evaluation_result, - ) - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.MetricResponseAdapter.validate_python", - side_effect=ValueError("metric response validation failed"), - ) - mock_logger = mocker.patch("nmp.evaluator.api.v2.metrics.manager._logger") - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert exc_info.value.error_code == "EVALUATION_FAILED" - assert exc_info.value.detail == "metric response validation failed" - mock_logger.exception.assert_called_once() - assert "post-pipeline" in mock_logger.exception.call_args[0][0] - - @pytest.mark.asyncio - async def test_metric_init_failure_raises_evaluation_error(self, metrics_service, mock_sdk, mocker): - """ValueError during metric initialization should be wrapped in MetricEvaluationError.""" - metric = entities.StringCheckMetric( - name="bad-init", - workspace="test-workspace", - operation="equals", - left_template="{{x}}", - right_template="{{y}}", - ) - dataset = DatasetRows(rows=[{"x": "a", "y": "a"}]) - - mocker.patch( - "nmp.evaluator.api.v2.metrics.manager.new_metric", - new_callable=AsyncMock, - side_effect=ValueError("unsupported metric config"), - ) - - with pytest.raises(MetricEvaluationError) as exc_info: - await metrics_service.evaluate("test-workspace", metric, dataset, sdk=mock_sdk) - - assert exc_info.value.error_code == "EVALUATION_FAILED" - assert "Failed to initialize metric" in exc_info.value.detail - assert "unsupported metric config" in exc_info.value.detail diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_v2_metrics_endpoints.py b/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_v2_metrics_endpoints.py deleted file mode 100644 index 15e9164601..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/metrics/test_v2_metrics_endpoints.py +++ /dev/null @@ -1,1544 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from typing import Any, Generator, cast -from unittest.mock import AsyncMock, patch - -import nmp.evaluator.app.values as app -import nmp.evaluator.entities as entities -import pytest -import pytest_asyncio -import yaml -from fastapi import FastAPI, HTTPException -from fastapi.testclient import TestClient -from nemo_evaluator_sdk.values import AggregatedMetricResult -from nemo_evaluator_sdk.values.metrics import default_judge_prompt_template_chat -from nemo_platform_plugin.jobs.api_factory import _validate_and_resolve_job_output -from nemo_platform_plugin.jobs.image import get_qualified_image -from nmp.common.entities import EntityClient -from nmp.common.jobs.constants import EPHEMERAL_TASK_STORAGE_PATH_ENVVAR, PERSISTENT_JOB_STORAGE_PATH_ENVVAR -from nmp.evaluator.api.v2.common.query_params import AggregateFieldNameList -from nmp.evaluator.api.v2.metrics.endpoints import ( - create_metric, - delete_metric, - evaluate_metric, - get_metric, - get_metrics_manager, - platform_job_config_compiler, - router, -) -from nmp.evaluator.api.v2.metrics.manager import MetricsManager -from nmp.evaluator.api.v2.metrics.schemas.evaluation import ( - EvaluateDatasetRows, - MetricEvaluationRequest, - MetricEvaluationResponse, -) -from nmp.evaluator.api.v2.metrics.schemas.jobs import ( - MetricJob, - MetricJobAdapter, - MetricOfflineJob, - MetricOnlineJob, - MetricRetrieverJob, -) -from nmp.evaluator.api.v2.metrics.schemas.metrics import ( - BLEUMetric, - LLMJudgeMetric, - RemoteMetric, - ROUGEMetric, - StringCheckMetric, -) -from nmp.evaluator.api.v2.metrics.schemas.metrics_resp import ( - MetricJobResult, - MetricJobResultsListResponse, - MetricResponseAdapter, - MetricsListResponse, -) -from nmp.evaluator.app.evalfactory.agentic_eval import AgenticEvalHandler -from nmp.evaluator.app.evalfactory.retriever import RetrieverHandler -from nmp.evaluator.app.jobs.fileset import fileset_entrypoint_args -from nmp.evaluator.config import settings -from nmp.testing import create_test_client - -WORKSPACE = "my-workspace" - -# Mirror the job_route_factory configuration from endpoints.py to derive -# the realistic parameters that create_job passes to the compiler. -_, transformer_func = cast( - tuple[MetricJob, None], - _validate_and_resolve_job_output( - job_output=None, # not configured in factory - job_input=MetricJob, - input_to_output=None, # not configured in factory - ), -) - - -def _compiler_args( - original_spec: MetricJob, - workspace: str, - entity_client: EntityClient, -) -> tuple[MetricJob, str | None]: - """Derive transformed_spec and job_name as job_route_factory's create_job would.""" - job_name = None - transformed_spec = ( - transformer_func(original_spec, workspace, entity_client, job_name) if transformer_func else original_spec - ) - return transformed_spec, job_name - - -def test_metric_job_params_reject_aggregate_fields() -> None: - with pytest.raises(ValueError, match="Extra inputs are not permitted"): - MetricJobAdapter.validate_python( - { - "metric": "default/exact-match", - "dataset": "default/dataset", - "params": {"aggregate_fields": ["mean"]}, - } - ) - - -def _subset_match(expected: dict[str, Any], actual: dict[str, Any], path: str = "") -> list[str]: - """Check if expected dict is a subset of actual dict. Returns list of mismatches.""" - errors = [] - for key, expected_value in expected.items(): - current_path = f"{path}.{key}" if path else key - if key not in actual: - errors.append(f"Missing key: {current_path}") - continue - actual_value = actual[key] - if isinstance(expected_value, dict) and isinstance(actual_value, dict): - errors.extend(_subset_match(expected_value, actual_value, current_path)) - elif expected_value != actual_value: - errors.append(f"Mismatch at {current_path}: expected {expected_value!r}, got {actual_value!r}") - return errors - - -@pytest.fixture -def mock_entity_client() -> Generator[EntityClient, None, None]: - """Real EntityClient backed by in-memory storage for integration-style testing.""" - # Include workspaces needed by tests (default + cross-workspace tests) - workspaces = ["default", "system"] - with create_test_client(client_type=EntityClient, workspaces=workspaces) as client: - yield client - - -# mock_sdk fixture is now provided by conftest.py - - -@pytest.fixture -def metrics_manager(mock_entity_client) -> MetricsManager: - """MetricsManager instance with mocked EntityClient.""" - return MetricsManager(mock_entity_client) - - -@pytest_asyncio.fixture -async def create_sample_metric_job_results(mock_entity_client): - await mock_entity_client.create( - entities.MetricJobResult( - name="result1", - workspace="default", - metric=app.MetricRef("default/metric"), - dataset=app.FilesetRef("default/dataset"), - scores=AggregatedMetricResult.model_validate( - { - "scores": [ - { - "name": "accuracy", - "mean": 0.85, - "count": 100, - "nan_count": 0, - "std_dev": 0.2, - "min": 0.1, - "max": 1.0, - } - ] - } - ).scores, - ) - ) - await mock_entity_client.create( - entities.MetricJobResult( - name="result2", - workspace="default", - metric=app.MetricRef("default/metric2"), - dataset=app.FilesetRef("default/dataset2"), - scores=AggregatedMetricResult.model_validate( - {"scores": [{"name": "accuracy", "mean": 0.1, "count": 100, "nan_count": 0, "min": 0.1, "max": 0.1}]} - ).scores, - ) - ) - await mock_entity_client.create( - entities.MetricJobResult( - name="result3", - workspace="default", - metric=app.MetricRef("default/metric"), - dataset=app.FilesetRef("default/dataset"), - model=app.ModelRef("default/model"), - labels={"label": "value"}, - scores=AggregatedMetricResult.model_validate( - {"scores": [{"name": "accuracy", "mean": 0.1, "count": 100, "nan_count": 0, "min": 0.1}]} - ).scores, - ) - ) - - -def new_test_client(manager: MetricsManager, mock_sdk=None) -> TestClient: - """Fast API test client with metrics manager""" - - def override_get_metrics_manager() -> MetricsManager: - return manager - - app = FastAPI() - app.include_router(router, prefix="/apis/evaluation") - app.dependency_overrides[get_metrics_manager] = override_get_metrics_manager - - # Override get_sdk_client if mock_sdk is provided - if mock_sdk is not None: - from nmp.common.service.dependencies import get_sdk_client - - app.dependency_overrides[get_sdk_client] = lambda: mock_sdk - - return TestClient(app) - - -class TestMetricJobSecretRefSchema: - def test_metric_job_schema_uses_strict_service_secret_ref_pattern(self) -> None: - schema = MetricJobAdapter.json_schema() - secret_ref_defs = { - name: value - for name, value in schema["$defs"].items() - if isinstance(value, dict) and value.get("title") == "SecretRef" - } - - assert secret_ref_defs - assert {value["pattern"] for value in secret_ref_defs.values()} == {r"^[a-z0-9_-]+(/[a-z0-9_-]+)?$"} - - def test_metric_response_schema_uses_strict_service_secret_ref_pattern(self) -> None: - serialized_schema = str(MetricResponseAdapter.json_schema()) - - assert "^[A-Za-z0-9_-]+(/[A-Za-z0-9_-]+)?$" not in serialized_schema - assert "^[a-z0-9_-]+(/[a-z0-9_-]+)?$" in serialized_schema - - def test_model_api_key_secret_rejects_uppercase_in_service_schema(self) -> None: - with pytest.raises(ValueError, match="String should match pattern"): - MetricJobAdapter.validate_python( - { - "model": { - "url": "http://nim.test/v1/chat/completions", - "name": "my/model", - "api_key_secret": "NVIDIA_BUILD_API_KEY", - }, - "dataset": {"rows": [{"prompt": "hello world"}]}, - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - }, - "prompt_template": "{{item.prompt}}", - } - ) - - def test_llm_judge_api_key_secret_rejects_uppercase_in_service_schema(self) -> None: - with pytest.raises(ValueError, match="String should match pattern"): - LLMJudgeMetric.model_validate( - { - "type": "llm-judge", - "model": { - "url": "http://judge-nim.test/v1/chat/completions", - "name": "my/judge", - "api_key_secret": "NVIDIA_BUILD_API_KEY", - }, - "scores": [{"name": "quality", "minimum": 1, "maximum": 5}], - } - ) - - def test_remote_metric_api_key_secret_rejects_uppercase_in_service_schema(self) -> None: - with pytest.raises(ValueError, match="String should match pattern"): - RemoteMetric.model_validate( - { - "type": "remote", - "url": "http://remote.test/score", - "api_key_secret": "NVIDIA_BUILD_API_KEY", - "body": {"input": "{{item.input}}"}, - "scores": [{"name": "quality"}], - } - ) - - -@pytest.mark.asyncio -@patch.dict(os.environ, {"my_model_secret_name": "model_secret_***", "my_judge_secret_name": "judge_secret_***"}) -async def test_platform_job_config_compiler_llm_judge_metric(mock_entity_client: EntityClient, mock_sdk): - """High level test for compiling a custom in-line metric to a job spec""" - original_spec: MetricOnlineJob = MetricJobAdapter.validate_python( - { - "model": { - "url": "http://nim.test/v1/chat/completions", - "name": "my/model", - "api_key_secret": "my-model-secret-name", - }, - "dataset": { - "rows": [{"prompt": "hello world"}], - }, - "metric": { - "type": "llm-judge", - "model": { - "url": "http://judge-nim.test/v1/chat/completions", - "name": "my/judge", - "api_key_secret": "my-judge-secret-name", - }, - "inference": {"max_tokens": 100}, - "scores": [ - { - "name": "length", - "rubric": [ - {"label": "short", "value": 0}, - {"label": "medium", "value": 1}, - {"label": "long", "value": 2}, - ], - } - ], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{prompt}}"}]}, - "params": { - "limit_samples": 5, - "inference": { - "max_tokens": 300, - }, - }, - } - ) - # Mock the model reachability check - with ( - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.dataset_exists", new_callable=AsyncMock - ) as mock_fileset_exists, - patch("nmp.evaluator.app.inference.verify_model_reachable", new_callable=AsyncMock) as mock_verify, - ): - mock_fileset_exists.return_value = True - mock_verify.return_value = {"status": "success"} - - transformed_spec, _ = _compiler_args(original_spec, WORKSPACE, mock_entity_client) - platform_job_spec = await platform_job_config_compiler( - WORKSPACE, original_spec, transformed_spec, mock_entity_client, None, mock_sdk - ) - - # Verify job can be serialized after resolving metric - # emulates Jobs API factory handle_job_spec_mismatch - MetricJobAdapter.validate_python(transformed_spec.model_dump(exclude_none=True)) - - expected_metric_config = { - "params": { - "ignore_request_failure": False, - "inference": {"max_tokens": 300}, - "parallelism": 8, - "max_retries": 3, - "limit_samples": 5, - }, - "metric_params": {}, - "metric": { - "type": "llm-judge", - "labels": {}, - "supported_job_types": ["online", "offline"], - "job_type": "online", - "model": { - "url": "http://judge-nim.test/v1/chat/completions", - "name": "my/judge", - "api_key_secret": "my-judge-secret-name", - "format": "nim", - }, - # structured_output is runtime-derived by the SDK metric from the score definitions. - # The compiled job spec persists user/config inputs only, so it should not include - # this generated schema payload. - "prompt_template": default_judge_prompt_template_chat(), - "optional_fields": [], - "ignore_request_failure": False, - "inference": {"max_tokens": 100}, - "scores": [ - { - "name": "length", - "rubric": [ - {"label": "short", "value": 0}, - {"label": "medium", "value": 1}, - {"label": "long", "value": 2}, - ], - "parser": {"type": "json", "json_path": "length"}, - } - ], - "structured_output": { - "schema": { - "properties": { - "length": { - "enum": [ - "short", - "medium", - "long", - ], - "type": "string", - }, - }, - "required": [ - "length", - ], - "type": "object", - }, - }, - }, - "model": { - "url": "http://nim.test/v1/chat/completions", - "name": "my/model", - "api_key_secret": "my-model-secret-name", - "format": "nim", - }, - "dataset": {"rows": [{"prompt": "hello world"}]}, - "prompt_template": {"messages": [{"role": "user", "content": "{{prompt}}"}]}, - "optional_fields": [], - } - expected = { - "steps": [ - { - "name": "evaluation", - "executor": { - "provider": "cpu", - "container": { - "image": get_qualified_image("nmp-cpu-tasks"), - "entrypoint": [ - "python", - "-m", - "nmp.evaluator.tasks.evaluate_metric", - ], - "command": [ - "--progress-tracking-url", - "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - ], - }, - }, - "config": expected_metric_config, - "environment": [ - {"name": "NEMO_JOB_PERSISTENT_JOB_STORAGE_PATH", "value": settings.jobs.volume_path}, - {"name": "LOG_FORMAT", "value": "json"}, - {"name": "my_model_secret_name", "from_secret": {"name": "my-model-secret-name"}}, - {"name": "my_judge_secret_name", "from_secret": {"name": "my-judge-secret-name"}}, - ], - }, - ] - } - - assert platform_job_spec == expected - - -@pytest.mark.asyncio -async def test_platform_job_config_compiler_unsupported_inline_system_metric( - mock_entity_client: EntityClient, mock_sdk -): - """Test system metric cannot be inline and only supports metric ref""" - - original_spec = MetricOfflineJob( - metric=app.SystemMetric( - name="my-custom-system-metric", - ), - dataset=app.FilesetRef(root="default/my-dataset"), - ) - with pytest.raises(HTTPException) as exc_info: - transformed_spec, _ = _compiler_args(original_spec, WORKSPACE, mock_entity_client) - await platform_job_config_compiler( - WORKSPACE, original_spec, transformed_spec, mock_entity_client, None, mock_sdk - ) - - assert isinstance(exc_info.value, HTTPException) - assert exc_info.value.status_code == 422 - assert ( - "Unsupported job with custom system metric. Use metric reference instead 'system/'" - in exc_info.value.detail - ) - - -@pytest.mark.asyncio -async def test_platform_job_config_compiler_system_metric(mock_entity_client: EntityClient, mock_sdk): - """High level test for compiling a system metric to an EvalFactory job spec""" - job: MetricOfflineJob = MetricJobAdapter.validate_python( - { - "metric": "system/trajectory-evaluation", - "dataset": "my-workspace/dataset", - "params": { - "limit_samples": 5, - }, - "metric_params": { - "judge": {"model": {"url": "http://nim.test/v1/chat/completions", "name": "my/judge"}}, - "trajectory_used_tools": "tool1,tool2", - }, - } - ) - - metrics_manager = MetricsManager(mock_entity_client) - agentic_metric = AgenticEvalHandler._system_metrics[0] - agentic_metric_config = agentic_metric.model_dump(mode="json", exclude_none=True) - agentic_metric_entity = entities.SystemMetric(**agentic_metric_config) - await metrics_manager.create(agentic_metric_entity, sdk=mock_sdk) - - with ( - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.dataset_exists", new_callable=AsyncMock - ) as mock_fileset_exists, - patch("nmp.evaluator.app.inference.verify_model_reachable", new_callable=AsyncMock) as mock_verify, - ): - mock_fileset_exists.return_value = True - mock_verify.return_value = {"status": "success"} - - transformed_spec, _ = _compiler_args(job, WORKSPACE, mock_entity_client) - platform_job_spec = await platform_job_config_compiler( - WORKSPACE, job, transformed_spec, mock_entity_client, None, mock_sdk - ) - - # Verify job can be serialized after resolving metric - # emulates Jobs API factory handle_job_spec_mismatch - MetricJobAdapter.validate_python(job.model_dump(exclude_none=True)) - - expected_evalfactory_config_yaml = f"""config: - params: - extra: - dataset_path: {settings.jobs.dataset_dir}/my-workspace/dataset - judge: - model: - name: my/judge - url: http://nim.test/v1/chat/completions - judge_model_args: {{}} - judge_model_type: nvidia-nim - trajectory_used_tools: tool1,tool2 - limit_samples: 5 - parallelism: 8 - type: agentic_eval_trajectory_evaluation -output_dir: {settings.jobs.results_dir} -target: - api_endpoint: - adapter_config: - interceptors: - - config: - log_failed_requests: true - output_dir: {settings.jobs.results_dir} - name: request_logging - - config: - cache_dir: {settings.jobs.results_dir} - reuse_cached_responses: true - save_requests: true - save_responses: true - name: caching - - name: endpoint - - config: - output_dir: {settings.jobs.results_dir} - name: response_logging - - name: raise_client_errors - - config: - progress_tracking_interval: 1 - progress_tracking_interval_seconds: 60 - progress_tracking_url: ${{NMP_JOBS_URL}}/apis/jobs/v2/workspaces/${{NEMO_JOB_WORKSPACE}}/jobs/${{NEMO_JOB_ID}}/status-details - request_method: PATCH - name: progress_tracking - post_eval_hooks: - - config: - report_types: - - json - name: post_eval_report - - config: - progress_tracking_interval: 1 - progress_tracking_interval_seconds: 60 - progress_tracking_url: ${{NMP_JOBS_URL}}/apis/jobs/v2/workspaces/${{NEMO_JOB_WORKSPACE}}/jobs/${{NEMO_JOB_ID}}/status-details - request_method: PATCH - name: progress_tracking - model_id: my/judge - type: chat - url: http://nim.test/v1/chat/completions -""" - scratch_path = f"${{{EPHEMERAL_TASK_STORAGE_PATH_ENVVAR}}}" - target_download_dir = f"${{{PERSISTENT_JOB_STORAGE_PATH_ENVVAR}}}/datasets" - dataset_download_command = fileset_entrypoint_args( - app.FilesetRef(root="my-workspace/dataset"), - target_download_dir, - scratch_path, - ) - - expected = { - "steps": [ - { - "environment": [ - { - "name": "NEMO_JOB_PERSISTENT_JOB_STORAGE_PATH", - "value": settings.jobs.volume_path, - }, - ], - "executor": { - "container": { - "command": dataset_download_command, - "entrypoint": [ - "python", - "-m", - "nmp.evaluator.tasks.download_fileset", - ], - "image": get_qualified_image("nmp-cpu-tasks"), - }, - "provider": "cpu", - }, - "name": "dataset-download", - }, - { - "name": "evaluation", - "executor": { - "provider": "cpu", - "container": { - "image": settings.evalfactory.agentic_eval, - "command": [ - "/bin/sh", - "-c", - f'mkdir -p {settings.jobs.configs_dir} && echo "$NEMO_EVAL_FACTORY_JOB_CONFIG" > {settings.jobs.configs_dir}/evaluation_job_file.yaml && exec nemo-evaluator run_eval --run_config {settings.jobs.configs_dir}/evaluation_job_file.yaml --output_dir {settings.jobs.results_dir} --eval_type agentic_eval_trajectory_evaluation --model_id my/judge --model_url http://nim.test/v1/chat/completions --model_type chat', - ], - }, - }, - "config": { - "target": { - "api_endpoint": { - "url": "http://nim.test/v1/chat/completions", - "model_id": "my/judge", - "type": "chat", - "adapter_config": { - "interceptors": [ - { - "name": "request_logging", - "config": { - "output_dir": settings.jobs.results_dir, - "log_failed_requests": True, - }, - }, - { - "name": "caching", - "config": { - "cache_dir": settings.jobs.results_dir, - "reuse_cached_responses": True, - "save_requests": True, - "save_responses": True, - }, - }, - {"name": "endpoint"}, - { - "name": "response_logging", - "config": { - "output_dir": settings.jobs.results_dir, - }, - }, - {"name": "raise_client_errors"}, - { - "name": "progress_tracking", - "config": { - "progress_tracking_interval": 1, - "progress_tracking_interval_seconds": 60, - "progress_tracking_url": "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - "request_method": "PATCH", - }, - }, - ], - "post_eval_hooks": [ - {"name": "post_eval_report", "config": {"report_types": ["json"]}}, - { - "name": "progress_tracking", - "config": { - "progress_tracking_interval": 1, - "progress_tracking_interval_seconds": 60, - "progress_tracking_url": "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - "request_method": "PATCH", - }, - }, - ], - }, - } - }, - "config": { - "type": "agentic_eval_trajectory_evaluation", - "params": { - "extra": { - "dataset_path": f"{settings.jobs.dataset_dir}/my-workspace/dataset", - "judge": {"model": {"url": "http://nim.test/v1/chat/completions", "name": "my/judge"}}, - "judge_model_args": {}, - "judge_model_type": "nvidia-nim", - "trajectory_used_tools": "tool1,tool2", - }, - "parallelism": 8, - "limit_samples": 5, - }, - }, - "output_dir": settings.jobs.results_dir, - }, - "environment": [ - {"name": "NEMO_JOB_PERSISTENT_JOB_STORAGE_PATH", "value": settings.jobs.volume_path}, - {"name": "NEMO_EVAL_FACTORY_JOB_CONFIG", "value": expected_evalfactory_config_yaml}, - ], - }, - { - "name": "results", - "config": { - "dataset": "my-workspace/dataset", - "dataset_ref": "my-workspace/dataset", - "metric": agentic_metric_config, - "metric_params": { - "judge": { - "model": { - "name": "my/judge", - "url": "http://nim.test/v1/chat/completions", - }, - }, - "judge_model_args": {}, - "judge_model_type": "nvidia-nim", - "trajectory_used_tools": "tool1,tool2", - }, - "metric_ref": "system/trajectory-evaluation", - "params": { - "limit_samples": 5, - "parallelism": 8, - }, - }, - "executor": { - "provider": "cpu", - "container": { - "image": get_qualified_image("nmp-cpu-tasks"), - "entrypoint": ["python", "-m", "nmp.evaluator.tasks.metric_results"], - "command": [ - "--progress-tracking-url", - "${NMP_JOBS_URL}/apis/jobs/v2/workspaces/${NEMO_JOB_WORKSPACE}/jobs/${NEMO_JOB_ID}/status-details", - ], - }, - }, - "environment": [ - {"name": "NEMO_JOB_PERSISTENT_JOB_STORAGE_PATH", "value": settings.jobs.volume_path}, - {"name": "LOG_FORMAT", "value": "json"}, - {"name": "NEMO_EVAL_HARNESS", "value": "agentic_eval"}, - ], - }, - ] - } - assert platform_job_spec == expected - - -class TestCreateMetricEndpoint: - """Tests for the create_metric endpoint function. - - Regression tests for NVBug 5827225: isinstance() was incorrectly used with - a subscripted generic type (Metric = Annotated[Union[...]]), causing a - TypeError when creating BLEU, ROUGE, or StringCheck metrics. - - """ - - @pytest.mark.asyncio - async def test_create_metric_bleu(self, metrics_manager): - """Test create_metric endpoint successfully creates a BLEU metric. - - Regression test for NVBug 5827225. - """ - # Arrange - bleu_request = BLEUMetric( - references=["{{item.reference}}"], - ) - - # Act - call the endpoint function directly - result = await create_metric( - workspace="default", - name="test-bleu", - metric_request=bleu_request, - metrics_manager=metrics_manager, - ) - - # Assert - assert result is not None - assert result.name == "test-bleu" - assert result.type == "bleu" - - @pytest.mark.asyncio - async def test_create_metric_rouge(self, metrics_manager): - """Test create_metric endpoint successfully creates a ROUGE metric. - - Regression test for NVBug 5827225. - """ - # Arrange - rouge_request = ROUGEMetric( - reference="{{item.reference}}", - ) - - # Act - call the endpoint function directly - result = await create_metric( - workspace="default", - name="test-rouge", - metric_request=rouge_request, - metrics_manager=metrics_manager, - ) - - # Assert - assert result is not None - assert result.name == "test-rouge" - assert result.type == "rouge" - - @pytest.mark.asyncio - async def test_create_metric_string_check(self, metrics_manager): - """Test create_metric endpoint successfully creates a StringCheck metric. - - Regression test for NVBug 5827225. - """ - # Arrange - string_check_request = StringCheckMetric( - operation="contains", - left_template="{{item.response}}", - right_template="{{item.expected}}", - ) - - # Act - call the endpoint function directly - result = await create_metric( - workspace="default", - name="test-string-check", - metric_request=string_check_request, - metrics_manager=metrics_manager, - ) - - # Assert - assert result is not None - assert result.name == "test-string-check" - assert result.type == "string-check" - - -@pytest.mark.asyncio -async def test_platform_job_config_compiler_retriever_metric( - mock_entity_client: EntityClient, mock_sdk, metrics_manager: MetricsManager -): - """End-to-end test for compiling a retriever system metric to an EvalFactory job spec. - - This test verifies the complete flow from retriever job input to platform job spec, - using a BuiltInDataset (BEIR) for evaluation. - """ - original_spec: MetricRetrieverJob = MetricJobAdapter.validate_python( - { - "retriever_pipeline": { - "embeddings_model": { - "url": "https://integrate.api.nvidia.com/v1", - "name": "nvidia/nv-embedqa-e5-v5", - "format": "nim", - "api_key_secret": "embedding-secret", - }, - }, - "dataset": "beir/fiqa", # BuiltInDataset (plain string) - "metric": "system/retriever-ndcg-cut-10", - "metric_params": { - "dataset_format": "beir", - "top_k": 10, - }, - } - ) - - # Register the retriever metric in the entity store - retriever_metric = next(m for m in RetrieverHandler._system_metrics if m.name == "retriever-ndcg-cut-10") - retriever_metric_entity = entities.SystemMetric(**retriever_metric.model_dump(exclude_none=True)) - await metrics_manager.create(retriever_metric_entity, sdk=mock_sdk) - - # Mock the fileset check - with ( - patch( - "nmp.evaluator.app.datasets.nmp_datasets.fileset.dataset_exists", new_callable=AsyncMock - ) as mock_fileset_exists, - patch("nmp.evaluator.app.inference.verify_model_reachable", new_callable=AsyncMock) as mock_verify, - ): - mock_fileset_exists.return_value = True - mock_verify.return_value = {"status": "success"} - - transformed_spec, _ = _compiler_args(original_spec, WORKSPACE, mock_entity_client) - platform_job_spec = await platform_job_config_compiler( - WORKSPACE, original_spec, transformed_spec, mock_entity_client, None, mock_sdk - ) - - # Verify job can be serialized after resolving metric - # emulates Jobs API factory handle_job_spec_mismatch - MetricJobAdapter.validate_python(transformed_spec.model_dump(exclude_none=True)) - - # Expected evaluation step configuration - expected_eval_step = yaml.safe_load( - """ - name: evaluation - executor: - container: - image: {image} - config: - target: - api_endpoint: - type: embedding - config: - type: retriever - params: - extra: - tasks: - retriever: - dataset: - format: beir - path: fiqa - metrics: - ndcg_cut_10: - type: pytrec_eval - pipeline: - query_embedding_model: - api_endpoint: - url: https://integrate.api.nvidia.com/v1 - model_id: nvidia/nv-embedqa-e5-v5 - format: nim - api_key: $QUERY_API_KEY - index_embedding_model: - api_endpoint: - url: https://integrate.api.nvidia.com/v1 - model_id: nvidia/nv-embedqa-e5-v5 - format: nim - api_key: $INDEX_API_KEY - top_k: 10 - """.format(image=settings.evalfactory.rag_retriever) - ) - - # Expected results step configuration - expected_results_step = yaml.safe_load( - """ - name: results - executor: - container: - image: {image} - entrypoint: - - python - - -m - - nmp.evaluator.tasks.metric_results - """.format(image=get_qualified_image("nmp-cpu-tasks")) - ) - - # Verify job structure has both evaluation and results steps - assert "steps" in platform_job_spec - steps = list(platform_job_spec["steps"]) - assert len(steps) >= 2, "Expected at least evaluation and results steps" - - eval_step = cast(dict[str, Any], steps[0]) - results_step = cast(dict[str, Any], steps[1]) - - # Extract expected path before comparison (BuiltInDataset uses the name directly) - expected_dataset_path = expected_eval_step["config"]["config"]["params"]["extra"]["tasks"]["retriever"][ - "dataset" - ].pop("path") - - # Compare evaluation step using subset matching (excluding dynamic path) - errors = _subset_match(expected_eval_step, eval_step) - assert not errors, "Evaluation step config mismatch:\n" + "\n".join(errors) - - # Compare results step using subset matching - errors = _subset_match(expected_results_step, results_step) - assert not errors, "Results step config mismatch:\n" + "\n".join(errors) - - # Verify dataset path ends with expected value (path includes output_dir prefix) - dataset = eval_step["config"]["config"]["params"]["extra"]["tasks"]["retriever"]["dataset"] - assert dataset["path"].endswith(expected_dataset_path), ( - f"Expected dataset path to end with '{expected_dataset_path}', got: {dataset['path']}" - ) - - # Verify dense_only yaml files are used (no reranker configured) - retriever_params = eval_step["config"]["config"]["params"]["extra"]["pipeline"]["params"] - assert "dense_only" in retriever_params["index_pipeline_yaml_file"] - assert "dense_only" in retriever_params["query_pipeline_yaml_file"] - - # Verify secrets in environment (only embedding, no reranker) - env_names = [e["name"] for e in eval_step["environment"] if "from_secret" in e] - assert "QUERY_API_KEY" in env_names - assert "INDEX_API_KEY" in env_names - - -class TestAggregateFieldNameList: - """Tests for AggregateFieldNameList query parameter parsing.""" - - def test_parse_none(self): - """Test parsing None value returns empty list.""" - result = AggregateFieldNameList.model_validate(None) - assert result.root == [] - - def test_parse_empty_list(self): - """Test parsing empty list returns empty list.""" - result = AggregateFieldNameList.model_validate([]) - assert result.root == [] - - def test_parse_single_value(self): - """Test parsing a single string value.""" - result = AggregateFieldNameList.model_validate(["mean"]) - assert result.root == ["mean"] - - def test_parse_multiple_values(self): - """Test parsing multiple string values.""" - result = AggregateFieldNameList.model_validate(["mean", "std_dev", "min"]) - assert result.root == ["mean", "std_dev", "min"] - - def test_parse_comma_separated_string(self): - """Test parsing comma-separated values in a single string.""" - result = AggregateFieldNameList.model_validate(["mean,std_dev,min"]) - assert result.root == ["mean", "std_dev", "min"] - - def test_parse_mixed_formats(self): - """Test parsing mixed formats (comma-separated and separate items).""" - result = AggregateFieldNameList.model_validate(["mean,std_dev", "min", "max"]) - assert result.root == ["mean", "std_dev", "min", "max"] - - def test_parse_with_whitespace(self): - """Test parsing values with whitespace are trimmed.""" - result = AggregateFieldNameList.model_validate(["mean , std_dev , min"]) - assert result.root == ["mean", "std_dev", "min"] - - def test_parse_dict_with_aggregate_fields_key(self): - """Test parsing dict format (FastAPI query param representation).""" - result = AggregateFieldNameList.model_validate({"aggregate_fields": ["mean", "std_dev"]}) - assert result.root == ["mean", "std_dev"] - - def test_parse_dict_with_root_key(self): - """Test parsing dict format with 'root' key.""" - result = AggregateFieldNameList.model_validate({"root": ["mean", "std_dev"]}) - assert result.root == ["mean", "std_dev"] - - -class TestListMetricsEndpoint: - """Tests for the list_metrics endpoint function.""" - - async def _create_metrics(self, metrics_manager: MetricsManager, mock_sdk): - metric1 = entities.StringCheckMetric( - name="metric-1", - workspace="default", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - labels={"label1": "value1"}, - ) - metric2 = entities.BLEUMetric( - name="metric-2", - workspace="default", - references=["{{reference}}"], - ) - await metrics_manager.create(metric1, sdk=mock_sdk) - await metrics_manager.create(metric2, sdk=mock_sdk) - - @pytest.mark.asyncio - async def test_list_metrics_empty(self, metrics_manager): - """Test list_metrics returns empty page when no metrics exist.""" - client = new_test_client(metrics_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics") - assert resp.status_code == 200, resp.json() - - result = MetricsListResponse.model_validate(resp.json()) - - assert result.data == [] - assert result.pagination is not None - assert result.pagination.total_results == 0 - assert result.pagination.page == 1 - - @pytest.mark.asyncio - async def test_list_metrics_returns_metrics(self, metrics_manager, mock_sdk): - """Test list_metrics returns all metrics for the workspace.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics") - assert resp.status_code == 200, resp.json() - - result = MetricsListResponse.model_validate(resp.json()) - - assert len(result.data) == 2 - assert result.pagination is not None - assert result.pagination.total_results == 2 - names = {m.name for m in result.data} - assert names == {"metric-1", "metric-2"} - - @pytest.mark.asyncio - async def test_list_metrics_sort_pagination(self, metrics_manager, mock_sdk): - """Test list_metrics returns sorted response.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?page_size=5&sort=name") - assert resp.status_code == 200, resp.json() - - result = MetricsListResponse.model_validate(resp.json()) - - assert len(result.data) == 2 - assert result.pagination is not None - assert result.pagination.total_results == 2 - assert result.pagination.page_size == 5 - assert result.sort == "name" - names = [m.name for m in result.data] - assert names == ["metric-1", "metric-2"] - - @pytest.mark.asyncio - async def test_list_metrics_filter_type(self, metrics_manager, mock_sdk): - """Test list_metrics returns filtered by metric type.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[type]=bleu") - assert resp.status_code == 200, resp.json() - - result = MetricsListResponse.model_validate(resp.json()) - - assert len(result.data) == 1 - assert result.pagination is not None - assert result.pagination.total_results == 1 - assert result.filter == {"type": {"$eq": "bleu"}} - names = {m.name for m in result.data} - assert names == {"metric-2"} - - @pytest.mark.asyncio - async def test_list_metrics_filter_label(self, metrics_manager, mock_sdk): - """Test list_metrics returns filtered by label.""" - await self._create_metrics(metrics_manager, mock_sdk) - client = new_test_client(metrics_manager) - - # Filter with brackets - resp = client.get("/apis/evaluation/v2/workspaces/default/metrics?filter[data.labels.label1]=value1") - assert resp.status_code == 200, resp.json() - - result_bracket = MetricsListResponse.model_validate(resp.json()) - - assert len(result_bracket.data) == 1 - assert result_bracket.pagination is not None - assert result_bracket.pagination.total_results == 1 - names = {m.name for m in result_bracket.data} - assert names == {"metric-1"} - - # Filter with json - resp = client.get( - '/apis/evaluation/v2/workspaces/default/metrics?filter={"data.labels.label1": {"$eq": "value1"}}' - ) - assert resp.status_code == 200, resp.json() - - result_json = MetricsListResponse.model_validate(resp.json()) - assert result_bracket.data == result_json.data - assert result_bracket.pagination == result_json.pagination - - -class TestGetMetricEndpoint: - """Tests for the get_metric endpoint function.""" - - @pytest.mark.asyncio - async def test_get_metric_success(self, metrics_manager, mock_sdk): - """Test get_metric returns the metric when found.""" - metric = entities.StringCheckMetric( - name="test-metric", - workspace="default", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - await metrics_manager.create(metric, sdk=mock_sdk) - - result = await get_metric(workspace="default", name="test-metric", metrics_manager=metrics_manager) - - assert result.name == "test-metric" - assert result.type == "string-check" - - @pytest.mark.asyncio - async def test_get_metric_not_found_raises_404(self, metrics_manager): - """Test get_metric raises HTTPException 404 when metric not found.""" - with pytest.raises(HTTPException) as exc_info: - await get_metric(workspace="default", name="nonexistent", metrics_manager=metrics_manager) - - assert isinstance(exc_info.value, HTTPException) - assert exc_info.value.status_code == 404 - assert "not found" in exc_info.value.detail.lower() - - -class TestDeleteMetricEndpoint: - """Tests for the delete_metric endpoint function.""" - - @pytest.mark.asyncio - async def test_delete_metric_success(self, metrics_manager, mock_sdk): - """Test delete_metric successfully deletes a metric.""" - metric = entities.StringCheckMetric( - name="to-delete", - workspace="default", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - await metrics_manager.create(metric, sdk=mock_sdk) - - result = await delete_metric(workspace="default", name="to-delete", metrics_manager=metrics_manager) - - assert result.message is not None - # Verify it's actually deleted - with pytest.raises(HTTPException) as exc_info: - await get_metric(workspace="default", name="to-delete", metrics_manager=metrics_manager) - assert isinstance(exc_info.value, HTTPException) - assert exc_info.value.status_code == 404 - - @pytest.mark.asyncio - async def test_delete_metric_not_found_raises_404(self, metrics_manager): - """Test delete_metric raises HTTPException 404 when metric not found.""" - with pytest.raises(HTTPException) as exc_info: - await delete_metric(workspace="default", name="nonexistent", metrics_manager=metrics_manager) - - assert isinstance(exc_info.value, HTTPException) - assert exc_info.value.status_code == 404 - - @pytest.mark.asyncio - async def test_delete_metric_system_workspace_raises_403(self, metrics_manager): - """Test delete_metric raises HTTPException 403 for system workspace.""" - with pytest.raises(HTTPException) as exc_info: - await delete_metric(workspace="system", name="any-metric", metrics_manager=metrics_manager) - - assert isinstance(exc_info.value, HTTPException) - assert exc_info.value.status_code == 403 - assert "system" in exc_info.value.detail.lower() - - -class TestEvaluateMetricEndpoint: - """Tests for the evaluate_metric endpoint function. - - This endpoint was missing tests, which allowed a bug (metric vs metric_ref - parameter name mismatch) to go undetected. - """ - - @pytest.mark.asyncio - async def test_evaluate_metric_with_inline_metric(self, metrics_manager, mock_sdk): - """Test evaluate_metric with an inline metric definition.""" - # Arrange - metric = StringCheckMetric( - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - request = MetricEvaluationRequest( - metric=metric, - dataset=EvaluateDatasetRows( - rows=[ - {"expected": "hello", "output": "hello"}, - {"expected": "world", "output": "world"}, - {"expected": "foo", "output": "bar"}, - ], - ), - ) - - client = new_test_client(metrics_manager, mock_sdk=mock_sdk) - resp = client.post( - "/apis/evaluation/v2/workspaces/default/metric-evaluate", - json=request.model_dump(mode="json", exclude_unset=True), - ) - assert resp.status_code == 200, resp.text - - result = MetricEvaluationResponse.model_validate(resp.json()) - - # Assert - assert result.metric.model_dump(exclude_none=True) == metric.model_dump(exclude_none=True) - assert result.row_scores is not None - assert len(result.row_scores) == 3 - assert result.row_scores[0].scores is not None - assert result.row_scores[1].scores is not None - assert result.row_scores[2].scores is not None - assert result.row_scores[0].scores["string-check"] == 1.0 - assert result.row_scores[1].scores["string-check"] == 1.0 - assert result.row_scores[2].scores["string-check"] == 0.0 - - @pytest.mark.asyncio - async def test_evaluate_metric_with_stored_metric_urn(self, metrics_manager, mock_sdk): - """Test evaluate_metric with a stored metric referenced by URN.""" - # Arrange - Create and store a metric - metric = entities.StringCheckMetric( - name="stored-metric", - workspace="default", - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - await metrics_manager.create(metric, sdk=mock_sdk) - - request = MetricEvaluationRequest( - metric=app.MetricRef(root="default/stored-metric"), # URN reference - dataset=EvaluateDatasetRows( - rows=[{"expected": "match", "output": "match"}], - ), - ) - - client = new_test_client(metrics_manager, mock_sdk=mock_sdk) - resp = client.post( - "/apis/evaluation/v2/workspaces/default/metric-evaluate", - json=request.model_dump(mode="json", exclude_unset=True), - ) - assert resp.status_code == 200, resp.text - - result = MetricEvaluationResponse.model_validate(resp.json()) - - # Assert - assert result.row_scores is not None - assert len(result.row_scores) == 1 - assert result.row_scores[0].scores is not None - assert result.row_scores[0].scores["string-check"] == 1.0 - - @pytest.mark.asyncio - async def test_evaluate_metric_not_found_raises_404(self, metrics_manager, mock_sdk): - """Test evaluate_metric raises HTTPException 404 when metric URN not found.""" - request = MetricEvaluationRequest( - metric=app.MetricRef(root="nonexistent/metric"), - dataset=EvaluateDatasetRows(rows=[{"input": "test"}]), - ) - - client = new_test_client(metrics_manager, mock_sdk=mock_sdk) - resp = client.post( - "/apis/evaluation/v2/workspaces/default/metric-evaluate", - json=request.model_dump(mode="json", exclude_unset=True), - ) - assert resp.status_code == 404, resp.text - - @pytest.mark.asyncio - async def test_evaluate_metric_with_aggregate_fields(self, metrics_manager, mock_sdk): - """Test evaluate_metric respects aggregate_fields query parameter.""" - metric = StringCheckMetric( - operation="equals", - left_template="{{expected}}", - right_template="{{output}}", - ) - request = MetricEvaluationRequest( - metric=metric, - dataset=EvaluateDatasetRows( - rows=[{"expected": "hello", "output": "hello"}], - ), - ) - - # Request only specific aggregate fields - pass plain list as expected by endpoint - client = new_test_client(metrics_manager, mock_sdk=mock_sdk) - resp = client.post( - "/apis/evaluation/v2/workspaces/default/metric-evaluate?aggregate_fields=mean,std_dev", - json=request.model_dump(mode="json", exclude_unset=True), - ) - assert resp.status_code == 200, resp.text - - # Check that only requested fields are present - assert "mean" in resp.text - assert "std_dev" in resp.text - # Default fields that weren't requested should be absent - assert "sum" not in resp.text - assert "min" not in resp.text - assert "max" not in resp.text - - @pytest.mark.asyncio - async def test_evaluate_metric_evaluation_error_raises_500(self, metrics_manager): - """Test evaluate_metric raises HTTPException 500 on evaluation failure.""" - # Use a metric with invalid template that will cause evaluation to fail - metric = StringCheckMetric( - operation="equals", - left_template="{{nonexistent_field}}", - right_template="{{output}}", - ) - request = MetricEvaluationRequest( - metric=metric, - dataset=EvaluateDatasetRows( - rows=[{"input": "test", "output": "test"}], - ), - ) - - with pytest.raises(HTTPException) as exc_info: - await evaluate_metric( - workspace="default", - request=request, - metrics_manager=metrics_manager, - aggregate_fields=[], - ) - - assert isinstance(exc_info.value, HTTPException) - assert exc_info.value.status_code == 500 - assert "nonexistent_field" in exc_info.value.detail - - -class TestGetMetricJobResultsEndpoint: - @pytest.mark.asyncio - async def test_get_404(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results/dne") - assert resp.status_code == 404, resp.json() - - @pytest.mark.asyncio - async def test_get(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results/result1") - assert resp.status_code == 200, resp.text - - # Verify entity attrs - raw_result = resp.json() - assert "created_at" in raw_result, "missing entity private attributes" - - # doesn't serialize entity attrs, SDK types to though - result = MetricJobResult.model_validate(raw_result) - assert result.name == "result1" - assert result.workspace == "default" - assert result.metric is not None - assert result.dataset is not None - assert len(result.scores) == 1 - assert result.scores[0].name == "accuracy" - assert result.scores[0].mean == 0.85 - - @pytest.mark.asyncio - async def test_get_aggregate_fields_invalid(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results/result1?aggregate_fields=dne") - assert resp.status_code == 422, resp.text - - @pytest.mark.asyncio - async def test_get_aggregate_fields(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results/result1") - assert resp.status_code == 200, resp.text - assert "count" in resp.text, "always expect count" - assert "std_dev" in resp.text, "expected for default" - assert "min" in resp.text, "expected for default" - assert "max" in resp.text, "expected for default" - - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results/result1?aggregate_fields=std_dev") - assert resp.status_code == 200, resp.text - assert "count" in resp.text, "always expect count" - assert "std_dev" in resp.text, "included in filter" - assert "min" not in resp.text, "excluded from filter" - assert "max" not in resp.text, "excluded from filter" - - resp = client.get( - "/apis/evaluation/v2/workspaces/default/metric-job-results/result1?aggregate_fields=std_dev,min" - ) - assert resp.status_code == 200, resp.text - assert "count" in resp.text, "always expect count" - assert "std_dev" in resp.text, "included in filter" - assert "min" in resp.text, "included in filter" - assert "max" not in resp.text, "excluded from filter" - - -class TestDeleteMetricJobResultsEndpoint: - @pytest.mark.asyncio - async def test_delete_404(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - resp = client.delete("/apis/evaluation/v2/workspaces/default/metric-job-results/dne") - assert resp.status_code == 404, resp.json() - - @pytest.mark.asyncio - async def test_delete(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results/result1") - assert resp.status_code == 200 - - resp = client.delete("/apis/evaluation/v2/workspaces/default/metric-job-results/result1") - assert resp.status_code == 200, resp.json() - - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results/result1") - assert resp.status_code == 404, "expected entity to be deleted" - - -class TestListMetricJobResultsEndpoint: - @pytest.mark.asyncio - async def test_list(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results") - assert resp.status_code == 200, resp.json() - - results = MetricJobResultsListResponse.model_validate(resp.json()) - assert len(results.data) == 3 - assert results.pagination is not None - assert results.pagination.total_results == 3 - - @pytest.mark.asyncio - async def test_list_filter_empty(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-job-results?filter[model]=ws/dne") - assert resp.status_code == 200, resp.json() - - results = MetricJobResultsListResponse.model_validate(resp.json()) - assert len(results.data) == 0 - assert results.pagination is not None - assert results.pagination.total_results == 0 - - @pytest.mark.asyncio - async def test_list_filter_metric(self, metrics_manager, create_sample_metric_job_results): - filter = "filter[metric]=default/metric" - client = new_test_client(metrics_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metric-job-results?{filter}") - assert resp.status_code == 200, resp.json() - - results = MetricJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 2 - assert results.pagination.total_results == 2 - for result in results.data: - assert result.name in ["result1", "result3"] - assert result.metric is not None - assert result.metric.root == "default/metric" - - # Filter and Sort - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metric-job-results?{filter}&sort=name") - assert resp.status_code == 200, resp.json() - results = MetricJobResultsListResponse.model_validate(resp.json()) - assert results.data[0].name == "result1" - assert results.data[1].name == "result3" - - @pytest.mark.asyncio - async def test_list_filter_dataset(self, metrics_manager, create_sample_metric_job_results): - filter = "filter[dataset]=default/dataset2" - client = new_test_client(metrics_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metric-job-results?{filter}") - assert resp.status_code == 200, resp.json() - - results = MetricJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 1 - assert results.pagination.total_results == 1 - assert results.data[0].name == "result2" - assert results.data[0].metric is not None - assert results.data[0].dataset is not None - assert results.data[0].metric.root == "default/metric2" - assert results.data[0].dataset.root == "default/dataset2" - - @pytest.mark.asyncio - async def test_list_filter_model(self, metrics_manager, create_sample_metric_job_results): - filter = "filter[model]=default/model" - client = new_test_client(metrics_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metric-job-results?{filter}") - assert resp.status_code == 200, resp.json() - - results = MetricJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 1 - assert results.pagination.total_results == 1 - assert results.data[0].name == "result3" - assert results.data[0].model is not None - assert results.data[0].model.root == "default/model" - - @pytest.mark.asyncio - async def test_list_filter_multiple(self, metrics_manager, create_sample_metric_job_results): - filter = "filter[metric]=default/metric&filter[model]=default/model" - client = new_test_client(metrics_manager) - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metric-job-results?{filter}") - assert resp.status_code == 200, resp.json() - - results = MetricJobResultsListResponse.model_validate(resp.json()) - assert results.pagination is not None - assert len(results.data) == 1 - assert results.pagination.total_results == 1 - assert results.data[0].name == "result3" - assert results.data[0].metric is not None - assert results.data[0].model is not None - assert results.data[0].metric.root == "default/metric" - assert results.data[0].model.root == "default/model" - - @pytest.mark.asyncio - async def test_list_filter_label(self, metrics_manager, create_sample_metric_job_results): - client = new_test_client(metrics_manager) - - # Filter with brackets - filter_param = "filter[data.labels.label]=value" - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metric-job-results?{filter_param}") - assert resp.status_code == 200, resp.json() - - results_bracket = MetricJobResultsListResponse.model_validate(resp.json()) - assert results_bracket.pagination is not None - assert len(results_bracket.data) == 1 - assert results_bracket.pagination.total_results == 1 - assert results_bracket.data[0].name == "result3" - assert "label" in results_bracket.data[0].labels - assert results_bracket.data[0].labels["label"] == "value" - - # Filter with json - filter_param = 'filter={"data.labels.label": {"$eq": "value"}}' - resp = client.get(f"/apis/evaluation/v2/workspaces/default/metric-job-results?{filter_param}") - assert resp.status_code == 200, resp.json() - - result_json = MetricJobResultsListResponse.model_validate(resp.json()) - assert results_bracket.data == result_json.data - assert results_bracket.pagination == result_json.pagination diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/test_evaluation_jobs_search.py b/services/evaluator/tests/nmp/evaluator/api/v2/test_evaluation_jobs_search.py deleted file mode 100644 index 67dbb798bd..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/test_evaluation_jobs_search.py +++ /dev/null @@ -1,144 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for filter parameter parsing on metric-jobs and benchmark-jobs list endpoints. - -These endpoints use job_route_factory which supports filtering by name, project, -status, created_at, and updated_at fields via the unified filter parameter. -""" - -from unittest.mock import AsyncMock - -import pytest -from fastapi import FastAPI -from fastapi.testclient import TestClient -from nmp.common.api.common import Page, PaginationData -from nmp.common.service.dependencies import get_sdk_client -from nmp.evaluator.api.v2.metrics import endpoints as metrics_endpoints - - -def _empty_jobs_page(): - return Page( - data=[], - pagination=PaginationData( - page=1, - page_size=10, - current_page_size=0, - total_pages=1, - total_results=0, - ), - sort="-created_at", - filter={}, - ) - - -def _make_client(mock_sdk, *routers) -> TestClient: - app = FastAPI() - app.dependency_overrides[get_sdk_client] = lambda: mock_sdk - for router in routers: - app.include_router(router, prefix="/apis/evaluation") - return TestClient(app) - - -@pytest.fixture -def mock_sdk(mock_sdk): - mock_sdk.jobs.list = AsyncMock(return_value=_empty_jobs_page()) - return mock_sdk - - -def _filter_kwargs(mock_sdk) -> dict: - """Decode the JSON ``filter`` the factory sent via ``extra_query``. - - The factory bypasses the SDK's typed ``filter`` kwarg because the bundled - querystring serializer mangles the list-of-dict values that ``$and``-style - composition produces. It sends a JSON-encoded filter through - ``extra_query`` instead — round it back to a dict here. - """ - import json - - call_kwargs = mock_sdk.jobs.list.call_args.kwargs - extra_query = call_kwargs.get("extra_query") or {} - raw = extra_query.get("filter") - return json.loads(raw) if raw else {} - - -def _clauses(filt: dict) -> list[dict]: - """Flatten the forwarded filter into a list of single-field clauses. - - The factory composes the user filter with the service source predicate via - a tree-level ``$and`` (so logical roots like ``$or`` stay scoped). When the - user passes no filter, ``source`` stands alone — handle both shapes here so - individual tests can assert on a specific clause without caring about the - surrounding composition. - """ - if "$and" in filt: - return list(filt["$and"]) - return [filt] - - -def _clause_for(filt: dict, field: str) -> dict: - for clause in _clauses(filt): - if field in clause: - return clause - raise AssertionError(f"No clause for field {field!r} in {filt!r}") - - -class TestMetricEvaluationJobsFilter: - @pytest.fixture(autouse=True) - def _setup(self, mock_sdk): - self.client = _make_client(mock_sdk, metrics_endpoints.router) - self.mock_sdk = mock_sdk - - def test_name_filter(self): - resp = self.client.get("/apis/evaluation/v2/workspaces/default/metric-jobs?filter[name]=my-job") - assert resp.status_code == 200 - # Bracket notation wraps bare values in $eq so the filter tree carries the operator. - assert _clause_for(_filter_kwargs(self.mock_sdk), "name") == {"name": {"$eq": "my-job"}} - - def test_status_filter_single(self): - resp = self.client.get("/apis/evaluation/v2/workspaces/default/metric-jobs?filter[status]=active") - assert resp.status_code == 200 - assert _clause_for(_filter_kwargs(self.mock_sdk), "status") == {"status": {"$eq": "active"}} - - def test_created_at_filter(self): - resp = self.client.get( - "/apis/evaluation/v2/workspaces/default/metric-jobs?filter[created_at][gte]=2024-01-01T00:00:00Z" - ) - assert resp.status_code == 200 - # Bracket-notation operator aliases (gte) are normalized to canonical $-prefixed keys. - assert _clause_for(_filter_kwargs(self.mock_sdk), "created_at") == { - "created_at": {"$gte": "2024-01-01T00:00:00Z"} - } - - def test_invalid_filter_field_rejected(self): - resp = self.client.get("/apis/evaluation/v2/workspaces/default/metric-jobs?filter[nonexistent]=foo") - # make_filter_dep's allowlist rejects unknown fields with 400 before any - # SDK call is made — assert the SDK was never invoked. - assert resp.status_code == 400 - self.mock_sdk.jobs.list.assert_not_called() - - def test_filter_includes_source(self): - """Filter always includes the service source for factory-generated endpoints.""" - resp = self.client.get("/apis/evaluation/v2/workspaces/default/metric-jobs") - assert resp.status_code == 200 - assert _clause_for(_filter_kwargs(self.mock_sdk), "source") == {"source": {"$eq": "evaluator-metrics"}} - - -class TestBenchmarkEvaluationJobsFilter: - @pytest.fixture(autouse=True) - def _setup(self, mock_sdk): - from nmp.evaluator.api.v2.benchmarks import endpoints as benchmarks_endpoints - - self.client = _make_client(mock_sdk, benchmarks_endpoints.router) - self.mock_sdk = mock_sdk - - def test_name_filter(self): - resp = self.client.get("/apis/evaluation/v2/workspaces/default/benchmark-jobs?filter[name]=my-benchmark") - assert resp.status_code == 200 - assert _clause_for(_filter_kwargs(self.mock_sdk), "name") == {"name": {"$eq": "my-benchmark"}} - - def test_filter_includes_source(self): - """Filter always includes the service source for factory-generated endpoints.""" - resp = self.client.get("/apis/evaluation/v2/workspaces/default/benchmark-jobs") - assert resp.status_code == 200 - assert _clause_for(_filter_kwargs(self.mock_sdk), "source") == {"source": {"$eq": "evaluator-benchmarks"}} diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/test_job_sources.py b/services/evaluator/tests/nmp/evaluator/api/v2/test_job_sources.py deleted file mode 100644 index 12e49c1dc6..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/test_job_sources.py +++ /dev/null @@ -1,65 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import AsyncMock, MagicMock - -from fastapi import FastAPI -from fastapi.testclient import TestClient -from nmp.common.api.common import Page, PaginationData -from nmp.common.service.dependencies import get_sdk_client -from nmp.evaluator.api.v2.benchmarks import endpoints as benchmarks_endpoints -from nmp.evaluator.api.v2.metrics import endpoints as metrics_endpoints - - -def test_metric_and_benchmark_jobs_use_distinct_sources(): - """Regression for NV Bug 5868970 - - The platform jobs list API can only filter by `source`. If metric and benchmark jobs - share the same source, list endpoints can return mixed job specs and then fail schema - validation when rendering the job spec. - - This test would fail without the fix because both routes previously used the same - `source` ("evaluator"), and this assertion expects distinct `source` values. - - Fix: use distinct sources for metric vs benchmark job routes. - """ - - mock_sdk = MagicMock() - mock_sdk.jobs.list = AsyncMock( - return_value=Page( - data=[], - pagination=PaginationData( - page=1, - page_size=10, - current_page_size=0, - total_pages=1, - total_results=0, - ), - sort="-created_at", - filter={}, - ) - ) - - app = FastAPI() - app.dependency_overrides[get_sdk_client] = lambda: mock_sdk - app.include_router(metrics_endpoints.router, prefix="/apis/evaluation") - app.include_router(benchmarks_endpoints.router, prefix="/apis/evaluation") - - client = TestClient(app) - - import json - - resp = client.get("/apis/evaluation/v2/workspaces/default/metric-jobs") - assert resp.status_code == 200 - assert mock_sdk.jobs.list.call_count == 1 - kwargs = mock_sdk.jobs.list.call_args.kwargs - # Filter is forwarded as a JSON string via extra_query so logical-array - # values ($and/$or) survive the SDK querystring serializer. - assert json.loads(kwargs["extra_query"]["filter"]) == {"source": {"$eq": "evaluator-metrics"}} - - mock_sdk.jobs.list.reset_mock() - resp = client.get("/apis/evaluation/v2/workspaces/default/benchmark-jobs") - assert resp.status_code == 200 - assert mock_sdk.jobs.list.call_count == 1 - kwargs = mock_sdk.jobs.list.call_args.kwargs - assert json.loads(kwargs["extra_query"]["filter"]) == {"source": {"$eq": "evaluator-benchmarks"}} diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/test_model_resolution.py b/services/evaluator/tests/nmp/evaluator/api/v2/test_model_resolution.py deleted file mode 100644 index 22d86d5faf..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/test_model_resolution.py +++ /dev/null @@ -1,251 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for model resolution utilities.""" - -from typing import Any, cast -from unittest.mock import AsyncMock, MagicMock, patch - -import httpx -import pytest -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.values import Model as SDKModel -from nemo_platform import NotFoundError -from nmp.evaluator.api.v2.common.inline_models import Model -from nmp.evaluator.api.v2.common.model_resolution import ( - resolve_model, - resolve_params_model_refs, - rewrite_models_for_job_container, -) -from nmp.evaluator.app.values.common import ModelRef -from pydantic import ValidationError - - -class TestResolveModel: - """Tests for resolve_model function.""" - - @pytest.mark.asyncio - async def test_resolve_model_passthrough(self): - """Model values are returned unchanged.""" - model = Model(url="http://example.com/v1", name="gpt-4o", format=ModelFormat.OPEN_AI) - result = await resolve_model(model) - assert result is model - - @pytest.mark.asyncio - async def test_resolve_sdk_model_coerces_to_service_model(self): - """SDK Model values are revalidated as service API Model values.""" - model = SDKModel(url="http://example.com/v1", name="gpt-4o", format=ModelFormat.OPEN_AI) - result = await resolve_model(model) - - assert isinstance(result, Model) - assert result.model_dump(mode="json") == model.model_dump(mode="json") - - @pytest.mark.asyncio - async def test_resolve_model_ref(self): - """ModelRef is resolved via SDK to an Model with IGW URL.""" - mock_sdk = MagicMock() - mock_sdk.models.retrieve = AsyncMock(return_value=MagicMock()) - mock_sdk.models.get_model_entity_route_openai_url = MagicMock( - return_value="http://gateway:8080/v1/my-workspace/my-model" - ) - - ref = ModelRef(root="my-workspace/my-model") - result = await resolve_model(ref, sdk=mock_sdk) - - assert isinstance(result, Model) - assert result.url == "http://gateway:8080/v1/my-workspace/my-model" - assert result.name == "my-model" - assert result.format == "nim" - mock_sdk.models.retrieve.assert_called_once_with("my-model", workspace="my-workspace") - - @pytest.mark.asyncio - async def test_resolve_model_ref_invalid_format(self): - """ModelRef with invalid format is rejected by Pydantic validation.""" - with pytest.raises(ValidationError, match="string_pattern_mismatch"): - ModelRef(root="no-slash") - - @pytest.mark.asyncio - async def test_resolve_model_ref_empty_parts(self): - """ModelRef with empty workspace or name is rejected by Pydantic validation.""" - with pytest.raises(ValidationError): - ModelRef(root="/model-name") - - with pytest.raises(ValidationError): - ModelRef(root="workspace/") - - @pytest.mark.asyncio - async def test_resolve_model_ref_not_found(self): - """ModelRef pointing to non-existent entity raises ValueError with helpful message.""" - mock_sdk = MagicMock() - # NotFoundError requires response, body, and message - mock_response = httpx.Response(status_code=404, request=httpx.Request("GET", "http://test")) - mock_sdk.models.retrieve = AsyncMock( - side_effect=NotFoundError( - response=mock_response, - body=None, - message="Not found", - ) - ) - - ref = ModelRef(root="my-workspace/missing-model") - with pytest.raises(ValueError, match="not found") as exc_info: - await resolve_model(ref, sdk=mock_sdk) - - # Verify the error message includes actionable details - assert "missing-model" in str(exc_info.value) - assert "my-workspace" in str(exc_info.value) - assert "inline model definition" in str(exc_info.value) - - # Verify the original NotFoundError is chained - assert isinstance(exc_info.value.__cause__, NotFoundError) - - @pytest.mark.asyncio - async def test_resolve_model_unsupported_type(self): - """Unsupported model type raises TypeError.""" - with pytest.raises(TypeError, match="Unsupported model type"): - await resolve_model(cast(Any, "raw-string")) - - -class TestResolveParamsModelRefs: - """Tests for resolve_params_model_refs function.""" - - @pytest.mark.asyncio - async def test_resolve_params_no_model_refs(self): - """Params without model refs are returned unchanged.""" - params = {"some_key": "some_value", "number": 42} - result = await resolve_params_model_refs(params) - assert result == params - - @pytest.mark.asyncio - async def test_resolve_params_judge_model_ref(self): - """String model ref in judge param is resolved to Model dict.""" - resolved_model = Model( - url="http://gateway:8080/v1/ws/judge", - name="judge", - format=ModelFormat.NVIDIA_NIM, - ) - - params = { - "judge": { - "model": "ws/judge", - "other_setting": "value", - }, - } - - with patch( - "nmp.evaluator.api.v2.common.model_resolution.resolve_model", - new_callable=AsyncMock, - return_value=resolved_model, - ): - result = await resolve_params_model_refs(params) - - # The model field should be replaced with a Model dict - assert isinstance(result["judge"]["model"], dict) - assert result["judge"]["model"]["url"] == "http://gateway:8080/v1/ws/judge" - assert result["judge"]["model"]["name"] == "judge" - assert result["judge"]["model"]["format"] == "nim" - # Other settings preserved - assert result["judge"]["other_setting"] == "value" - - @pytest.mark.asyncio - async def test_resolve_params_judge_embeddings_model_ref(self): - """String model ref in judge_embeddings param is resolved.""" - resolved_model = Model( - url="http://gateway:8080/v1/ws/embed", - name="embed", - format=ModelFormat.NVIDIA_NIM, - ) - - params = { - "judge_embeddings": { - "model": "ws/embed", - }, - } - - with patch( - "nmp.evaluator.api.v2.common.model_resolution.resolve_model", - new_callable=AsyncMock, - return_value=resolved_model, - ): - result = await resolve_params_model_refs(params) - - assert isinstance(result["judge_embeddings"]["model"], dict) - assert result["judge_embeddings"]["model"]["name"] == "embed" - - @pytest.mark.asyncio - async def test_resolve_params_dict_model_unchanged(self): - """Dict model values (inline models) are not modified.""" - params = { - "judge": { - "model": {"url": "http://example.com/v1", "name": "gpt-4o", "format": "openai"}, - }, - } - result = await resolve_params_model_refs(params) - # Dict model should remain unchanged - assert result["judge"]["model"] == params["judge"]["model"] - - @pytest.mark.asyncio - async def test_resolve_params_does_not_mutate_original(self): - """Original params dict is not mutated.""" - params = { - "judge": { - "model": {"url": "http://example.com/v1", "name": "gpt-4o", "format": "openai"}, - }, - } - original_model = dict(params["judge"]["model"]) - await resolve_params_model_refs(params) - assert params["judge"]["model"] == original_model - - -class TestRewriteModelsForJobContainer: - def test_rewrites_loopback_model_urls(self): - payload = { - "model": { - "url": "http://localhost:8080/apis/inference-gateway/v2/workspaces/ws/model/test/-/v1", - "host_url": "http://127.0.0.1:9000", - "name": "test-model", - "format": "nim", - } - } - - result = rewrite_models_for_job_container(payload, target_base_url="http://nmp-quickstart:8080") - - assert result["model"]["url"] == ( - "http://nmp-quickstart:8080/apis/inference-gateway/v2/workspaces/ws/model/test/-/v1" - ) - assert result["model"]["host_url"] == "http://nmp-quickstart:8080" - assert payload["model"]["url"].startswith("http://localhost") - - def test_rewrites_nested_models_only(self): - payload = { - "metric_params": { - "judge": { - "model": { - "url": "http://127.0.0.1:8080/apis/inference-gateway/v2/workspaces/ws/model/judge/-/v1", - "name": "judge-model", - "format": "nim", - } - } - }, - "other_url": "http://localhost:8080/leave-alone", - } - - result = rewrite_models_for_job_container(payload, target_base_url="http://container-abc123:8080") - - assert result["metric_params"]["judge"]["model"]["url"] == ( - "http://container-abc123:8080/apis/inference-gateway/v2/workspaces/ws/model/judge/-/v1" - ) - assert result["other_url"] == "http://localhost:8080/leave-alone" - - def test_leaves_non_loopback_model_urls_unchanged(self): - payload = { - "model": { - "url": "http://gateway:8080/apis/inference-gateway/v2/workspaces/ws/model/test/-/v1", - "name": "test-model", - "format": "nim", - } - } - - result = rewrite_models_for_job_container(payload, target_base_url="http://container-abc123:8080") - - assert result == payload diff --git a/services/evaluator/tests/nmp/evaluator/api/v2/test_validation_messages.py b/services/evaluator/tests/nmp/evaluator/api/v2/test_validation_messages.py deleted file mode 100644 index f91eaf6f00..0000000000 --- a/services/evaluator/tests/nmp/evaluator/api/v2/test_validation_messages.py +++ /dev/null @@ -1,40 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import nmp.evaluator.app.values as app -from nmp.evaluator.api.v2.common.checks import mapping_hint, schema_error_message - - -def test_metric_schema_error_message_deduplicates_missing_field_pairs(): - message = schema_error_message( - "Dataset schema is incompatible with metric 'llm-judge'", - [ - "dataset schema missing required field 'input'", - "dataset schema missing field definition 'input'", - "dataset schema missing required field 'output'", - "dataset schema missing field definition 'output'", - ], - hint=mapping_hint(app.FieldMapping()), - ) - - assert "missing required field 'input'" in message - assert "missing field definition 'input'" not in message - assert "missing required field 'output'" in message - assert "missing field definition 'output'" not in message - assert "provide field_mapping" in message - - -def test_benchmark_schema_error_message_deduplicates_repeated_errors_and_adds_mapping_hint(): - message = schema_error_message( - "Benchmark dataset schema is incompatible with benchmark metrics", - [ - "dataset schema missing required field 'output'", - "dataset schema missing field definition 'output'", - "dataset schema missing required field 'output'", - ], - hint=mapping_hint(app.FieldMapping(output="answer")), - ) - - assert message.count("missing required field 'output'") == 1 - assert "missing field definition 'output'" not in message - assert "Check field_mapping values against your dataset schema" in message diff --git a/services/evaluator/tests/nmp/evaluator/app/entities/test_utils.py b/services/evaluator/tests/nmp/evaluator/app/entities/test_utils.py deleted file mode 100644 index 5d9185faf1..0000000000 --- a/services/evaluator/tests/nmp/evaluator/app/entities/test_utils.py +++ /dev/null @@ -1,214 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for EmbeddedEntityMixin in entities/utils.py.""" - -from datetime import datetime -from typing import ClassVar - -from nmp.common.entities.client import EntityBase -from nmp.evaluator.entities.utils import EmbeddedEntityMixin -from pydantic import Field - - -class ChildEntity(EntityBase): - """Simple entity for testing embedding.""" - - value: str - - -class ParentWithMixin(EmbeddedEntityMixin, EntityBase): - """Parent entity using the mixin.""" - - __embedded_entity_fields__: ClassVar[dict[str, type]] = {"children": ChildEntity} - - children: list[ChildEntity] - - -class ParentWithoutEmbeddedFields(EmbeddedEntityMixin, EntityBase): - """Parent entity with mixin but no embedded fields defined.""" - - name_field: str - - -class TestEmbeddedEntityMixinSerialization: - """Tests for _get_data_fields serialization.""" - - def test_preserves_nested_entity_ids_during_serialization(self): - """Nested entity IDs should be included in serialized data.""" - child = ChildEntity(name="child-1", workspace="default", value="test") - child._id = "child-id-123" - child._created_at = datetime(2024, 1, 15, 10, 30) - child._updated_at = datetime(2024, 1, 15, 10, 30) - - parent = ParentWithMixin(name="parent-1", workspace="default", children=[child]) - - data = parent._get_data_fields() - - assert "children" in data - assert len(data["children"]) == 1 - assert data["children"][0]["id"] == "child-id-123" - assert data["children"][0]["created_at"] == "2024-01-15T10:30:00" - - def test_excludes_top_level_computed_fields(self): - """Top-level id/created_at/updated_at should not be in serialized data.""" - child = ChildEntity(name="child-1", workspace="default", value="test") - parent = ParentWithMixin(name="parent-1", workspace="default", children=[child]) - parent._id = "parent-id-456" - parent._created_at = datetime(2024, 1, 20) - - data = parent._get_data_fields() - - assert "id" not in data - assert "created_at" not in data - assert "updated_at" not in data - assert "entity_id" not in data - - -class TestEmbeddedEntityMixinDeserialization: - """Tests for _restore_embedded_entity_ids deserialization.""" - - def test_restores_nested_entity_ids_from_dict(self): - """IDs and timestamps should be restored to nested entities from dict data.""" - data = { - "name": "parent-1", - "workspace": "default", - "children": [ - { - "name": "child-1", - "workspace": "default", - "value": "test", - "id": "restored-id-123", - "created_at": "2024-01-15T10:30:00", - "updated_at": "2024-01-15T11:00:00", - } - ], - } - - parent = ParentWithMixin.model_validate(data) - - assert parent.children[0].id == "restored-id-123" - assert parent.children[0].created_at == datetime(2024, 1, 15, 10, 30) - assert parent.children[0].updated_at == datetime(2024, 1, 15, 11, 0) - - def test_handles_datetime_objects_in_nested_data(self): - """Datetime objects (not strings) should be handled correctly.""" - data = { - "name": "parent-1", - "workspace": "default", - "children": [ - { - "name": "child-1", - "workspace": "default", - "value": "test", - "id": "id-123", - "created_at": datetime(2024, 1, 15, 10, 30), - "updated_at": datetime(2024, 1, 15, 11, 0), - } - ], - } - - parent = ParentWithMixin.model_validate(data) - - assert parent.children[0].created_at == datetime(2024, 1, 15, 10, 30) - assert parent.children[0].updated_at == datetime(2024, 1, 15, 11, 0) - - def test_handles_missing_id_fields(self): - """Validation should work when nested entities have no IDs.""" - data = { - "name": "parent-1", - "workspace": "default", - "children": [ - { - "name": "child-1", - "workspace": "default", - "value": "test", - # No id, created_at, updated_at - } - ], - } - - parent = ParentWithMixin.model_validate(data) - - assert parent.children[0].id == "" # Default empty string - assert parent.children[0].created_at is None - - def test_passes_through_entity_instances(self): - """Already-validated entity instances should pass through unchanged.""" - child = ChildEntity(name="child-1", workspace="default", value="test") - child._id = "existing-id" - child._created_at = datetime(2024, 1, 15) - - parent = ParentWithMixin(name="parent-1", workspace="default", children=[child]) - - assert parent.children[0].id == "existing-id" - assert parent.children[0].created_at == datetime(2024, 1, 15) - - def test_handles_non_dict_input(self): - """Non-dict input should pass through (edge case for model_validator).""" - # When Pydantic passes already-validated instances, it may not be a dict - child = ChildEntity(name="child-1", workspace="default", value="test") - parent = ParentWithMixin(name="parent-1", workspace="default", children=[child]) - - # Round-trip through model_validate with an instance - parent2 = ParentWithMixin.model_validate(parent) - assert parent2.name == "parent-1" - - def test_handles_empty_embedded_fields_config(self): - """Entity with mixin but no __embedded_entity_fields__ should work.""" - data = {"name": "test", "workspace": "default", "name_field": "value"} - - entity = ParentWithoutEmbeddedFields.model_validate(data) - - assert entity.name == "test" - assert entity.name_field == "value" - - def test_handles_missing_embedded_field_in_data(self): - """Validation should work when embedded field is not in input data.""" - - # Create a variant that has an optional children field - class OptionalChildrenParent(EmbeddedEntityMixin, EntityBase): - __embedded_entity_fields__: ClassVar[dict[str, type]] = {"children": ChildEntity} - children: list[ChildEntity] = Field(default_factory=list) - - data = {"name": "parent-1", "workspace": "default"} - - parent = OptionalChildrenParent.model_validate(data) - - assert parent.children == [] - - -class TestEmbeddedEntityMixinRoundTrip: - """Tests for full serialization/deserialization round-trip.""" - - def test_full_round_trip_preserves_nested_ids(self): - """IDs should survive serialize -> store -> deserialize cycle.""" - # Create entity with nested IDs - child = ChildEntity(name="child-1", workspace="default", value="test") - child._id = "child-id-abc" - child._created_at = datetime(2024, 1, 15, 10, 30) - child._updated_at = datetime(2024, 1, 15, 10, 30) - - parent = ParentWithMixin(name="parent-1", workspace="default", children=[child]) - - # Simulate what EntityClient does: serialize - data = parent._get_data_fields() - - # Simulate store response (store adds parent's own id/timestamps) - store_response = { - **data, - "name": "parent-1", - "workspace": "default", - "id": "parent-id-xyz", - "created_at": "2024-01-20T12:00:00", - "updated_at": "2024-01-20T12:00:00", - } - - # Deserialize - reconstructed = ParentWithMixin.model_validate(store_response) - - # Verify nested IDs preserved - assert reconstructed.children[0].id == "child-id-abc" - assert reconstructed.children[0].created_at == datetime(2024, 1, 15, 10, 30) - assert reconstructed.children[0].name == "child-1" - assert reconstructed.children[0].value == "test" diff --git a/services/evaluator/tests/nmp/evaluator/app/metrics/test_metric_protocol.py b/services/evaluator/tests/nmp/evaluator/app/metrics/test_metric_protocol.py deleted file mode 100644 index ec4159e534..0000000000 --- a/services/evaluator/tests/nmp/evaluator/app/metrics/test_metric_protocol.py +++ /dev/null @@ -1,120 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest.mock import patch - -import pytest -from nemo_evaluator_sdk.enums import MetricType, ModelFormat -from nemo_evaluator_sdk.metrics.bleu import BLEUMetric -from nemo_evaluator_sdk.metrics.exact_match import ExactMatchMetric -from nemo_evaluator_sdk.metrics.f1 import F1Metric -from nemo_evaluator_sdk.metrics.llm_judge import LLMJudgeMetric -from nemo_evaluator_sdk.metrics.number_check import NumberCheckMetric -from nemo_evaluator_sdk.metrics.protocol import Metric -from nemo_evaluator_sdk.metrics.rouge import ROUGEMetric -from nemo_evaluator_sdk.metrics.string_check import StringCheckMetric -from nemo_evaluator_sdk.metrics.tool_calling import ToolCallingMetric -from nemo_evaluator_sdk.values import ( - JSONScoreParser, - Model, - RemoteScore, - Rubric, - RubricScore, - SecretRef, -) -from nmp.evaluator.app.metrics.metric import _METRIC_CLASSES -from nmp.evaluator.app.metrics.remote import NemoAgentToolkitRemoteMetric, RemoteMetric - - -class TestProtocolConformance: - def test_metric_typing_bleu(self): - metric = BLEUMetric(references=["Hello, world!"], candidate="Hello, world!") - assert isinstance(metric, Metric) - - def test_metric_typing_exact_match(self): - metric = ExactMatchMetric(reference="Hello, world!", candidate="Hello, world!") - assert isinstance(metric, Metric) - - def test_metric_typing_f1(self): - metric = F1Metric(reference="Hello, world!") - assert isinstance(metric, Metric) - - @patch.dict(os.environ, {"secret_name": "secret_***"}) - def test_metric_typing_llm_judge(self): - score = RubricScore( - name="name", - rubric=[ - Rubric(label="label", description="description", value=1), - Rubric(label="label", description="description", value=1), - ], - ) - score.parser = JSONScoreParser(json_path="json_path") - metric = LLMJudgeMetric( - model=Model( - url="https://api.openai.com/v1", - name="gpt-4o", - api_key_secret=SecretRef(root="secret_name"), - format=ModelFormat.OPEN_AI, - ), - prompt_template="prompt_template", - scores=[score], - ) - assert isinstance(metric, Metric) - - def test_metric_typing_number_check(self): - metric = NumberCheckMetric( - operation="equals", - left_template="left_template", - right_template="right_template", - ) - assert isinstance(metric, Metric) - - def test_metric_typing_remote(self): - metric = RemoteMetric( - url="url", - body={"input_args": "input_args"}, - scores=[RemoteScore(name="score", parser=JSONScoreParser(json_path="$.result.score"))], - ) - assert isinstance(metric, Metric) - - def test_metric_typing_nemo_agent_toolkit_remote(self): - metric = NemoAgentToolkitRemoteMetric( - url="url", - evaluator_name="tool_accuracy", - ) - assert isinstance(metric, Metric) - - def test_metric_typing_rouge(self): - metric = ROUGEMetric(reference="Hello, world!") - assert isinstance(metric, Metric) - - def test_metric_typing_string_check(self): - metric = StringCheckMetric( - operation="equals", - left_template="left_template", - right_template="right_template", - ) - assert isinstance(metric, Metric) - - def test_metric_typing_tool_calling(self): - metric = ToolCallingMetric(reference="Hello, world!") - assert isinstance(metric, Metric) - - @pytest.mark.parametrize( - ("metric_type", "metric_cls"), - [ - (MetricType.BLEU, BLEUMetric), - (MetricType.EXACT_MATCH, ExactMatchMetric), - (MetricType.F1, F1Metric), - (MetricType.LLM_JUDGE, LLMJudgeMetric), - (MetricType.NUMBER_CHECK, NumberCheckMetric), - (MetricType.REMOTE, RemoteMetric), - (MetricType.NEMO_AGENT_TOOLKIT_REMOTE, NemoAgentToolkitRemoteMetric), - (MetricType.ROUGE, ROUGEMetric), - (MetricType.STRING_CHECK, StringCheckMetric), - (MetricType.TOOL_CALLING, ToolCallingMetric), - ], - ) - def test_metric_registry_uses_direct_runtime_classes(self, metric_type: MetricType, metric_cls: type[Metric]): - assert _METRIC_CLASSES[metric_type] is metric_cls diff --git a/services/evaluator/tests/nmp/evaluator/app/test_values.py b/services/evaluator/tests/nmp/evaluator/app/test_values.py deleted file mode 100644 index 7990a50ffb..0000000000 --- a/services/evaluator/tests/nmp/evaluator/app/test_values.py +++ /dev/null @@ -1,241 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Tests for evaluator app value models.""" - -import pytest -from nemo_evaluator_sdk.enums import ModelFormat -from nemo_evaluator_sdk.values import DatasetRows, InferenceParams, Model, RunConfigOnlineModel, SecretRef -from pydantic import ValidationError - -# Many tests in this file intentionally pass invalid arguments to verify -# that Pydantic validation rejects them. We use **{} to bypass type checking -# for intentionally invalid arguments. - - -class TestSecretRefValidation: - @pytest.mark.parametrize( - ("value", "expected"), - [ - ("workspace/name", "workspace/name"), - ("secret-name", "secret-name"), - ("NVIDIA_BUILD_API_KEY", "NVIDIA_BUILD_API_KEY"), - ("workspace/NVIDIA_BUILD_API_KEY", "workspace/NVIDIA_BUILD_API_KEY"), - ("Workspace/Secret_Name", "Workspace/Secret_Name"), - ], - ) - def test_valid_secret_ref(self, value: str, expected: str): - secret_ref = SecretRef(value) - assert secret_ref.root == expected - - @pytest.mark.parametrize( - "value", - [ - "invalid/workspace/ref", - "invalid/characters@?", - "invalid-characters@?", - "", - ], - ) - def test_invalid_secret_ref(self, value: str): - with pytest.raises(ValidationError) as e: - SecretRef(value) - assert "String should match pattern" in str(e.value.errors()) - - -class TestModelSecretEnv: - @pytest.mark.parametrize( - ("value", "expected"), - [ - ("my-workspace/my-secret", "my_workspace_my_secret"), - ("my-secret", "my_secret"), - ("9my-secret", "_9my_secret"), - ("NVIDIA_BUILD_API_KEY", "NVIDIA_BUILD_API_KEY"), - ("workspace/NVIDIA_BUILD_API_KEY", "workspace_NVIDIA_BUILD_API_KEY"), - ("Workspace/Secret_Name", "Workspace_Secret_Name"), - ], - ) - def test_api_key_env(self, value: str, expected: str): - model = Model( - url="http://localhost:8000", - name="my-model", - api_key_secret=SecretRef(value), - ) - assert model.api_key_env == expected - - -class TestRunConfigValidation: - """Tests for RunConfig extra field rejection.""" - - def test_valid_params_accepted(self): - """Valid parameters should be accepted.""" - params = RunConfigOnlineModel( - limit_samples=10, - parallelism=4, - max_retries=2, - request_timeout=120, - inference=InferenceParams(max_tokens=1024, temperature=0.5), - ) - assert params.limit_samples == 10 - assert params.parallelism == 4 - assert params.max_retries == 2 - assert params.request_timeout == 120 - assert params.inference is not None - assert params.inference.max_tokens == 1024 - - def test_extra_fields_rejected(self): - """Unknown fields at top level should be rejected.""" - with pytest.raises(ValidationError) as exc_info: - RunConfigOnlineModel.model_validate( - { - "limit_samples": 10, - "max_tokens": 4096, # Wrong level - should be inference.max_tokens - } - ) - err = exc_info.value - assert err.errors()[0]["type"] == "extra_forbidden" - assert "max_tokens" in str(err.errors()[0]["loc"]) - - def test_multiple_extra_fields_rejected(self): - """Multiple unknown fields should all be reported.""" - with pytest.raises(ValidationError) as exc_info: - RunConfigOnlineModel.model_validate( - { - "limit_samples": 10, - "max_tokens": 4096, - "temperature": 0.5, - "unknown_field": "value", - } - ) - err = exc_info.value - assert len(err.errors()) == 3 # max_tokens, temperature, unknown_field - - def test_inference_params_allow_extra(self): - """InferenceParams should allow extra fields for vendor-specific params.""" - params = RunConfigOnlineModel.model_validate( - { - "inference": { - "max_tokens": 1024, - "vendor_specific_param": "some_value", - } - } - ) - # Extra fields are allowed in InferenceParams - assert params.inference is not None - assert params.inference.max_tokens == 1024 - - -class TestModelValidation: - """Tests for Model extra field rejection.""" - - def test_valid_model_accepted(self): - """Valid model configuration should be accepted.""" - model = Model( - url="http://localhost:8000/v1/chat/completions", - name="test-model", - format=ModelFormat.NVIDIA_NIM, - ) - assert model.url == "http://localhost:8000/v1/chat/completions" - assert model.name == "test-model" - assert model.format == ModelFormat.NVIDIA_NIM - - def test_extra_fields_rejected(self): - """Unknown fields should be rejected.""" - with pytest.raises(ValidationError) as exc_info: - Model.model_validate( - { - "url": "http://localhost:8000/v1/chat/completions", - "name": "test-model", - "model_type": "chat", # Not a valid field - } - ) - err = exc_info.value - assert len(err.errors()) == 1 - assert err.errors()[0]["type"] == "extra_forbidden" - - def test_typo_in_field_name_rejected(self): - """Typos in field names should be rejected.""" - with pytest.raises(ValidationError) as exc_info: - Model.model_validate( - { - "url": "http://localhost:8000/v1/chat/completions", - "name": "test-model", - "endpont": "http://wrong", # Typo: endpont instead of endpoint - } - ) - err = exc_info.value - assert any(e["type"] == "extra_forbidden" for e in err.errors()) - - def test_llama_stack_format_accepted(self): - """llama_stack should be accepted as a valid model format.""" - model = Model.model_validate( - { - "url": "http://localhost:8000/v1/chat/completions", - "name": "test-model", - "format": "llama_stack", - } - ) - assert model.format == ModelFormat.LLAMA_STACK - - def test_lama_stack_format_rejected(self): - """lama_stack typo should be rejected.""" - with pytest.raises(ValidationError) as exc_info: - Model.model_validate( - { - "url": "http://localhost:8000/v1/chat/completions", - "name": "test-model", - "format": "lama_stack", - } - ) - err = exc_info.value - assert any(e["loc"] == ("format",) for e in err.errors()) - - -class TestDatasetRowsValidation: - """Tests for DatasetRows extra field rejection.""" - - def test_valid_dataset_accepted(self): - """Valid dataset configuration should be accepted.""" - dataset = DatasetRows( - rows=[{"input": "test", "output": "result"}], - ) - assert len(dataset.rows) == 1 - - def test_extra_fields_rejected(self): - """Unknown fields should be rejected.""" - with pytest.raises(ValidationError) as exc_info: - DatasetRows.model_validate( - { - "rows": [{"input": "test"}], - "path": "/some/path", # Not a valid field - } - ) - err = exc_info.value - assert len(err.errors()) == 1 - assert err.errors()[0]["type"] == "extra_forbidden" - - def test_typo_in_field_name_rejected(self): - """Typos in field names should be rejected.""" - with pytest.raises(ValidationError) as exc_info: - DatasetRows.model_validate( - { - "rows": [{"input": "test"}], - "rowz": [{"input": "test"}], # Typo: rowz instead of rows - } - ) - err = exc_info.value - assert any(e["type"] == "extra_forbidden" for e in err.errors()) - - def test_rows_required(self): - """Rows field is required and must have at least one item.""" - with pytest.raises(ValidationError) as exc_info: - DatasetRows() # type: ignore[call-arg] - err = exc_info.value - assert any(e["loc"] == ("rows",) for e in err.errors()) - - def test_empty_rows_rejected(self): - """Empty rows array should be rejected.""" - with pytest.raises(ValidationError) as exc_info: - DatasetRows(rows=[]) - err = exc_info.value - assert any(e["type"] == "too_short" for e in err.errors()) diff --git a/services/evaluator/tests/notebooks/register-entities-in-entity-store.ipynb b/services/evaluator/tests/notebooks/register-entities-in-entity-store.ipynb deleted file mode 100644 index 07b020672d..0000000000 --- a/services/evaluator/tests/notebooks/register-entities-in-entity-store.ipynb +++ /dev/null @@ -1,203 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "751c058f8432bbb", - "metadata": {}, - "source": [ - "# Register entities in Entity Store\n", - "\n", - "First, we will register the evaluation dataset in the entity store." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "initial_id", - "metadata": { - "ExecuteTime": { - "end_time": "2025-02-14T14:05:38.408288Z", - "start_time": "2025-02-14T14:05:37.884137Z" - }, - "collapsed": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'schema_version': '1.0',\n", - " 'id': 'dataset-Uu3hLqPLQzevi37G6xtVbd',\n", - " 'description': None,\n", - " 'type_prefix': None,\n", - " 'namespace': 'default',\n", - " 'project': None,\n", - " 'created_at': '2025-02-14T14:05:38.499329',\n", - " 'updated_at': '2025-02-14T14:05:38.499333',\n", - " 'custom_fields': {},\n", - " 'ownership': None,\n", - " 'name': 'math',\n", - " 'version_id': 'main',\n", - " 'version_tags': [],\n", - " 'format': None,\n", - " 'files_url': 'hf://datasets/default/eval-test-data-math'}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import requests\n", - "\n", - "res = requests.post(\n", - " \"http://nemo.test:8008/v1/datasets\",\n", - " json={\"name\": \"math\", \"namespace\": \"default\", \"files_url\": \"hf://datasets/default/eval-test-data-math\"},\n", - ")\n", - "dataset = res.json()\n", - "dataset" - ] - }, - { - "cell_type": "markdown", - "id": "a334c137c2964521", - "metadata": {}, - "source": "Next, we'll register the evaluation model." - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "8d5ad7bacd8f272a", - "metadata": { - "ExecuteTime": { - "end_time": "2025-02-14T14:40:13.826567Z", - "start_time": "2025-02-14T14:40:13.275257Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'created_at': '2025-02-14T14:40:13.938374',\n", - " 'updated_at': '2025-02-14T14:40:13.938375',\n", - " 'name': 'llama-3.1-8b',\n", - " 'namespace': 'meta',\n", - " 'description': None,\n", - " 'spec': None,\n", - " 'artifact': None,\n", - " 'base_model': None,\n", - " 'api_endpoint': {'url': 'http://nim.test:8008/v1/completions',\n", - " 'model_id': 'meta/llama-3.1-8b-instruct',\n", - " 'api_key': None,\n", - " 'format': 'openai'},\n", - " 'peft': None,\n", - " 'prompt': None,\n", - " 'guardrails': None,\n", - " 'schema_version': '1.0',\n", - " 'project': None,\n", - " 'custom_fields': {},\n", - " 'ownership': None}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = requests.post(\n", - " \"http://nemo.test:8008/v1/models\",\n", - " json={\n", - " \"name\": \"llama-3.1-8b\",\n", - " \"namespace\": \"meta\",\n", - " \"api_endpoint\": {\n", - " \"url\": \"http://nim.test:8008/v1/completions\",\n", - " \"model_id\": \"meta/llama-3.1-8b-instruct\",\n", - " },\n", - " },\n", - ")\n", - "model = res.json()\n", - "model" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "993d6704d54dfeec", - "metadata": { - "ExecuteTime": { - "end_time": "2025-02-14T14:45:38.424744Z", - "start_time": "2025-02-14T14:45:37.849506Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'created_at': '2025-02-14T14:45:38.536983',\n", - " 'updated_at': '2025-02-14T14:45:38.536987',\n", - " 'name': 'llama-3.1-8b-instruct',\n", - " 'namespace': 'meta',\n", - " 'description': None,\n", - " 'spec': None,\n", - " 'artifact': None,\n", - " 'base_model': None,\n", - " 'api_endpoint': None,\n", - " 'peft': None,\n", - " 'prompt': None,\n", - " 'guardrails': None,\n", - " 'schema_version': '1.0',\n", - " 'project': None,\n", - " 'custom_fields': {},\n", - " 'ownership': None}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# This is one we register manually until DMS will register it automatically\n", - "res = requests.post(\n", - " \"http://nemo.test:8008/v1/models\",\n", - " json={\n", - " \"name\": \"llama-3.1-8b-instruct\",\n", - " \"namespace\": \"meta\",\n", - " },\n", - ")\n", - "model = res.json()\n", - "model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "65b4009200e0981e", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/services/evaluator/tests/notebooks/upload-to-datastore.ipynb b/services/evaluator/tests/notebooks/upload-to-datastore.ipynb deleted file mode 100644 index d55139126a..0000000000 --- a/services/evaluator/tests/notebooks/upload-to-datastore.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "metadata": {}, - "cell_type": "markdown", - "source": [ - "# Upload Evaluation Dataset to data store\n", - "\n", - "In this notebook, we will upload the evaluation dataset to the data store.\n", - "\n", - "## Prerequisites\n", - "\n", - "- You need to have the `huggingface_hub` package installed.\n", - "- A running instance of the data store available at `http://data-store.test:8008`." - ], - "id": "a3c783dc775b77bf" - }, - { - "cell_type": "code", - "id": "initial_id", - "metadata": { - "collapsed": true - }, - "source": [ - "from huggingface_hub import HfApi\n", - "\n", - "hf_api = HfApi(endpoint=\"http://data-store.test:8008/v1/hf\", token=\"token\")" - ], - "outputs": [], - "execution_count": null - }, - { - "metadata": {}, - "cell_type": "markdown", - "source": [ - "We use the `data` folder to upload all the test data. The folder contains the following files:\n", - "- simple-math.csv\n", - "- test_dataset_1.json" - ], - "id": "5e003b4b0ddd98e2" - }, - { - "metadata": {}, - "cell_type": "code", - "source": [ - "dataset_name = \"eval-test-data-math\"\n", - "namespace = \"default\"\n", - "repo_id = f\"{namespace}/{dataset_name}\"\n", - "\n", - "hf_api.create_repo(repo_id, repo_type=\"dataset\")" - ], - "id": "152f4fa16ea68d44", - "outputs": [], - "execution_count": null - }, - { - "metadata": {}, - "cell_type": "code", - "source": "hf_api.upload_folder(folder_path=\"../datasets/math\", path_in_repo=\"\", repo_id=repo_id, repo_type=\"dataset\")", - "id": "3a99098d9d9a8097", - "outputs": [], - "execution_count": null - }, - { - "metadata": {}, - "cell_type": "markdown", - "source": "Check the uploaded files:", - "id": "b5ebbca0ab80d74e" - }, - { - "metadata": {}, - "cell_type": "code", - "source": "assert repo_id in [dataset.id for dataset in hf_api.list_datasets()]", - "id": "54216d170cbf6bcc", - "outputs": [], - "execution_count": null - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/services/evaluator/tests/tasks/__init__.py b/services/evaluator/tests/tasks/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/evaluator/tests/tasks/test_download_fileset_task.py b/services/evaluator/tests/tasks/test_download_fileset_task.py deleted file mode 100644 index c3241a09bf..0000000000 --- a/services/evaluator/tests/tasks/test_download_fileset_task.py +++ /dev/null @@ -1,123 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import json -from pathlib import Path - -import pytest -from nmp.evaluator.tasks.download_fileset.__main__ import main, move_to_target -from pytest_mock import MockerFixture - - -class TestMoveToTarget: - def test_replaces_existing_file_collision(self, tmp_path: Path): - local_dir = tmp_path / "local" - target_dir = tmp_path / "target" - local_dir.mkdir() - target_dir.mkdir() - - (local_dir / "dataset.json").write_text("new") - (target_dir / "dataset.json").write_text("old") - - move_to_target(str(local_dir), str(target_dir)) - - assert (target_dir / "dataset.json").read_text() == "new" - assert not any(local_dir.iterdir()) - - def test_replaces_existing_directory_collision(self, tmp_path: Path): - local_dir = tmp_path / "local" - target_dir = tmp_path / "target" - local_dir.mkdir() - target_dir.mkdir() - - (local_dir / "dataset").mkdir() - (local_dir / "dataset" / "new.json").write_text("new") - (target_dir / "dataset").mkdir() - (target_dir / "dataset" / "old.json").write_text("old") - - move_to_target(str(local_dir), str(target_dir)) - - moved_dir = target_dir / "dataset" - assert moved_dir.is_dir() - assert (moved_dir / "new.json").read_text() == "new" - assert not (moved_dir / "old.json").exists() - - -class TestMain: - @pytest.mark.asyncio - async def test_expands_env_vars_and_copies_when_target_dir_provided( - self, tmp_path: Path, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch - ): - local_root = tmp_path / "local-root" - target_root = tmp_path / "target-root" - monkeypatch.setenv("LOCAL_ROOT", str(local_root)) - monkeypatch.setenv("TARGET_ROOT", str(target_root)) - - mock_download_dataset = mocker.patch( - "nmp.evaluator.tasks.download_fileset.__main__.download_dataset", - new=mocker.AsyncMock(), - ) - mock_move_to_target = mocker.patch("nmp.evaluator.tasks.download_fileset.__main__.move_to_target") - - result = await main( - [ - "--dataset", - json.dumps({"rows": [{"x": 1}]}), - "--local-dir", - "${LOCAL_ROOT}/scratch", - "--target-dir", - "${TARGET_ROOT}/datasets", - ], - sdk=mocker.Mock(), - ) - - assert result == 0 - mock_download_dataset.assert_awaited_once() - assert mock_download_dataset.await_args.kwargs["destination"] == str(local_root / "scratch") - mock_move_to_target.assert_called_once_with(str(local_root / "scratch"), str(target_root / "datasets")) - - @pytest.mark.asyncio - async def test_does_not_copy_when_target_dir_not_provided(self, mocker: MockerFixture): - mock_download_dataset = mocker.patch( - "nmp.evaluator.tasks.download_fileset.__main__.download_dataset", - new=mocker.AsyncMock(), - ) - mock_move_to_target = mocker.patch("nmp.evaluator.tasks.download_fileset.__main__.move_to_target") - - result = await main( - [ - "--dataset", - json.dumps({"rows": [{"x": 1}]}), - "--local-dir", - "/tmp/local", - ], - sdk=mocker.Mock(), - ) - - assert result == 0 - mock_download_dataset.assert_awaited_once() - mock_move_to_target.assert_not_called() - - @pytest.mark.asyncio - async def test_does_not_copy_when_local_and_target_are_equal(self, mocker: MockerFixture): - mock_download_dataset = mocker.patch( - "nmp.evaluator.tasks.download_fileset.__main__.download_dataset", - new=mocker.AsyncMock(), - ) - mock_move_to_target = mocker.patch("nmp.evaluator.tasks.download_fileset.__main__.move_to_target") - - result = await main( - [ - "--dataset", - json.dumps({"rows": [{"x": 1}]}), - "--local-dir", - "/tmp/same", - "--target-dir", - "/tmp/same", - ], - sdk=mocker.Mock(), - ) - - assert result == 0 - mock_download_dataset.assert_awaited_once() - mock_move_to_target.assert_not_called() diff --git a/services/evaluator/tests/tasks/test_evaluate_benchmark.py b/services/evaluator/tests/tasks/test_evaluate_benchmark.py deleted file mode 100644 index 4075de250a..0000000000 --- a/services/evaluator/tests/tasks/test_evaluate_benchmark.py +++ /dev/null @@ -1,493 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from pathlib import Path - -import pytest -from nemo_evaluator_sdk.execution.values import EvaluationError, EvaluationPhase -from nemo_evaluator_sdk.metrics.protocol import MetricInput, MetricOutput, MetricOutputSpec, MetricResult -from nemo_evaluator_sdk.values import AggregateRangeScore -from nemo_evaluator_sdk.values.multi_metric_results import BenchmarkEvaluationResult as SDKBenchmarkEvaluationResult -from nmp.common.jobs.constants import NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, PERSISTENT_JOB_STORAGE_PATH_ENVVAR -from nmp.evaluator.app.values import ( - BenchmarkEvaluationResult, - BenchmarkMetricResult, - BenchmarkOfflineJob, - BenchmarkOnlineAgentJob, - BenchmarkOnlineJob, -) -from nmp.evaluator.tasks.evaluate_benchmark.__main__ import ( - _load_dataset_items, - benchmark_evaluation_entrypoint, - benchmark_evaluation_entrypoint_args, - evaluate_benchmark, - main, -) -from pytest_mock import MockerFixture - - -def _write_benchmark_job_config(tmp_path: Path) -> Path: - """Write a minimal benchmark task config file for CLI-oriented tests.""" - config_path = tmp_path / "benchmark-job.json" - config_path.write_text("{}") - return config_path - - -class TestEvaluateBenchmark: - def test_load_dataset_items_defaults_optional_metric_fields(self, mocker: MockerFixture, tmp_path: Path) -> None: - """Benchmark dataset loading should map canonical fields and default optional metric fields.""" - job = BenchmarkOnlineJob.model_validate( - { - "benchmark": { - "name": "pipeline-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/llm-judge", - "metric": { - "type": "llm-judge", - "model": {"url": "http://nim.test/v1", "name": "judge", "format": "openai"}, - "optional_fields": ["reference"], - "scores": [ - { - "name": "score", - "description": "Score from 1-5", - "minimum": 1, - "maximum": 5, - "parser": {"type": "json", "json_path": "score"}, - } - ], - "prompt_template": { - "messages": [ - {"role": "user", "content": "Q: {{item.input}}\nR: {{item.reference}}"} - ] - }, - }, - } - ], - "field_mapping": {"input": "question"}, - }, - "model": {"url": "http://nim.test/v1", "name": "my/model"}, - "prompt_template": "{{item.input}}", - } - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.load_dataset_from_ref_as_dicts", - return_value=[{"question": "hello"}], - ) - - assert _load_dataset_items(job, dataset_dir=str(tmp_path)) == [ - {"question": "hello", "input": "hello", "reference": ""} - ] - - def test_load_dataset_items_defaults_to_runtime_job_storage( - self, mocker: MockerFixture, tmp_path: Path, monkeypatch: pytest.MonkeyPatch - ) -> None: - """Benchmark dataset loading should read from runtime job storage by default.""" - job = BenchmarkOfflineJob.model_validate( - { - "benchmark": { - "name": "test-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/exact-match", - "metric": {"type": "exact-match", "reference": "{{item.expected}}"}, - } - ], - }, - } - ) - storage_dir = tmp_path / "job-storage" - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(storage_dir)) - load_dataset = mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.load_dataset_from_ref_as_dicts", - return_value=[{"input": "hello"}], - ) - - assert _load_dataset_items(job) == [{"input": "hello"}] - load_dataset.assert_called_once_with("test-workspace/test-dataset", base_dir=str(storage_dir / "datasets")) - - @pytest.mark.asyncio - async def test_defaults_missing_params_before_sdk_execution(self, tmp_path: Path, mocker: MockerFixture) -> None: - """Missing job params should be normalized to default offline params.""" - job = BenchmarkOfflineJob.model_validate( - { - "benchmark": { - "name": "test-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/exact-match", - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - }, - } - ], - }, - "params": None, - } - ) - metric = mocker.Mock() - metric.score_names.return_value = ["exact-match"] - service_result = mocker.Mock(results=[]) - - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__._load_dataset_items", - return_value=[{"id": 1}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.new_metric", - new_callable=mocker.AsyncMock, - return_value=metric, - ) - sdk_evaluate = mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.sdk_evaluate_benchmark", - new_callable=mocker.AsyncMock, - return_value=mocker.Mock(row_scores=[]), - ) - mocker.patch( - "nmp.evaluator.app.values.benchmarks_job.BenchmarkEvaluationResult.from_sdk_results", - return_value=service_result, - ) - mocker.patch("nmp.evaluator.tasks.evaluate_benchmark.__main__.job_artifacts_dump") - - result = await evaluate_benchmark(job, str(tmp_path)) - - assert result is service_result - assert sdk_evaluate.await_args.kwargs["params"] is not None - assert sdk_evaluate.await_args.kwargs["params"].parallelism == 8 - assert sdk_evaluate.await_args.kwargs["params"].limit_samples is None - - @pytest.mark.asyncio - async def test_logs_structured_benchmark_error_context(self, tmp_path: Path, mocker: MockerFixture) -> None: - """Typed benchmark SDK failures should be logged with row and metric context.""" - job = BenchmarkOfflineJob.model_validate( - { - "benchmark": { - "name": "test-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/exact-match", - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - }, - } - ], - } - } - ) - metric = mocker.Mock() - metric.score_names.return_value = ["exact-match"] - benchmark_error = EvaluationError( - index=3, - message="metric exploded", - phase=EvaluationPhase.METRIC_SCORING, - metric_key="default/exact-match", - ) - - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__._load_dataset_items", - return_value=[{"id": 1}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.new_metric", - new_callable=mocker.AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.sdk_evaluate_benchmark", - new_callable=mocker.AsyncMock, - side_effect=benchmark_error, - ) - log_exception = mocker.patch("nmp.evaluator.tasks.evaluate_benchmark.__main__.log.exception") - - with pytest.raises(EvaluationError) as exc_info: - await evaluate_benchmark(job, str(tmp_path)) - - assert exc_info.value is benchmark_error - log_exception.assert_called_once_with( - "Benchmark evaluation failed", - extra={ - "phase": "metric_scoring", - "metric_key": "default/exact-match", - "row_index": 3, - "error": "metric exploded", - }, - ) - - @pytest.mark.asyncio - async def test_agent_benchmark_passes_platform_headers_to_agent_inference( - self, tmp_path: Path, mocker: MockerFixture - ) -> None: - """Platform headers from agent URL should reach the agent inference function.""" - job = BenchmarkOnlineAgentJob.model_validate( - { - "benchmark": { - "name": "agent-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/agent-score", - "metric": {"type": "exact-match", "reference": "{{item.expected}}"}, - } - ], - }, - "agent": { - "url": "http://nemo-platform-api.default.svc.cluster.local/v1/agents/test", - "name": "test-agent", - "format": "generic", - "body": {"prompt": "{{ prompt }}"}, - "response_path": "$.answer", - }, - "prompt_template": "{{item.prompt}}", - } - ) - headers = {"X-NMP-Principal-Id": "service:evaluator"} - captured_headers: list[dict[str, str] | None] = [] - - class _FakeMetric: - """Metric test double that returns a fixed score.""" - - def output_spec(self) -> list[MetricOutputSpec]: - """Return the outputs exposed by this metric.""" - return [MetricOutputSpec.continuous_score("score")] - - async def compute_scores(self, input: MetricInput) -> MetricResult: - """Return one fixed metric score.""" - del input - return MetricResult(outputs=[MetricOutput(name="score", value=1.0)]) - - async def _agent_inference( - agent, - request, - max_retries, - default_headers=None, - **kwargs, - ) -> dict: - """Capture forwarded default headers and return an OpenAI-style response.""" - captured_headers.append(default_headers) - return {"choices": [{"message": {"content": "ok"}}]} - - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__._load_dataset_items", - return_value=[{"prompt": "hi", "expected": "ok"}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.new_metric", - new_callable=mocker.AsyncMock, - return_value=_FakeMetric(), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.get_platform_headers", - return_value=headers, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.make_agent_inference_request", - side_effect=_agent_inference, - ) - - await evaluate_benchmark(job, str(tmp_path)) - - assert captured_headers == [headers] - - def test_from_sdk_results_strips_metric_namespace_and_binds_metric_ref(self) -> None: - """SDK benchmark results should be projected onto the service wire shape.""" - job = BenchmarkOfflineJob.model_validate( - { - "benchmark": { - "name": "test-benchmark", - "dataset": "test-workspace/test-dataset", - "metrics": [ - { - "metric_ref": "default/exact-match", - "metric": { - "type": "exact-match", - "reference": "{{item.expected}}", - }, - } - ], - } - } - ) - sdk_result = SDKBenchmarkEvaluationResult.model_validate( - { - "row_scores": [], - "aggregate_scores": {"scores": []}, - "per_metric": { - "default/exact-match": { - "row_scores": [], - "aggregate_scores": { - "scores": [ - { - "name": "default/exact-match.score", - "count": 1, - "nan_count": 0, - "sum": 1.0, - "mean": 1.0, - "min": 1.0, - "max": 1.0, - "variance": 0.0, - "std_dev": 0.0, - "percentiles": { - "p10": 1.0, - "p20": 1.0, - "p30": 1.0, - "p40": 1.0, - "p50": 1.0, - "p60": 1.0, - "p70": 1.0, - "p80": 1.0, - "p90": 1.0, - "p100": 1.0, - }, - "histogram": {"bins": []}, - } - ] - }, - } - }, - } - ) - - result = BenchmarkEvaluationResult.from_sdk_results(sdk_result, job.benchmark.metrics) - sdk_score = sdk_result.per_metric["default/exact-match"].aggregate_scores.scores[0] - assert isinstance(sdk_score, AggregateRangeScore) - - assert result == BenchmarkEvaluationResult( - results=[ - BenchmarkMetricResult( - metric=job.benchmark.metrics[0].metric_ref, - scores=[ - AggregateRangeScore( - name="score", - count=1, - nan_count=0, - sum=1.0, - mean=1.0, - min=1.0, - max=1.0, - variance=0.0, - std_dev=0.0, - percentiles=sdk_score.percentiles, - histogram=sdk_score.histogram, - ) - ], - ) - ] - ) - - -class TestMain: - @pytest.mark.asyncio - async def test_defaults_to_job_runtime_environment( - self, tmp_path: Path, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch - ) -> None: - """Main should use job runtime env vars when argv omits config and results paths.""" - config_file = _write_benchmark_job_config(tmp_path) - storage_dir = tmp_path / "job-storage" - expected_results_dir = str(storage_dir / "results") - evaluation_result = mocker.Mock(results=[mocker.Mock(scores=[mocker.Mock(count=1)])]) - - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_file)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(storage_dir)) - - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.BenchmarkJobAdapter.validate_python", - return_value=mocker.Mock(), - ) - evaluate = mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.evaluate_benchmark", - new_callable=mocker.AsyncMock, - return_value=evaluation_result, - ) - - assert await main(["--skip-upload-results"]) == 0 - evaluate.assert_awaited_once_with(mocker.ANY, expected_results_dir, None) - - @pytest.mark.asyncio - async def test_uploads_results_and_builds_results_handler_config( - self, tmp_path: Path, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch - ) -> None: - """Main should load env-backed results config and upload results on success.""" - config_file = _write_benchmark_job_config(tmp_path) - results_dir = tmp_path / "results" - results_config = mocker.Mock(NEMO_JOB_ID="job-123", NEMO_JOB_WORKSPACE="workspace") - progress_tracking = mocker.Mock() - evaluation_result = mocker.Mock(results=[mocker.Mock(scores=[mocker.Mock(count=1)])]) - sdk = mocker.Mock() - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_file)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(tmp_path)) - - results_handler_cls = mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.ResultsHandlerConfig", - return_value=results_config, - ) - progress_tracking_cls = mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.ProgressTracking", - return_value=progress_tracking, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.BenchmarkJobAdapter.validate_python", - return_value=mocker.Mock(), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.evaluate_benchmark", - new_callable=mocker.AsyncMock, - return_value=evaluation_result, - ) - handle_results = mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.handle_results_async", - new_callable=mocker.AsyncMock, - ) - get_sdk = mocker.patch( - "nmp.evaluator.tasks.evaluate_benchmark.__main__.get_async_platform_sdk", - return_value=sdk, - ) - - exit_code = await main( - [ - "--progress-tracking-url", - "https://callback.example.test", - "--progress-tracking-interval", - "25", - "--progress-tracking-interval-seconds", - "30", - ] - ) - - assert exit_code == 0 - results_handler_cls.assert_called_once_with() - progress_tracking_cls.assert_called_once_with("https://callback.example.test", 25, 30) - get_sdk.assert_called_once_with() - handle_results.assert_awaited_once_with( - mocker.ANY, - results_config, - str(results_dir), - sdk=sdk, - ) - progress_tracking.stop.assert_called_once_with() - - -class TestBenchmarkEvaluationEntrypoint: - def test_returns_python_module_command(self): - assert benchmark_evaluation_entrypoint() == ["python", "-m", "nmp.evaluator.tasks.evaluate_benchmark"] - - -class TestBenchmarkEvaluationEntrypointArgs: - def test_defaults_to_job_runtime_environment(self): - assert benchmark_evaluation_entrypoint_args() == [] - - def test_includes_progress_tracking_options(self): - assert benchmark_evaluation_entrypoint_args( - progress_tracking_url="https://callback.example.test", - progress_tracking_interval=25, - ) == [ - "--progress-tracking-url", - "https://callback.example.test", - "--progress-tracking-interval", - "25", - ] diff --git a/services/evaluator/tests/tasks/test_evaluate_metric.py b/services/evaluator/tests/tasks/test_evaluate_metric.py deleted file mode 100644 index 64d3eee755..0000000000 --- a/services/evaluator/tests/tasks/test_evaluate_metric.py +++ /dev/null @@ -1,1484 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import json -import os -from pathlib import Path -from unittest.mock import AsyncMock, MagicMock, patch - -import pytest -from nemo_evaluator_sdk import inference -from nemo_evaluator_sdk.enums import MetricType -from nemo_evaluator_sdk.execution.values import EvaluationError, EvaluationPhase -from nemo_evaluator_sdk.values import ( - AggregatedMetricResult, - AggregateRangeScore, - DatasetRows, - Histogram, - Percentiles, -) -from nmp.common.jobs.constants import NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, PERSISTENT_JOB_STORAGE_PATH_ENVVAR -from nmp.evaluator.app.datasets.loader import DatasetLoadError -from nmp.evaluator.app.inference_hooks import ProgressTrackingHook -from nmp.evaluator.app.jobs.constants import ( - EVALUATION_RESULTS_AGG_SCORES_FILE_NAME, - EVALUATION_RESULTS_ROW_SCORES_FILE_NAME, -) -from nmp.evaluator.app.values import FilesetRef, MetricJobAdapter -from nmp.evaluator.tasks.evaluate_metric.__main__ import ( - _apply_optional_fields_to_row, - _json_default, - _load_dataset_items, - evaluate_metric, - main, - metric_evaluation_entrypoint, - metric_evaluation_entrypoint_args, - no_aggregated_metric_scores, - run, -) -from pytest_mock import MockerFixture - -TEST_DIR = os.path.dirname(__file__).rsplit("/", 1)[0] -INFERENCE_FAILURE_HINT = ( - "To prevent failure of evaluation from inference request failures, check the model endpoint, " - "credentials, request timeout, and retry settings, or set params.ignore_request_failure=true " - "to mark failed rows as NaN." -) - - -def _expected_inference_failure_message(row_index: int) -> str: - return f"Row {row_index} failed inference: Simulated inference failure. {INFERENCE_FAILURE_HINT}" - - -@pytest.mark.asyncio -async def test_evaluate_metric(tmp_path, monkeypatch: pytest.MonkeyPatch): - job_file = f"{TEST_DIR}/data/metric-jobs/llm-judge-offline.json" - expected_results_file = f"{TEST_DIR}/data/metric-jobs/llm-judge-offline-results.json" - results_dir = tmp_path / "results" - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, job_file) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(tmp_path)) - - with patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.make_inference_request", new_callable=AsyncMock - ) as make_inference_request: - make_inference_request.return_value = {"choices": [{"message": {"content": '{"length": "short"}'}}]} - await main(["--skip-upload-results", "true"]) - - with open(expected_results_file) as f: - expected_results = json.load(f) - - actual_results_file = Path(results_dir, EVALUATION_RESULTS_AGG_SCORES_FILE_NAME) - with open(actual_results_file) as f: - actual_results = json.load(f) - - assert actual_results == expected_results - - detailed_results_file = Path(results_dir, EVALUATION_RESULTS_ROW_SCORES_FILE_NAME) - with open(detailed_results_file) as f: - num_lines = sum(1 for line in f) - assert num_lines == 3, "expected an evaluation for each row" - - -@pytest.mark.asyncio -async def test_evaluate_metric_offline_uses_shared_generated_sample_pipeline(tmp_path, mocker: MockerFixture): - job_file = f"{TEST_DIR}/data/metric-jobs/llm-judge-offline.json" - - with open(job_file) as f: - job = MetricJobAdapter.validate_python(json.load(f)) - - pipeline_result = [ - ( - 0, - None, - mocker.Mock( - item={"input": "What is Python?", "output": "A programming language"}, - sample={}, - ), - ), - ( - 1, - None, - mocker.Mock( - item={"input": "Explain quantum computing", "output": "Complex physics stuff"}, - sample={}, - ), - ), - ] - - run_pipeline_mock = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=pipeline_result, - ) - metric_mock = mocker.Mock() - metric_mock.type = MetricType.LLM_JUDGE - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric_mock, - ) - new_hooks_mock = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - finalize_mock = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.finalize_evaluation_result", - new_callable=AsyncMock, - return_value=mocker.Mock( - aggregate_scores=AggregatedMetricResult(scores=[]), - row_scores=[], - ), - ) - - await evaluate_metric(job, str(tmp_path)) - - run_pipeline_mock.assert_awaited_once() - new_hooks_mock.assert_called_once_with(job.params, model_format=None) - finalize_mock.assert_awaited_once() - - assert run_pipeline_mock.await_args is not None - pipeline = run_pipeline_mock.await_args.args[0] - assert pipeline.rows == [ - {"input": "hi.", "output": "hello world"}, - {"input": "Are you hungry?", "output": "no"}, - { - "input": "What is coffee?", - "output": "a hot drink made from the roasted and ground seeds (coffee beans) of a tropical shrub.", - }, - ] - assert pipeline.parallelism == job.params.parallelism - assert pipeline.target is None - assert pipeline.prompt_template is None - assert pipeline.metric_key == "llm-judge" - - -@pytest.mark.asyncio -async def test_evaluate_metric_offline_uses_string_metric_type_for_metric_key(tmp_path, mocker: MockerFixture): - job_file = f"{TEST_DIR}/data/metric-jobs/llm-judge-offline.json" - - with open(job_file) as f: - job = MetricJobAdapter.validate_python(json.load(f)) - - run_pipeline_mock = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=[], - ) - - class StringMetric: - type = "custom-metric" - - metric_mock = StringMetric() - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric_mock, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.finalize_evaluation_result", - new_callable=AsyncMock, - return_value=mocker.Mock( - aggregate_scores=AggregatedMetricResult(scores=[]), - row_scores=[], - ), - ) - - await evaluate_metric(job, str(tmp_path)) - - assert run_pipeline_mock.await_args is not None - pipeline = run_pipeline_mock.await_args.args[0] - assert pipeline.metric_key == "custom-metric" - - -@pytest.mark.asyncio -async def test_evaluate_metric_inference_failure_with_ignore_flag_returns_nan(tmp_path): - """Test that inference failures return NaN scores when ignore_request_failure is True.""" - job_config = { - "model": { - "name": "test-model", - "url": "http://test:8000/v1/chat/completions", - "api_key_secret": None, - }, - "dataset": { - "rows": [ - {"input": "test input 1"}, - {"input": "test input 2"}, - ], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "params": { - "ignore_request_failure": True, - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - - job = MetricJobAdapter.validate_python(job_config) - - with patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.make_inference_request", new_callable=AsyncMock - ) as mock_inference: - # Simulate inference failure - mock_inference.side_effect = Exception("Simulated inference failure") - - result = await evaluate_metric(job, str(tmp_path)) - - # Verify we got results with NaN tracking - assert len(result.scores) == 1 - score = result.scores[0] - assert isinstance(score, AggregateRangeScore) - assert score.name == "exact-match" - # AggregateScore has nan_count and count directly (not nested in stats) - assert score.nan_count == 2 - assert score.count == 0 - assert score.mean is None - assert score.sum is None - assert score.min is None - assert score.max is None - assert score.std_dev is None - assert score.variance is None - assert isinstance(score, AggregateRangeScore) - assert score.percentiles is None - - with open(tmp_path / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME) as f: - rows = [json.loads(line) for line in f] - - assert [row["row_index"] for row in rows] == [0, 1] - assert all( - row["metric_errors"] == {"exact-match": _expected_inference_failure_message(row["row_index"])} for row in rows - ) - - -@pytest.mark.asyncio -async def test_evaluate_metric_inference_failure_without_ignore_flag_raises(tmp_path): - """Test that inference failures raise exception when ignore_request_failure is False (default).""" - job_config = { - "model": { - "name": "test-model", - "url": "http://test:8000/v1/chat/completions", - "api_key_secret": None, - }, - "dataset": { - "rows": [{"input": "test input"}], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - - job = MetricJobAdapter.validate_python(job_config) - - with patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.make_inference_request", new_callable=AsyncMock - ) as mock_inference: - mock_inference.side_effect = Exception("Simulated inference failure") - - with pytest.raises(EvaluationError, match="sample generation") as exc_info: - await evaluate_metric(job, str(tmp_path)) - assert exc_info.value.index == 0 - assert exc_info.value.phase is EvaluationPhase.SAMPLE_GENERATION - assert exc_info.value.metric_key == "exact-match" - - -def _ragas_topic_adherence_job_config(*, ignore_request_failure: bool) -> dict: - config: dict = { - "dataset": { - "rows": [ - { - "user_input": "What is the capital of France?", - "response": "The capital is Paris.", - "reference": "Paris", - "retrieved_contexts": ["Paris is the capital and largest city of France."], - } - ], - }, - "metric": { - "type": "topic_adherence", - "metric_mode": "f1", - "judge_model": { - "name": "test-judge", - "url": "http://test:8000/v1/chat/completions", - }, - }, - } - if ignore_request_failure: - config["metric"]["ignore_request_failure"] = True - return config - - -@pytest.mark.asyncio -async def test_evaluate_metric_ragas_parse_failure_with_ignore_flag_returns_nan_row_error(tmp_path): - job = MetricJobAdapter.validate_python(_ragas_topic_adherence_job_config(ignore_request_failure=True)) - - empty_result = MagicMock() - empty_result.scores = [] - mock_evaluate = MagicMock(return_value=empty_result) - with patch("nemo_evaluator_sdk.metrics.ragas.base.get_evaluate_function", return_value=mock_evaluate): - result = await evaluate_metric(job, str(tmp_path)) - - assert len(result.scores) == 1 - assert result.scores[0].name == "topic_adherence" - assert result.scores[0].nan_count == 1 - assert result.scores[0].count == 0 - - with open(tmp_path / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME) as f: - rows = [json.loads(line) for line in f] - assert rows[0]["row_index"] == 0 - assert rows[0]["metric_errors"] is None - - -@pytest.mark.asyncio -async def test_evaluate_metric_ragas_parse_failure_without_ignore_flag_still_returns_nan(tmp_path): - job = MetricJobAdapter.validate_python(_ragas_topic_adherence_job_config(ignore_request_failure=False)) - - empty_result = MagicMock() - empty_result.scores = [] - mock_evaluate = MagicMock(return_value=empty_result) - with patch("nemo_evaluator_sdk.metrics.ragas.base.get_evaluate_function", return_value=mock_evaluate): - result = await evaluate_metric(job, str(tmp_path)) - - assert len(result.scores) == 1 - assert result.scores[0].name == "topic_adherence" - assert result.scores[0].nan_count == 1 - assert result.scores[0].count == 0 - - -@pytest.mark.asyncio -async def test_evaluate_metric_inference_failure_with_empty_message_content_raises_helpful_error(tmp_path): - job_config = { - "model": { - "name": "test-model", - "url": "http://test:8000/v1/chat/completions", - "api_key_secret": None, - }, - "dataset": { - "rows": [ - { - "messages": [{"role": "user", "content": ""}], - "expected": "unused", - } - ], - }, - "prompt_template": {"messages": "{{ messages | tojson }}"}, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - - job = MetricJobAdapter.validate_python(job_config) - - with patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.make_inference_request", new_callable=AsyncMock - ) as mock_inference: - mock_inference.side_effect = Exception("Simulated inference failure") - - with pytest.raises(EvaluationError, match="sample generation") as exc_info: - await evaluate_metric(job, str(tmp_path)) - assert exc_info.value.index == 0 - assert exc_info.value.phase is EvaluationPhase.SAMPLE_GENERATION - assert exc_info.value.message == ( - "Row 0 has empty message content and failed inference: Simulated inference failure. " - "To prevent failure of evaluation, fix the dataset row or set " - "params.ignore_request_failure=true to skip invalid rows." - ) - - -@pytest.mark.asyncio -async def test_evaluate_metric_inference_failure_with_empty_prompt_raises_helpful_error(tmp_path): - job_config = { - "model": { - "name": "test-model", - "url": "http://test:8000/v1/completions", - "api_key_secret": None, - }, - "dataset": { - "rows": [ - { - "prompt": "", - "expected": "unused", - } - ], - }, - "prompt_template": {"prompt": "{{ prompt }}"}, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - - job = MetricJobAdapter.validate_python(job_config) - - with patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.make_inference_request", new_callable=AsyncMock - ) as mock_inference: - mock_inference.side_effect = Exception("Simulated inference failure") - - with pytest.raises(EvaluationError, match="sample generation") as exc_info: - await evaluate_metric(job, str(tmp_path)) - assert exc_info.value.index == 0 - assert exc_info.value.phase is EvaluationPhase.SAMPLE_GENERATION - assert exc_info.value.message == ( - "Row 0 has empty prompt and failed inference: Simulated inference failure. " - "To prevent failure of evaluation, fix the dataset row or set " - "params.ignore_request_failure=true to skip invalid rows." - ) - - -class TestEvaluateMetric: - @pytest.mark.asyncio - async def test_reraises_keyboard_interrupt_from_scoring_pipeline(self, tmp_path, mocker: MockerFixture): - job = MetricJobAdapter.validate_python( - { - "dataset": { - "rows": [{"input": "test input", "expected": "expected output"}], - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - ) - metric = mocker.Mock() - metric.type.value = "exact-match" - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__._load_dataset_items", - return_value=[{"input": "test input", "expected": "expected output"}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=KeyboardInterrupt, - ) - get_eval_error = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.get_evaluation_error", - ) - - with pytest.raises(KeyboardInterrupt): - await evaluate_metric(job, str(tmp_path)) - - get_eval_error.assert_not_called() - - @pytest.mark.asyncio - async def test_normalizes_non_system_exception_from_scoring_pipeline(self, tmp_path, mocker: MockerFixture): - job = MetricJobAdapter.validate_python( - { - "dataset": { - "rows": [{"input": "test input", "expected": "expected output"}], - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - ) - metric = mocker.Mock() - metric.type.value = "exact-match" - failure = ValueError("boom") - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__._load_dataset_items", - return_value=[{"input": "test input", "expected": "expected output"}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=failure, - ) - get_eval_error = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.get_evaluation_error", - return_value=RuntimeError("normalized boom"), - ) - - with pytest.raises(RuntimeError, match="normalized boom"): - await evaluate_metric(job, str(tmp_path)) - - get_eval_error.assert_called_once_with(failure) - - @pytest.mark.asyncio - async def test_reraises_evaluation_error_from_scoring_pipeline(self, tmp_path, mocker: MockerFixture): - job = MetricJobAdapter.validate_python( - { - "dataset": { - "rows": [{"input": "test input", "expected": "expected output"}], - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - ) - metric = mocker.Mock() - metric.type.value = "exact-match" - failure = EvaluationError( - index=3, - message="'missing_field' is undefined", - phase=EvaluationPhase.METRIC_SCORING, - metric_key="exact-match", - ) - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__._load_dataset_items", - return_value=[{"input": "test input", "expected": "expected output"}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=failure, - ) - log_exception = mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.log.exception") - - with pytest.raises(EvaluationError) as exc_info: - await evaluate_metric(job, str(tmp_path)) - - assert exc_info.value is failure - log_exception.assert_called_once_with( - "Metric evaluation failed", - extra={ - "phase": "metric_scoring", - "metric_key": "exact-match", - "row_index": 3, - "error": "'missing_field' is undefined", - }, - ) - - @pytest.mark.asyncio - async def test_reraises_evaluation_error_from_single_exception_group(self, tmp_path, mocker: MockerFixture): - from nemo_evaluator_sdk.execution.values import EvaluationError - - job = MetricJobAdapter.validate_python( - { - "dataset": { - "rows": [{"input": "test input", "expected": "expected output"}], - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - ) - metric = mocker.Mock() - metric.type.value = "exact-match" - failure = EvaluationError(index=4, message="grouped cause") - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__._load_dataset_items", - return_value=[{"input": "test input", "expected": "expected output"}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=ExceptionGroup("tasks", [failure]), - ) - - with pytest.raises(EvaluationError) as exc_info: - await evaluate_metric(job, str(tmp_path)) - - assert exc_info.value is failure - - @pytest.mark.asyncio - async def test_reraises_non_leading_evaluation_error_from_exception_group(self, tmp_path, mocker: MockerFixture): - from nemo_evaluator_sdk.execution.values import EvaluationError - - job = MetricJobAdapter.validate_python( - { - "dataset": { - "rows": [{"input": "test input", "expected": "expected output"}], - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - ) - metric = mocker.Mock() - metric.type.value = "exact-match" - failure = EvaluationError(index=5, message="non-leading cause") - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__._load_dataset_items", - return_value=[{"input": "test input", "expected": "expected output"}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=ExceptionGroup( - "tasks", - [ - RuntimeError("sibling before"), - failure, - RuntimeError("sibling after"), - ], - ), - ) - - with pytest.raises(EvaluationError) as exc_info: - await evaluate_metric(job, str(tmp_path)) - - assert exc_info.value is failure - - @pytest.mark.asyncio - async def test_reraises_nested_evaluation_error_from_exception_group(self, tmp_path, mocker: MockerFixture): - from nemo_evaluator_sdk.execution.values import EvaluationError - - job = MetricJobAdapter.validate_python( - { - "dataset": { - "rows": [{"input": "test input", "expected": "expected output"}], - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - ) - metric = mocker.Mock() - metric.type.value = "exact-match" - failure = EvaluationError(index=6, message="nested cause") - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__._load_dataset_items", - return_value=[{"input": "test input", "expected": "expected output"}], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - side_effect=ExceptionGroup( - "outer", - [ - RuntimeError("sibling"), - ExceptionGroup("inner", [RuntimeError("noise"), failure]), - ], - ), - ) - - with pytest.raises(EvaluationError) as exc_info: - await evaluate_metric(job, str(tmp_path)) - - assert exc_info.value is failure - - -@pytest.mark.asyncio -async def test_evaluate_metric_inference_failure_keeps_partial_requests(tmp_path): - job_config = { - "model": { - "name": "test-model", - "url": "http://test:8000/v1/chat/completions", - "api_key_secret": None, - }, - "dataset": { - "rows": [ - {"input": "test input 1"}, - {"input": "test input 2"}, - ], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "params": { - "ignore_request_failure": True, - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - - job = MetricJobAdapter.validate_python(job_config) - - async def partial_failing_inference(*args, **kwargs): - request = kwargs.get("request") if "request" in kwargs else args[1] - inference.requests_log_var.get([]).append({"request": request, "error": "partial failure"}) - raise Exception("Simulated inference failure") - - await evaluate_metric(job, str(tmp_path), inference_fn=partial_failing_inference) - - with open(tmp_path / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME) as f: - rows = [json.loads(line) for line in f] - - assert len(rows) == 2 - for row in rows: - assert "row_index" in row - assert len(row["requests"]) == 1 - assert row["metric_errors"] == {"exact-match": _expected_inference_failure_message(row["row_index"])} - assert row["requests"][0]["error"] == "partial failure" - assert row["requests"][0]["request"]["messages"][0]["content"] == row["item"]["input"] - - -@pytest.mark.asyncio -async def test_evaluate_metric_metric_failure_with_ignore_flag_keeps_nan_row_metric(tmp_path): - job_config = { - "model": { - "name": "test-model", - "url": "http://test:8000/v1/chat/completions", - "api_key_secret": None, - }, - "dataset": { - "rows": [{"input": "test input"}], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "params": { - "ignore_request_failure": True, - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - - job = MetricJobAdapter.validate_python(job_config) - - async def successful_inference(*args, **kwargs): - return {"choices": [{"message": {"content": "model answer"}}]} - - result = await evaluate_metric(job, str(tmp_path), inference_fn=successful_inference) - - assert result.scores[0].count == 0 - assert result.scores[0].nan_count == 1 - - with open(tmp_path / EVALUATION_RESULTS_ROW_SCORES_FILE_NAME) as f: - row = json.loads(next(f)) - - assert row["row_index"] == 0 - assert row["metrics"]["exact-match"][0]["value"] == "NaN" - assert "exact-match" in row["metric_errors"] - - -@pytest.mark.asyncio -async def test_evaluate_metric_online_tool_calling_allows_null_content(tmp_path): - job_config = { - "model": { - "name": "test-model", - "url": "http://test:8000/v1/chat/completions", - "api_key_secret": None, - }, - "dataset": { - "rows": [ - { - "input": "Calculate area", - "expected_tool_calls": [ - { - "function": { - "name": "calculate_area", - "arguments": {"base": 10, "height": 5}, - } - } - ], - } - ], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "metric": { - "type": "tool-calling", - "name": "test-tool-calling", - "workspace": "default", - "reference": "{{item.expected_tool_calls}}", - }, - } - - job = MetricJobAdapter.validate_python(job_config) - - response = { - "choices": [ - { - "message": { - "role": "assistant", - "content": None, - "tool_calls": [ - { - "function": { - "name": "calculate_area", - "arguments": '{"base": 10, "height": 5}', - } - } - ], - } - } - ] - } - - async def mock_inference(*args, **kwargs): - return response - - result = await evaluate_metric(job, str(tmp_path), inference_fn=mock_inference) - - scores = {score.name: score for score in result.scores} - assert scores["function_name_accuracy"].mean == 1.0 - assert scores["function_name_and_args_accuracy"].mean == 1.0 - - -def _make_aggregate_score(name: str, count: int, nan_count: int = 0) -> AggregateRangeScore: - """Helper to create a minimal AggregateRangeScore for testing.""" - return AggregateRangeScore( - name=name, - count=count, - nan_count=nan_count, - sum=0.0, - mean=0.0, - min=0.0, - max=0.0, - std_dev=0.0, - variance=0.0, - percentiles=Percentiles( - p10=0.0, - p20=0.0, - p30=0.0, - p40=0.0, - p50=0.0, - p60=0.0, - p70=0.0, - p80=0.0, - p90=0.0, - p100=0.0, - ), - histogram=Histogram(bins=[]), - ) - - -class TestNoAggregatedMetricScores: - """Tests for no_aggregated_metric_scores function.""" - - def test_empty_scores_returns_true(self): - """Empty scores list means no valid metrics.""" - result = AggregatedMetricResult(scores=[]) - assert no_aggregated_metric_scores(result) is True - - def test_all_scores_zero_count_returns_true(self): - """All scores with count=0 (all NaN) means no valid metrics.""" - result = AggregatedMetricResult( - scores=[ - _make_aggregate_score("score1", count=0, nan_count=5), - _make_aggregate_score("score2", count=0, nan_count=3), - ] - ) - assert no_aggregated_metric_scores(result) is True - - def test_some_valid_scores_returns_false(self): - """At least one score with count > 0 means we have valid metrics.""" - result = AggregatedMetricResult( - scores=[ - _make_aggregate_score("score1", count=0, nan_count=5), - _make_aggregate_score("score2", count=3, nan_count=2), - ] - ) - assert no_aggregated_metric_scores(result) is False - - def test_all_valid_scores_returns_false(self): - """All scores with count > 0 means we have valid metrics.""" - result = AggregatedMetricResult( - scores=[ - _make_aggregate_score("score1", count=10), - _make_aggregate_score("score2", count=5), - ] - ) - assert no_aggregated_metric_scores(result) is False - - -class TestJsonDefault: - """Tests for _json_default function used in JSON serialization.""" - - def test_object_with_dict_method(self): - """Objects with dict() method (LangChain messages, Pydantic v1) are serialized.""" - - class MockLangChainMessage: - def __init__(self, content: str, msg_type: str): - self.content = content - self.type = msg_type - - def dict(self): - return {"content": self.content, "type": self.type} - - msg = MockLangChainMessage("Hello", "human") - result = _json_default(msg) - assert result == {"content": "Hello", "type": "human"} - - def test_object_with_model_dump_method(self): - """Objects with model_dump() method (Pydantic v2) are serialized.""" - - class MockPydanticV2Model: - def __init__(self, value: int): - self.value = value - - def model_dump(self): - return {"value": self.value} - - model = MockPydanticV2Model(42) - result = _json_default(model) - assert result == {"value": 42} - - def test_object_with_to_dict_method(self): - """Objects with to_dict() method are serialized.""" - - class MockObject: - def __init__(self, data: str): - self.data = data - - def to_dict(self): - return {"data": self.data} - - obj = MockObject("test") - result = _json_default(obj) - assert result == {"data": "test"} - - def test_dict_method_takes_precedence(self): - """dict() method takes precedence over model_dump() and to_dict().""" - - class MockMultiMethod: - def dict(self): - return {"method": "dict"} - - def model_dump(self): - return {"method": "model_dump"} - - def to_dict(self): - return {"method": "to_dict"} - - obj = MockMultiMethod() - result = _json_default(obj) - assert result == {"method": "dict"} - - def test_fallback_to_string(self): - """Objects without serialization methods fall back to str().""" - - class PlainObject: - def __str__(self): - return "PlainObject()" - - obj = PlainObject() - result = _json_default(obj) - assert result == "PlainObject()" - - def test_json_dumps_integration(self): - """Verify _json_default works with json.dumps().""" - - class MockMessage: - def dict(self): - return {"content": "test", "type": "human"} - - data = {"messages": [MockMessage()]} - result = json.dumps(data, default=_json_default) - parsed = json.loads(result) - assert parsed == {"messages": [{"content": "test", "type": "human"}]} - - -def _write_metric_job_config(tmp_path: Path, *, online: bool = False) -> Path: - config = { - "dataset": { - "rows": [{"input": "test input", "expected": "expected output"}], - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - if online: - config["model"] = { - "name": "test-model", - "url": "http://test:8000/v1/chat/completions", - "api_key_secret": None, - } - config["prompt_template"] = {"messages": [{"role": "user", "content": "{{input}}"}]} - - config_path = tmp_path / "job.json" - config_path.write_text(json.dumps(config)) - return config_path - - -class TestMetricEvaluationEntrypoint: - def test_returns_python_module_command(self): - assert metric_evaluation_entrypoint() == ["python", "-m", "nmp.evaluator.tasks.evaluate_metric"] - - -class TestMetricEvaluationEntrypointArgs: - def test_defaults_to_job_runtime_environment(self): - assert metric_evaluation_entrypoint_args() == [] - - def test_includes_progress_tracking_options(self): - assert metric_evaluation_entrypoint_args( - progress_tracking_url="https://callback.example.test", - progress_tracking_interval=25, - ) == [ - "--progress-tracking-url", - "https://callback.example.test", - "--progress-tracking-interval", - "25", - ] - - -class TestLoadDatasetItems: - def test_apply_optional_fields_defaults_missing_fields(self): - assert _apply_optional_fields_to_row({"input": "hello"}, ["reference"]) == { - "input": "hello", - "reference": "", - } - - def test_returns_inline_rows(self, mocker: MockerFixture): - job = mocker.Mock(dataset=DatasetRows(rows=[{"input": "hello"}]), field_mapping=None) - job.metric = mocker.Mock(optional_fields=[]) - - assert _load_dataset_items(job) == [{"input": "hello"}] - - def test_raises_for_empty_inline_rows(self, mocker: MockerFixture): - job = mocker.Mock(dataset=DatasetRows.model_construct(rows=[]), field_mapping=None) - job.metric = mocker.Mock(optional_fields=[]) - - with pytest.raises(ValueError, match="DatasetRows has no rows"): - _load_dataset_items(job) - - def test_defaults_optional_fields_for_inline_rows(self, mocker: MockerFixture): - job = mocker.Mock(dataset=DatasetRows(rows=[{"input": "hello"}]), field_mapping=None) - job.metric = mocker.Mock(optional_fields=["reference"]) - - assert _load_dataset_items(job) == [{"input": "hello", "reference": ""}] - - def test_loads_fileset_rows(self, mocker: MockerFixture): - job = mocker.Mock(dataset=FilesetRef(root="workspace/fileset"), field_mapping=None) - job.metric = mocker.Mock(optional_fields=[]) - load_dataset = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.load_dataset_from_ref_as_dicts", - return_value=[{"input": "from fileset"}], - ) - - assert _load_dataset_items(job, dataset_dir="/tmp/downloads") == [{"input": "from fileset"}] - load_dataset.assert_called_once_with("workspace/fileset", base_dir="/tmp/downloads") - - def test_loads_fileset_rows_from_runtime_job_storage( - self, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch, tmp_path: Path - ): - job = mocker.Mock(dataset=FilesetRef(root="workspace/fileset"), field_mapping=None) - job.metric = mocker.Mock(optional_fields=[]) - storage_dir = tmp_path / "job-storage" - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(storage_dir)) - load_dataset = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.load_dataset_from_ref_as_dicts", - return_value=[{"input": "from fileset"}], - ) - - assert _load_dataset_items(job) == [{"input": "from fileset"}] - load_dataset.assert_called_once_with("workspace/fileset", base_dir=str(storage_dir / "datasets")) - - def test_raises_for_fileset_load_error(self, mocker: MockerFixture): - job = mocker.Mock(dataset=FilesetRef(root="workspace/fileset"), field_mapping=None) - job.metric = mocker.Mock(optional_fields=[]) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.load_dataset_from_ref_as_dicts", - side_effect=DatasetLoadError("bad dataset"), - ) - - with pytest.raises(ValueError, match="Failed to load dataset 'workspace/fileset': bad dataset"): - _load_dataset_items(job, dataset_dir="/tmp/downloads") - - def test_raises_for_empty_fileset(self, mocker: MockerFixture): - job = mocker.Mock(dataset=FilesetRef(root="workspace/fileset"), field_mapping=None) - job.metric = mocker.Mock(optional_fields=[]) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.load_dataset_from_ref_as_dicts", - return_value=[], - ) - - with pytest.raises(ValueError, match="Dataset 'workspace/fileset' is empty"): - _load_dataset_items(job, dataset_dir="/tmp/downloads") - - def test_raises_for_unsupported_dataset_type(self, mocker: MockerFixture): - job = mocker.Mock(dataset="not-supported", field_mapping=None) - job.metric = mocker.Mock(optional_fields=[]) - - with pytest.raises(ValueError, match="Unsupported dataset type: str"): - _load_dataset_items(job) - - -class TestEvaluateMetricBranches: - @pytest.mark.asyncio - async def test_online_job_configures_progress_tracking_pipeline(self, tmp_path, mocker: MockerFixture): - job = MetricJobAdapter.validate_python( - { - "model": { - "name": "test-model", - "url": "http://test:8000/v1/chat/completions", - "api_key_secret": None, - "format": "openai", - }, - "dataset": { - "rows": [ - {"input": "one", "expected": "ONE"}, - {"input": "two", "expected": "TWO"}, - {"input": "three", "expected": "THREE"}, - ], - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{input}}"}]}, - "params": { - "limit_samples": 2, - "ignore_request_failure": True, - }, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - } - ) - progress_tracking = mocker.Mock(interval=5) - metric = mocker.Mock() - metric.type.value = "exact-match" - completed = [ - ( - 0, - None, - mocker.Mock(item={"input": "one"}, sample={"output_text": "ONE"}), - ), - ( - 1, - None, - mocker.Mock(item={"input": "two"}, sample={"output_text": "TWO"}), - ), - ] - finalized = mocker.Mock( - aggregate_scores=AggregatedMetricResult(scores=[_make_aggregate_score("exact-match", count=2)]), - row_scores=[], - ) - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__._load_dataset_items", - return_value=[ - {"input": "one", "expected": "ONE"}, - {"input": "two", "expected": "TWO"}, - {"input": "three", "expected": "THREE"}, - ], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.get_platform_headers", - return_value={"x-platform": "evaluator"}, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=(["pre-hook"], ["post-hook"]), - ) - run_pipeline = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=completed, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.finalize_evaluation_result", - new_callable=AsyncMock, - return_value=finalized, - ) - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.job_artifacts_dump") - - result = await evaluate_metric(job, str(tmp_path), progress_tracking=progress_tracking) - - assert result == finalized.aggregate_scores - assert progress_tracking.total_samples == 2 - assert run_pipeline.await_args is not None - pipeline = run_pipeline.await_args.args[0] - assert pipeline.rows == [ - {"input": "one", "expected": "ONE"}, - {"input": "two", "expected": "TWO"}, - ] - assert pipeline.target == job.model - assert pipeline.prompt_template == job.prompt_template - assert pipeline.default_headers == {"x-platform": "evaluator"} - assert pipeline.params is job.params - assert pipeline.params.ignore_request_failure is True - assert pipeline.preprocess_hooks == ["pre-hook"] - assert pipeline.postprocess_hooks[0] == "post-hook" - assert isinstance(pipeline.postprocess_hooks[1], ProgressTrackingHook) - assert pipeline.postprocess_hooks[1].progress_tracking is progress_tracking - - @pytest.mark.asyncio - async def test_evaluate_metric_attaches_platform_headers_to_agent_pipeline(self, tmp_path, mocker: MockerFixture): - job = MetricJobAdapter.validate_python( - { - "dataset": {"rows": [{"input": "one", "expected": "ONE"}]}, - "metric": { - "type": "exact-match", - "name": "test-metric", - "workspace": "default", - "reference": "{{item.expected}}", - }, - "agent": { - "url": "http://nemo-platform-api.default.svc.cluster.local/v1/agents/test-agent", - "name": "test-agent", - "format": "generic", - "body": {"messages": "{{messages}}"}, - "response_path": "$.answer", - }, - "prompt_template": {"messages": [{"role": "user", "content": "{{item.input}}"}]}, - "params": {"parallelism": 1, "ignore_request_failure": False}, - } - ) - metric = mocker.Mock() - metric.type.value = "exact-match" - finalized = mocker.Mock( - aggregate_scores=AggregatedMetricResult(scores=[_make_aggregate_score("exact-match", count=1)]), - row_scores=[], - ) - get_platform_headers = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.get_platform_headers", - return_value={"x-platform": "evaluator"}, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.new_metric", - new_callable=AsyncMock, - return_value=metric, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.inference_hooks.new_hooks", - return_value=([], []), - ) - run_pipeline = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.run_generated_sample_scoring_pipeline", - new_callable=AsyncMock, - return_value=[], - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.finalize_evaluation_result", - new_callable=AsyncMock, - return_value=finalized, - ) - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.job_artifacts_dump") - - await evaluate_metric(job, str(tmp_path)) - - get_platform_headers.assert_called_once_with(job.agent.url) - assert run_pipeline.await_args is not None - pipeline = run_pipeline.await_args.args[0] - assert pipeline.target == job.agent - assert pipeline.default_headers == {"x-platform": "evaluator"} - assert pipeline.params is job.params - assert pipeline.params.ignore_request_failure is False - - -class TestMain: - @pytest.mark.asyncio - async def test_defaults_to_job_runtime_environment(self, tmp_path, mocker: MockerFixture, monkeypatch): - config_file = _write_metric_job_config(tmp_path) - storage_dir = tmp_path / "job-storage" - expected_results_dir = str(storage_dir / "results") - evaluation_result = AggregatedMetricResult(scores=[_make_aggregate_score("exact-match", count=1)]) - - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_file)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(storage_dir)) - - evaluate = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.evaluate_metric", - new_callable=AsyncMock, - return_value=evaluation_result, - ) - - assert await main(["--skip-upload-results", "true"]) == 0 - evaluate.assert_awaited_once_with(mocker.ANY, expected_results_dir, None) - - @pytest.mark.asyncio - async def test_uploads_results_and_updates_progress( - self, tmp_path, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch - ): - config_file = _write_metric_job_config(tmp_path) - results_dir = tmp_path / "results" - results_config = mocker.Mock(NEMO_JOB_ID="job-123", NEMO_JOB_WORKSPACE="workspace") - progress_tracking = mocker.Mock() - evaluation_result = AggregatedMetricResult(scores=[_make_aggregate_score("exact-match", count=1)]) - sdk = mocker.Mock() - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_file)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(tmp_path)) - - results_handler_cls = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.ResultsHandlerConfig", - return_value=results_config, - ) - progress_tracking_cls = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.ProgressTracking", - return_value=progress_tracking, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.evaluate_metric", - new_callable=AsyncMock, - return_value=evaluation_result, - ) - handle_results = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.handle_results_async", - new_callable=AsyncMock, - ) - get_sdk = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.get_async_platform_sdk", - return_value=sdk, - ) - - exit_code = await main( - [ - "--progress-tracking-url", - "https://callback.example.test", - "--progress-tracking-interval", - "25", - "--progress-tracking-interval-seconds", - "30", - ] - ) - - assert exit_code == 0 - results_handler_cls.assert_called_once_with() - progress_tracking_cls.assert_called_once_with("https://callback.example.test", "25", "30") - get_sdk.assert_called_once_with(as_service="evaluator", internal=True) - handle_results.assert_awaited_once_with( - mocker.ANY, - results_config, - str(results_dir), - sdk=sdk, - ) - progress_tracking.update_progress.assert_called_once_with(100) - progress_tracking.stop.assert_called_once_with() - - @pytest.mark.asyncio - async def test_raises_when_no_aggregated_scores_exist( - self, tmp_path, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch - ): - config_file = _write_metric_job_config(tmp_path) - results_config = mocker.Mock(NEMO_JOB_ID="job-123", NEMO_JOB_WORKSPACE="workspace") - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_file)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(tmp_path)) - - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.ResultsHandlerConfig", - return_value=results_config, - ) - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.evaluate_metric", - new_callable=AsyncMock, - return_value=AggregatedMetricResult(scores=[]), - ) - handle_results = mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.handle_results_async", - new_callable=AsyncMock, - ) - - with pytest.raises(ValueError, match="no evaluation results detected"): - await main([]) - - handle_results.assert_awaited_once() - - -class TestRun: - def test_returns_async_main_result(self, mocker: MockerFixture): - register_handlers = mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.register_task_signal_handlers") - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.asyncio.run", - side_effect=lambda coro: (coro.close(), 7)[1], - ) - - assert run([]) == 7 - register_handlers.assert_called_once_with() - - def test_returns_zero_on_keyboard_interrupt(self, mocker: MockerFixture): - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.register_task_signal_handlers") - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.asyncio.run", - side_effect=lambda coro: (coro.close(), (_ for _ in ()).throw(KeyboardInterrupt()))[1], - ) - log_info = mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.log.info") - - assert run() == 0 - log_info.assert_called_once() - - def test_returns_one_on_exception(self, mocker: MockerFixture): - mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.register_task_signal_handlers") - mocker.patch( - "nmp.evaluator.tasks.evaluate_metric.__main__.asyncio.run", - side_effect=lambda coro: (coro.close(), (_ for _ in ()).throw(RuntimeError("boom")))[1], - ) - log_exception = mocker.patch("nmp.evaluator.tasks.evaluate_metric.__main__.log.exception") - - assert run() == 1 - log_exception.assert_called_once_with("Error in evaluate_metric task") diff --git a/services/evaluator/tests/tasks/test_metric_results.py b/services/evaluator/tests/tasks/test_metric_results.py deleted file mode 100644 index 14b1351f5e..0000000000 --- a/services/evaluator/tests/tasks/test_metric_results.py +++ /dev/null @@ -1,37 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import json -from pathlib import Path - -import pytest -from nmp.common.jobs.constants import NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, PERSISTENT_JOB_STORAGE_PATH_ENVVAR -from nmp.evaluator.tasks.metric_results.__main__ import main -from pytest_mock import MockerFixture - - -@pytest.mark.asyncio -async def test_defaults_to_job_runtime_environment( - tmp_path: Path, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch -) -> None: - config_file = tmp_path / "job_step_config.json" - storage_dir = tmp_path / "job-storage" - expected_results_dir = str(storage_dir / "results") - config_file.write_text(json.dumps({})) - job = mocker.Mock() - results_config = mocker.Mock() - sdk = mocker.Mock() - - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_file)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(storage_dir)) - - mocker.patch("nmp.evaluator.tasks.metric_results.__main__.MetricJobAdapter.validate_python", return_value=job) - mocker.patch("nmp.evaluator.tasks.metric_results.__main__.ResultsHandlerConfig", return_value=results_config) - mocker.patch("nmp.evaluator.tasks.metric_results.__main__.get_async_platform_sdk", return_value=sdk) - handle_results = mocker.patch( - "nmp.evaluator.tasks.metric_results.__main__.handle_results_async", - new_callable=mocker.AsyncMock, - ) - - assert await main([]) == 0 - handle_results.assert_awaited_once_with(job, results_config, expected_results_dir, sdk=sdk) diff --git a/services/evaluator/tests/tasks/test_task_entrypoint_termination.py b/services/evaluator/tests/tasks/test_task_entrypoint_termination.py deleted file mode 100644 index 140b6f05da..0000000000 --- a/services/evaluator/tests/tasks/test_task_entrypoint_termination.py +++ /dev/null @@ -1,111 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -from pathlib import Path -from typing import Any, Coroutine - -import pytest -from nmp.common.jobs.constants import NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, PERSISTENT_JOB_STORAGE_PATH_ENVVAR -from nmp.evaluator.tasks.download_fileset import __main__ as download_fileset_task -from nmp.evaluator.tasks.evaluate_benchmark import __main__ as evaluate_benchmark_task -from nmp.evaluator.tasks.evaluate_metric import __main__ as evaluate_metric_task -from nmp.evaluator.tasks.metric_results import __main__ as metric_results_task -from pytest_mock import MockerFixture - - -def _raise_keyboard_interrupt(main_coro: Coroutine[Any, Any, int]) -> None: - main_coro.close() - raise KeyboardInterrupt - - -def _raise_runtime_error(main_coro: Coroutine[Any, Any, int]) -> None: - main_coro.close() - raise RuntimeError("boom") - - -@pytest.mark.parametrize( - "task_module", - [ - pytest.param(download_fileset_task, id="download_fileset"), - pytest.param(evaluate_metric_task, id="evaluate_metric"), - pytest.param(evaluate_benchmark_task, id="evaluate_benchmark"), - pytest.param(metric_results_task, id="metric_results"), - ], -) -class TestRun: - def test_returns_zero_on_keyboard_interrupt(self, mocker: MockerFixture, task_module): - register_handlers = mocker.patch.object(task_module, "register_task_signal_handlers") - mocker.patch.object(task_module.asyncio, "run", side_effect=_raise_keyboard_interrupt) - - result = task_module.run() - - assert result == 0 - register_handlers.assert_called_once_with() - - def test_returns_one_on_exception(self, mocker: MockerFixture, task_module): - register_handlers = mocker.patch.object(task_module, "register_task_signal_handlers") - mocker.patch.object(task_module.asyncio, "run", side_effect=_raise_runtime_error) - - result = task_module.run() - - assert result == 1 - register_handlers.assert_called_once_with() - - -@pytest.mark.parametrize( - ("task_module", "job_config_cls", "validate_method", "eval_fn", "config_filename", "extra_args"), - [ - pytest.param( - evaluate_metric_task, - evaluate_metric_task.MetricJobAdapter, - "validate_python", - "evaluate_metric", - "metric-job.json", - ["--skip-upload-results", "true"], - id="evaluate_metric", - ), - pytest.param( - evaluate_benchmark_task, - evaluate_benchmark_task.BenchmarkJobAdapter, - "validate_python", - "evaluate_benchmark", - "benchmark-job.json", - ["--skip-upload-results"], - id="evaluate_benchmark", - ), - ], -) -class TestMainStopsProgressTrackingOnKeyboardInterrupt: - @pytest.mark.asyncio - async def test_stops_progress_tracking_on_keyboard_interrupt( - self, - tmp_path: Path, - mocker: MockerFixture, - task_module, - job_config_cls, - validate_method, - eval_fn, - config_filename, - extra_args, - monkeypatch: pytest.MonkeyPatch, - ): - config_path = tmp_path / config_filename - config_path.write_text("{}") - monkeypatch.setenv(NEMO_JOB_STEP_CONFIG_FILE_PATH_ENVVAR, str(config_path)) - monkeypatch.setenv(PERSISTENT_JOB_STORAGE_PATH_ENVVAR, str(tmp_path)) - - progress_tracking = mocker.Mock() - mocker.patch.object(task_module, "ProgressTracking", return_value=progress_tracking) - mocker.patch.object(job_config_cls, validate_method, return_value=mocker.Mock()) - mocker.patch.object(task_module, eval_fn, new=mocker.AsyncMock(side_effect=KeyboardInterrupt)) - - with pytest.raises(KeyboardInterrupt): - await task_module.main( - [ - "--progress-tracking-url", - "http://example.com/progress", - *extra_args, - ] - ) - - progress_tracking.stop.assert_called_once() diff --git a/services/evaluator/tests/test_config.py b/services/evaluator/tests/test_config.py deleted file mode 100644 index 298895f296..0000000000 --- a/services/evaluator/tests/test_config.py +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest import mock - -import pytest -from nmp.evaluator.config import EvaluatorSettings - - -def test_defaults(): - settings = EvaluatorSettings() - assert settings.recreate_existing_system_entities is False - assert settings.jobs.configs_dir == "/configs" - assert settings.evalfactory.agentic_eval == "nvcr.io/nvidia/eval-factory/agentic_eval:26.01" - - -@pytest.mark.unit_test -@mock.patch.dict( - os.environ, - { - "NMP_EVALUATOR_RECREATE_EXISTING_SYSTEM_ENTITIES": "true", - "NMP_EVALUATOR_JOBS_CONFIGS_DIR": "/new/configs/path", - "NMP_EVALUATOR_EVALFACTORY_AGENTIC_EVAL": "my-container", - }, -) -def test_env_override(): - settings = EvaluatorSettings() - assert settings.recreate_existing_system_entities is True - assert settings.jobs.configs_dir == "/new/configs/path" - assert settings.evalfactory.agentic_eval == "my-container" diff --git a/services/evaluator/tests/test_dataset_downloader.py b/services/evaluator/tests/test_dataset_downloader.py deleted file mode 100644 index 1f1e01cacc..0000000000 --- a/services/evaluator/tests/test_dataset_downloader.py +++ /dev/null @@ -1,87 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -from unittest.mock import patch - -import pytest -from huggingface_hub import HfApi -from nmp.evaluator.app.datasets.nmp_datasets.hf import download_dataset -from nmp.evaluator.config import settings - - -@pytest.mark.asyncio -@patch.object(HfApi, "hf_hub_download") -@patch.dict(os.environ, {"DATA_STORE_URL": "http://data-store.test", "HF_TOKEN": "test-token"}) -async def test_download_dataset_success_file(mock_hf_hub_download): - mock_hf_hub_download.return_value = f"{settings.jobs.dataset_dir}/owner/repo/path/to/file.json" - dataset_path, relative_repo_path = await download_dataset( - hf_path="hf://datasets/owner/repo/path/to/file.json", local_dir=settings.jobs.dataset_dir - ) - - # Verify the result - assert dataset_path == f"{settings.jobs.dataset_dir}/owner/repo" - assert relative_repo_path == "path/to/file.json" - - -@pytest.mark.asyncio -@patch.object(HfApi, "snapshot_download") -@patch.dict(os.environ, {"DATA_STORE_URL": "http://data-store.test", "HF_TOKEN": "test-token"}) -async def test_download_dataset_success_repo(mock_snapshot_download): - mock_snapshot_download.return_value = f"{settings.jobs.dataset_dir}/owner/repo" - dataset_path, relative_repo_path = await download_dataset( - hf_path="hf://datasets/owner/repo", local_dir=settings.jobs.dataset_dir - ) - - # Verify the result - assert dataset_path == f"{settings.jobs.dataset_dir}/owner/repo" - assert relative_repo_path is None - - -@pytest.mark.asyncio -@patch.object(HfApi, "snapshot_download") -@patch.dict(os.environ, {"DATA_STORE_URL": "http://data-store.test", "HF_TOKEN": "test-token"}) -async def test_download_dataset_success_repo_subdir(mock_snapshot_download): - mock_snapshot_download.return_value = f"{settings.jobs.dataset_dir}/owner/repo" - dataset_path, relative_repo_path = await download_dataset( - hf_path="hf://datasets/owner/repo/sub/dir", local_dir=settings.jobs.dataset_dir - ) - - # Verify the result - assert dataset_path == f"{settings.jobs.dataset_dir}/owner/repo" - assert relative_repo_path == "sub/dir" - - -@pytest.mark.asyncio -async def test_download_dataset_invalid_path(): - # Test with invalid path format - with pytest.raises(ValueError, match="Invalid dataset path: invalid/path. Must start with 'hf://datasets/'"): - await download_dataset(hf_path="invalid/path", local_dir=settings.jobs.dataset_dir) - - -@pytest.mark.asyncio -@patch.object(HfApi, "hf_hub_download") -@patch.dict(os.environ, {"HF_TOKEN": "test-token"}) -async def test_download_dataset_custom_endpoint(mock_hf_hub_download): - # Call the function with custom endpoint - mock_hf_hub_download.return_value = f"{settings.jobs.dataset_dir}/owner/repo/path/to/file.json" - dataset_path, relative_repo_path = await download_dataset( - hf_path="hf://datasets/owner/repo/path/to/file.json", - local_dir=settings.jobs.dataset_dir, - hf_endpoint="https://custom-hf-endpoint.com", - ) - - # Verify the result - assert dataset_path == f"{settings.jobs.dataset_dir}/owner/repo" - assert relative_repo_path == "path/to/file.json" - - -@pytest.mark.asyncio -@patch.object(HfApi, "hf_hub_download") -@patch.dict(os.environ, {"DATA_STORE_URL": "http://data-store.test", "HF_TOKEN": "test-token"}) -async def test_download_dataset_error_handling(mock_hf_hub_download): - mock_hf_hub_download.side_effect = Exception("Download failed") - with pytest.raises(Exception, match="Download failed"): - await download_dataset( - hf_path="hf://datasets/owner/repo/path/to/file.json", local_dir=settings.jobs.dataset_dir - ) diff --git a/services/evaluator/tests/test_datasets.py b/services/evaluator/tests/test_datasets.py deleted file mode 100644 index a2483f526e..0000000000 --- a/services/evaluator/tests/test_datasets.py +++ /dev/null @@ -1,159 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import json -import os -import tempfile - -import pytest -from datasets import exceptions -from nmp.common.files.deprecated_datastore.datasets import Dataset -from nmp.evaluator.app.datasets.nmp_datasets.exceptions import UnsupportedFileFormatException -from nmp.evaluator.app.datasets.nmp_datasets.utils import ( - LoadingMode, - _load_dataset_with_hf, - _load_dataset_with_json, - load_dataset, -) -from pydantic import AnyUrl - - -def test_load_dataset_with_hf_exception(mocker): - mocker.patch( - "nmp.evaluator.app.datasets.nmp_datasets.utils.hf_load_dataset" - ).side_effect = exceptions.DatasetGenerationError - mock_load_dataset_with_json = mocker.patch("nmp.evaluator.app.datasets.nmp_datasets.utils._load_dataset_with_json") - - _load_dataset_with_hf("some_path", None) - - mock_load_dataset_with_json.assert_called_with("some_path", None) - - -def test_load_dataset_with_hf_exception_file_path(mocker): - mocker.patch( - "nmp.evaluator.app.datasets.nmp_datasets.utils.hf_load_dataset" - ).side_effect = exceptions.DatasetGenerationError - mock_load_dataset_with_json = mocker.patch("nmp.evaluator.app.datasets.nmp_datasets.utils._load_dataset_with_json") - - _load_dataset_with_hf("some_path", "nested_dir_1/nested_dir_2/file.txt", "train") - - mock_load_dataset_with_json.assert_called_with("some_path", "nested_dir_1/nested_dir_2/file.txt") - - -def test_load_dataset_with_hf_exception_json_unsupported_format(mocker): - mocker.patch( - "nmp.evaluator.app.datasets.nmp_datasets.utils.hf_load_dataset" - ).side_effect = exceptions.DatasetGenerationError - mock_load_dataset_with_json = mocker.patch("nmp.evaluator.app.datasets.nmp_datasets.utils._load_dataset_with_json") - mock_load_dataset_with_json.side_effect = UnsupportedFileFormatException - - with pytest.raises(UnsupportedFileFormatException): - _load_dataset_with_hf("some_path", "nested_dir_1/nested_dir_2/file.txt") - - mock_load_dataset_with_json.assert_called_with("some_path", "nested_dir_1/nested_dir_2/file.txt") - - -def test_load_dataset_with_json_nested_files(): - with tempfile.TemporaryDirectory() as temp_dir: - json_file_name = "dataset_1.json" - json_file_path = os.path.join(temp_dir, json_file_name) - with open(json_file_path, "w") as json_file: - json.dump([{"id": "row_1"}, {"id": "row_2"}], json_file) - - subpath = "subpath" - os.mkdir(os.path.join(temp_dir, subpath)) - - jsonl_file_name = "dataset_2.json" - jsonl_file_path = os.path.join(temp_dir, subpath, jsonl_file_name) - with open(jsonl_file_path, "w") as jsonl_file: - jsonl_file.write(json.dumps({"id": "row_3"})) - - rows = _load_dataset_with_json(temp_dir, None) - # Should have read 3 rows from 2 files - assert len(rows) == 3 - - -def test_load_dataset_with_json_nested_files_dir_load(): - with tempfile.TemporaryDirectory() as temp_dir: - subpath = "subpath_1" - dataset_path = os.path.join(temp_dir, subpath) - os.mkdir(dataset_path) - - json_file_name = "dataset_1.json" - json_file_path = os.path.join(temp_dir, subpath, json_file_name) - with open(json_file_path, "w") as json_file: - json.dump([{"id": "row_1"}, {"id": "row_2"}], json_file) - - subpath_1_1 = "subpath_1_1" - os.mkdir(os.path.join(temp_dir, subpath, subpath_1_1)) - - jsonl_file_name = "dataset_2.json" - jsonl_file_path = os.path.join(temp_dir, subpath, subpath_1_1, jsonl_file_name) - with open(jsonl_file_path, "w") as jsonl_file: - jsonl_file.write(json.dumps({"id": "row_3"})) - - rows = _load_dataset_with_json(temp_dir, subpath) - # Should have read 3 rows from 2 files - assert len(rows) == 3 - - -def test_load_dataset_with_json_unsupported_format_single_file(): - with tempfile.TemporaryDirectory() as temp_dir: - txt_file = "dataset.txt" - file_path = os.path.join(temp_dir, txt_file) - - with open(file_path, "w"): - with pytest.raises(UnsupportedFileFormatException): - _load_dataset_with_json(temp_dir, txt_file) - - -def test_load_dataset_with_json_supported_format_with_other_unsupported(): - with tempfile.TemporaryDirectory() as temp_dir: - json_file_name = "good_dataset.json" - json_file_path = os.path.join(temp_dir, json_file_name) - with open(json_file_path, "w") as json_file: - json.dump([{"id": "row_1"}, {"id": "row_2"}], json_file) - - txt_file_name = "dataset.txt" - txt_file_path = os.path.join(temp_dir, txt_file_name) - with open(txt_file_path, "w"): - pass - - rows = _load_dataset_with_json(temp_dir, json_file_name) - assert len(rows) == 2 - - -def test_load_dataset_with_json_unsupported_format_multiple_files(): - with tempfile.TemporaryDirectory() as temp_dir: - json_file = "good_dataset.json" - json_file_path = os.path.join(temp_dir, json_file) - with open(json_file_path, "w"): - txt_file = "dataset.txt" - txt_file_path = os.path.join(temp_dir, txt_file) - with open(txt_file_path, "w"): - with pytest.raises(UnsupportedFileFormatException): - _load_dataset_with_json(temp_dir, txt_file) - - -@pytest.mark.asyncio -async def test_load_dataset_limit(): - """ - Test loading dataset from file:// with limit - """ - with tempfile.TemporaryDirectory() as temp_dir: - json_file_name = "dataset_1.json" - json_file_path = os.path.join(temp_dir, json_file_name) - with open(json_file_path, "w") as json_file: - json.dump([{"id": "row_1"}, {"id": "row_2"}, {"id": "row_3"}], json_file) - - dataset = Dataset(files_url=AnyUrl(f"file://{json_file_path}")) - loaded_dataset = await load_dataset(dataset, LoadingMode.SIMPLE) - assert len(loaded_dataset) == 3, "expected all rows" - - dataset = Dataset(files_url=AnyUrl(f"file://{json_file_path}"), limit=2) - loaded_dataset = await load_dataset(dataset, LoadingMode.SIMPLE) - assert len(loaded_dataset) == 2, "expected limit to truncate dataset size" - - dataset = Dataset(files_url=AnyUrl(f"file://{json_file_path}"), limit=5) - loaded_dataset = await load_dataset(dataset, LoadingMode.SIMPLE) - assert len(loaded_dataset) == 3, "expected limit ignored when greater than dataset size" diff --git a/services/evaluator/tests/test_manual_datasets.py b/services/evaluator/tests/test_manual_datasets.py deleted file mode 100644 index 900f9c1482..0000000000 --- a/services/evaluator/tests/test_manual_datasets.py +++ /dev/null @@ -1,75 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -import os -import sys - -import pytest -from nmp.common.files.deprecated_datastore.datasets import Dataset -from nmp.evaluator.app.datasets.nmp_datasets import load_dataset -from pydantic import AnyUrl - -TEST_DATA_ROOT = os.path.join(os.path.dirname(__file__), "datasets") - -is_manual = any("test_manual" in arg for arg in sys.argv) - - -@pytest.mark.asyncio -@pytest.mark.skipif(not is_manual, reason="Only run manually") -async def test_load_local_file_dataset(): - dataset = await load_dataset(Dataset(files_url=AnyUrl(f"file://{TEST_DATA_ROOT}/math/simple-math.csv"))) - assert len(dataset) == 3 - - dataset = await load_dataset(Dataset(files_url=AnyUrl(f"file://{TEST_DATA_ROOT}/qa/questions.json"))) - assert len(dataset) == 4 - - -@pytest.mark.asyncio -@pytest.mark.skipif(not is_manual, reason="Only run manually") -async def test_load_local_folder_dataset(): - dataset = await load_dataset(Dataset(files_url=AnyUrl(f"file://{TEST_DATA_ROOT}/math"))) - assert len(dataset) == 3 - - dataset = await load_dataset(Dataset(files_url=AnyUrl(f"file://{TEST_DATA_ROOT}/qa"))) - assert len(dataset) == 4 - - -@pytest.mark.skipif(not is_manual, reason="Only run manually") -@pytest.mark.asyncio -async def test_load_datastore_dataset(): - os.environ["DATA_STORE_URL"] = "http://data-store.test:8008/v1/hf" - - dataset = await load_dataset(Dataset(files_url=AnyUrl("hf://datasets/default/eval-test-data-math"))) - assert len(dataset) == 3 - - -@pytest.mark.skipif(not is_manual, reason="Only run manually") -@pytest.mark.asyncio -async def test_load_datastore_file(): - os.environ["DATA_STORE_URL"] = "http://data-store.test:8008/v1/hf" - - dataset = await load_dataset(Dataset(files_url=AnyUrl("hf://datasets/default/eval-test-data-math/simple-math.csv"))) - assert len(dataset) == 3 - - -@pytest.mark.skipif(not is_manual, reason="Only run manually") -@pytest.mark.asyncio -async def test_load_datastore_file_with_limit(): - os.environ["DATA_STORE_URL"] = "http://data-store.test:8008/v1/hf" - - dataset = await load_dataset( - Dataset(files_url=AnyUrl("hf://datasets/default/eval-test-data-math/simple-math.csv"), limit=1) - ) - assert len(dataset) == 1 - - -@pytest.mark.skipif(not is_manual, reason="Only run manually") -@pytest.mark.asyncio -async def test_load_hugging_face_hub_dataset(): - dataset = await load_dataset( - Dataset( - files_url=AnyUrl("hf://datasets/cornell-movie-review-data/rotten_tomatoes"), - hf_endpoint=AnyUrl("https://huggingface.co"), - ) - ) - assert len(dataset) == 8530 diff --git a/tests/agentic-use/requirements-nat.txt b/tests/agentic-use/requirements-nat.txt index 7c48b84e5d..69b202fc96 100644 --- a/tests/agentic-use/requirements-nat.txt +++ b/tests/agentic-use/requirements-nat.txt @@ -2,9 +2,8 @@ # # WHY THIS FILE EXISTS INSTEAD OF pyproject.toml # ----------------------------------------------- -# nvidia-nat requires pymilvus>=2.6, which conflicts with nmp-evaluator's -# requirement of pymilvus==2.4.6 in the NeMo Platform workspace uv.lock. This means -# nvidia-nat cannot be added as a workspace dependency. +# Keep nvidia-nat isolated from the main workspace lock so agentic-use eval +# tasks can iterate without perturbing platform runtime dependency resolution. # # Instead, nvidia-nat is installed: # 1. Inside the Docker container via Dockerfile.agentic-base (runtime) @@ -12,7 +11,7 @@ # # INSTALLATION (outside container) # --------------------------------- -# Install into a separate virtual environment to avoid the workspace conflict: +# Install into a separate virtual environment: # # python3.11 -m venv .venv-nat # source .venv-nat/bin/activate diff --git a/third_party/licenses.jsonl b/third_party/licenses.jsonl index 6dc2fc302e..073e761aea 100644 --- a/third_party/licenses.jsonl +++ b/third_party/licenses.jsonl @@ -40,7 +40,6 @@ {"name": "cloudpickle", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "colorama", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "colorlog", "license": "MIT", "compatible": true} -{"name": "crc32c", "license": "LGPL-2.1-OR-LATER", "compatible": true} {"name": "cryptography", "license": "APACHE-2.0", "compatible": true} {"name": "cyclopts", "license": "APACHE-2.0", "compatible": true} {"name": "data-designer", "license": "APACHE-2.0", "compatible": true} @@ -48,7 +47,6 @@ {"name": "data-designer-engine", "license": "APACHE-2.0", "compatible": true} {"name": "dataclasses-json", "license": "MIT", "compatible": true} {"name": "datasets", "license": "APACHE-2.0", "compatible": true} -{"name": "detect-installer", "license": "0BSD", "compatible": true} {"name": "diff-cover", "license": "APACHE-2.0", "compatible": true} {"name": "dill", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "diskcache", "license": "APACHE-2.0", "compatible": true} @@ -56,6 +54,7 @@ {"name": "dnspython", "license": "ISC", "compatible": true} {"name": "docker", "license": "APACHE-2.0", "compatible": true} {"name": "docstring-parser", "license": "MIT", "compatible": true} +{"name": "docutils", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "duckdb", "license": "MIT", "compatible": true} {"name": "durationpy", "license": "MIT", "compatible": true} {"name": "email-validator", "license": "UNLICENSE", "compatible": true} @@ -69,7 +68,6 @@ {"name": "fastar", "license": "MIT", "compatible": true} {"name": "fastembed", "license": "APACHE-2.0", "compatible": true} {"name": "fastmcp", "license": "APACHE-2.0", "compatible": true} -{"name": "fastmcp-slim", "license": "APACHE-2.0", "compatible": true} {"name": "fastuuid", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "filelock", "license": "UNLICENSE", "compatible": true} {"name": "filetype", "license": "MIT", "compatible": true} @@ -80,7 +78,6 @@ {"name": "gitpython", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "googleapis-common-protos", "license": "APACHE-2.0", "compatible": true} {"name": "greenlet", "license": "MIT", "compatible": true} -{"name": "griffelib", "license": "ISC", "compatible": true} {"name": "grpcio", "license": "APACHE-2.0", "compatible": true} {"name": "gunicorn", "license": "MIT", "compatible": true} {"name": "h11", "license": "MIT", "compatible": true} @@ -151,6 +148,7 @@ {"name": "mdurl", "license": "MIT", "compatible": true} {"name": "mmh3", "license": "MIT", "compatible": true} {"name": "more-itertools", "license": "MIT", "compatible": true} +{"name": "mpmath", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "multidict", "license": "APACHE-2.0", "compatible": true} {"name": "multiprocess", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "mypy-extensions", "license": "MIT", "compatible": true} @@ -235,7 +233,6 @@ {"name": "pyopenssl", "license": "APACHE-2.0", "compatible": true} {"name": "pyperclip", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "pytest", "license": "MIT", "compatible": true} -{"name": "python-box", "license": "MIT", "compatible": true} {"name": "python-dateutil", "license": "APACHE-2.0", "compatible": true} {"name": "python-dotenv", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "python-json-logger", "license": "BSD-3-CLAUSE", "compatible": true} @@ -279,6 +276,7 @@ {"name": "starlette", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "streaming-form-data", "license": "MIT", "compatible": true} {"name": "structlog", "license": "APACHE-2.0", "compatible": true} +{"name": "sympy", "license": "BSD-3-CLAUSE", "compatible": true} {"name": "tabulate", "license": "MIT", "compatible": true} {"name": "tblib", "license": "BSD-2-CLAUSE", "compatible": true} {"name": "tenacity", "license": "APACHE-2.0", "compatible": true} diff --git a/third_party/osv-licenses.json b/third_party/osv-licenses.json index e5133daf29..5f4f4dd82e 100644 --- a/third_party/osv-licenses.json +++ b/third_party/osv-licenses.json @@ -38,7 +38,7 @@ { "package": { "name": "aiofile", - "version": "3.11.1", + "version": "3.9.0", "ecosystem": "PyPI" }, "licenses": [ @@ -58,7 +58,7 @@ { "package": { "name": "aiohappyeyeballs", - "version": "2.6.2", + "version": "2.6.1", "ecosystem": "PyPI" }, "licenses": [ @@ -68,9 +68,793 @@ { "package": { "name": "aiohttp", - "version": "3.14.1", + "version": "3.13.5", "ecosystem": "PyPI" }, + "vulnerabilities": [ + { + "modified": "2026-06-04T15:29:16Z", + "published": "2026-06-03T21:34:38Z", + "schema_version": "1.7.5", + "id": "GHSA-hg6j-4rv6-33pg", + "aliases": [ + "CVE-2026-47265" + ], + "related": [ + "CGA-5f7q-7pmq-hq3r" + ], + "summary": "AIOHTTP is vulnerable to cross-origin redirect with per-request cookies", + "details": "### Summary\n\nCookies set with the `cookies` parameter on requests are sent after following a cross-origin redirect.\n\n### Impact\n\nIf a developer uses the `cookies` parameter on a per-request basis then sensitive data might be leaked to an attacker if they manage to control a redirect.\n\n### Workaround\n\nIf unable to upgrade, using a `Cookie` header in the `headers` parameter is not vulnerable.\n\n-----\n\nPatch: https://github.com/aio-libs/aiohttp/commit/f54c40851b0d6c4bbdab97ba518a223adda32478", + "severity": [ + { + "type": "CVSS_V4", + "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:U" + } + ], + "affected": [ + { + "package": { + "ecosystem": "PyPI", + "name": "aiohttp", + "purl": "pkg:pypi/aiohttp" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "0" + }, + { + "fixed": "3.14.0" + } + ] + } + ], + "versions": [ + "0.1", + "0.10.0", + "0.10.1", + "0.10.2", + "0.11.0", + "0.12.0", + "0.13.0", + "0.13.1", + "0.14.0", + "0.14.1", + "0.14.2", + "0.14.3", + "0.14.4", + "0.15.0", + "0.15.1", + "0.15.2", + "0.15.3", + "0.16.0", + "0.16.1", + "0.16.2", + "0.16.3", + "0.16.4", + "0.16.5", + "0.16.6", + "0.17.0", + "0.17.1", + "0.17.2", + "0.17.3", + "0.17.4", + "0.18.0", + "0.18.1", + "0.18.2", + "0.18.3", + "0.18.4", + "0.19.0", + "0.2", + "0.20.0", + "0.20.1", + "0.20.2", + "0.21.0", + "0.21.1", + "0.21.2", + "0.21.4", + "0.21.5", + "0.21.6", + "0.22.0", + "0.22.0a0", + "0.22.0b0", + "0.22.0b1", + "0.22.0b2", + "0.22.0b3", + "0.22.0b4", + "0.22.0b5", + "0.22.0b6", + "0.22.1", + "0.22.2", + "0.22.3", + "0.22.4", + "0.22.5", + "0.3", + "0.4", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.5.0", + "0.6.0", + "0.6.1", + "0.6.2", + "0.6.3", + "0.6.4", + "0.6.5", + "0.7.0", + "0.7.1", + "0.7.2", + "0.7.3", + "0.8.0", + "0.8.1", + "0.8.2", + "0.8.3", + "0.8.4", + "0.9.0", + "0.9.1", + "0.9.2", + "0.9.3", + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.0.5", + "1.1.0", + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.2.0", + "1.3.0", + "1.3.1", + "1.3.2", + "1.3.3", + "1.3.4", + "1.3.5", + "2.0.0", + "2.0.0rc1", + "2.0.1", + "2.0.2", + "2.0.3", + "2.0.4", + "2.0.5", + "2.0.6", + "2.0.7", + "2.1.0", + "2.2.0", + "2.2.1", + "2.2.2", + "2.2.3", + "2.2.4", + "2.2.5", + "2.3.0", + "2.3.0a1", + "2.3.0a2", + "2.3.0a3", + "2.3.0a4", + "2.3.1", + "2.3.10", + "2.3.1a1", + "2.3.2", + "2.3.2b2", + "2.3.2b3", + "2.3.3", + "2.3.4", + "2.3.5", + "2.3.6", + "2.3.7", + "2.3.8", + "2.3.9", + "3.0.0", + "3.0.0b0", + "3.0.0b1", + "3.0.0b2", + "3.0.0b3", + "3.0.0b4", + "3.0.1", + "3.0.2", + "3.0.3", + "3.0.4", + "3.0.5", + "3.0.6", + "3.0.7", + "3.0.8", + "3.0.9", + "3.1.0", + "3.1.1", + "3.1.2", + "3.1.3", + "3.10.0", + "3.10.0b1", + "3.10.0rc0", + "3.10.1", + "3.10.10", + "3.10.11", + "3.10.11rc0", + "3.10.2", + "3.10.3", + "3.10.4", + "3.10.5", + "3.10.6", + "3.10.6rc0", + "3.10.6rc1", + "3.10.6rc2", + "3.10.7", + "3.10.8", + "3.10.9", + "3.11.0", + "3.11.0b0", + "3.11.0b1", + "3.11.0b2", + "3.11.0b3", + "3.11.0b4", + "3.11.0b5", + "3.11.0rc0", + "3.11.0rc1", + "3.11.0rc2", + "3.11.1", + "3.11.10", + "3.11.11", + "3.11.12", + "3.11.13", + "3.11.14", + "3.11.15", + "3.11.16", + "3.11.17", + "3.11.18", + "3.11.2", + "3.11.3", + "3.11.4", + "3.11.5", + "3.11.6", + "3.11.7", + "3.11.8", + "3.11.9", + "3.12.0", + "3.12.0b0", + "3.12.0b1", + "3.12.0b2", + "3.12.0b3", + "3.12.0rc0", + "3.12.0rc1", + "3.12.1", + "3.12.10", + "3.12.11", + "3.12.12", + "3.12.13", + "3.12.14", + "3.12.15", + "3.12.1rc0", + "3.12.2", + "3.12.3", + "3.12.4", + "3.12.6", + "3.12.7", + "3.12.7rc0", + "3.12.8", + "3.12.9", + "3.13.0", + "3.13.1", + "3.13.2", + "3.13.3", + "3.13.4", + "3.13.5", + "3.2.0", + "3.2.1", + "3.3.0", + "3.3.0a0", + "3.3.1", + "3.3.2", + "3.3.2a0", + "3.4.0", + "3.4.0a0", + "3.4.0a3", + "3.4.0b1", + "3.4.0b2", + "3.4.1", + "3.4.2", + "3.4.3", + "3.4.4", + "3.5.0", + "3.5.0a1", + "3.5.0b1", + "3.5.0b2", + "3.5.0b3", + "3.5.1", + "3.5.2", + "3.5.3", + "3.5.4", + "3.6.0", + "3.6.0a0", + "3.6.0a1", + "3.6.0a11", + "3.6.0a12", + "3.6.0a2", + "3.6.0a3", + "3.6.0a4", + "3.6.0a5", + "3.6.0a6", + "3.6.0a7", + "3.6.0a8", + "3.6.0a9", + "3.6.0b0", + "3.6.1", + "3.6.1b3", + "3.6.1b4", + "3.6.2", + "3.6.2a0", + "3.6.2a1", + "3.6.2a2", + "3.6.3", + "3.7.0", + "3.7.0b0", + "3.7.0b1", + "3.7.1", + "3.7.2", + "3.7.3", + "3.7.4", + "3.7.4.post0", + "3.8.0", + "3.8.0a7", + "3.8.0b0", + "3.8.1", + "3.8.2", + "3.8.3", + "3.8.4", + "3.8.5", + "3.8.6", + "3.9.0", + "3.9.0b0", + "3.9.0b1", + "3.9.0rc0", + "3.9.1", + "3.9.2", + "3.9.3", + "3.9.4", + "3.9.4rc0", + "3.9.5" + ], + "database_specific": { + "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-hg6j-4rv6-33pg/GHSA-hg6j-4rv6-33pg.json" + } + } + ], + "references": [ + { + "type": "WEB", + "url": "https://github.com/aio-libs/aiohttp/security/advisories/GHSA-hg6j-4rv6-33pg" + }, + { + "type": "ADVISORY", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-47265" + }, + { + "type": "WEB", + "url": "https://github.com/aio-libs/aiohttp/commit/f54c40851b0d6c4bbdab97ba518a223adda32478" + }, + { + "type": "PACKAGE", + "url": "https://github.com/aio-libs/aiohttp" + } + ], + "database_specific": { + "cwe_ids": [ + "CWE-346" + ], + "github_reviewed": true, + "github_reviewed_at": "2026-06-03T21:34:38Z", + "nvd_published_at": "2026-06-02T20:16:37Z", + "severity": "MODERATE" + } + }, + { + "modified": "2026-06-04T15:29:17Z", + "published": "2026-06-03T20:56:54Z", + "schema_version": "1.7.5", + "id": "GHSA-jg22-mg44-37j8", + "aliases": [ + "CVE-2026-34993" + ], + "related": [ + "CGA-2r69-w36g-jxvr" + ], + "summary": "AIOHTTP is Vulnerable to Deserialization of Untrusted Data", + "details": "### Summary\n\nUsing ``CookieJar.load()`` with untrusted input may allow arbitrary code execution.\n\n### Impact\n\nMost applications using this function will be doing so with the user's own data, so this is unlikely to affect many applications.\n\n### Workaround\n\nIf an application does allow attacker controlled files to be loaded, a workaround on older releases would be to sanitise the files before loading.\n\n-----\n\nPatch: https://github.com/aio-libs/aiohttp/commit/dcf40f30637e8752c76781cf6703b5a236749a00", + "severity": [ + { + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:H/A:L" + } + ], + "affected": [ + { + "package": { + "ecosystem": "PyPI", + "name": "aiohttp", + "purl": "pkg:pypi/aiohttp" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "0" + }, + { + "fixed": "3.14.0" + } + ] + } + ], + "versions": [ + "0.1", + "0.10.0", + "0.10.1", + "0.10.2", + "0.11.0", + "0.12.0", + "0.13.0", + "0.13.1", + "0.14.0", + "0.14.1", + "0.14.2", + "0.14.3", + "0.14.4", + "0.15.0", + "0.15.1", + "0.15.2", + "0.15.3", + "0.16.0", + "0.16.1", + "0.16.2", + "0.16.3", + "0.16.4", + "0.16.5", + "0.16.6", + "0.17.0", + "0.17.1", + "0.17.2", + "0.17.3", + "0.17.4", + "0.18.0", + "0.18.1", + "0.18.2", + "0.18.3", + "0.18.4", + "0.19.0", + "0.2", + "0.20.0", + "0.20.1", + "0.20.2", + "0.21.0", + "0.21.1", + "0.21.2", + "0.21.4", + "0.21.5", + "0.21.6", + "0.22.0", + "0.22.0a0", + "0.22.0b0", + "0.22.0b1", + "0.22.0b2", + "0.22.0b3", + "0.22.0b4", + "0.22.0b5", + "0.22.0b6", + "0.22.1", + "0.22.2", + "0.22.3", + "0.22.4", + "0.22.5", + "0.3", + "0.4", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.5.0", + "0.6.0", + "0.6.1", + "0.6.2", + "0.6.3", + "0.6.4", + "0.6.5", + "0.7.0", + "0.7.1", + "0.7.2", + "0.7.3", + "0.8.0", + "0.8.1", + "0.8.2", + "0.8.3", + "0.8.4", + "0.9.0", + "0.9.1", + "0.9.2", + "0.9.3", + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.0.5", + "1.1.0", + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.2.0", + "1.3.0", + "1.3.1", + "1.3.2", + "1.3.3", + "1.3.4", + "1.3.5", + "2.0.0", + "2.0.0rc1", + "2.0.1", + "2.0.2", + "2.0.3", + "2.0.4", + "2.0.5", + "2.0.6", + "2.0.7", + "2.1.0", + "2.2.0", + "2.2.1", + "2.2.2", + "2.2.3", + "2.2.4", + "2.2.5", + "2.3.0", + "2.3.0a1", + "2.3.0a2", + "2.3.0a3", + "2.3.0a4", + "2.3.1", + "2.3.10", + "2.3.1a1", + "2.3.2", + "2.3.2b2", + "2.3.2b3", + "2.3.3", + "2.3.4", + "2.3.5", + "2.3.6", + "2.3.7", + "2.3.8", + "2.3.9", + "3.0.0", + "3.0.0b0", + "3.0.0b1", + "3.0.0b2", + "3.0.0b3", + "3.0.0b4", + "3.0.1", + "3.0.2", + "3.0.3", + "3.0.4", + "3.0.5", + "3.0.6", + "3.0.7", + "3.0.8", + "3.0.9", + "3.1.0", + "3.1.1", + "3.1.2", + "3.1.3", + "3.10.0", + "3.10.0b1", + "3.10.0rc0", + "3.10.1", + "3.10.10", + "3.10.11", + "3.10.11rc0", + "3.10.2", + "3.10.3", + "3.10.4", + "3.10.5", + "3.10.6", + "3.10.6rc0", + "3.10.6rc1", + "3.10.6rc2", + "3.10.7", + "3.10.8", + "3.10.9", + "3.11.0", + "3.11.0b0", + "3.11.0b1", + "3.11.0b2", + "3.11.0b3", + "3.11.0b4", + "3.11.0b5", + "3.11.0rc0", + "3.11.0rc1", + "3.11.0rc2", + "3.11.1", + "3.11.10", + "3.11.11", + "3.11.12", + "3.11.13", + "3.11.14", + "3.11.15", + "3.11.16", + "3.11.17", + "3.11.18", + "3.11.2", + "3.11.3", + "3.11.4", + "3.11.5", + "3.11.6", + "3.11.7", + "3.11.8", + "3.11.9", + "3.12.0", + "3.12.0b0", + "3.12.0b1", + "3.12.0b2", + "3.12.0b3", + "3.12.0rc0", + "3.12.0rc1", + "3.12.1", + "3.12.10", + "3.12.11", + "3.12.12", + "3.12.13", + "3.12.14", + "3.12.15", + "3.12.1rc0", + "3.12.2", + "3.12.3", + "3.12.4", + "3.12.6", + "3.12.7", + "3.12.7rc0", + "3.12.8", + "3.12.9", + "3.13.0", + "3.13.1", + "3.13.2", + "3.13.3", + "3.13.4", + "3.13.5", + "3.2.0", + "3.2.1", + "3.3.0", + "3.3.0a0", + "3.3.1", + "3.3.2", + "3.3.2a0", + "3.4.0", + "3.4.0a0", + "3.4.0a3", + "3.4.0b1", + "3.4.0b2", + "3.4.1", + "3.4.2", + "3.4.3", + "3.4.4", + "3.5.0", + "3.5.0a1", + "3.5.0b1", + "3.5.0b2", + "3.5.0b3", + "3.5.1", + "3.5.2", + "3.5.3", + "3.5.4", + "3.6.0", + "3.6.0a0", + "3.6.0a1", + "3.6.0a11", + "3.6.0a12", + "3.6.0a2", + "3.6.0a3", + "3.6.0a4", + "3.6.0a5", + "3.6.0a6", + "3.6.0a7", + "3.6.0a8", + "3.6.0a9", + "3.6.0b0", + "3.6.1", + "3.6.1b3", + "3.6.1b4", + "3.6.2", + "3.6.2a0", + "3.6.2a1", + "3.6.2a2", + "3.6.3", + "3.7.0", + "3.7.0b0", + "3.7.0b1", + "3.7.1", + "3.7.2", + "3.7.3", + "3.7.4", + "3.7.4.post0", + "3.8.0", + "3.8.0a7", + "3.8.0b0", + "3.8.1", + "3.8.2", + "3.8.3", + "3.8.4", + "3.8.5", + "3.8.6", + "3.9.0", + "3.9.0b0", + "3.9.0b1", + "3.9.0rc0", + "3.9.1", + "3.9.2", + "3.9.3", + "3.9.4", + "3.9.4rc0", + "3.9.5" + ], + "database_specific": { + "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-jg22-mg44-37j8/GHSA-jg22-mg44-37j8.json" + } + } + ], + "references": [ + { + "type": "WEB", + "url": "https://github.com/aio-libs/aiohttp/security/advisories/GHSA-jg22-mg44-37j8" + }, + { + "type": "ADVISORY", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-34993" + }, + { + "type": "WEB", + "url": "https://github.com/aio-libs/aiohttp/commit/dcf40f30637e8752c76781cf6703b5a236749a00" + }, + { + "type": "PACKAGE", + "url": "https://github.com/aio-libs/aiohttp" + } + ], + "database_specific": { + "cwe_ids": [ + "CWE-502" + ], + "github_reviewed": true, + "github_reviewed_at": "2026-06-03T20:56:54Z", + "nvd_published_at": "2026-06-02T20:16:34Z", + "severity": "MODERATE" + } + } + ], + "groups": [ + { + "ids": [ + "GHSA-hg6j-4rv6-33pg" + ], + "aliases": [ + "CVE-2026-47265", + "GHSA-hg6j-4rv6-33pg" + ], + "max_severity": "6.6" + }, + { + "ids": [ + "GHSA-jg22-mg44-37j8" + ], + "aliases": [ + "CVE-2026-34993", + "GHSA-jg22-mg44-37j8" + ], + "max_severity": "6.4" + } + ], "licenses": [ "Apache-2.0 AND MIT" ] @@ -158,7 +942,7 @@ { "package": { "name": "anthropic", - "version": "0.107.1", + "version": "0.101.0", "ecosystem": "PyPI" }, "licenses": [ @@ -268,7 +1052,7 @@ { "package": { "name": "beautifulsoup4", - "version": "4.15.0", + "version": "4.14.3", "ecosystem": "PyPI" }, "licenses": [ @@ -298,7 +1082,7 @@ { "package": { "name": "botocore-stubs", - "version": "1.43.14", + "version": "1.42.41", "ecosystem": "PyPI" }, "licenses": [ @@ -308,7 +1092,7 @@ { "package": { "name": "cachetools", - "version": "7.1.4", + "version": "7.0.5", "ecosystem": "PyPI" }, "licenses": [ @@ -328,7 +1112,7 @@ { "package": { "name": "certifi", - "version": "2026.5.20", + "version": "2026.2.25", "ecosystem": "PyPI" }, "licenses": [ @@ -358,7 +1142,7 @@ { "package": { "name": "charset-normalizer", - "version": "3.4.7", + "version": "3.4.6", "ecosystem": "PyPI" }, "licenses": [ @@ -378,7 +1162,7 @@ { "package": { "name": "click", - "version": "8.4.1", + "version": "8.3.1", "ecosystem": "PyPI" }, "licenses": [ @@ -425,16 +1209,6 @@ "MIT" ] }, - { - "package": { - "name": "crc32c", - "version": "2.7.1", - "ecosystem": "PyPI" - }, - "licenses": [ - "LGPL-2.1-or-later" - ] - }, { "package": { "name": "cryptography", @@ -448,7 +1222,7 @@ { "package": { "name": "cyclopts", - "version": "4.17.0", + "version": "4.10.1", "ecosystem": "PyPI" }, "licenses": [ @@ -505,20 +1279,10 @@ "Apache-2.0" ] }, - { - "package": { - "name": "detect-installer", - "version": "0.1.0", - "ecosystem": "PyPI" - }, - "licenses": [ - "0BSD" - ] - }, { "package": { "name": "diff-cover", - "version": "10.3.0", + "version": "10.2.0", "ecosystem": "PyPI" }, "licenses": [ @@ -528,7 +1292,7 @@ { "package": { "name": "dill", - "version": "0.4.0", + "version": "0.3.8", "ecosystem": "PyPI" }, "licenses": [ @@ -746,17 +1510,27 @@ { "package": { "name": "docstring-parser", - "version": "0.18.0", + "version": "0.17.0", "ecosystem": "PyPI" }, "licenses": [ "MIT" ] }, + { + "package": { + "name": "docutils", + "version": "0.22.4", + "ecosystem": "PyPI" + }, + "licenses": [ + "non-standard" + ] + }, { "package": { "name": "duckdb", - "version": "1.5.3", + "version": "1.5.1", "ecosystem": "PyPI" }, "licenses": [ @@ -846,7 +1620,7 @@ { "package": { "name": "fastapi-cloud-cli", - "version": "0.19.0", + "version": "0.15.1", "ecosystem": "PyPI" }, "licenses": [ @@ -856,7 +1630,7 @@ { "package": { "name": "fastar", - "version": "0.11.0", + "version": "0.9.0", "ecosystem": "PyPI" }, "licenses": [ @@ -876,17 +1650,7 @@ { "package": { "name": "fastmcp", - "version": "3.4.0", - "ecosystem": "PyPI" - }, - "licenses": [ - "Apache-2.0" - ] - }, - { - "package": { - "name": "fastmcp-slim", - "version": "3.4.0", + "version": "3.2.0", "ecosystem": "PyPI" }, "licenses": [ @@ -906,7 +1670,7 @@ { "package": { "name": "filelock", - "version": "3.29.1", + "version": "3.25.2", "ecosystem": "PyPI" }, "licenses": [ @@ -946,11 +1710,11 @@ { "package": { "name": "fsspec", - "version": "2025.9.0", + "version": "2025.3.0", "ecosystem": "PyPI" }, "licenses": [ - "BSD-3-Clause" + "non-standard" ] }, { @@ -976,7 +1740,7 @@ { "package": { "name": "googleapis-common-protos", - "version": "1.75.0", + "version": "1.73.1", "ecosystem": "PyPI" }, "licenses": [ @@ -986,27 +1750,17 @@ { "package": { "name": "greenlet", - "version": "3.5.1", + "version": "3.3.2", "ecosystem": "PyPI" }, "licenses": [ "MIT AND PSF-2.0" ] }, - { - "package": { - "name": "griffelib", - "version": "2.0.2", - "ecosystem": "PyPI" - }, - "licenses": [ - "ISC" - ] - }, { "package": { "name": "grpcio", - "version": "1.81.0", + "version": "1.80.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1016,7 +1770,7 @@ { "package": { "name": "gunicorn", - "version": "26.0.0", + "version": "25.3.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1036,7 +1790,7 @@ { "package": { "name": "hf-xet", - "version": "1.5.1", + "version": "1.4.3", "ecosystem": "PyPI" }, "licenses": [ @@ -1056,7 +1810,7 @@ { "package": { "name": "httptools", - "version": "0.8.0", + "version": "0.7.1", "ecosystem": "PyPI" }, "licenses": [ @@ -1076,7 +1830,7 @@ { "package": { "name": "httpx-retries", - "version": "0.5.0", + "version": "0.4.6", "ecosystem": "PyPI" }, "licenses": [ @@ -1096,7 +1850,7 @@ { "package": { "name": "huggingface-hub", - "version": "1.18.0", + "version": "1.15.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1116,7 +1870,7 @@ { "package": { "name": "idna", - "version": "3.18", + "version": "3.15", "ecosystem": "PyPI" }, "licenses": [ @@ -1126,7 +1880,7 @@ { "package": { "name": "importlib-metadata", - "version": "8.9.0", + "version": "8.5.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1186,7 +1940,7 @@ { "package": { "name": "jaraco-functools", - "version": "4.5.0", + "version": "4.4.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1216,7 +1970,7 @@ { "package": { "name": "jiter", - "version": "0.13.0", + "version": "0.10.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1246,7 +2000,7 @@ { "package": { "name": "joserfc", - "version": "1.7.1", + "version": "1.6.5", "ecosystem": "PyPI" }, "licenses": [ @@ -1316,7 +2070,7 @@ { "package": { "name": "jsonschema", - "version": "4.26.0", + "version": "4.23.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1326,7 +2080,7 @@ { "package": { "name": "jsonschema-path", - "version": "0.5.0", + "version": "0.3.4", "ecosystem": "PyPI" }, "licenses": [ @@ -1356,7 +2110,7 @@ { "package": { "name": "kubernetes", - "version": "36.0.2", + "version": "35.0.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1366,7 +2120,7 @@ { "package": { "name": "langchain", - "version": "1.3.4", + "version": "1.2.14", "ecosystem": "PyPI" }, "licenses": [ @@ -1396,7 +2150,7 @@ { "package": { "name": "langchain-community", - "version": "0.3.31", + "version": "0.3.27", "ecosystem": "PyPI" }, "licenses": [ @@ -1406,7 +2160,7 @@ { "package": { "name": "langchain-core", - "version": "1.4.2", + "version": "1.3.3", "ecosystem": "PyPI" }, "licenses": [ @@ -1436,7 +2190,7 @@ { "package": { "name": "langchain-litellm", - "version": "0.6.6", + "version": "0.6.5", "ecosystem": "PyPI" }, "licenses": [ @@ -1456,7 +2210,7 @@ { "package": { "name": "langchain-nvidia-ai-endpoints", - "version": "1.4.1", + "version": "1.3.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1466,7 +2220,7 @@ { "package": { "name": "langchain-oci", - "version": "0.2.7", + "version": "0.2.6", "ecosystem": "PyPI" }, "licenses": [ @@ -1476,7 +2230,7 @@ { "package": { "name": "langchain-openai", - "version": "1.2.2", + "version": "1.2.1", "ecosystem": "PyPI" }, "licenses": [ @@ -1486,7 +2240,7 @@ { "package": { "name": "langchain-protocol", - "version": "0.0.16", + "version": "0.0.15", "ecosystem": "PyPI" }, "licenses": [ @@ -1516,7 +2270,7 @@ { "package": { "name": "langgraph", - "version": "1.2.4", + "version": "1.1.4", "ecosystem": "PyPI" }, "licenses": [ @@ -1526,7 +2280,7 @@ { "package": { "name": "langgraph-checkpoint", - "version": "4.1.1", + "version": "4.0.1", "ecosystem": "PyPI" }, "licenses": [ @@ -1536,7 +2290,7 @@ { "package": { "name": "langgraph-prebuilt", - "version": "1.1.0", + "version": "1.0.8", "ecosystem": "PyPI" }, "licenses": [ @@ -1546,7 +2300,7 @@ { "package": { "name": "langgraph-sdk", - "version": "0.4.2", + "version": "0.3.12", "ecosystem": "PyPI" }, "licenses": [ @@ -1576,7 +2330,7 @@ { "package": { "name": "litellm", - "version": "1.88.1", + "version": "1.83.14", "ecosystem": "PyPI" }, "licenses": [ @@ -1596,7 +2350,7 @@ { "package": { "name": "lxml", - "version": "6.1.1", + "version": "6.1.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1626,7 +2380,7 @@ { "package": { "name": "markdown-it-py", - "version": "4.2.0", + "version": "4.0.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1636,7 +2390,7 @@ { "package": { "name": "marko", - "version": "2.2.3", + "version": "2.2.2", "ecosystem": "PyPI" }, "licenses": [ @@ -1666,7 +2420,7 @@ { "package": { "name": "mcp", - "version": "1.27.2", + "version": "1.26.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1696,13 +2450,23 @@ { "package": { "name": "more-itertools", - "version": "11.1.0", + "version": "10.8.0", "ecosystem": "PyPI" }, "licenses": [ "MIT" ] }, + { + "package": { + "name": "mpmath", + "version": "1.3.0", + "ecosystem": "PyPI" + }, + "licenses": [ + "non-standard" + ] + }, { "package": { "name": "multidict", @@ -1746,7 +2510,7 @@ { "package": { "name": "nemo-safe-synthesizer", - "version": "0.1.1", + "version": "0.1.2", "ecosystem": "PyPI" }, "licenses": [ @@ -1796,7 +2560,7 @@ { "package": { "name": "ngcsdk", - "version": "4.19.1", + "version": "4.16.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1816,7 +2580,7 @@ { "package": { "name": "numpy", - "version": "2.4.6", + "version": "2.4.4", "ecosystem": "PyPI" }, "licenses": [ @@ -1826,7 +2590,7 @@ { "package": { "name": "nvidia-ml-py", - "version": "13.610.43", + "version": "13.595.45", "ecosystem": "PyPI" }, "licenses": [ @@ -1906,7 +2670,7 @@ { "package": { "name": "oci", - "version": "2.178.0", + "version": "2.174.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1926,7 +2690,7 @@ { "package": { "name": "onnxruntime", - "version": "1.26.0", + "version": "1.24.4", "ecosystem": "PyPI" }, "licenses": [ @@ -1936,7 +2700,7 @@ { "package": { "name": "openai", - "version": "2.41.0", + "version": "2.35.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1966,7 +2730,7 @@ { "package": { "name": "openinference-semantic-conventions", - "version": "0.1.30", + "version": "0.1.29", "ecosystem": "PyPI" }, "licenses": [ @@ -1976,7 +2740,7 @@ { "package": { "name": "opentelemetry-api", - "version": "1.42.1", + "version": "1.40.0", "ecosystem": "PyPI" }, "licenses": [ @@ -1986,7 +2750,7 @@ { "package": { "name": "opentelemetry-distro", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -1996,7 +2760,7 @@ { "package": { "name": "opentelemetry-exporter-otlp", - "version": "1.42.1", + "version": "1.40.0", "ecosystem": "PyPI" }, "licenses": [ @@ -2006,7 +2770,7 @@ { "package": { "name": "opentelemetry-exporter-otlp-proto-common", - "version": "1.42.1", + "version": "1.40.0", "ecosystem": "PyPI" }, "licenses": [ @@ -2016,7 +2780,7 @@ { "package": { "name": "opentelemetry-exporter-otlp-proto-grpc", - "version": "1.42.1", + "version": "1.40.0", "ecosystem": "PyPI" }, "licenses": [ @@ -2026,7 +2790,7 @@ { "package": { "name": "opentelemetry-exporter-otlp-proto-http", - "version": "1.42.1", + "version": "1.40.0", "ecosystem": "PyPI" }, "licenses": [ @@ -2036,7 +2800,7 @@ { "package": { "name": "opentelemetry-exporter-prometheus", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2046,7 +2810,7 @@ { "package": { "name": "opentelemetry-instrumentation", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2056,7 +2820,7 @@ { "package": { "name": "opentelemetry-instrumentation-asgi", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2066,7 +2830,7 @@ { "package": { "name": "opentelemetry-instrumentation-fastapi", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2076,7 +2840,7 @@ { "package": { "name": "opentelemetry-instrumentation-httpx", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2086,7 +2850,7 @@ { "package": { "name": "opentelemetry-instrumentation-requests", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2096,7 +2860,7 @@ { "package": { "name": "opentelemetry-instrumentation-sqlalchemy", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2106,7 +2870,7 @@ { "package": { "name": "opentelemetry-instrumentation-system-metrics", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2116,7 +2880,7 @@ { "package": { "name": "opentelemetry-processor-baggage", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2126,7 +2890,7 @@ { "package": { "name": "opentelemetry-proto", - "version": "1.42.1", + "version": "1.40.0", "ecosystem": "PyPI" }, "licenses": [ @@ -2136,7 +2900,7 @@ { "package": { "name": "opentelemetry-sdk", - "version": "1.42.1", + "version": "1.40.0", "ecosystem": "PyPI" }, "licenses": [ @@ -2146,7 +2910,7 @@ { "package": { "name": "opentelemetry-semantic-conventions", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2156,7 +2920,7 @@ { "package": { "name": "opentelemetry-util-http", - "version": "0.63b1", + "version": "0.61b0", "ecosystem": "PyPI" }, "licenses": [ @@ -2176,7 +2940,7 @@ { "package": { "name": "orjson", - "version": "3.11.9", + "version": "3.11.8", "ecosystem": "PyPI" }, "licenses": [ @@ -2196,7 +2960,7 @@ { "package": { "name": "packaging", - "version": "26.2", + "version": "26.0", "ecosystem": "PyPI" }, "licenses": [ @@ -2216,7 +2980,7 @@ { "package": { "name": "pathable", - "version": "0.6.0", + "version": "0.4.4", "ecosystem": "PyPI" }, "licenses": [ @@ -2226,7 +2990,7 @@ { "package": { "name": "pathspec", - "version": "1.1.1", + "version": "1.0.4", "ecosystem": "PyPI" }, "licenses": [ @@ -2246,9 +3010,236 @@ { "package": { "name": "pip", - "version": "26.1.2", + "version": "26.1.1", "ecosystem": "PyPI" }, + "vulnerabilities": [ + { + "modified": "2026-06-05T12:45:14Z", + "published": "2026-06-01T17:17:35Z", + "schema_version": "1.7.5", + "id": "PYSEC-2026-196", + "aliases": [ + "CVE-2026-8643" + ], + "details": "pip would treat console_scripts and gui_scripts as paths instead of file names without sanitizing the resolved absolute path to the installation directory, leading to entry points being installed outside the installation directory.", + "severity": [ + { + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N" + } + ], + "affected": [ + { + "package": { + "ecosystem": "PyPI", + "name": "pip", + "purl": "pkg:pypi/pip" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "0" + }, + { + "fixed": "26.1.2" + } + ] + } + ], + "versions": [ + "0.2", + "0.2.1", + "0.3", + "0.3.1", + "0.4", + "0.5", + "0.5.1", + "0.6", + "0.6.1", + "0.6.2", + "0.6.3", + "0.7", + "0.7.1", + "0.7.2", + "0.8", + "0.8.1", + "0.8.2", + "0.8.3", + "1.0", + "1.0.1", + "1.0.2", + "1.1", + "1.2", + "1.2.1", + "1.3", + "1.3.1", + "1.4", + "1.4.1", + "1.5", + "1.5.1", + "1.5.2", + "1.5.3", + "1.5.4", + "1.5.5", + "1.5.6", + "10.0.0", + "10.0.0b1", + "10.0.0b2", + "10.0.1", + "18.0", + "18.1", + "19.0", + "19.0.1", + "19.0.2", + "19.0.3", + "19.1", + "19.1.1", + "19.2", + "19.2.1", + "19.2.2", + "19.2.3", + "19.3", + "19.3.1", + "20.0", + "20.0.1", + "20.0.2", + "20.1", + "20.1.1", + "20.1b1", + "20.2", + "20.2.1", + "20.2.2", + "20.2.3", + "20.2.4", + "20.2b1", + "20.3", + "20.3.1", + "20.3.2", + "20.3.3", + "20.3.4", + "20.3b1", + "21.0", + "21.0.1", + "21.1", + "21.1.1", + "21.1.2", + "21.1.3", + "21.2", + "21.2.1", + "21.2.2", + "21.2.3", + "21.2.4", + "21.3", + "21.3.1", + "22.0", + "22.0.1", + "22.0.2", + "22.0.3", + "22.0.4", + "22.1", + "22.1.1", + "22.1.2", + "22.1b1", + "22.2", + "22.2.1", + "22.2.2", + "22.3", + "22.3.1", + "23.0", + "23.0.1", + "23.1", + "23.1.1", + "23.1.2", + "23.2", + "23.2.1", + "23.3", + "23.3.1", + "23.3.2", + "24.0", + "24.1", + "24.1.1", + "24.1.2", + "24.1b1", + "24.1b2", + "24.2", + "24.3", + "24.3.1", + "25.0", + "25.0.1", + "25.1", + "25.1.1", + "25.2", + "25.3", + "26.0", + "26.0.1", + "26.1", + "26.1.1", + "6.0", + "6.0.1", + "6.0.2", + "6.0.3", + "6.0.4", + "6.0.5", + "6.0.6", + "6.0.7", + "6.0.8", + "6.1.0", + "6.1.1", + "7.0.0", + "7.0.1", + "7.0.2", + "7.0.3", + "7.1.0", + "7.1.1", + "7.1.2", + "8.0.0", + "8.0.1", + "8.0.2", + "8.0.3", + "8.1.0", + "8.1.1", + "8.1.2", + "9.0.0", + "9.0.1", + "9.0.2", + "9.0.3" + ], + "database_specific": { + "source": "https://github.com/pypa/advisory-database/blob/main/vulns/pip/PYSEC-2026-196.yaml" + } + } + ], + "references": [ + { + "type": "ADVISORY", + "url": "http://www.openwall.com/lists/oss-security/2026/06/01/5" + }, + { + "type": "ADVISORY", + "url": "https://mail.python.org/archives/list/security-announce@python.org/thread/YV63UET5D3OOJY7O4M5XCVYO2YM4NBYJ/" + }, + { + "type": "FIX", + "url": "https://github.com/pypa/pip/pull/14000" + } + ] + } + ], + "groups": [ + { + "ids": [ + "PYSEC-2026-196" + ], + "aliases": [ + "CVE-2026-8643", + "PYSEC-2026-196" + ], + "max_severity": "5.5" + } + ], "licenses": [ "MIT" ] @@ -2276,7 +3267,7 @@ { "package": { "name": "platformdirs", - "version": "4.10.0", + "version": "4.9.4", "ecosystem": "PyPI" }, "licenses": [ @@ -2326,7 +3317,7 @@ { "package": { "name": "prometheus-client", - "version": "0.25.0", + "version": "0.24.1", "ecosystem": "PyPI" }, "licenses": [ @@ -2356,7 +3347,7 @@ { "package": { "name": "propcache", - "version": "0.5.2", + "version": "0.4.1", "ecosystem": "PyPI" }, "licenses": [ @@ -2386,7 +3377,7 @@ { "package": { "name": "psycopg2-binary", - "version": "2.9.12", + "version": "2.9.11", "ecosystem": "PyPI" }, "licenses": [ @@ -2396,7 +3387,7 @@ { "package": { "name": "py-key-value-aio", - "version": "0.4.5", + "version": "0.4.4", "ecosystem": "PyPI" }, "licenses": [ @@ -2406,7 +3397,7 @@ { "package": { "name": "py-rust-stemmers", - "version": "0.1.8", + "version": "0.1.5", "ecosystem": "PyPI" }, "licenses": [ @@ -2421,256 +3412,677 @@ }, "vulnerabilities": [ { - "modified": "2026-06-05T21:56:07Z", - "published": "2026-02-17T14:16:01Z", + "modified": "2026-06-10T17:01:40Z", + "published": "2026-02-17T14:16:01Z", + "schema_version": "1.7.5", + "id": "PYSEC-2026-113", + "aliases": [ + "CVE-2026-25087", + "GHSA-rgxp-2hwp-jwgg" + ], + "details": "Use After Free vulnerability in Apache Arrow C++.\n\nThis issue affects Apache Arrow C++ from 15.0.0 through 23.0.0. It can be triggered when reading an Arrow IPC file (but not an IPC stream) with pre-buffering enabled, if the IPC file contains data with variadic buffers (such as Binary View and String View data). Depending on the number of variadic buffers in a record batch column and on the temporal sequence of multi-threaded IO, a write to a dangling pointer could occur. The value (a `std::shared_ptr` object)\u00a0that is written to the dangling pointer is not under direct control of the attacker.\n\nPre-buffering is disabled by default but can be enabled using a specific C++ API call (`RecordBatchFileReader::PreBufferMetadata`). The functionality is not exposed in language bindings (Python, Ruby, C GLib), so these bindings are not vulnerable.\n\nThe most likely consequence of this issue would be random crashes or memory corruption when reading specific kinds of IPC files. If the application allows ingesting IPC files from untrusted sources, this could plausibly be exploited for denial of service. Inducing more targeted kinds of misbehavior (such as confidential data extraction from the running process) depends on memory allocation and multi-threaded IO temporal patterns that are unlikely to be easily controlled by an attacker.\n\nAdvice for users of Arrow C++:\n\n1. check whether you enable pre-buffering on the IPC file reader (using\u00a0`RecordBatchFileReader::PreBufferMetadata`)\n \n2. if so, either disable pre-buffering (which may have adverse performance consequences), or switch to Arrow 23.0.1 which is not vulnerable", + "severity": [ + { + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:H" + } + ], + "affected": [ + { + "package": { + "ecosystem": "PyPI", + "name": "pyarrow", + "purl": "pkg:pypi/pyarrow" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "15.0.0" + }, + { + "fixed": "23.0.1" + } + ] + } + ], + "versions": [ + "15.0.0", + "15.0.1", + "15.0.2", + "16.0.0", + "16.1.0", + "17.0.0", + "18.0.0", + "18.1.0", + "19.0.0", + "19.0.1", + "20.0.0", + "21.0.0", + "22.0.0", + "23.0.0" + ], + "database_specific": { + "source": "https://github.com/pypa/advisory-database/blob/main/vulns/pyarrow/PYSEC-2026-113.yaml" + } + } + ], + "references": [ + { + "type": "ADVISORY", + "url": "http://www.openwall.com/lists/oss-security/2026/02/17/4" + }, + { + "type": "ADVISORY", + "url": "https://lists.apache.org/thread/mpm4ld1qony30tchfpjtk5b11tcyvmwh" + }, + { + "type": "FIX", + "url": "https://github.com/apache/arrow/pull/48925" + }, + { + "type": "ADVISORY", + "url": "https://github.com/advisories/GHSA-rgxp-2hwp-jwgg" + } + ] + }, + { + "modified": "2026-06-05T21:56:07Z", + "published": "2026-02-17T15:31:35Z", + "schema_version": "1.7.5", + "id": "GHSA-rgxp-2hwp-jwgg", + "aliases": [ + "CVE-2026-25087", + "PYSEC-2026-113" + ], + "summary": "Apache Arrow: Potential use-after-free when reading IPC file with pre-buffering", + "details": "Use After Free vulnerability in Apache Arrow C++.\n\nThis issue affects Apache Arrow C++ from 15.0.0 through 23.0.0. It can be triggered when reading an Arrow IPC file (but not an IPC stream) with pre-buffering enabled, if the IPC file contains data with variadic buffers (such as Binary View and String View data). Depending on the number of variadic buffers in a record batch column and on the temporal sequence of multi-threaded IO, a write to a dangling pointer could occur. The value (a `std::shared_ptr` object)\u00a0that is written to the dangling pointer is not under direct control of the attacker.\n\nPre-buffering is disabled by default but can be enabled using a specific C++ API call (`RecordBatchFileReader::PreBufferMetadata`). The functionality is not exposed in language bindings (Python, Ruby, C GLib), so these bindings are not vulnerable.\n\nThe most likely consequence of this issue would be random crashes or memory corruption when reading specific kinds of IPC files. If the application allows ingesting IPC files from untrusted sources, this could plausibly be exploited for denial of service. Inducing more targeted kinds of misbehavior (such as confidential data extraction from the running process) depends on memory allocation and multi-threaded IO temporal patterns that are unlikely to be easily controlled by an attacker.\n\nAdvice for users of Arrow C++:\n\n1. check whether you enable pre-buffering on the IPC file reader (using\u00a0`RecordBatchFileReader::PreBufferMetadata`)\n\n2. if so, either disable pre-buffering (which may have adverse performance consequences), or switch to Arrow 23.0.1 which is not vulnerable", + "severity": [ + { + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:H" + } + ], + "affected": [ + { + "package": { + "ecosystem": "PyPI", + "name": "pyarrow", + "purl": "pkg:pypi/pyarrow" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "15.0.0" + }, + { + "fixed": "23.0.1" + } + ] + } + ], + "versions": [ + "15.0.0", + "15.0.1", + "15.0.2", + "16.0.0", + "16.1.0", + "17.0.0", + "18.0.0", + "18.1.0", + "19.0.0", + "19.0.1", + "20.0.0", + "21.0.0", + "22.0.0", + "23.0.0" + ], + "database_specific": { + "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/02/GHSA-rgxp-2hwp-jwgg/GHSA-rgxp-2hwp-jwgg.json" + } + } + ], + "references": [ + { + "type": "ADVISORY", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-25087" + }, + { + "type": "WEB", + "url": "https://github.com/apache/arrow/pull/48925" + }, + { + "type": "PACKAGE", + "url": "https://github.com/apache/arrow" + }, + { + "type": "WEB", + "url": "https://github.com/pypa/advisory-database/tree/main/vulns/pyarrow/PYSEC-2026-113.yaml" + }, + { + "type": "WEB", + "url": "https://lists.apache.org/thread/mpm4ld1qony30tchfpjtk5b11tcyvmwh" + }, + { + "type": "WEB", + "url": "http://www.openwall.com/lists/oss-security/2026/02/17/4" + } + ], + "database_specific": { + "cwe_ids": [ + "CWE-416" + ], + "github_reviewed": true, + "github_reviewed_at": "2026-06-05T21:39:35Z", + "nvd_published_at": "2026-02-17T14:16:01Z", + "severity": "HIGH" + } + } + ], + "groups": [ + { + "ids": [ + "PYSEC-2026-113", + "GHSA-rgxp-2hwp-jwgg" + ], + "aliases": [ + "CVE-2026-25087", + "GHSA-rgxp-2hwp-jwgg", + "PYSEC-2026-113" + ], + "max_severity": "7.0" + } + ], + "licenses": [ + "non-standard" + ] + }, + { + "package": { + "name": "pycparser", + "version": "3.0", + "ecosystem": "PyPI" + }, + "licenses": [ + "BSD-3-Clause" + ] + }, + { + "package": { + "name": "pydantic", + "version": "2.12.5", + "ecosystem": "PyPI" + }, + "licenses": [ + "MIT" + ] + }, + { + "package": { + "name": "pydantic-core", + "version": "2.41.5", + "ecosystem": "PyPI" + }, + "licenses": [ + "MIT" + ] + }, + { + "package": { + "name": "pydantic-extra-types", + "version": "2.11.1", + "ecosystem": "PyPI" + }, + "licenses": [ + "MIT" + ] + }, + { + "package": { + "name": "pydantic-settings", + "version": "2.8.1", + "ecosystem": "PyPI" + }, + "licenses": [ + "MIT" + ] + }, + { + "package": { + "name": "pygments", + "version": "2.20.0", + "ecosystem": "PyPI" + }, + "licenses": [ + "BSD-2-Clause" + ] + }, + { + "package": { + "name": "pyjwt", + "version": "2.12.1", + "ecosystem": "PyPI" + }, + "vulnerabilities": [ + { + "modified": "2026-06-02T12:15:09Z", + "published": "2026-05-28T16:16:29Z", + "schema_version": "1.7.5", + "id": "PYSEC-2026-175", + "aliases": [ + "CVE-2026-48522", + "GHSA-993g-76c3-p5m4" + ], + "details": "PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient passes its uri argument directly to urllib.request.urlopen() which uses Python stdlib's default OpenerDirector registering HTTPHandler, HTTPSHandler, FTPHandler, FileHandler, and DataHandler. There is currently no documented option to restrict which schemes PyJWKClient will fetch. If an application's jku URL ingestion path accepts attacker-influenced URLs (e.g., from JWT header, configuration file, OAuth flow parameter), the attacker can cause PyJWKClient to read arbitrary local files via file:// (SSRF on local filesystem), cause PyJWKClient to attempt FTP / data-URI fetches (broader SSRF surface), or forge tokens that PyJWT verifies as valid. The library does not directly return non-HTTP(S) URI contents to the attacker; the chained \"plant a JWKS to forge tokens\" scenario described in the original report requires additional application-layer flaws (attacker write access to a filesystem path, untrusted jku derivation) that this fix does not address. This vulnerability is fixed in 2.13.0.", + "severity": [ + { + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N" + } + ], + "affected": [ + { + "package": { + "ecosystem": "PyPI", + "name": "pyjwt", + "purl": "pkg:pypi/pyjwt" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "0" + }, + { + "fixed": "2.13.0" + } + ] + } + ], + "versions": [ + "0.1.1", + "0.1.2", + "0.1.3", + "0.1.4", + "0.1.5", + "0.1.6", + "0.1.7", + "0.1.8", + "0.1.9", + "0.2.0", + "0.2.1", + "0.2.3", + "0.3.0", + "0.3.1", + "0.3.2", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "1.0.0", + "1.0.1", + "1.1.0", + "1.3.0", + "1.4.0", + "1.4.1", + "1.4.2", + "1.5.0", + "1.5.1", + "1.5.2", + "1.5.3", + "1.6.0", + "1.6.1", + "1.6.3", + "1.6.4", + "1.7.0", + "1.7.1", + "2.0.0", + "2.0.0a1", + "2.0.0a2", + "2.0.1", + "2.1.0", + "2.10.0", + "2.10.1", + "2.11.0", + "2.12.0", + "2.12.1", + "2.2.0", + "2.3.0", + "2.4.0", + "2.5.0", + "2.6.0", + "2.7.0", + "2.8.0", + "2.9.0" + ], + "database_specific": { + "source": "https://github.com/pypa/advisory-database/blob/main/vulns/pyjwt/PYSEC-2026-175.yaml" + } + } + ], + "references": [ + { + "type": "EVIDENCE", + "url": "https://github.com/jpadilla/pyjwt/security/advisories/GHSA-993g-76c3-p5m4" + } + ] + }, + { + "modified": "2026-06-02T12:15:10Z", + "published": "2026-05-28T16:16:29Z", "schema_version": "1.7.5", - "id": "PYSEC-2026-113", + "id": "PYSEC-2026-177", "aliases": [ - "CVE-2026-25087", - "GHSA-rgxp-2hwp-jwgg" + "CVE-2026-48524", + "GHSA-fhv5-28vv-h8m8" ], - "details": "Use After Free vulnerability in Apache Arrow C++.\n\nThis issue affects Apache Arrow C++ from 15.0.0 through 23.0.0. It can be triggered when reading an Arrow IPC file (but not an IPC stream) with pre-buffering enabled, if the IPC file contains data with variadic buffers (such as Binary View and String View data). Depending on the number of variadic buffers in a record batch column and on the temporal sequence of multi-threaded IO, a write to a dangling pointer could occur. The value (a `std::shared_ptr` object)\u00a0that is written to the dangling pointer is not under direct control of the attacker.\n\nPre-buffering is disabled by default but can be enabled using a specific C++ API call (`RecordBatchFileReader::PreBufferMetadata`). The functionality is not exposed in language bindings (Python, Ruby, C GLib), so these bindings are not vulnerable.\n\nThe most likely consequence of this issue would be random crashes or memory corruption when reading specific kinds of IPC files. If the application allows ingesting IPC files from untrusted sources, this could plausibly be exploited for denial of service. Inducing more targeted kinds of misbehavior (such as confidential data extraction from the running process) depends on memory allocation and multi-threaded IO temporal patterns that are unlikely to be easily controlled by an attacker.\n\nAdvice for users of Arrow C++:\n\n1. check whether you enable pre-buffering on the IPC file reader (using\u00a0`RecordBatchFileReader::PreBufferMetadata`)\n\n2. if so, either disable pre-buffering (which may have adverse performance consequences), or switch to Arrow 23.0.1 which is not vulnerable", + "details": "PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, PyJWKClient.get_signing_key() forces a fresh HTTP request to the JWKS endpoint for every JWT with an unknown kid value, with no rate limiting. Since kid comes from the unverified token header, an attacker can trigger unlimited outbound requests. The vulnerability surfaces only when a JWKS fetch fails; an attacker can attempt to provoke that with sustained unknown-kid traffic, but the outcome depends on upstream JWKS-endpoint behavior (rate limiting, transient errors) which is beyond the attacker's control. This vulnerability is fixed in 2.13.0.", "severity": [ { "type": "CVSS_V3", - "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:H" + "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L" } ], "affected": [ { "package": { "ecosystem": "PyPI", - "name": "pyarrow", - "purl": "pkg:pypi/pyarrow" + "name": "pyjwt", + "purl": "pkg:pypi/pyjwt" }, "ranges": [ { "type": "ECOSYSTEM", "events": [ { - "introduced": "15.0.0" + "introduced": "0" }, { - "fixed": "23.0.1" + "fixed": "2.13.0" } ] } ], "versions": [ - "15.0.0", - "15.0.1", - "15.0.2", - "16.0.0", - "16.1.0", - "17.0.0", - "18.0.0", - "18.1.0", - "19.0.0", - "19.0.1", - "20.0.0", - "21.0.0", - "22.0.0", - "23.0.0" + "0.1.1", + "0.1.2", + "0.1.3", + "0.1.4", + "0.1.5", + "0.1.6", + "0.1.7", + "0.1.8", + "0.1.9", + "0.2.0", + "0.2.1", + "0.2.3", + "0.3.0", + "0.3.1", + "0.3.2", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "1.0.0", + "1.0.1", + "1.1.0", + "1.3.0", + "1.4.0", + "1.4.1", + "1.4.2", + "1.5.0", + "1.5.1", + "1.5.2", + "1.5.3", + "1.6.0", + "1.6.1", + "1.6.3", + "1.6.4", + "1.7.0", + "1.7.1", + "2.0.0", + "2.0.0a1", + "2.0.0a2", + "2.0.1", + "2.1.0", + "2.10.0", + "2.10.1", + "2.11.0", + "2.12.0", + "2.12.1", + "2.2.0", + "2.3.0", + "2.4.0", + "2.5.0", + "2.6.0", + "2.7.0", + "2.8.0", + "2.9.0" ], "database_specific": { - "source": "https://github.com/pypa/advisory-database/blob/main/vulns/pyarrow/PYSEC-2026-113.yaml" + "source": "https://github.com/pypa/advisory-database/blob/main/vulns/pyjwt/PYSEC-2026-177.yaml" } } ], "references": [ { "type": "ADVISORY", - "url": "http://www.openwall.com/lists/oss-security/2026/02/17/4" - }, + "url": "https://github.com/jpadilla/pyjwt/security/advisories/GHSA-fhv5-28vv-h8m8" + } + ] + }, + { + "modified": "2026-06-02T12:15:10Z", + "published": "2026-05-28T16:16:29Z", + "schema_version": "1.7.5", + "id": "PYSEC-2026-178", + "aliases": [ + "CVE-2026-48525", + "GHSA-w7vc-732c-9m39" + ], + "details": "PyJWT is a JSON Web Token implementation in Python. From 2.8.0 to 2.12.1, when verifying detached JWS tokens using the unencoded-payload option (\"b64\": false, RFC 7797), PyJWT performs Base64URL decoding of the compact-serialization payload segment before enforcing the detached-payload rules. For b64=false, PyJWT later discards that decoded payload and replaces it with the caller-provided detached_payload. In practice, this turns the middle segment into an attacker-controlled \u201cwork amplifier\u201d: a remote client can supply an arbitrarily large Base64URL payload segment that forces CPU work + memory allocations even if the signature is invalid. This creates an unauthenticated DoS vector against any endpoint that verifies detached JWS using PyJWT. This vulnerability is fixed in 2.13.0.", + "severity": [ { - "type": "ADVISORY", - "url": "https://lists.apache.org/thread/mpm4ld1qony30tchfpjtk5b11tcyvmwh" - }, + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" + } + ], + "affected": [ { - "type": "FIX", - "url": "https://github.com/apache/arrow/pull/48925" + "package": { + "ecosystem": "PyPI", + "name": "pyjwt", + "purl": "pkg:pypi/pyjwt" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "2.8.0" + }, + { + "fixed": "2.13.0" + } + ] + } + ], + "versions": [ + "2.10.0", + "2.10.1", + "2.11.0", + "2.12.0", + "2.12.1", + "2.8.0", + "2.9.0" + ], + "database_specific": { + "source": "https://github.com/pypa/advisory-database/blob/main/vulns/pyjwt/PYSEC-2026-178.yaml" + } + } + ], + "references": [ + { + "type": "EVIDENCE", + "url": "https://github.com/jpadilla/pyjwt/security/advisories/GHSA-w7vc-732c-9m39" } ] }, { - "modified": "2026-06-05T21:56:07Z", - "published": "2026-02-17T15:31:35Z", + "modified": "2026-06-02T12:15:10Z", + "published": "2026-05-28T16:16:29Z", "schema_version": "1.7.5", - "id": "GHSA-rgxp-2hwp-jwgg", + "id": "PYSEC-2026-179", "aliases": [ - "CVE-2026-25087", - "PYSEC-2026-113" + "CVE-2026-48526", + "GHSA-xgmm-8j9v-c9wx" ], - "summary": "Apache Arrow: Potential use-after-free when reading IPC file with pre-buffering", - "details": "Use After Free vulnerability in Apache Arrow C++.\n\nThis issue affects Apache Arrow C++ from 15.0.0 through 23.0.0. It can be triggered when reading an Arrow IPC file (but not an IPC stream) with pre-buffering enabled, if the IPC file contains data with variadic buffers (such as Binary View and String View data). Depending on the number of variadic buffers in a record batch column and on the temporal sequence of multi-threaded IO, a write to a dangling pointer could occur. The value (a `std::shared_ptr` object)\u00a0that is written to the dangling pointer is not under direct control of the attacker.\n\nPre-buffering is disabled by default but can be enabled using a specific C++ API call (`RecordBatchFileReader::PreBufferMetadata`). The functionality is not exposed in language bindings (Python, Ruby, C GLib), so these bindings are not vulnerable.\n\nThe most likely consequence of this issue would be random crashes or memory corruption when reading specific kinds of IPC files. If the application allows ingesting IPC files from untrusted sources, this could plausibly be exploited for denial of service. Inducing more targeted kinds of misbehavior (such as confidential data extraction from the running process) depends on memory allocation and multi-threaded IO temporal patterns that are unlikely to be easily controlled by an attacker.\n\nAdvice for users of Arrow C++:\n\n1. check whether you enable pre-buffering on the IPC file reader (using\u00a0`RecordBatchFileReader::PreBufferMetadata`)\n\n2. if so, either disable pre-buffering (which may have adverse performance consequences), or switch to Arrow 23.0.1 which is not vulnerable", + "details": "PyJWT is a JSON Web Token implementation in Python. Prior to 2.13.0, when the verifier is decoding JSON Web Tokens, while supporting both asymmetric and HMAC algorithms, the library does not validate use of JSON Web Keys in HMAC algorithm, allowing attacker to use the issuer public key as the secret key for HMAC algorithm. This vulnerability is fixed in 2.13.0.", "severity": [ { "type": "CVSS_V3", - "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:H" + "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N" } ], "affected": [ { "package": { "ecosystem": "PyPI", - "name": "pyarrow", - "purl": "pkg:pypi/pyarrow" + "name": "pyjwt", + "purl": "pkg:pypi/pyjwt" }, "ranges": [ { "type": "ECOSYSTEM", "events": [ { - "introduced": "15.0.0" + "introduced": "0" }, { - "fixed": "23.0.1" + "fixed": "2.13.0" } ] } ], "versions": [ - "15.0.0", - "15.0.1", - "15.0.2", - "16.0.0", - "16.1.0", - "17.0.0", - "18.0.0", - "18.1.0", - "19.0.0", - "19.0.1", - "20.0.0", - "21.0.0", - "22.0.0", - "23.0.0" + "0.1.1", + "0.1.2", + "0.1.3", + "0.1.4", + "0.1.5", + "0.1.6", + "0.1.7", + "0.1.8", + "0.1.9", + "0.2.0", + "0.2.1", + "0.2.3", + "0.3.0", + "0.3.1", + "0.3.2", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "1.0.0", + "1.0.1", + "1.1.0", + "1.3.0", + "1.4.0", + "1.4.1", + "1.4.2", + "1.5.0", + "1.5.1", + "1.5.2", + "1.5.3", + "1.6.0", + "1.6.1", + "1.6.3", + "1.6.4", + "1.7.0", + "1.7.1", + "2.0.0", + "2.0.0a1", + "2.0.0a2", + "2.0.1", + "2.1.0", + "2.10.0", + "2.10.1", + "2.11.0", + "2.12.0", + "2.12.1", + "2.2.0", + "2.3.0", + "2.4.0", + "2.5.0", + "2.6.0", + "2.7.0", + "2.8.0", + "2.9.0" ], "database_specific": { - "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/02/GHSA-rgxp-2hwp-jwgg/GHSA-rgxp-2hwp-jwgg.json" + "source": "https://github.com/pypa/advisory-database/blob/main/vulns/pyjwt/PYSEC-2026-179.yaml" } } ], "references": [ { - "type": "ADVISORY", - "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-25087" - }, - { - "type": "WEB", - "url": "https://github.com/apache/arrow/pull/48925" - }, - { - "type": "PACKAGE", - "url": "https://github.com/apache/arrow" - }, - { - "type": "WEB", - "url": "https://github.com/pypa/advisory-database/tree/main/vulns/pyarrow/PYSEC-2026-113.yaml" - }, - { - "type": "WEB", - "url": "https://lists.apache.org/thread/mpm4ld1qony30tchfpjtk5b11tcyvmwh" - }, - { - "type": "WEB", - "url": "http://www.openwall.com/lists/oss-security/2026/02/17/4" + "type": "EVIDENCE", + "url": "https://github.com/jpadilla/pyjwt/security/advisories/GHSA-xgmm-8j9v-c9wx" } - ], - "database_specific": { - "cwe_ids": [ - "CWE-416" - ], - "github_reviewed": true, - "github_reviewed_at": "2026-06-05T21:39:35Z", - "nvd_published_at": "2026-02-17T14:16:01Z", - "severity": "HIGH" - } + ] } ], "groups": [ { "ids": [ - "PYSEC-2026-113", - "GHSA-rgxp-2hwp-jwgg" + "PYSEC-2026-175" ], "aliases": [ - "CVE-2026-25087", - "GHSA-rgxp-2hwp-jwgg", - "PYSEC-2026-113" + "CVE-2026-48522", + "GHSA-993g-76c3-p5m4", + "PYSEC-2026-175" ], - "max_severity": "7.0" + "max_severity": "4.2" + }, + { + "ids": [ + "PYSEC-2026-177" + ], + "aliases": [ + "CVE-2026-48524", + "GHSA-fhv5-28vv-h8m8", + "PYSEC-2026-177" + ], + "max_severity": "3.7" + }, + { + "ids": [ + "PYSEC-2026-178" + ], + "aliases": [ + "CVE-2026-48525", + "GHSA-w7vc-732c-9m39", + "PYSEC-2026-178" + ], + "max_severity": "5.3" + }, + { + "ids": [ + "PYSEC-2026-179" + ], + "aliases": [ + "CVE-2026-48526", + "GHSA-xgmm-8j9v-c9wx", + "PYSEC-2026-179" + ], + "max_severity": "7.4" } ], - "licenses": [ - "non-standard" - ] - }, - { - "package": { - "name": "pycparser", - "version": "3.0", - "ecosystem": "PyPI" - }, - "licenses": [ - "BSD-3-Clause" - ] - }, - { - "package": { - "name": "pydantic", - "version": "2.13.4", - "ecosystem": "PyPI" - }, - "licenses": [ - "MIT" - ] - }, - { - "package": { - "name": "pydantic-core", - "version": "2.46.4", - "ecosystem": "PyPI" - }, - "licenses": [ - "MIT" - ] - }, - { - "package": { - "name": "pydantic-extra-types", - "version": "2.11.1", - "ecosystem": "PyPI" - }, - "licenses": [ - "MIT" - ] - }, - { - "package": { - "name": "pydantic-settings", - "version": "2.14.1", - "ecosystem": "PyPI" - }, - "licenses": [ - "MIT" - ] - }, - { - "package": { - "name": "pygments", - "version": "2.20.0", - "ecosystem": "PyPI" - }, - "licenses": [ - "BSD-2-Clause" - ] - }, - { - "package": { - "name": "pyjwt", - "version": "2.13.0", - "ecosystem": "PyPI" - }, "licenses": [ "MIT" ] @@ -2725,16 +4137,6 @@ "MIT" ] }, - { - "package": { - "name": "python-box", - "version": "7.4.1", - "ecosystem": "PyPI" - }, - "licenses": [ - "MIT" - ] - }, { "package": { "name": "python-dateutil", @@ -2778,7 +4180,7 @@ { "package": { "name": "pytz", - "version": "2026.2", + "version": "2026.1.post1", "ecosystem": "PyPI" }, "licenses": [ @@ -2939,7 +4341,7 @@ { "package": { "name": "referencing", - "version": "0.37.0", + "version": "0.36.2", "ecosystem": "PyPI" }, "licenses": [ @@ -2959,7 +4361,7 @@ { "package": { "name": "requests", - "version": "2.34.2", + "version": "2.33.1", "ecosystem": "PyPI" }, "licenses": [ @@ -2989,7 +4391,7 @@ { "package": { "name": "rich", - "version": "14.3.4", + "version": "14.3.3", "ecosystem": "PyPI" }, "licenses": [ @@ -2999,7 +4401,7 @@ { "package": { "name": "rich-argparse", - "version": "1.8.0", + "version": "1.7.2", "ecosystem": "PyPI" }, "licenses": [ @@ -3009,7 +4411,7 @@ { "package": { "name": "rich-rst", - "version": "2.0.1", + "version": "1.3.2", "ecosystem": "PyPI" }, "licenses": [ @@ -3019,7 +4421,7 @@ { "package": { "name": "rich-toolkit", - "version": "0.20.1", + "version": "0.19.7", "ecosystem": "PyPI" }, "licenses": [ @@ -3049,7 +4451,7 @@ { "package": { "name": "rpds-py", - "version": "2026.5.1", + "version": "0.30.0", "ecosystem": "PyPI" }, "licenses": [ @@ -3129,7 +4531,7 @@ { "package": { "name": "sentry-sdk", - "version": "2.62.0", + "version": "2.57.0", "ecosystem": "PyPI" }, "licenses": [ @@ -3189,7 +4591,7 @@ { "package": { "name": "smart-open", - "version": "7.6.1", + "version": "7.0.5", "ecosystem": "PyPI" }, "licenses": [ @@ -3219,7 +4621,7 @@ { "package": { "name": "soupsieve", - "version": "2.8.4", + "version": "2.8.3", "ecosystem": "PyPI" }, "licenses": [ @@ -3229,7 +4631,7 @@ { "package": { "name": "sqlalchemy", - "version": "2.0.50", + "version": "2.0.48", "ecosystem": "PyPI" }, "licenses": [ @@ -3244,7 +4646,7 @@ }, "vulnerabilities": [ { - "modified": "2026-05-19T20:15:17Z", + "modified": "2026-06-10T13:45:15Z", "published": "2026-05-19T20:10:53Z", "schema_version": "1.7.5", "id": "GHSA-73jc-5mrq-prw7", @@ -3444,6 +4846,10 @@ "type": "WEB", "url": "https://github.com/sqlfluff/sqlfluff/security/advisories/GHSA-73jc-5mrq-prw7" }, + { + "type": "ADVISORY", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-46374" + }, { "type": "PACKAGE", "url": "https://github.com/sqlfluff/sqlfluff" @@ -3455,7 +4861,7 @@ ], "github_reviewed": true, "github_reviewed_at": "2026-05-19T20:10:53Z", - "nvd_published_at": null, + "nvd_published_at": "2026-06-09T23:16:59Z", "severity": "HIGH" } } @@ -3479,7 +4885,7 @@ { "package": { "name": "sqlmodel", - "version": "0.0.38", + "version": "0.0.37", "ecosystem": "PyPI" }, "licenses": [ @@ -3489,7 +4895,7 @@ { "package": { "name": "sse-starlette", - "version": "3.4.4", + "version": "3.3.4", "ecosystem": "PyPI" }, "licenses": [ @@ -4086,13 +5492,23 @@ { "package": { "name": "structlog", - "version": "26.1.0", + "version": "25.5.0", "ecosystem": "PyPI" }, "licenses": [ "Apache-2.0 OR MIT" ] }, + { + "package": { + "name": "sympy", + "version": "1.14.0", + "ecosystem": "PyPI" + }, + "licenses": [ + "non-standard" + ] + }, { "package": { "name": "tabulate", @@ -4126,7 +5542,7 @@ { "package": { "name": "tiktoken", - "version": "0.13.0", + "version": "0.12.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4146,7 +5562,7 @@ { "package": { "name": "tomlkit", - "version": "0.15.0", + "version": "0.14.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4156,7 +5572,7 @@ { "package": { "name": "tornado", - "version": "6.5.7", + "version": "6.5.5", "ecosystem": "PyPI" }, "licenses": [ @@ -4166,7 +5582,7 @@ { "package": { "name": "tqdm", - "version": "4.68.2", + "version": "4.67.3", "ecosystem": "PyPI" }, "licenses": [ @@ -4176,7 +5592,7 @@ { "package": { "name": "transformers", - "version": "5.10.2", + "version": "5.5.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4186,7 +5602,7 @@ { "package": { "name": "typer", - "version": "0.25.1", + "version": "0.24.1", "ecosystem": "PyPI" }, "licenses": [ @@ -4206,7 +5622,7 @@ { "package": { "name": "types-aiobotocore", - "version": "3.7.0", + "version": "3.3.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4226,7 +5642,7 @@ { "package": { "name": "types-awscrt", - "version": "0.34.1", + "version": "0.31.3", "ecosystem": "PyPI" }, "licenses": [ @@ -4276,7 +5692,7 @@ { "package": { "name": "tzdata", - "version": "2026.2", + "version": "2025.3", "ecosystem": "PyPI" }, "licenses": [ @@ -4296,7 +5712,7 @@ { "package": { "name": "uncalled-for", - "version": "0.3.2", + "version": "0.2.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4316,7 +5732,7 @@ { "package": { "name": "uuid-utils", - "version": "0.16.0", + "version": "0.14.1", "ecosystem": "PyPI" }, "licenses": [ @@ -4326,7 +5742,7 @@ { "package": { "name": "uvicorn", - "version": "0.49.0", + "version": "0.42.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4356,9 +5772,163 @@ { "package": { "name": "wasmtime", - "version": "45.0.0", + "version": "43.0.0", "ecosystem": "PyPI" }, + "vulnerabilities": [ + { + "modified": "2026-05-21T15:00:24Z", + "published": "2026-04-09T19:16:24Z", + "schema_version": "1.7.5", + "id": "PYSEC-2026-151", + "aliases": [ + "CVE-2026-34983", + "GHSA-hfr4-7c6c-48w2", + "RUSTSEC-2026-0090" + ], + "details": "Wasmtime is a runtime for WebAssembly. In 43.0.0, cloning a wasmtime::Linker is unsound and can result in use-after-free bugs. This bug is not controllable by guest Wasm programs. It can only be triggered by a specific sequence of embedder API calls made by the host. Specifically, the following steps must occur to trigger the bug clone a wasmtime::Linker, drop the original linker instance, use the new, cloned linker instance, resulting in a use-after-free. This vulnerability is fixed in 43.0.1.", + "severity": [ + { + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:N/I:N/A:H" + } + ], + "affected": [ + { + "package": { + "ecosystem": "PyPI", + "name": "wasmtime", + "purl": "pkg:pypi/wasmtime" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "0" + }, + { + "last_affected": "43.0.0" + } + ] + } + ], + "versions": [ + "0.0.1", + "0.0.2", + "0.11.0", + "0.12.0", + "0.15.0", + "0.15.1", + "0.16.0", + "0.16.1", + "0.17.0", + "0.18.0", + "0.18.1", + "0.18.2", + "0.19.0", + "0.20.0", + "0.21.0", + "0.22.0", + "0.23.0", + "0.24.0", + "0.25.0", + "0.26.0", + "0.27.0", + "0.28.0", + "0.28.1", + "0.29.0", + "0.30.0", + "0.31.0", + "0.32.0", + "0.33.0", + "0.34.0", + "0.35.0", + "0.36.0", + "0.37.0", + "0.38.0", + "0.39.1", + "0.40.0", + "0.9.0", + "1.0.0", + "1.0.1", + "10.0.0", + "10.0.1", + "11.0.0", + "12.0.0", + "13.0.0", + "13.0.1", + "13.0.2", + "14.0.0", + "15.0.0", + "16.0.0", + "17.0.0", + "17.0.1", + "18.0.0", + "18.0.2", + "19.0.0", + "2.0.0", + "20.0.0", + "21.0.0", + "22.0.0", + "23.0.0", + "24.0.0", + "25.0.0", + "27.0.0", + "27.0.1", + "27.0.2", + "28.0.0", + "29.0.0", + "3.0.0", + "30.0.0", + "31.0.0", + "32.0.0", + "33.0.0", + "34.0.0", + "35.0.0", + "36.0.0", + "37.0.0", + "38.0.0", + "39.0.0", + "4.0.0", + "40.0.0", + "41.0.0", + "42.0.0", + "43.0.0", + "5.0.0", + "6.0.0", + "7.0.0", + "8.0.0", + "8.0.1", + "9.0.0" + ], + "database_specific": { + "source": "https://github.com/pypa/advisory-database/blob/main/vulns/wasmtime/PYSEC-2026-151.yaml" + } + } + ], + "references": [ + { + "type": "ADVISORY", + "url": "https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-hfr4-7c6c-48w2" + } + ] + } + ], + "groups": [ + { + "ids": [ + "PYSEC-2026-151" + ], + "aliases": [ + "CVE-2026-34983", + "GHSA-hfr4-7c6c-48w2", + "PYSEC-2026-151", + "RUSTSEC-2026-0090" + ], + "max_severity": "5.0" + } + ], "licenses": [ "Apache-2.0 WITH LLVM-exception" ] @@ -4376,7 +5946,7 @@ { "package": { "name": "watchfiles", - "version": "1.2.0", + "version": "1.1.1", "ecosystem": "PyPI" }, "licenses": [ @@ -4386,7 +5956,7 @@ { "package": { "name": "wcwidth", - "version": "0.8.1", + "version": "0.6.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4406,7 +5976,7 @@ { "package": { "name": "websockets", - "version": "15.0.1", + "version": "16.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4446,7 +6016,7 @@ { "package": { "name": "xxhash", - "version": "3.7.0", + "version": "3.6.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4466,7 +6036,7 @@ { "package": { "name": "yarl", - "version": "1.24.2", + "version": "1.23.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4476,7 +6046,7 @@ { "package": { "name": "zipp", - "version": "4.1.0", + "version": "3.23.0", "ecosystem": "PyPI" }, "licenses": [ @@ -4505,23 +6075,23 @@ "license_summary": [ { "name": "MIT", - "count": 131 + "count": 130 }, { "name": "Apache-2.0", - "count": 82 + "count": 81 }, { "name": "non-standard", - "count": 39 + "count": 43 }, { "name": "BSD-3-Clause", - "count": 33 + "count": 32 }, { "name": "ISC", - "count": 6 + "count": 5 }, { "name": "Apache-2.0 OR MIT", @@ -4543,10 +6113,6 @@ "name": "UPL-1.0", "count": 2 }, - { - "name": "0BSD", - "count": 1 - }, { "name": "0BSD AND BSD-3-Clause AND CC0-1.0 AND MIT AND Zlib", "count": 1 @@ -4575,10 +6141,6 @@ "name": "Apache-2.0 WITH LLVM-exception", "count": 1 }, - { - "name": "LGPL-2.1-or-later", - "count": 1 - }, { "name": "MIT AND MPL-2.0", "count": 1 diff --git a/third_party/requirements-main.txt b/third_party/requirements-main.txt index 493be6da2f..fd7c9edde3 100644 --- a/third_party/requirements-main.txt +++ b/third_party/requirements-main.txt @@ -16,9 +16,7 @@ # nemoplatform # nmp-platform -e ./packages/nemo_evaluator_sdk ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') - # via - # nemo-evaluator-plugin - # nmp-evaluator + # via nemo-evaluator-plugin -e ./packages/nemo_platform ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') # via # data-designer-nemo @@ -56,18 +54,12 @@ # nmp-platform-runner -e ./packages/nmp_common ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') # via - # nemo-agents-plugin - # nemo-anonymizer-plugin - # nemo-data-designer-plugin - # nemo-evaluator-plugin # nemo-platform - # nemo-safe-synthesizer-plugin # nemoplatform # nmp-auth # nmp-automodel # nmp-core-mcp # nmp-entities - # nmp-evaluator # nmp-files # nmp-guardrails # nmp-hello-world @@ -148,8 +140,6 @@ # via # nemoplatform # nmp-platform --e ./services/evaluator ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') - # via nemoplatform -e ./services/guardrails ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') # via # nemoplatform @@ -176,9 +166,9 @@ aiobotocore==2.25.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') --hash=sha256:ea9be739bfd7ece8864f072ec99bb9ed5c7e78ebb2b0b15f29781fbe02daedbc \ --hash=sha256:eb6daebe3cbef5b39a0bb2a97cffbe9c7cb46b2fcc399ad141f369f3c2134b1f # via aioboto3 -aiofile==3.11.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:1f91912c6643d2a4e49ca4ae3514f0bf3867ce948a36d99a6411b8f4755f4cf9 \ - --hash=sha256:ce77d14ac07f77bc2b757834a5c129321f3f705c474593deed5ab209079a52c9 +aiofile==3.9.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:ce2f6c1571538cbdfa0143b04e16b208ecb0e9cb4148e528af8a640ed51cc8aa \ + --hash=sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b # via py-key-value-aio aiofiles==25.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2 \ @@ -189,67 +179,38 @@ aiofiles==25.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # ngcsdk # nmp-automodel # nmp-common - # nmp-evaluator # nvidia-nat-core # streaming-form-data -aiohappyeyeballs==2.6.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:4708045e2d7a6c6bdf8aafa8ed39649eaf926a4543b54560659129e3365953c4 \ - --hash=sha256:e202810ee718bd01fc6ef49e8ea53d023d5cb6b581076d7925aa499fa55dbe64 +aiohappyeyeballs==2.6.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558 \ + --hash=sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 # via aiohttp -aiohttp==3.14.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:1b9748363260121d2927704f5d4fc498150669ca3ae93625986ee89c8f80dcd4 \ - --hash=sha256:1c1421eb01d4fd608d88cc8290211d177a58532b55ad94076fb349c5bf467f0a \ - --hash=sha256:1d459b98a932296c6f0e94f87511a0b1b90a8a02c30a50e60a297619cd5a58ee \ - --hash=sha256:269b76ac5394092b95bc4a098f4fc6c191c083c3bd12775d1e30e663132f6a09 \ - --hash=sha256:27fd7c91e51729b4f7e1577865fa6d34c9adccbc39aabe9000285b48af9f0ec2 \ - --hash=sha256:2f73e01dc37122325caf079982621262f96d74823c179038a82fddfc50359264 \ - --hash=sha256:2fbc3ed048b3475b9f0cbcb9978e9d2d3511acd91ead203af26ed9f0056004cf \ - --hash=sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035 \ - --hash=sha256:317acd9f8602858dc7d59679812c376c7f0b97bcbbf16e0d6237f54141d8a8a6 \ - --hash=sha256:34b257ec41345c1e8f2df68fa908a7952f5de932723871eb633ecbbff396c9a4 \ - --hash=sha256:3e6fc1a85fa7194a1a7d19f44e8609180f4a8eb5fa4c7ed8b4355f080fad235c \ - --hash=sha256:4cd96b5ba05d67ed0cf00b5b405c8cd99586d8e3481e8ee0a831057591af7621 \ - --hash=sha256:5663ee9257cfa1add7253a7da3035a02f31b6600ec48261585e1800a81533080 \ - --hash=sha256:5c0b3e614340c889d575451696374c9d17affd54cd607ca0babed8f8c37b9397 \ - --hash=sha256:5f2504bc0322437c9a1ff6d3333ca56c7477b727c995f036b976ae17b98372c8 \ - --hash=sha256:603a2c834142172ffddc054067f5ec0ca65d57a0aa98a71bc81952573208e345 \ - --hash=sha256:64c567bf9eaf664280116a8688f63016e6b32db2505908e2bdaca1b6438142f2 \ - --hash=sha256:686b6c0d3911ec387b444ddf5dc62fb7f7c0a7d5186a7861626496a5ab4aff95 \ - --hash=sha256:6f71173be42d3241d428f760122febb748de0623f44308a6f120d0dd9ec572e3 \ - --hash=sha256:73f05ea02013e02512c3bf42714f1208c57168c779cc6fe23516e4543089d0a6 \ - --hash=sha256:764457a7be60825fb770a644852ff717bcbb5042f189f2bd16df61a81b3f6573 \ - --hash=sha256:797457503c2d426bee06eef808d07b31ede30b65e054444e7de64cad0061b7af \ - --hash=sha256:7fb4bdf95b0561a79f259f9d28fbc109728c5ee7f27aff6391f0ca703a329abe \ - --hash=sha256:86a6dab78b0e43e2897a3bbe15745aa60dc5423ca437b7b0b164c069bf91b876 \ - --hash=sha256:87a5eea1b2a5e21e1ebdbb33ad4165359189327e63fc4e4894693e7f821ac817 \ - --hash=sha256:915fbb7b41b115192259f8c9ae58f3ddc444d2b5579917270211858e606a4afd \ - --hash=sha256:93b032b5ec3255473c143627d21a69ac74ae12f7f33974cb587c564d11b1066f \ - --hash=sha256:97e704dcd26271f5bda3fa07c3ce0fb76d6d3f8659f4baa1a24442cc9ba177ca \ - --hash=sha256:9af6779bfb46abf124068327abcdf9ce95c9ef8287a3e8da76ccf2d0f16c28fa \ - --hash=sha256:aa00140699487bd435fde4342d85c94cb256b7cd3a5b9c3396c67f19922afda2 \ - --hash=sha256:b6feea921016eb3d4e04d65fc4e9ca402d1a3801f562aef94989f54694917af3 \ - --hash=sha256:b821a1f7dedf7e37450654e620038ac3b2e81e8fa6ea269337e97101978ec730 \ - --hash=sha256:bb2c0c80d431c0d03f2c7dbf125150fedd4f0de17366a7ca33f7ccb822391842 \ - --hash=sha256:bd869c427324e5cb15195793de951295710db28be7d818247f3097b4ab5d4b96 \ - --hash=sha256:bedb0cd073cc2dc035e30aeb99444389d3cd2113afe4ef9fcd23d439f5bade85 \ - --hash=sha256:c6fa4dc7ad6f8109c70bb1499e589f76b0b792baf39f9b017eb92c8a81d0a199 \ - --hash=sha256:cb21957bb8aca671c1765e32f58164cf0c50e6bf41c0bbbd16da20732ecaf588 \ - --hash=sha256:d35143e27778b4bb0fb189562d7f275bff79c62ab8e98459717c0ea617ff2480 \ - --hash=sha256:d3b1a184a9a8f548a6b73f1e26b96b052193e4b3175ed7342aaf1151a1f00a04 \ - --hash=sha256:d44ec478e713ee7f29b439f7eb8dc2b9d4079e11ae114d2c2ac3d5daf30516c8 \ - --hash=sha256:de538791a80e5d862addbc183f70f0158ac9b9bb872bb147f1fd2a683691e087 \ - --hash=sha256:f234b4deb12f3ad59127e037bc57c40c21e45b45282df7d3a55a0f409f595296 \ - --hash=sha256:f380468b09d2a81633ee863b0ec5648d364bd17bb8ecfb8c2f387f7ac1faf42c \ - --hash=sha256:f5e6ff2bdbb8f4cd3fbe41f99e25bbcd58e3bf9f13d3dd31a11e7917251cc77a \ - --hash=sha256:f7a16ef45b081454ef844502d87a848876c490c4cb5c650c230f6ec79ed2c1e7 \ - --hash=sha256:faccab372e66bc76d5731525e7f1143c922271725b9d38c9f97edcc66266b451 +aiohttp==3.13.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:023ecba036ddd840b0b19bf195bfae970083fd7024ce1ac22e9bba90464620e9 \ + --hash=sha256:2d6d44a5b48132053c2f6cd5c8cb14bc67e99a63594e336b0f2af81e94d5530c \ + --hash=sha256:327cc432fdf1356fb4fbc6fe833ad4e9f6aacb71a8acaa5f1855e4b25910e4a9 \ + --hash=sha256:3a807cabd5115fb55af198b98178997a5e0e57dead43eb74a93d9c07d6d4a7dc \ + --hash=sha256:3df334e39d4c2f899a914f1dba283c1aadc311790733f705182998c6f7cae665 \ + --hash=sha256:57653eac22c6a4c13eb22ecf4d673d64a12f266e72785ab1c8b8e5940d0e8090 \ + --hash=sha256:60869c7ac4aaabe7110f26499f3e6e5696eae98144735b12a9c3d9eae2b51a49 \ + --hash=sha256:7996023b2ed59489ae4762256c8516df9820f751cf2c5da8ed2fb20ee50abab3 \ + --hash=sha256:7ab7229b6f9b5c1ba4910d6c41a9eb11f543eadb3f384df1b4c293f4e73d44d6 \ + --hash=sha256:7becdf835feff2f4f335d7477f121af787e3504b48b449ff737afb35869ba7bb \ + --hash=sha256:888e78eb5ca55a615d285c3c09a7a91b42e9dd6fc699b166ebd5dee87c9ccf14 \ + --hash=sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1 \ + --hash=sha256:a2567b72e1ffc3ab25510db43f355b29eeada56c0a622e58dcdb19530eb0a3cb \ + --hash=sha256:a5029cc80718bbd545123cd8fe5d15025eccaaaace5d0eeec6bd556ad6163d61 \ + --hash=sha256:a60eaa2d440cd4707696b52e40ed3e2b0f73f65be07fd0ef23b6b539c9c0b0b4 \ + --hash=sha256:a84792f8631bf5a94e52d9cc881c0b824ab42717165a5579c760b830d9392ac9 \ + --hash=sha256:ab2899f9fa2f9f741896ebb6fa07c4c883bfa5c7f2ddd8cf2aafa86fa981b2d2 \ + --hash=sha256:b18f31b80d5a33661e08c89e202edabf1986e9b49c42b4504371daeaa11b47c1 \ + --hash=sha256:e7d2f8616f0ff60bd332022279011776c3ac0faa0f1b463f7bb12326fbc97a1c # via # aiobotocore # aiohttp-retry # fsspec # garak-api # instructor - # kubernetes # langchain-community # langchain-nvidia-ai-endpoints # langchain-oci @@ -257,7 +218,6 @@ aiohttp==3.14.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # litellm # nemoguardrails # ngcsdk - # nmp-evaluator # nmp-files # nmp-inference-gateway aiohttp-retry==2.9.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ @@ -281,7 +241,6 @@ alembic==1.18.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc # via # nmp-entities - # nmp-evaluator # nmp-guardrails # optuna annotated-doc==0.0.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ @@ -297,9 +256,9 @@ annotated-types==0.7.0 ; (platform_machine == 'arm64' and sys_platform == 'darwi annoy==1.17.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:9cbfebefe0a5f843eba29c6be4c84d601f4f41ad4ded0486f1b88c3b07739c15 # via nemoguardrails -anthropic==0.107.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:8e7169a6ab57fb806b778d9af018c867bad688144efec8969cdb4c5ccecd6670 \ - --hash=sha256:b74338d08000ba105dfc8adae29af3713ece845a4bffec9986a20697e087c7b3 +anthropic==0.101.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:1116a6a87c55757e0fbe3e1ba40804fbd04de7963601a6dd6b539a889f18de3e \ + --hash=sha256:cc3cc6576989471e2aa9132258034ad0ff0d8fe500b04ac499e4e46ed68c5ed0 # via # nemo-agents-plugin # nemo-platform-plugin @@ -357,13 +316,12 @@ attrs==26.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # aiohttp # cyclopts # jsonschema - # jsonschema-path # referencing authlib==1.7.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231 \ --hash=sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f # via - # fastmcp-slim + # fastmcp # nvidia-nat-core backports-tarfile==1.2.0 ; (python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \ @@ -376,15 +334,14 @@ base58==2.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # nemoplatform # nmp-common # nmp-entities - # nmp-evaluator # nmp-jobs beartype==0.22.9 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f \ --hash=sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2 # via py-key-value-aio -beautifulsoup4==4.15.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7 \ - --hash=sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9 +beautifulsoup4==4.14.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb \ + --hash=sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86 # via wikipedia boto3==1.40.61 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:6b9c57b2a922b5d8c17766e29ed792586a818098efe84def27c8f582b33f898c \ @@ -403,15 +360,15 @@ botocore==1.40.61 ; (platform_machine == 'arm64' and sys_platform == 'darwin') o # nemo-agents-plugin # ngcsdk # s3transfer -botocore-stubs==1.43.14 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:9e3bc1fdd51da7473f0df726c82747a1b0ae913449d629659765c247fecc2039 \ - --hash=sha256:fb98f1475c92fd718644e786b5c543a20f1b1f610e89e0a7191c3f1f429c75aa +botocore-stubs==1.42.41 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:9423110fb0e391834bd2ed44ae5f879d8cb370a444703d966d30842ce2bcb5f0 \ + --hash=sha256:dbeac2f744df6b814ce83ec3f3777b299a015cbea57a2efc41c33b8c38265825 # via # types-aioboto3 # types-aiobotocore -cachetools==7.1.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:323dc4127934744db5b54eb4924482d7edafbf9554e820d1531c2e08c0e4ef54 \ - --hash=sha256:437f55a4e0c1b01a4f3077cc470e6991d47430970e36fbcb77e2be0df4fc1cd6 +cachetools==7.0.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0cd042c24377200c1dcd225f8b7b12b0ca53cc2c961b43757e774ebe190fd990 \ + --hash=sha256:46bc8ebefbe485407621d0a4264b23c080cedd913921bad7ac3ed2f26c183114 # via # py-key-value-aio # pymilvus @@ -431,9 +388,9 @@ caio==0.9.25 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pl --hash=sha256:fb7ff95af4c31ad3f03179149aab61097a71fd85e05f89b4786de0359dffd044 \ --hash=sha256:fc220b8533dcf0f238a6b1a4a937f92024c71e7b10b5a2dfc1c73604a25709bc # via aiofile -certifi==2026.5.20 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897 \ - --hash=sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d +certifi==2026.2.25 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa \ + --hash=sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7 # via # clickhouse-connect # httpcore @@ -444,7 +401,6 @@ certifi==2026.5.20 ; (platform_machine == 'arm64' and sys_platform == 'darwin') # requests # sentry-sdk cffi==2.0.0 ; (platform_machine == 'arm64' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (platform_machine == 'x86_64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') \ - --hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \ --hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \ --hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \ --hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \ @@ -452,20 +408,15 @@ cffi==2.0.0 ; (platform_machine == 'arm64' and platform_python_implementation != --hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \ --hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \ --hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \ - --hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \ --hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \ --hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \ - --hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \ --hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \ --hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \ - --hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \ --hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \ --hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \ --hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \ --hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \ - --hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \ - --hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \ - --hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 + --hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c # via cryptography chardet==5.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ @@ -474,58 +425,33 @@ chardet==5.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or ( # data-designer-engine # diff-cover # sqlfluff -charset-normalizer==3.4.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4 \ - --hash=sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c \ - --hash=sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5 \ - --hash=sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b \ - --hash=sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c \ - --hash=sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7 \ - --hash=sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb \ - --hash=sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1 \ - --hash=sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df \ - --hash=sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e \ - --hash=sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38 \ - --hash=sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18 \ - --hash=sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d \ - --hash=sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48 \ - --hash=sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5 \ - --hash=sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d \ - --hash=sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c \ - --hash=sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116 \ - --hash=sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2 \ - --hash=sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a \ - --hash=sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265 \ - --hash=sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15 \ - --hash=sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7 \ - --hash=sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8 \ - --hash=sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66 \ - --hash=sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d \ - --hash=sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5 \ - --hash=sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7 \ - --hash=sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49 \ - --hash=sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c \ - --hash=sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd \ - --hash=sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e \ - --hash=sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b \ - --hash=sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859 \ - --hash=sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46 \ - --hash=sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a \ - --hash=sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215 \ - --hash=sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063 \ - --hash=sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832 \ - --hash=sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6 \ - --hash=sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464 +charset-normalizer==3.4.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5 \ + --hash=sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f \ + --hash=sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6 \ + --hash=sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab \ + --hash=sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f \ + --hash=sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843 \ + --hash=sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9 \ + --hash=sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd \ + --hash=sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9 \ + --hash=sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2 \ + --hash=sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e \ + --hash=sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69 \ + --hash=sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73 \ + --hash=sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923 \ + --hash=sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21 \ + --hash=sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2 \ + --hash=sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021 # via requests circuitbreaker==2.1.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:1a4baee510f7bea3c91b194dcce7c07805fe96c4423ed5594b75af438531d084 \ --hash=sha256:87ba6a3ed03fdc7032bc175561c2b04d52ade9d5faf94ca2b035fbdc5e6b1dd1 # via oci -click==8.4.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2 \ - --hash=sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96 +click==8.3.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \ + --hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 # via - # huggingface-hub # litellm # nltk # nvidia-nat-core @@ -567,38 +493,10 @@ colorlog==6.10.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c \ --hash=sha256:eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321 # via optuna -crc32c==2.7.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:03a92551a343702629af91f78d205801219692b6909f8fa126b830e332bfb0e0 \ - --hash=sha256:19e03a50545a3ef400bd41667d5525f71030488629c57d819e2dd45064f16192 \ - --hash=sha256:24949bffb06fc411cc18188d33357923cb935273642164d0bb37a5f375654169 \ - --hash=sha256:55a77e29a265418fa34bef15bd0f2c60afae5348988aaf35ed163b4bbf93cf37 \ - --hash=sha256:56ef661b34e9f25991fface7f9ad85e81bbc1b3fe3b916fd58c893eabe2fa0b8 \ - --hash=sha256:57a20dfc27995f568f64775eea2bbb58ae269f1a1144561df5e4a4955f79db32 \ - --hash=sha256:588587772e55624dd9c7a906ec9e8773ae0b6ac5e270fc0bc84ee2758eba90d5 \ - --hash=sha256:5c056ef043393085523e149276a7ce0cb534b872e04f3e20d74d9a94a75c0ad7 \ - --hash=sha256:724d5ff4d29ff093a983ae656be3307093706d850ea2a233bf29fcacc335d945 \ - --hash=sha256:80ebbf144a1a56a532b353e81fa0f3edca4f4baa1bf92b1dde2c663a32bb6a15 \ - --hash=sha256:88732070f6175530db04e0bb36880ac45c33d49f8ac43fa0e50cfb1830049d23 \ - --hash=sha256:96b794fd11945298fdd5eb1290a812efb497c14bc42592c5c992ca077458eeba \ - --hash=sha256:99d17637c4867672cb8adeea007294e3c3df9d43964369516cfe2c1f47ce500a \ - --hash=sha256:a1738259802978cdf428f74156175da6a5fdfb7256f647fdc0c9de1bc6cd7173 \ - --hash=sha256:afd778fc8ac0ed2ffbfb122a9aa6a0e409a8019b894a1799cda12c01534493e0 \ - --hash=sha256:b2416c4d88696ac322632555c0f81ab35e15f154bc96055da6cf110d642dbc10 \ - --hash=sha256:ba110df60c64c8e2d77a9425b982a520ccdb7abe42f06604f4d98a45bb1fff62 \ - --hash=sha256:c02a3bd67dea95cdb25844aaf44ca2e1b0c1fd70b287ad08c874a95ef4bb38db \ - --hash=sha256:c277f9d16a3283e064d54854af0976b72abaa89824955579b2b3f37444f89aae \ - --hash=sha256:d698eec444b18e296a104d0b9bb6c596c38bdcb79d24eba49604636e9d747305 \ - --hash=sha256:db9ac92294284b22521356715784b91cc9094eee42a5282ab281b872510d1831 \ - --hash=sha256:e07cf10ef852d219d179333fd706d1c415626f1f05e60bd75acf0143a4d8b225 \ - --hash=sha256:edefc0e46f3c37372183f70338e5bdee42f6789b62fcd36ec53aa933e9dfbeaf \ - --hash=sha256:f7d1c4e761fe42bf856130daf8b2658df33fe0ced3c43dadafdfeaa42b57b950 \ - --hash=sha256:f91b144a21eef834d64178e01982bb9179c354b3e9e5f4c803b0e5096384968c - # via oci cryptography==46.0.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:04959522f938493042d595a736e7dbdff6eb6cc2339c11465b3ff89343b65f65 \ --hash=sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832 \ --hash=sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067 \ - --hash=sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de \ --hash=sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0 \ --hash=sha256:3986ac1dee6def53797289999eabe84798ad7817f3e97779b5061a95b0ee4968 \ --hash=sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef \ @@ -612,14 +510,9 @@ cryptography==46.0.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin' --hash=sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7 \ --hash=sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83 \ --hash=sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85 \ - --hash=sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006 \ - --hash=sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb \ --hash=sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e \ --hash=sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba \ --hash=sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325 \ - --hash=sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1 \ - --hash=sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2 \ - --hash=sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0 \ --hash=sha256:d02c738dacda7dc2a74d1b2b3177042009d5cab7c7079db74afc19e56ca1b455 \ --hash=sha256:d3b99c535a9de0adced13d159c5a9cf65c325601aa30f4be08afd680643e9c15 \ --hash=sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5 \ @@ -637,11 +530,11 @@ cryptography==46.0.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin' # pyjwt # pyopenssl # secretstorage -cyclopts==4.17.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:6b3231f18b404879e978214ef26fa174e8b505bd0f2117290b4135560666004b \ - --hash=sha256:6ee947c9f3bbe9679b9fa9cea1bb327298db80b302df62d7f1d1bd82726508e0 +cyclopts==4.10.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:35f37257139380a386d9fe4475e1e7c87ca7795765ef4f31abba579fcfcb6ecd \ + --hash=sha256:ad4e4bb90576412d32276b14a76f55d43353753d16217f2c3cd5bdceba7f15a0 # via - # fastmcp-slim + # fastmcp # nemo-anonymizer data-designer==0.6.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:257e58e1fb860c59c9d0cc83969c52f313f55f113f112301672382d04be78a05 \ @@ -673,19 +566,15 @@ datasets==4.3.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:bc9118ed9afd92346c5be7ed3aaa00177eb907c25467f9d072a0d22777efbd2b # via # nemo-customizer-plugin - # nmp-evaluator + # nemo-safe-synthesizer-plugin # ragas -detect-installer==0.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:00ad7ba0a36e3cf7d08a40d3643011746dbc112597c7d475cc91c416710ca4e7 \ - --hash=sha256:034fb20fd665c36e6ba52b8821525ea07fb4f7f938cac459df889fb33801528a - # via fastapi-cloud-cli -diff-cover==10.3.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:2e47d5ab3868d1e92131c11f364f3f4a8583c97123d3bbc6b6cc8ce0a4cc2202 \ - --hash=sha256:474dbc63e815fbb7567d7b7ca5b104123e96129f25426ebdbc9a1bdbb935b2c6 +diff-cover==10.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:59c328595e0b8948617cc5269af9e484c86462e2844bfcafa3fb37f8fca0af87 \ + --hash=sha256:61bf83025f10510c76ef6a5820680cf61b9b974e8f81de70c57ac926fa63872a # via sqlfluff -dill==0.4.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0 \ - --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +dill==0.3.8 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca \ + --hash=sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7 # via # datasets # multiprocess @@ -713,27 +602,31 @@ docker==7.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # ngcsdk # nmp-jobs # nmp-models -docstring-parser==0.18.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015 \ - --hash=sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b +docstring-parser==0.17.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912 \ + --hash=sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708 # via # anthropic # cyclopts # instructor -duckdb==1.5.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0ce80aed7a538422129a57eaca9141e3afb51f8bf562b1908b1576c9725b5b22 \ - --hash=sha256:10960400ed60cdf0fe05bab2086fa8eb733889cb0ceca18d07ff9a00c0e0be7b \ - --hash=sha256:3248b49cd835ea322574bc6aac0ae7a83be85547f49d4f5f5777cb380ee6627f \ - --hash=sha256:341a2672e2551ba51c95c1898f0ade983e76675e79038ccb16342c3d6cfb82d7 \ - --hash=sha256:3d5db8c0b55e072cf437948ebb5d7e23d7b9d03d905fa5f9145583e65aa447f7 \ - --hash=sha256:70a18f932cf6d87bd0e554613657a515c1443a1724aacfc7ec5137dd28698b03 \ - --hash=sha256:787df63824f07bf18022dbc3b8ca4b2bfab0ebe616464f55c6e8cd0f59ea762e \ - --hash=sha256:9fb7516255a8764545e30f7efacea408cc847764a3027b3b0b3e7d1a7bebbc5c \ - --hash=sha256:c5f18e7561403054433706c187589e86629a7af09a7efc23a06a8b308e6acc68 \ - --hash=sha256:df39428eb130faa35ae96fd35245bdeae6ecf43936250b116b5fead568eb9f16 \ - --hash=sha256:e75a6122c12579a99848517f6f00a4e342aebda3590c30fe9b5cc5f39d5e6afc \ - --hash=sha256:e80eb4d0fb59869cb2c7d7ef494c07fb92014fe8e77d96c170cd1ebc1488a708 \ - --hash=sha256:ff11a457258148337ef9a392148a8cdbd1069b6c27c21958816c7b67fe6c542d +docutils==0.22.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968 \ + --hash=sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de + # via rich-rst +duckdb==1.5.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:26e56b5f0c96189e3288d83cf7b476e23615987902f801e5788dee15ee9f24a9 \ + --hash=sha256:40c5220ec93790b18ec6278da9c6ac2608d997ee6d6f7cd44c5c3992764e8e71 \ + --hash=sha256:482f8a13f2600f527e427f73c42b5aa75536f9892868068f0aaf573055a0135f \ + --hash=sha256:553c273a6a8f140adaa6da6a6135c7f95bdc8c2e5f95252fcdf9832d758e2141 \ + --hash=sha256:5d4147422d91ccdc2d2abf6ed24196025e020259d1d267970ae20c13c2ce84b1 \ + --hash=sha256:6af347debc8b721aa72e48671166282da979d5e5ae52dbc660ab417282b48e23 \ + --hash=sha256:6f7361d66cc801d9eb4df734b139cd7b0e3c257a16f3573ebd550ddb255549e6 \ + --hash=sha256:8150c569b2aa4573b51ba8475e814aa41fd53a3d510c1ffb96f1139f46faf611 \ + --hash=sha256:b370d1620a34a4538ef66524fcee9de8171fa263c701036a92bc0b4c1f2f9c6d \ + --hash=sha256:b8b0808dba0c63b7633bdaefb34e08fe0612622224f9feb0e7518904b1615101 \ + --hash=sha256:bc7ca6a1a40e7e4c933017e6c09ef18032add793df4e42624c6c0c87e0bebdad \ + --hash=sha256:da137802688190835b4c863cafa77fd7e29dff662ee6d905a9ffc14f00299c91 \ + --hash=sha256:ed6d23a3f806898e69c77430ebd8da0c79c219f97b9acbc9a29a653e09740c59 # via # data-designer-engine # data-designer-nemo @@ -757,7 +650,7 @@ exceptiongroup==1.3.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin --hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \ --hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 # via - # fastmcp-slim + # fastmcp # pyleak expandvars==1.1.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:6c5822b7b756a99a356b915dd1267f52ab8a4efaa135963bd7f4bd5d368f71d7 \ @@ -782,7 +675,6 @@ fastapi==0.129.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # nmp-auth # nmp-common # nmp-entities - # nmp-evaluator # nmp-files # nmp-guardrails # nmp-hello-world @@ -799,67 +691,43 @@ fastapi-cli==0.0.24 ; (platform_machine == 'arm64' and sys_platform == 'darwin') --hash=sha256:1afc9c9e21d7ebc8a3ca5e31790cd8d837742be7e4f8b9236e99cb3451f0de00 \ --hash=sha256:4a1f78ed798f106b4fee85ca93b85d8fe33c0a3570f775964d37edb80b8f0edc # via fastapi -fastapi-cloud-cli==0.19.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:a2dfc4074c321e63ec88589cc1f90573d4b5bf980ddc44a7033e6f3cd8e96628 \ - --hash=sha256:f97b31c2ad6af3832eb4065870bdca3365b6e827a0ccf6eeb15e477bc1662b13 +fastapi-cloud-cli==0.15.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:71a46f8a1d9fea295544113d6b79f620dc5768b24012887887306d151165745d \ + --hash=sha256:b1e8b3b26dc314e180fc0ab67dfd39d7d9fe160d3951081d09184eafaacf5649 # via fastapi-cli -fastar==0.11.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0324ed1d1ef0186e1bbd843b17807d6d837d0906899d4c99378b02c5d86bdd9c \ - --hash=sha256:03a112395a8b0bff251423bd1564c012f0cc058ad8b6bd8fba96f3d7fc117e44 \ - --hash=sha256:0d9d6b052baf5380baea866675dab6ccd04ec2460d12b1c46f10ce3f4ee6a820 \ - --hash=sha256:0fafb95ecbe70f666a5e9b35dd63974ccdc9bb3d99ccdbd4014a823ec3e659b5 \ - --hash=sha256:136cf342735464091c39dc3708168f9fdeb9ebea40b1ead937c61afaf46143d9 \ - --hash=sha256:27eed386fd0558e6daa29211111bbd7b740f7c7e881197f8a00ac7c0f3cdb1d7 \ - --hash=sha256:28095bb8f821e85fc2764e1a55f03e5e2876dee2abe7cd0ee9420d929905d643 \ - --hash=sha256:298a827ec04ade43733f6ca960d0faec38706aa1494175869ea7ea17f5bad5d3 \ - --hash=sha256:29c9c386dc0d5dda78845a8e6b1480d26ab861c1e0b68f42ae5735cb70ca07f1 \ - --hash=sha256:2e160919b1c47ddb8538e7e8eb4cd527281b40f0bf75110a75993838ef61f286 \ - --hash=sha256:38ef77fe940bbc9b37a98bd838727f844b11731cd39358a2640ff864fb385086 \ - --hash=sha256:483532442cdb08fbff0169510224eae0836f2f672cea6aacb52847d90fefdc46 \ - --hash=sha256:4bb4dc0fc8f7a6807febcebce8a2f3626ba4955a9263d81ecc630aad83be84c0 \ - --hash=sha256:59af8dbb683b24b90fb5b506de080faeab0a17a908e6c2a5d93a97260ed75d7b \ - --hash=sha256:5b83c1f61f7017d6e1498568038f8745440cfc16ca2f697ec81bac83050108f6 \ - --hash=sha256:625827d52eb4e8fec942e0233f125ff8010fcf6a67c0a974a8e5f4666b771e3c \ - --hash=sha256:6a1c56957ac82408be37a3f63594bc83e0919e8760492a4475e542f9f1828778 \ - --hash=sha256:7496def0a2befd82d429cb004ef7ca831585cc887947bd6b9abb68a5ef852b0b \ - --hash=sha256:74cd96163f39b8638ab4e8d49708ca887959672a22871d8170d01f067319533b \ - --hash=sha256:863b7929845c9fec92ef6c8d59579cf46af5136655e5342f8df5cebe46cab06c \ - --hash=sha256:878eaf15463eb572e3538af7ca3a8534e5e279cf8196db902d24e5725c4af86e \ - --hash=sha256:891f72ce42a5e28a74fbd4d5fbf1a3ac1a1163d13cbc200cbd005fb0fabc54bd \ - --hash=sha256:8955e61b32d6aff82c983217abf80933fd823b0e727586fc72f08043d996fd59 \ - --hash=sha256:8c15af91b8cd87ddf23ea55355ae513c1de3ab67178f26dad017c9e9c0af6096 \ - --hash=sha256:91c1c792447e4a642745f347ff9847c52af39633071c57ee67ed53c157fc3506 \ - --hash=sha256:96b4a57df12bf3211662627a3ea29d62ecb314a2434a0d0843f9fc23e47536e5 \ - --hash=sha256:9f3df73a3c4292cfe15696cdf59cdb6c309ab59d30b34c733be13c6e32d9a264 \ - --hash=sha256:a8c7bc8ac74cb359bb546b199288c83236372d094b402e557c197e85527495cd \ - --hash=sha256:aa3762cbb16e41a76b61f4a6914937a71aab3a7b6c2d82ca233bc686ebaf756b \ - --hash=sha256:aa7f100f7313c03fdb20f1385927ba95671071ba308ad0c1763fef295e1895ce \ - --hash=sha256:af48fed039b94016629dcdad1c95c90c486326dd068de2b0a4df419ee09b6821 \ - --hash=sha256:b8e545918441910a779659d4759ad0eef349e935fbdb4668a666d3681567eb05 \ - --hash=sha256:bdf9bd863205590beaf8ef6e66f315310196632180dceaf674985d01a876cac3 \ - --hash=sha256:c1e6e74aba1ae77ca4aedcaf1697cd413319f4c88a5ccbe5b42c709517c5097e \ - --hash=sha256:ceef1c2c4df7b7b8ebd3f5d718bbf457b9bbdf25ce0bd07870211ec4fbd9aff4 \ - --hash=sha256:d7f5fd8fa21ec0a88296a38dc5d7fc35efd3b26d46a17b8b7c73c5563925ca15 \ - --hash=sha256:db73a9b765a516e73983b25341e7b5e0189733878279e278b2295131b0e3a21e \ - --hash=sha256:dfe39d91fc28e37e06162d94afe01050220edb7df554acb5b702b5503e564816 \ - --hash=sha256:e45e598af5afe8412197d4786efd6cf29be02e7d3d4f6a3461149eae5d7e94f1 \ - --hash=sha256:ef5a6071121e05d8287fc75bccb054bcbac8bb0501200a0c0a8feeace5303ea4 \ - --hash=sha256:f2994bb8f5f8c11eb12beae1e6e77a907173c9819236b8a4c8f0573652ceccce +fastar==0.9.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:108bb46c080ca152bb331f1e0576177d36e9badba51b1d5724d2823542e0dd1f \ + --hash=sha256:17e2c3b46408193ea13c1e1177275ca7951e88bd3dce16baccb8de4f5e0dc2e8 \ + --hash=sha256:2394980cc126a3263e115600bc4ff9e7320cddde83c99fc334ab530be5b7166e \ + --hash=sha256:59bc500d7b6bdaf2ffb2b632bc6b0f97ddfb3bb7d31b54d61ceb00b5698d6484 \ + --hash=sha256:5a67b061b1099cf3b8b6234dd3605fa16f5078ab6b51c8d77ad7a5d11c3cf834 \ + --hash=sha256:5c03fad1ad9ac57cf03a4db9e18c7109c37416ff4eb9ebfca98fcd2b233a26c4 \ + --hash=sha256:76be31936cabce31cbb6381128f851cf0a6da2d5c25357615cd1504b26dc31cf \ + --hash=sha256:87006c8770dfc558aefe927590bbcdaf9648ca4472a9ee6d10dfb7c0bda4ce5b \ + --hash=sha256:9ec841a69fea73361c6df6d9183915c09e9ce3bd96493763fa46019e79918400 \ + --hash=sha256:acb62e2369834fb23d26327157f0a2dbec40b230c709fa85b1ce96cf010e6fbf \ + --hash=sha256:b665c33afcd1d581b82235b690d999c5446ccc2c4d80c4a95f30df3b43d22494 \ + --hash=sha256:c75e779f72d845037d4bf6692d01ac66f014eaef965c9231d41d5cc1276b89fc \ + --hash=sha256:c8ac3e8aaee57dfc822b04f570f0a963c2381a9dc8990fe0c6e965efd23fd451 \ + --hash=sha256:c9bd8879ebf05aa247e60e454bb7568cbdd44f016b8c58e31e5398039403e61d \ + --hash=sha256:d49114d5f0b76c5cc242875d90fa4706de45e0456ddedf416608ecd0787fb410 \ + --hash=sha256:d62a4fd86eda3bea7cc32efd64d43b6d0fcdbbec009558b750fc362f20142789 \ + --hash=sha256:d9ac410d32cbb514e966c45f0fedd0f9447b0dea9e734af714648da503603df6 \ + --hash=sha256:de264da9e8ef6407aa0b23c7c47ed4e34fde867e7c1f6e3cb98945a93e5f89f2 \ + --hash=sha256:ec7852de506d022ad36ad56f4aefb10c259dd59e485bf87af827954d404ba9d5 \ + --hash=sha256:f07c6bdeedfeb30ef459f21fa9ab06e2b6727f7e7653176d3abb7a85f447c400 \ + --hash=sha256:fad70e257daefb42bab68dcd68beaf2e2a99da056d65f2c9f988449a4e869306 # via fastapi-cloud-cli fastembed==0.8.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:40bee672657574a1009e35ec50030a55f2b426842cb011845379817641bbbbd0 \ --hash=sha256:75966edfa8b006ee78514c726bd7f6a50721dadc89305279052be9db72fd53e8 # via nemoguardrails -fastmcp==3.4.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:29055fb6816f4862c615aabaf0112ae8feb8b469740db13403a0ce5b799ec1dc \ - --hash=sha256:34523083d6149400a0655a8aa769eb34f85b1ce6dac6d66efb07503ebbe5f44b +fastmcp==3.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:d4830b8ffc3592d3d9c76dc0f398904cf41f04910e41a0de38cc1004e0903bef \ + --hash=sha256:e71aba3df16f86f546a4a9e513261d3233bcc92bef0dfa647bac3fa33623f681 # via # nmp-core-mcp # nmp-entities -fastmcp-slim==3.4.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:17cd0a1535972d3748d8c2416f0826dfc86c18df7a6cbc38602373277d44baa6 \ - --hash=sha256:faa0ccf16e85ec4b9f79c006fed3546b866d7e6dba3f60cd32cd98e84753a496 - # via fastmcp fastuuid==0.14.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:05a8dde1f395e0c9b4be515b7a521403d1e8349443e7641761af07c7ad1624b1 \ --hash=sha256:09378a05020e3e4883dfdab438926f31fea15fd17604908f3d39cbeb22a0b4dc \ @@ -881,9 +749,9 @@ fastuuid==0.14.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:cb9a030f609194b679e1660f7e32733b7a0f332d519c5d5a6a0a580991290022 \ --hash=sha256:d23ef06f9e67163be38cece704170486715b177f6baae338110983f99a72c070 # via litellm -filelock==3.29.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:85199dfd706869641b72b2e8955d5416a4b2b7dc4b0e8e6d97b4cc1299a6983b \ - --hash=sha256:d97e6b1b9757569626c58caa07dc4beb1613f4a2938b1e8cc81afca398906c9e +filelock==3.25.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694 \ + --hash=sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70 # via # datasets # huggingface-hub @@ -895,62 +763,38 @@ flatbuffers==25.12.19 ; (platform_machine == 'arm64' and sys_platform == 'darwin --hash=sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4 # via onnxruntime frozenlist==1.8.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0 \ - --hash=sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121 \ --hash=sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84 \ --hash=sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d \ --hash=sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967 \ - --hash=sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd \ --hash=sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed \ --hash=sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f \ - --hash=sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143 \ - --hash=sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e \ - --hash=sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8 \ --hash=sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad \ - --hash=sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82 \ --hash=sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29 \ --hash=sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383 \ --hash=sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52 \ - --hash=sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d \ - --hash=sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1 \ - --hash=sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714 \ --hash=sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65 \ --hash=sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506 \ --hash=sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41 \ - --hash=sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608 \ --hash=sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa \ --hash=sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1 \ - --hash=sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52 \ --hash=sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a \ - --hash=sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3 \ --hash=sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695 \ --hash=sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4 \ --hash=sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51 \ - --hash=sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8 \ --hash=sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b \ - --hash=sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b \ - --hash=sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d \ - --hash=sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567 \ - --hash=sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e \ - --hash=sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52 \ - --hash=sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1 \ --hash=sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94 \ --hash=sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822 \ --hash=sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11 \ - --hash=sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581 \ - --hash=sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51 \ --hash=sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40 \ - --hash=sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92 \ - --hash=sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5 \ --hash=sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4 \ --hash=sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93 \ --hash=sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027 # via # aiohttp # aiosignal -fsspec==2025.9.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19 \ - --hash=sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7 +fsspec==2025.3.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972 \ + --hash=sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3 # via # data-designer-engine # datasets @@ -967,71 +811,55 @@ gitpython==3.1.50 ; (platform_machine == 'arm64' and sys_platform == 'darwin') o --hash=sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc \ --hash=sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9 # via ragas -googleapis-common-protos==1.75.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd \ - --hash=sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed +googleapis-common-protos==1.73.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:13114f0e9d2391756a0194c3a8131974ed7bffb06086569ba193364af59163b6 \ + --hash=sha256:e51f09eb0a43a8602f5a915870972e6b4a394088415c79d79605a46d8e826ee8 # via # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-http -greenlet==3.5.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:017a544f0385d441e88714160d089d6900ef46c9eff9d99b6715a5ef2d127747 \ - --hash=sha256:089fff7a6ce8d9316d1f65ebc00273a56be258c1725b32b94de90a3a979557e1 \ - --hash=sha256:1072b4f9edcc1e192d9283a66a3e68d6b84c561de33a83d7858beb9ba1effe10 \ - --hash=sha256:1ffdb3c0bb002c99cd8f298957e046c3dbf6006b5b7cdf11a4e19194624a0a0a \ - --hash=sha256:51518ff74664078fc51bffcc6fc529b0df5ae58da192691cee765d45ce944a2b \ - --hash=sha256:5a56aeb7d5d9cc4b3a735efb5095bd4b4f6f0e4f93e5ca876d0e2315137b7829 \ - --hash=sha256:67821bb03e4e98664490edb787ff6af501194c29bbee0f5c1dfdcf1dc3d9d436 \ - --hash=sha256:6ebeb75c81211f5c702576cf81f315e77e23cfdb2c7c6fcb9dd143e6de35c360 \ - --hash=sha256:73f78f9b9f0a5c06e5c946ba1e8e36f5114923b6be109ee618c54f079c3ea14f \ - --hash=sha256:7715a5a2c3378ba602c3a440558261e13a820bb53a82693aacd7b7f6d964e283 \ - --hash=sha256:89101bfd5011e069be974903cb3a4e4523845e4ece2d62dcd8d358933c0ef249 \ - --hash=sha256:8a271fcd66c74615cda6a964fda3f304267a12e50a084472218a39bb0376f563 \ - --hash=sha256:a0cbed8bb44e23c5b199f888f4e4ce096b45ad9f25ff74a7ad0213875e936bb2 \ - --hash=sha256:a203a8bd0acb0701653d3bbb26e404854a68674139ed5cbb778830f42b09bb33 \ - --hash=sha256:a5ea42a752d47a145eae922b605cd1634665ac3d5ec1e72402d5048e8d60d207 \ - --hash=sha256:add5217d68b31130f0beca584d7fef4878327d2e31642b66618a14eef312b63b \ - --hash=sha256:c5551170cf4f5ff5623e9af81323751979fee2c731e2287b61f73cd27257b823 \ - --hash=sha256:cd443683db272ebaaca03af98c0b063ab30db70ea8a31a1559f35e3f7b744ccd \ - --hash=sha256:d0932b81d72f552ded9d810d00021b64d89f2195a91ce115b893f943b7a4ab3c \ - --hash=sha256:d40a890035c0058cadbdc4af7569800fd28a0e527a0fdbb7b5f9418f176846ce \ - --hash=sha256:dc71ff466927a201b08305acac451ebe1aedfcea002f62f1f2f2ac2ac1e6a135 \ - --hash=sha256:ded7b068c7c31c1a8657d4fd42d886b3e051ae29f88b80c5ff9d502257b0f071 \ - --hash=sha256:e6cd99ea59dd5d89f0c956606571d79bfe6f68c9eb7f4a4083a41a7f1587edee \ - --hash=sha256:fa4f98af3a528f0c3fd592a26df7f376f93329c8f4d987f6bb979057af8bf5e2 \ - --hash=sha256:ffea73584b216150eab159b6d12348fb253e68757974de1e2c40d8a318ac89ed +greenlet==3.3.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b \ + --hash=sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f \ + --hash=sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2 \ + --hash=sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd \ + --hash=sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070 \ + --hash=sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99 \ + --hash=sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be \ + --hash=sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79 \ + --hash=sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a \ + --hash=sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395 \ + --hash=sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358 \ + --hash=sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4 \ + --hash=sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986 \ + --hash=sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd \ + --hash=sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab \ + --hash=sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86 # via # nmp-entities # sqlalchemy -griffelib==2.0.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e \ - --hash=sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1 - # via fastmcp-slim -grpcio==1.81.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0fba53cb96004b2b7fb758b46b2288cb49d0b658316a4e73f3ef67230616ee65 \ - --hash=sha256:19f201da7b4e5c0559198abe5a97157e726f3abe6e8f5e832d4a50740f6dcc22 \ - --hash=sha256:275144b0115353339dbb8a6f28a9cf8997b5bf40e37f8f66ac0b0ea57e95b43f \ - --hash=sha256:43c121e135ae44d1559b430db2b2dfad7421cbbe40e1deba506c7dc62b439719 \ - --hash=sha256:57b3b0e73a518fa286959b40c3eddd02703504ca186e8b7b2945954519bd8b2c \ - --hash=sha256:62bbe463c9f0f2ff24e31bd25f8dd8b4bae78900e315915a3195a0ef1471a855 \ - --hash=sha256:638ccc1b86f7540170a169cb900799b9296a1381e47879ce60b0de9d3db73d33 \ - --hash=sha256:77eb4e9fe61486bd1198cc7236ebb0f70e66234e63c0348f40bc2553ed16a88b \ - --hash=sha256:794e6aa648e8df47d8f908dc8c3b42347d04ec58438f1dcd4e445f09b4f6b0ce \ - --hash=sha256:8bb1789c94322a13336a2b6c58d9c14d68f8628b6e24205a799c69f5bf8516ce \ - --hash=sha256:a524cd530900bd24511fcb7f2ed144da4ea37711c4b094475d0bceca7a93a170 \ - --hash=sha256:a5acd7efd3b1fe9b4eb0bcaaa1507eed68a0ad0678b654c3f7b464df9ba9dca5 \ - --hash=sha256:c36f5d5e97944cbda2d4096b4ae262e6e68506246b61582acf1b8591607f3ccc \ - --hash=sha256:c6ff087cb1f563f47b504b4e29e684129fc5ae4863faf3ebca08a327764ee6cb \ - --hash=sha256:cd78145b7f7784661c524624f3526c9c6f891b30a4b54cb93a40806d0d0d61e9 \ - --hash=sha256:dbdb99986548a7e87f8343805ef315fd4eb50ffaabf4fb1206e42f2542bb805d \ - --hash=sha256:e4d053900a0d24b75d7521139a3872150301b3d6bde3bed5e12318fb25791e4d \ - --hash=sha256:e7746ba3e6efc9e2b748eff59470a2b8684d5a9ec607c6580bcaa5be175820bc \ - --hash=sha256:f345de40ef2e65f63645d53d251824e6070e07804827c5b00ec2e44555f9f901 +grpcio==1.80.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:00168469238b022500e486c1c33916acf2f2a9b2c022202cf8a1885d2e3073c1 \ + --hash=sha256:09e5e478b3d14afd23f12e49e8b44c8684ac3c5f08561c43a5b9691c54d136ab \ + --hash=sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257 \ + --hash=sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d \ + --hash=sha256:2ed770b4c06984f3b47eb0517b1c69ad0b84ef3f40128f51448433be904634cd \ + --hash=sha256:4e78c4ac0d97dc2e569b2f4bcbbb447491167cb358d1a389fc4af71ab6f70411 \ + --hash=sha256:5c07e82e822e1161354e32da2662f741a4944ea955f9f580ec8fb409dd6f6060 \ + --hash=sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140 \ + --hash=sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f \ + --hash=sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7 \ + --hash=sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0 \ + --hash=sha256:9a6284a5d907c37db53350645567c522be314bac859a64a7a5ca63b77bb7958f \ + --hash=sha256:ba0915d51fd4ced2db5ff719f84e270afe0e2d4c45a7bdb1e8d036e4502928c2 \ + --hash=sha256:ce1794f4ea6cc3ca29463f42d665c32ba1b964b48958a66497917fe9069f26e6 \ + --hash=sha256:d334591df610ab94714048e0d5b4f3dd5ad1bee74dfec11eee344220077a79de \ + --hash=sha256:f49eddcac43c3bf350c0385366a58f36bed8cc2c0ec35ef7b74b49e56552c0c2 # via # opentelemetry-exporter-otlp-proto-grpc # pymilvus -gunicorn==26.0.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:40233d26a5f0d1872916188c276e21641155111c2853f0c2cd55260aec0d24fc \ - --hash=sha256:ca9346f85e3a4aeeb64d491045c16b9a35647abd37ea15efe53080eb8b090baf +gunicorn==25.3.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:cacea387dab08cd6776501621c295a904fe8e3b7aae9a1a3cbb26f4e7ed54660 \ + --hash=sha256:f74e1b2f9f76f6cd1ca01198968bd2dd65830edc24b6e8e4d78de8320e2fe889 # via # nemo-safe-synthesizer-plugin # nmp-guardrails @@ -1042,18 +870,18 @@ h11==0.16.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pla # httpcore # nemoplatform # uvicorn -hf-xet==1.5.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0c97106032ef70467b4f6bc2d0ccc266d7613ee076afc56516c502f87ce1c4a6 \ - --hash=sha256:51ef4500dab3764b41135ee1381a4b62ce56fc54d4c92b719b59e597d6df5bf6 \ - --hash=sha256:6208adb15d192b90e4c2ad2a27ed864359b2cb0f2494eb6d7c7f3699ac02e2bf \ - --hash=sha256:6f7a04a8ad962422e225bc49fbbac99dc1806764b1f3e54dbd154bffa7593947 \ - --hash=sha256:892e3a3a3aecc12aded8b93cf4f9cd059282c7de0732f7d55026f3abdf474350 \ - --hash=sha256:94e761bbd266bf4c03cee73753916062665ce8365aa40ed321f45afcb934b41e \ - --hash=sha256:97f212a88d14bbf573619a74b7fecb238de77d08fc702e54dec6f78276ca3283 \ - --hash=sha256:a93df2039190502835b1db8cd7e178b0b7b889fe9ab51299d5ced26e0dd879a4 \ - --hash=sha256:d48199c2bf4f8df0adc55d31d1368b6ec0e4d4f45bc86b08038089c23db0bed8 \ - --hash=sha256:e78e4e5192ad2b674c2e1160b651cb9134db974f8ae1835bdfbfb0166b894a43 \ - --hash=sha256:f61e3665892a6c8c5e765395838b8ddf36185da835253d4bc4509a81e49fb342 +hf-xet==1.4.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:21644b404bb0100fe3857892f752c4d09642586fd988e61501c95bbf44b393a3 \ + --hash=sha256:2815a49a7a59f3e2edf0cf113ae88e8cb2ca2a221bf353fb60c609584f4884d4 \ + --hash=sha256:39f2d2e9654cd9b4319885733993807aab6de9dfbd34c42f0b78338d6617421f \ + --hash=sha256:49ad8a8cead2b56051aa84d7fce3e1335efe68df3cf6c058f22a65513885baac \ + --hash=sha256:60cf7fc43a99da0a853345cf86d23738c03983ee5249613a6305d3e57a5dca74 \ + --hash=sha256:7716d62015477a70ea272d2d68cd7cad140f61c52ee452e133e139abfe2c17ba \ + --hash=sha256:8ddedb73c8c08928c793df2f3401ec26f95be7f7e516a7bee2fbb546f6676113 \ + --hash=sha256:987f09cfe418237812896a6736b81b1af02a3a6dcb4b4944425c4c4fca7a7cf8 \ + --hash=sha256:bee693ada985e7045997f05f081d0e12c4c08bd7626dc397f8a7c487e6c04f7f \ + --hash=sha256:e23717ce4186b265f69afa66e6f0069fe7efbf331546f5c313d00e123dc84583 \ + --hash=sha256:fc360b70c815bf340ed56c7b8c63aacf11762a4b099b2fe2c9bd6d6068668c08 # via huggingface-hub httpcore==1.0.9 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 \ @@ -1061,26 +889,26 @@ httpcore==1.0.9 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # via # exa-py # httpx -httptools==0.8.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683 \ - --hash=sha256:20b4aac66ff65f7db06a375808b78f42a94970aa22e826b3cb2b43eb09174124 \ - --hash=sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c \ - --hash=sha256:425f83884fd6343828d8c565f046cb72b6d19063f6924093e11bcd8e1548cd09 \ - --hash=sha256:52dd695b865fe96d9d2b16b64a895f3f57bf3cb064e8383cd3b5713a069e8085 \ - --hash=sha256:57278e6fa0424c42a8a3e454828ab4f0aff27b40cddf9679579b98c6dce6a376 \ - --hash=sha256:5931891fb7b441b8a3853cf1b85c82c903defce084dd5f6771ca46e31bf862c5 \ - --hash=sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8 \ - --hash=sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681 \ - --hash=sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999 \ - --hash=sha256:880490234c10f70a9830743097e8958d6e4b9f5a0ffc24515023afeef984054d \ - --hash=sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d \ - --hash=sha256:9518c406d7b310f05adb1a37f80acabac40504a575d7c0da6d3e365c695ac20d \ - --hash=sha256:a1afd7c9fbff0d9f5d489c4ce2768bd09c84a46ddefc7161e6aa82ae35c85745 \ - --hash=sha256:b15fc622b0f869d19207c4089a501d9bcc63ca5e071ffdd2f03f922df882dcb2 \ - --hash=sha256:bbb8caadb2b742d293169d2b458b5c001ef70e3158704aa3d3ef9597624c5d1d \ - --hash=sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7 \ - --hash=sha256:ed377e64805bdba4943c82717333f8f8603a13b09aff9cead2717c6c817fb168 \ - --hash=sha256:ef7c3c97f4311c7be57e2986629df89d49cb434dbff78eafcd48c2bff986b15a +httptools==0.7.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c \ + --hash=sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03 \ + --hash=sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df \ + --hash=sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5 \ + --hash=sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346 \ + --hash=sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650 \ + --hash=sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657 \ + --hash=sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca \ + --hash=sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66 \ + --hash=sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3 \ + --hash=sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2 \ + --hash=sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70 \ + --hash=sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9 \ + --hash=sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e \ + --hash=sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c \ + --hash=sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274 \ + --hash=sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5 \ + --hash=sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec \ + --hash=sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362 # via uvicorn httpx==0.28.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \ @@ -1092,7 +920,7 @@ httpx==0.28.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # exa-py # fastapi # fastapi-cloud-cli - # fastmcp-slim + # fastmcp # garak-api # httpx-retries # huggingface-hub @@ -1118,9 +946,9 @@ httpx==0.28.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # oci-openai # openai # switchyard -httpx-retries==0.5.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:d3124592979a9dc6197e666d1f02e9ab996a0c58fce59fad8db6201a6a87304e \ - --hash=sha256:d8c8e1e0852d84be3837aba0bcf78aeb89a4b77db95e8cc988c8c058830b3044 +httpx-retries==0.4.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:a076d8a5ede5d5794e9c241da17b15b393b482129ddd2fdf1fa56a3fa1f28a7f \ + --hash=sha256:d66d912173b844e065ffb109345a453b922f4c2cd9c9e11139304cb33e7a1ee1 # via data-designer-engine httpx-sse==0.4.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc \ @@ -1128,9 +956,9 @@ httpx-sse==0.4.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # via # langchain-community # mcp -huggingface-hub==1.18.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:729be4a976fb706dcc02d176bcda8a3f32bdf21a294e8f4b3dda6fbcbc9c1ab1 \ - --hash=sha256:f0c5ecd1ef8c6a60f86f61ee278f2c1570ba9e279c9f54de9094210723b3613b +huggingface-hub==1.15.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:28abfdddda3927fd4de6a63cf26ab012498a2c24dae52baf150c5c6edf98a1d5 \ + --hash=sha256:a4a59af04cbc41a3fe3fec429b171ef994ef8c971eda10136746f408dd4e3744 # via # data-designer-engine # datasets @@ -1138,7 +966,6 @@ huggingface-hub==1.18.0 ; (platform_machine == 'arm64' and sys_platform == 'darw # langchain-huggingface # nemo-safe-synthesizer # nmp-common - # nmp-evaluator # tokenizers # transformers hvac==2.4.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ @@ -1148,21 +975,22 @@ hvac==2.4.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pla # nemoplatform # nmp-common # nmp-jobs -idna==3.18 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2 \ - --hash=sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848 +idna==3.15 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8 \ + --hash=sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc # via # anyio # email-validator # httpx # requests # yarl -importlib-metadata==8.9.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:58850626cef4bd2df100378b0f2aea9724a7b92f10770d547725b047078f99ee \ - --hash=sha256:e0f761b6ea91ced3b0844c14c9d955224d538105921f8e6754c00f6ca79fba7f +importlib-metadata==8.5.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \ + --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7 # via # keyring # litellm + # opentelemetry-api iniconfig==2.3.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730 \ --hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 @@ -1183,9 +1011,9 @@ jaraco-context==6.1.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin --hash=sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535 \ --hash=sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3 # via keyring -jaraco-functools==4.5.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03 \ - --hash=sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4 +jaraco-functools==4.4.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176 \ + --hash=sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb # via keyring jeepney==0.9.0 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683 \ @@ -1207,41 +1035,25 @@ jinja2==3.1.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # nemoplatform # nvidia-nat-core # sqlfluff -jiter==0.13.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:04670992b576fa65bd056dbac0c39fe8bd67681c380cb2b48efa885711d9d726 \ - --hash=sha256:0b34c519e17658ed88d5047999a93547f8889f3c1824120c26ad6be5f27b6cf5 \ - --hash=sha256:1f4748aad1b4a93c8bdd70f604d0f748cdc0e8744c5547798acfa52f10e79228 \ - --hash=sha256:24ab43126d5e05f3d53a36a8e11eb2f23304c6c1117844aaaf9a0aa5e40b5018 \ - --hash=sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820 \ - --hash=sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2 \ - --hash=sha256:3b3fb8c2053acaef8580809ac1d1f7481a0a0bdc012fd7f5d8b18fb696a5a089 \ - --hash=sha256:45f6f8efb2f3b0603092401dc2df79fa89ccbc027aaba4174d2d4133ed661434 \ - --hash=sha256:47455245307e4debf2ce6c6e65a717550a0244231240dcf3b8f7d64e4c2f22f4 \ - --hash=sha256:597245258e6ad085d064780abfb23a284d418d3e61c57362d9449c6c7317ee2d \ - --hash=sha256:5a1aff1fbdb803a376d4d22a8f63f8e7ccbce0b4890c26cc7af9e501ab339ef0 \ - --hash=sha256:66aa3e663840152d18cc8ff1e4faad3dd181373491b9cfdc6004b92198d67911 \ - --hash=sha256:7bb00b6d26db67a05fe3e12c76edc75f32077fb51deed13822dc648fa373bc19 \ - --hash=sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663 \ - --hash=sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6 \ - --hash=sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f \ - --hash=sha256:ab44b178f7981fcaea7e0a5df20e773c663d06ffda0198f1a524e91b2fde7e59 \ - --hash=sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef \ - --hash=sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68 \ - --hash=sha256:bdaba7d87e66f26a2c45d8cbadcbfc4bf7884182317907baf39cfe9775bb4d93 \ - --hash=sha256:c1e2b199f446d3e82246b4fd9236d7cb502dc2222b18698ba0d986d2fecc6152 \ - --hash=sha256:c3524798e70655ff19aec58c7d05adb1f074fecff62da857ea9be2b908b6d701 \ - --hash=sha256:d2a6394e6af690d462310a86b53c47ad75ac8c21dc79f120714ea449979cb1d3 \ - --hash=sha256:db367d8be9fad6e8ebbac4a7578b7af562e506211036cba2c06c3b998603c3d2 \ - --hash=sha256:e404ea551d35438013c64b4f357b0474c7abf9f781c06d44fcaf7a14c69ff9e2 \ - --hash=sha256:ec7e287d7fbd02cb6e22f9a00dd9c9cd504c40a61f2c61e7e1f9690a82726b4c \ - --hash=sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159 \ - --hash=sha256:ee9da221dca6e0429c2704c1b3655fe7b025204a71d4d9b73390c759d776d165 \ - --hash=sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4 \ - --hash=sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a \ - --hash=sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb \ - --hash=sha256:f917a04240ef31898182f76a332f508f2cc4b57d2b4d7ad2dbfebbfe167eb505 \ - --hash=sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10 \ - --hash=sha256:ff732bd0a0e778f43d5009840f20b935e79087b4dc65bd36f1cd0f9b04b8ff7f +jiter==0.10.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500 \ + --hash=sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605 \ + --hash=sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070 \ + --hash=sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2 \ + --hash=sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca \ + --hash=sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041 \ + --hash=sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a \ + --hash=sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5 \ + --hash=sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d \ + --hash=sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6 \ + --hash=sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b \ + --hash=sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc \ + --hash=sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea \ + --hash=sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744 \ + --hash=sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5 \ + --hash=sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4 \ + --hash=sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a \ + --hash=sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e # via # anthropic # instructor @@ -1257,12 +1069,10 @@ joblib==1.5.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p --hash=sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713 \ --hash=sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3 # via nltk -joserfc==1.7.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:77d0b76514879c68c6f433bc5b7357a4ab72008ff1e33d8379fd11d72bd8ca81 \ - --hash=sha256:b3e3d655612e2e1ef67b2600f2f420e12e537b020208fab1761fad647319c164 - # via - # authlib - # fastmcp-slim +joserfc==1.6.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:1482a7db78fb4602e44ed89e51b599d052e091288c7c532c5b694e20149dec48 \ + --hash=sha256:e9878a0f8243fe7b95e11fdda81374ca9f7a689e302751579d3dfdeec559675e + # via authlib json-repair==0.58.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:2ea5c841cc1d91dbbe79e9ed4b2b77a5cc04d20892d62a15261b70ce999ec758 \ --hash=sha256:af0c7ff6a2ddd80bb1e7e6121c1a86d8bb57a539aa211acbfb25c64087b7116f @@ -1276,43 +1086,26 @@ jsonpath-ng==1.8.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') --hash=sha256:b8dde192f8af58d646fc031fac9c99fe4d00326afc4148f1f043c601a8cfe138 # via # nemo-evaluator-sdk - # nmp-evaluator # nvidia-nat-core jsonpath-rust-bindings==1.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:0017af7054fb6bce55863a7065ae465a9c47fd93fb94f002ca98bb8adf15101a \ - --hash=sha256:02373d581a093d0640e60858884d67ec93259e7b6d6bd8e5874400ad99558e00 \ --hash=sha256:0ca169ac219bc141775fb19df8165d4d0162e6ed77102e1ab19a74a80c1f9051 \ --hash=sha256:13446ad021abe05d622a01eaa648c238ef3b98e9fc0bd837a589bafb246ca3bc \ - --hash=sha256:146b69ce20cb9869e05a6d369f4a10b52f98e1f8575f1ac5b49e285fa2032380 \ - --hash=sha256:1ff4cd052f733d5f270329c552a04e08a1520053355d35f0be886714dff46955 \ --hash=sha256:26955685acf0208b6061419cab4bd79fe869ebce57f3cec1e9b20f0e0af56b35 \ - --hash=sha256:330f457556d06abc1ea36b6738eb172288afff6bd251350eaba42bed2f459fd3 \ - --hash=sha256:366cba544c080c08530cef0cc19922f0380f0caab6e7e5a0ddfb70de288d5abc \ - --hash=sha256:36a40ed04d2db70897cde2ac92f6c9aae2ed1b426aa4c97a47f3e2be911ea4ba \ --hash=sha256:3c220c2d27ab6a0791e3af10e2a7c53ccd1dc2dfc8681999fed4458392aa0372 \ --hash=sha256:40c23781d28a8b126c8a2b337e4fe275cc8f35a149bda769e3ec2760dfb58b91 \ --hash=sha256:44de7464ad227028c36e8d713653b4bfe5eb7524ac1a4b0a71e8bcb3bd4f4f3a \ - --hash=sha256:4eacb98f80fff7d43956503ca7b42e491f7084c7b9bd8b5b6bad3f50d08480df \ - --hash=sha256:50f16c3dd6eb572dda74731508d2fca1abbb927ab4f6511fb65eeba6e59fd041 \ - --hash=sha256:6716caa0855dbf9d021509a3caa00a9fa7cc241930f40830c24e85d0e17a6246 \ --hash=sha256:734eee89754c829a0fb55a30467c8a33081976375b763c907f71f7018682c26c \ - --hash=sha256:7bf30e27a81d07c79cc58c86600687e5adfe0f7b1aaf8069a737085bebfaea71 \ --hash=sha256:7f2a526c87a245f708dc1d8d4988c471384c369a5909b8b730e63b6a7f0c2d60 \ --hash=sha256:8c390c33582cd268d35b86eb0f550229e0cf26f03bb06c470db4712d6fa4dc0f \ - --hash=sha256:9212d3746a57015fc3722488f61c4afc465d993f68371d864be8fa5b0c58d635 \ --hash=sha256:9d656507b5913f9515ff136797c5850df907c5040fa1368baa428f7e829e33f0 \ --hash=sha256:a239166bd1418897de327c952a9d9ff912d1fabc9da82e688204ccfcd7b22584 \ --hash=sha256:a43107f6efc4e66ee046c338741429a268fd972e887721b01bf0f32e47387e30 \ - --hash=sha256:aa7e9d25b00c227c51e7a916a13fbf22cf483df622699dbc3ef051861ec1de85 \ --hash=sha256:b06b24668085b2791acbfefdfe2f2824d36be539c7647c00aee33242b4d3385d \ - --hash=sha256:b9583e965fe5f8f21cd0d047244db9716a119e0e82a06f2336e6b14c9a9637af \ --hash=sha256:ce1c6804706012c3c7a194903ef20befafa3cc913a4ef553696bc837ac738a66 \ --hash=sha256:ce7039a2f497674785a423076e803a1fa547c2f9cf568b25e2ac83ff5890b98f \ --hash=sha256:d21101114514d34b21ab216eef1d7bb41155311fa61284e8f2dbdb93bde41c78 \ - --hash=sha256:dc0c3488f04dbd318fa876fb880e8cb7d1e53abcf8b0d9e697e10a0a15ac3158 \ --hash=sha256:ddbf025592bf88fc5395d9d023d7bcc8fab977898c406e0a5722925c3b887c71 \ - --hash=sha256:e423363b47080830bbb4d8257c0f26bda8ee655a18c4f934952bfe4c46e8d510 \ - --hash=sha256:ebb9a05a2b80195ac47aec0ce98d861c102459d16225fefb0f7e0158196c4a58 \ --hash=sha256:f55ee1e7fdb6bb2363c40a6d6ce0285e53bd52b4ecae7bef3909eeb11a9b4cd2 \ --hash=sha256:fbfeb05c7a6854104e97a0e3234f312004b3f4e678d14b68180a6a4f33f4d7c3 \ --hash=sha256:fe44737c6c72079ef30c85f975c19fa0114c13039fe538d8c5b259007a35a0ff @@ -1324,10 +1117,10 @@ jsonpointer==3.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') jsonref==1.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552 \ --hash=sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9 - # via fastmcp-slim -jsonschema==4.26.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326 \ - --hash=sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce + # via fastmcp +jsonschema==4.23.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 # via # data-designer-engine # litellm @@ -1335,10 +1128,10 @@ jsonschema==4.26.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') # nemo-evaluator-sdk # nemo-safe-synthesizer # nmp-automodel -jsonschema-path==0.5.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:2790a070bc7abb08ea3dbe4d340ece4efadf639223001f020c7503229ba068e2 \ - --hash=sha256:493b156ba895c97602655b620a8456caa2ce08c1aa389f5a7addec065e6e855c - # via fastmcp-slim +jsonschema-path==0.3.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:8365356039f16cc65fddffafda5f58766e34bebab7d6d105616ab52bc4297001 \ + --hash=sha256:f502191fdc2b22050f9a81c9237be9d27145b9001c55842bece5e94e382e52f8 + # via fastmcp jsonschema-specifications==2025.9.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \ --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d @@ -1347,17 +1140,16 @@ keyring==25.7.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f \ --hash=sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b # via py-key-value-aio -kubernetes==36.0.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:03551fcb49cae1f708f63624041e37403545b7aaed10cbf54e2b01a37a5438e3 \ - --hash=sha256:faf9b5241b58de0c4a5069f2a0ffc8ac06fece7215156cd3d3ba081a78a858b6 +kubernetes==35.0.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:39e2b33b46e5834ef6c3985ebfe2047ab39135d41de51ce7641a7ca5b372a13d \ + --hash=sha256:3d00d344944239821458b9efd484d6df9f011da367ecb155dadf9513f05f09ee # via # nmp-common - # nmp-evaluator # nmp-jobs # nmp-models -langchain==1.3.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:d6e0654c22848925534f5c0a706f9be481bb09a619ec60a738fbd1e5502e457a \ - --hash=sha256:e51b05ab23d056bc6bf2d97d8c694fb92d6d5765126fef74565d007c27581672 +langchain==1.2.14 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:96da6d7338d5a6fc41eb4ec0db83f7ef5d03bb5efd17bb269f34ba4378ebdb4d \ + --hash=sha256:fc5511e8f8af7efee9e5a144da4392d700d627b301d240470db97272940ad317 # via # langchain-community # langchain-oci @@ -1376,17 +1168,16 @@ langchain-classic==1.0.7 ; (platform_machine == 'arm64' and sys_platform == 'dar --hash=sha256:d9d9be38f7aa534ed0259c2410432e34a1f80b1d491e686749bb55af56479be3 \ --hash=sha256:debbec8065e69b95108d2652e8d5c44f4516e19aa8d716c02ed2211c3aee099d # via nvidia-nat-langchain -langchain-community==0.3.31 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:1c727e3ebbacd4d891b07bd440647668001cea3e39cbe732499ad655ec5cb569 \ - --hash=sha256:250e4c1041539130f6d6ac6f9386cb018354eafccd917b01a4cff1950b80fd81 +langchain-community==0.3.27 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:581f97b795f9633da738ea95da9cb78f8879b538090c9b7a68c0aed49c828f0d \ + --hash=sha256:e1037c3b9da0c6d10bf06e838b034eb741e016515c79ef8f3f16e53ead33d882 # via # nemoguardrails - # nmp-evaluator # nvidia-nat-langchain # ragas -langchain-core==1.4.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:242abe763db71de05fe0d7ecff03f9cc6022fbceba8be15902fb89e35b7292f9 \ - --hash=sha256:a2906d339514e02a46d6c0888021dd2651ed5acc661a1f546fe33e1453adfcb9 +langchain-core==1.3.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:18aae8506f37da7f74398492279a7d6efcee4f8e23c4c41c7af080eeb7ef7bd1 \ + --hash=sha256:fa510a5db8efdc0c6ff41c0939fb5c00a0183c11f6b84233e892e3227ff69182 # via # langchain # langchain-aws @@ -1404,7 +1195,6 @@ langchain-core==1.4.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin # langgraph # langgraph-checkpoint # langgraph-prebuilt - # langgraph-sdk # nemoguardrails # nvidia-nat-langchain # ragas @@ -1416,41 +1206,40 @@ langchain-huggingface==1.2.2 ; (platform_machine == 'arm64' and sys_platform == --hash=sha256:1dd91ec415190d2704e93ec149618e3145075863ba37e74afc9080d685dc2743 \ --hash=sha256:f94944b0c0d5afc687568d426c87ed5236907464c41e72108ed76eee1a690f6d # via nvidia-nat-langchain -langchain-litellm==0.6.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:d49d0353254e10e38c351d7eae3d7b34128a0d31a3a22928ac289a8987c21a30 \ - --hash=sha256:fb4399ae4c239b5bb85c19574a5bb4c17988433d48ec716e62144f0dad4a63af +langchain-litellm==0.6.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:30741fda59803336d0d39788be441f6ccd2b4e41d7747ff0d2b002950a07453b \ + --hash=sha256:dce2ebfddddd0dfd6b1ed473399ccc095dd2f5cb6adfe1336d7bbe489ef32b4b # via nvidia-nat-langchain langchain-milvus==0.3.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:406c2d88da133741f5cc3e2fea4b36386182b35500205c70d003382ded210e41 \ --hash=sha256:6e12f15453372dd48836978faa4a149de79c721df3322229ad732a5e628e8e97 # via nvidia-nat-langchain -langchain-nvidia-ai-endpoints==1.4.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:3edd1678a3e2c55789128e53ba32aab3dffe94cb201c70e6cea521fab7c261ff \ - --hash=sha256:8835f7e56d559b370b87164f937c1eb048ab837f25de91598f00555a705c2d16 +langchain-nvidia-ai-endpoints==1.3.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:5223aa7988ee5044f38715ae757faa0af4ba64f2ed0c82851a99c052592eaa09 \ + --hash=sha256:cc2b356e96e86ffb92dcfe83980aa73227e1fad8f3a4cbdd76cdcf980c42e7cc # via - # nmp-evaluator + # nemo-evaluator-sdk # nmp-guardrails # nvidia-nat-langchain -langchain-oci==0.2.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:1fb7ef305008ebbb1fb53e32af4823daa754d256947b3462b2f85e147638dc55 \ - --hash=sha256:cf793058d3b76334b57e1c80203bb2ba42941a41ce236b5825d5dbc4fe188151 +langchain-oci==0.2.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:3451385da788926d5cffd19de8afb912e15bdb28fb76f3844d3d88a5683142b0 \ + --hash=sha256:92538d3ee45e3323290fcc672e3f6618b13878b464abd8692ade9b7441b5863b # via nvidia-nat-langchain -langchain-openai==1.2.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:7da39a3c70cbafa93853456199e39a264dc70651be79b12ac49b4f6a448bce2d \ - --hash=sha256:8698ffcee9a086e91ab6d207f0026181a03effcbf86bf9aee1808ee35af69dcc +langchain-openai==1.2.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:a80732185030d4f453dda6c25feef46f645f665423fdffe38ae3edf1ac3c6c4d \ + --hash=sha256:ee4480b787706361b7125fad46930589a624df87aa158c6986ef1fad10d10675 # via # langchain-oci + # nemo-evaluator-sdk # nemoguardrails # nmp-guardrails # nvidia-nat-langchain # openevals # ragas -langchain-protocol==0.0.16 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:3658c142c5d0fb3a023a4be442ce4c15c6d626aab6135eb79a76dc64ad19c3c3 \ - --hash=sha256:806c7cdd951b1c4f692fa40fce60821ff0f221d4360e27673ddf2c2b99c2b7ff - # via - # langchain-core - # langgraph-sdk +langchain-protocol==0.0.15 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:461eb794358f83d5e42635a5797799ffec7b4702314e34edf73ac21e75d3ef79 \ + --hash=sha256:9ab2d11ee73944754f10e037e717098d3a6796f0e58afa9cadda6154e7655ade + # via langchain-core langchain-tavily==0.2.18 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:cd7859ae1a6ce79236580ef67072ff5fc43c7ded94e7eac38ff04209ca85a320 \ --hash=sha256:dccf3ad1c50e2cb2a89bec11727555805c9df8abd42c1f3ad42ccad86e28aa44 @@ -1459,26 +1248,26 @@ langchain-text-splitters==1.1.2 ; (platform_machine == 'arm64' and sys_platform --hash=sha256:782a723db0a4746ac91e251c7c1d57fd23636e4f38ed733074e28d7a86f41627 \ --hash=sha256:a2de0d799ff31886429fd6e2e0032df275b60ec817c19059a7b46181cc1c2f10 # via langchain-classic -langgraph==1.2.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:5df076973a2d23efb13eceb279d1e5b46feebcbbeded0a86a2ef669abd9e4399 \ - --hash=sha256:ffe3e1e31dce28907640f82525858470f293506d2b272d07ea3b3ce97974b067 +langgraph==1.1.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:77ebe7ed44a2699f13696bf41f1dabe7b5fa8e6ad51e3597f2f175492e8f3656 \ + --hash=sha256:c951a859f68a021c69a27500db4eafc1900fc7ac32a54f7fc31d277165d04bed # via # langchain # langchain-oci # nvidia-nat-langchain -langgraph-checkpoint==4.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:25d29144b082827218e7bc3f1e9b0566a4bb007895cd6cc26f66a8428739f56e \ - --hash=sha256:6c2bdb530c91f91d7d9c1bd100925d0fc4f498d418c17f3587d1526279482a25 +langgraph-checkpoint==4.0.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:b433123735df11ade28829e40ce25b9be614930cd50245ff2af60629234befd9 \ + --hash=sha256:e3adcd7a0e0166f3b48b8cf508ce0ea366e7420b5a73aa81289888727769b034 # via # langgraph # langgraph-prebuilt -langgraph-prebuilt==1.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:3c579cf6eed2d17f9c157c2d0fcaddcd8688524e7022d3b22b37a3bf4589d528 \ - --hash=sha256:51e311747d755b751d5c6b39b0c1446124d3a7643d2515017e6714b323508fc9 +langgraph-prebuilt==1.0.8 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0cd3cf5473ced8a6cd687cc5294e08d3de57529d8dd14fdc6ae4899549efcf69 \ + --hash=sha256:d16a731e591ba4470f3e313a319c7eee7dbc40895bcf15c821f985a3522a7ce0 # via langgraph -langgraph-sdk==0.4.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:75fa5096c1177ce39c847096a8fe3745ffd480ddb412995f836e9f5f884c43dd \ - --hash=sha256:b88f0f5f6328ac0680d6790614a905b2bcfa257f2276dba4e38f0e86db0aa738 +langgraph-sdk==0.3.12 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:44323804965d6ec2a07127b3cf08a0428ea6deaeb172c2d478d5cd25540e3327 \ + --hash=sha256:c9c9ec22b3c0fcd352e2b8f32a815164f69446b8648ca22606329f4ff4c59a71 # via langgraph langsmith==0.8.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:4ff80d7dc1b273315401b681aef9b1fc92f4fa8a6d9d49eb65535520f8264fd4 \ @@ -1496,57 +1285,41 @@ lark==1.3.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pla # nemoguardrails # nmp-common # nmp-entities -litellm==1.88.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:369b84e57d9426582ddc35e731956ddb6618cda97cc44e4e4d2dfa75982a6e3a \ - --hash=sha256:89c6b74cc7912d6365793006ff951c0450fe847625008dfe49de8a7dc4529aa5 +litellm==1.83.14 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:24aef9b47cdc424c833e32f3727f411741c690832cd1fe4405e0077144fe09c9 \ + --hash=sha256:92b11ba2a32cf80707ddf388d18526696c7999a21b418c5e3b6eda1243d2cfdb # via langchain-litellm loguru==0.7.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6 \ --hash=sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c # via fastembed -lxml==6.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7 \ - --hash=sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83 \ - --hash=sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8 \ - --hash=sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085 \ - --hash=sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f \ - --hash=sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004 \ - --hash=sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d \ - --hash=sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947 \ - --hash=sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2 \ - --hash=sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc \ - --hash=sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955 \ - --hash=sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c \ - --hash=sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736 \ - --hash=sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6 \ - --hash=sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2 \ - --hash=sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b \ - --hash=sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca \ - --hash=sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635 \ - --hash=sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08 \ - --hash=sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f \ - --hash=sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383 \ - --hash=sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c \ - --hash=sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099 \ - --hash=sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510 \ - --hash=sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a \ - --hash=sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b \ - --hash=sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5 \ - --hash=sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf \ - --hash=sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40 \ - --hash=sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e \ - --hash=sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2 \ - --hash=sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc \ - --hash=sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785 \ - --hash=sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8 \ - --hash=sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a \ - --hash=sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6 \ - --hash=sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6 \ - --hash=sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354 \ - --hash=sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818 \ - --hash=sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2 \ - --hash=sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf \ - --hash=sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc +lxml==6.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:07f98f5496f96bf724b1e3c933c107f0cbf2745db18c03d2e13a291c3afd2635 \ + --hash=sha256:264c605ab9c0e4aa1a679636f4582c4d3313700009fac3ec9c3412ed0d8f3e1d \ + --hash=sha256:363e47283bde87051b821826e71dde47f107e08614e1aa312ba0c5711e77738c \ + --hash=sha256:37fabd1452852636cf38ecdcc9dd5ca4bba7a35d6c53fa09725deeb894a87491 \ + --hash=sha256:3ae5d8d5427f3cc317e7950f2da7ad276df0cfa37b8de2f5658959e618ea8512 \ + --hash=sha256:419c58fc92cc3a2c3fa5f78c63dbf5da70c1fa9c1b25f25727ecee89a96c7de2 \ + --hash=sha256:4642e04449a1e164b5ff71ffd901ddb772dfabf5c9adf1b7be5dffe1212bc037 \ + --hash=sha256:5715e0e28736a070f3f34a7ccc09e2fdcba0e3060abbcf61a1a5718ff6d6b105 \ + --hash=sha256:5cfa1a34df366d9dc0d5eaf420f4cf2bb1e1bebe1066d1c2fc28c179f8a4004c \ + --hash=sha256:73becf6d8c81d4c76b1014dbd3584cb26d904492dcf73ca85dc8bff08dcd6d2d \ + --hash=sha256:7f4a77d6f7edf9230cee3e1f7f6764722a41604ee5681844f18db9a81ea0ec33 \ + --hash=sha256:9147d8e386ec3b82c3b15d88927f734f565b0aaadef7def562b853adca45784a \ + --hash=sha256:942454ff253da14218f972b23dc72fa4edf6c943f37edd19cd697618b626fac5 \ + --hash=sha256:976a6b39b1b13e8c354ad8d3f261f3a4ac6609518af91bdb5094760a08f132c4 \ + --hash=sha256:a0092f2b107b69601adf562a57c956fbb596e05e3e6651cabd3054113b007e45 \ + --hash=sha256:a2853c8b2170cc6cd54a6b4d50d2c1a8a7aeca201f23804b4898525c7a152cfc \ + --hash=sha256:bc783ee3147e60a25aa0445ea82b3e8aabb83b240f2b95d32cb75587ff781814 \ + --hash=sha256:bfd57d8008c4965709a919c3e9a98f76c2c7cb319086b3d26858250620023b13 \ + --hash=sha256:cc16682cc987a3da00aa56a3aa3075b08edb10d9b1e476938cfdbee8f3b67181 \ + --hash=sha256:cec05be8c876f92a5aa07b01d60bbb4d11cfbdd654cad0561c0d7b5c043a61b9 \ + --hash=sha256:d036ee7b99d5148072ac7c9b847193decdfeac633db350363f7bce4fff108f0e \ + --hash=sha256:d2f17a16cd8751e8eb233a7e41aecdf8e511712e00088bf9be455f604cd0d28d \ + --hash=sha256:db88156fcf544cdbf0d95588051515cfdfd4c876fc66444eb98bceb5d6db76de \ + --hash=sha256:e69aa6805905807186eb00e66c6d97a935c928275182eb02ee40ba00da9623b2 \ + --hash=sha256:fc46da94826188ed45cb53bd8e3fc076ae22675aea2087843d4735627f867c6d \ + --hash=sha256:fcf3da95e93349e0647d48d4b36a12783105bcc74cb0c416952f9988410846a3 # via # data-designer-engine # sacrebleu @@ -1569,40 +1342,32 @@ mako==1.3.12 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pl --hash=sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9 \ --hash=sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a # via alembic -markdown-it-py==4.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \ - --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a +markdown-it-py==4.0.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147 \ + --hash=sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3 # via rich -marko==2.2.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:8e1d7a0387281e59dfbc52a381b58c570156970e36b2bbe047f8a3a2f368cacc \ - --hash=sha256:e31ec2875383bc62f9093d16babed5a2c2cde601c00d834ea935a2222120ec19 +marko==2.2.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:6940308e655f63733ca518c47a68ec9510279dbb916c83616e4c4b5829f052e8 \ + --hash=sha256:f064ae8c10416285ad1d96048dc11e98ef04e662d3342ae416f662b70aa7959e # via data-designer-engine markupsafe==3.0.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \ --hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \ --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \ - --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \ --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \ --hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce \ --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \ --hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d \ --hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a \ --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \ - --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \ --hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50 \ --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \ --hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b \ - --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \ - --hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115 \ - --hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f \ --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \ --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \ --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \ - --hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a \ --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \ --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \ - --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \ - --hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f \ --hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b \ --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \ --hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d \ @@ -1614,12 +1379,12 @@ marshmallow==3.26.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') --hash=sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73 \ --hash=sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57 # via dataclasses-json -mcp==1.27.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:8e02db104096d1c25b28e64bde29a5c32b31bc241710213e12fd4d84985bdfef \ - --hash=sha256:d6ff5160c6ca65d93013626efb3fc249de683c30b2d8570755ceddd490344de5 +mcp==1.26.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca \ + --hash=sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66 # via # data-designer-engine - # fastmcp-slim + # fastmcp mdurl==0.1.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba @@ -1631,91 +1396,59 @@ mmh3==5.2.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pla --hash=sha256:17fbb47f0885ace8327ce1235d0416dc86a211dcd8cc1e703f41523be32cfec8 \ --hash=sha256:1d9f9a3ce559a5267014b04b82956993270f63ec91765e13e9fd73daf2d2738e \ --hash=sha256:26fb5b9c3946bf7f1daed7b37e0c03898a6f062149127570f8ede346390a0825 \ - --hash=sha256:2778fed822d7db23ac5008b181441af0c869455b2e7d001f4019636ac31b6fe4 \ - --hash=sha256:2bd9f19f7f1fcebd74e830f4af0f28adad4975d40d80620be19ffb2b2af56c9f \ --hash=sha256:3737303ca9ea0f7cb83028781148fcda4f1dac7821db0c47672971dabcf63593 \ - --hash=sha256:3c38d142c706201db5b2345166eeef1e7740e3e2422b470b8ba5c8727a9b4c7a \ --hash=sha256:3d74a03fb57757ece25aa4b3c1c60157a1cece37a020542785f942e2f827eed5 \ - --hash=sha256:41aac7002a749f08727cb91babff1daf8deac317c0b1f317adc69be0e6c375d1 \ - --hash=sha256:50885073e2909251d4718634a191c49ae5f527e5e1736d738e365c3e8be8f22b \ - --hash=sha256:67e41a497bac88cc1de96eeba56eeb933c39d54bc227352f8455aa87c4ca4000 \ --hash=sha256:707151644085dd0f20fe4f4b573d28e5130c4aaa5f587e95b60989c5926653b5 \ --hash=sha256:82f3802bfc4751f420d591c5c864de538b71cea117fce67e4595c2afede08a15 \ --hash=sha256:8e6c219e375f6341d0959af814296372d265a8ca1af63825f65e2e87c618f006 \ - --hash=sha256:8f767ba0911602ddef289404e33835a61168314ebd3c729833db2ed685824211 \ - --hash=sha256:960b1b3efa39872ac8b6cc3a556edd6fb90ed74f08c9c45e028f1005b26aa55d \ --hash=sha256:9d8089d853c7963a8ce87fff93e2a67075c0bc08684a08ea6ad13577c38ffc38 \ --hash=sha256:a482ac121de6973897c92c2f31defc6bafb11c83825109275cffce54bb64933f \ --hash=sha256:b3f99e1756fc48ad507b95e5d86f2fb21b3d495012ff13e6592ebac14033f166 \ --hash=sha256:bbea5b775f0ac84945191fb83f845a6fd9a21a03ea7f2e187defac7e401616ad \ --hash=sha256:be77c402d5e882b6fbacfd90823f13da8e0a69658405a39a569c6b58fdb17b03 \ - --hash=sha256:c88653877aeb514c089d1b3d473451677b8b9a6d1497dbddf1ae7934518b06d2 \ - --hash=sha256:d30b650595fdbe32366b94cb14f30bb2b625e512bd4e1df00611f99dc5c27fd4 \ --hash=sha256:d51fde50a77f81330523562e3c2734ffdca9c4c9e9d355478117905e1cfe16c6 \ - --hash=sha256:d57dea657357230cc780e13920d7fa7db059d58fe721c80020f94476da4ca0a1 \ --hash=sha256:dae0f0bd7d30c0ad61b9a504e8e272cb8391eed3f1587edf933f4f6b33437450 \ --hash=sha256:db0562c5f71d18596dcd45e854cf2eeba27d7543e1a3acdafb7eef728f7fe85d \ --hash=sha256:e48d4dbe0f88e53081da605ae68644e5182752803bbc2beb228cca7f1c4454d6 \ --hash=sha256:eee884572b06bbe8a2b54f424dbd996139442cf83c76478e1ec162512e0dd2c7 \ - --hash=sha256:fc78739b5ec6e4fb02301984a3d442a91406e7700efbe305071e7fd1c78278f2 \ --hash=sha256:fceef7fe67c81e1585198215e42ad3fdba3a25644beda8fbdaf85f4d7b93175a # via fastembed -more-itertools==11.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d \ - --hash=sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192 +more-itertools==10.8.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b \ + --hash=sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd # via # jaraco-classes # jaraco-functools +mpmath==1.3.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f \ + --hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + # via sympy multidict==6.7.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9 \ - --hash=sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43 \ - --hash=sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c \ --hash=sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa \ --hash=sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6 \ - --hash=sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd \ - --hash=sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d \ --hash=sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3 \ - --hash=sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0 \ --hash=sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292 \ - --hash=sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed \ --hash=sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23 \ --hash=sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e \ --hash=sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582 \ - --hash=sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0 \ - --hash=sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e \ - --hash=sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a \ - --hash=sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d \ --hash=sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108 \ --hash=sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144 \ - --hash=sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060 \ --hash=sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56 \ - --hash=sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84 \ - --hash=sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71 \ --hash=sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7 \ - --hash=sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8 \ --hash=sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49 \ --hash=sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d \ --hash=sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445 \ - --hash=sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a \ --hash=sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33 \ - --hash=sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca \ - --hash=sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733 \ --hash=sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429 \ - --hash=sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6 \ --hash=sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172 \ - --hash=sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52 \ --hash=sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7 \ --hash=sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961 \ - --hash=sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b \ --hash=sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1 \ - --hash=sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c \ - --hash=sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a \ --hash=sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23 \ --hash=sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34 \ --hash=sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75 \ --hash=sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d \ --hash=sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855 \ - --hash=sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4 \ --hash=sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba # via # aiobotocore @@ -1738,8 +1471,8 @@ mypy-extensions==1.0.0 ; (platform_machine == 'arm64' and sys_platform == 'darwi nemo-anonymizer==0.2.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:369ee9f717e3c346328bcef9767da3b596d5b927b5f9cc162ece95766b1d8aad # via nemo-anonymizer-plugin -nemo-safe-synthesizer==0.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:e92564b8522ffc2360fb6daaca36e88a722206e165a4fe157e7ccf65b1cac260 +nemo-safe-synthesizer==0.1.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:fbf6f9179052d0ac27ad4493238009a5e1c7ae7775354f062d5e90725890b0ce # via nemo-safe-synthesizer-plugin nemoguardrails==0.21.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:b338453b371751f5b09637415702e2ee25f0885317b691cbb0d2f2f164eeea5d @@ -1763,8 +1496,8 @@ networkx==3.6.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # data-designer-engine # nvidia-nat-core # ragas -ngcsdk==4.19.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:945455d06f9a215772660472d2ff4432c67a53986f86a384a98fbee62b01e434 +ngcsdk==4.16.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:3fe7267fab02b5e4c63521ade365a708238113a1b19802e53fa699b548e13fce # via # nemo-platform-ext # nemo-platform-sdk @@ -1773,36 +1506,36 @@ nltk==3.9.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pla --hash=sha256:ed03bc098a40481310320808b2db712d95d13ca65b27372f8a403949c8b523d0 \ --hash=sha256:f2fa301c3a12718ce4a0e9305c5675299da5ad9e26068218b69d692fda84828f # via rouge-score -numpy==2.4.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f \ - --hash=sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47 \ - --hash=sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d \ - --hash=sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1 \ - --hash=sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41 \ - --hash=sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8 \ - --hash=sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0 \ - --hash=sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f \ - --hash=sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f \ - --hash=sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67 \ - --hash=sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b \ - --hash=sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93 \ - --hash=sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02 \ - --hash=sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853 \ - --hash=sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd \ - --hash=sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089 \ - --hash=sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb \ - --hash=sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a \ - --hash=sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8 \ - --hash=sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7 \ - --hash=sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605 \ - --hash=sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2 \ - --hash=sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe \ - --hash=sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb \ - --hash=sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d \ - --hash=sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a \ - --hash=sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda \ - --hash=sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6 \ - --hash=sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20 +numpy==2.4.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959 \ + --hash=sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd \ + --hash=sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7 \ + --hash=sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e \ + --hash=sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0 \ + --hash=sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103 \ + --hash=sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af \ + --hash=sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5 \ + --hash=sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7 \ + --hash=sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392 \ + --hash=sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c \ + --hash=sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40 \ + --hash=sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44 \ + --hash=sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5 \ + --hash=sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0 \ + --hash=sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e \ + --hash=sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015 \ + --hash=sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d \ + --hash=sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842 \ + --hash=sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed \ + --hash=sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f \ + --hash=sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e \ + --hash=sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83 \ + --hash=sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502 \ + --hash=sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115 \ + --hash=sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e \ + --hash=sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e \ + --hash=sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121 \ + --hash=sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d # via # data-designer-config # data-designer-engine @@ -1810,7 +1543,6 @@ numpy==2.4.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pl # fastembed # langchain-aws # langchain-community - # langchain-oci # nvidia-nat-config-optimizer # nvidia-nat-core # onnxruntime @@ -1822,9 +1554,9 @@ numpy==2.4.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pl # scikit-network # scipy # transformers -nvidia-ml-py==13.610.43 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:65437eb73d68d0c62c931ca4d45038472faff03bd0b8729abba4b899f70d60f2 \ - --hash=sha256:f13c72698edef492f985cc225f14faafe68ae065a2e407f45bdf6f4b9b43fde8 +nvidia-ml-py==13.595.45 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:b65a7977f503d56154b14d683710125ef93594adb63fbf7e559336e3318f1376 \ + --hash=sha256:c9f34897fe0441ff35bc8f35baf80f830a20b0f4e6ce71e0a325bc0e66acf079 # via # nemo-platform-ext # nemo-platform-sdk @@ -1860,9 +1592,9 @@ oauthlib==3.3.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9 \ --hash=sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1 # via requests-oauthlib -oci==2.178.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:830cb97cbcac818f8eb8d05d4abbc00192f4bcef10260b14d0978f649799a26e \ - --hash=sha256:d3a19859d80aa5c4988905e1a30b46dcc2af146c76f3d8c813129d71247d1a94 +oci==2.174.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:36c377fb59452b607686d73c1ae1604f2c19e3cabd7d12abe43a4404b10a17c5 \ + --hash=sha256:f960e413a7f0e59ca5523b57349165f992812bd2738abc34bd9fecbce4722733 # via # langchain-oci # oci-openai @@ -1870,24 +1602,24 @@ oci-openai==1.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') o --hash=sha256:1819ef7d17c1fdbe05c5c0653301fdca0d2fa99f6f8b1b7bd7667da9704d62a1 \ --hash=sha256:a028ee3e1a1b1ad4e0495b10ef70b81b5e6cd50e7f13cf485a112762641a9160 # via langchain-oci -onnxruntime==1.26.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:05b028781b322ad74b57ce5b50aa5280bb1fe96ceec334628ade681e0b24c1ac \ - --hash=sha256:11a8df4dcfe9ad5ff0bd71a7571dbed019fabc7594676c89fe8b86ea029c246f \ - --hash=sha256:35c7c7b0ac2e02001d28fab6c9fc24e9abc5e6faa35e6e19c63cecf1406ba89f \ - --hash=sha256:5e016edc15d3c19f36807e1c6b10be5b27807688c32720f91b5ae480a95215d0 \ - --hash=sha256:91f2bb870a4b9224eba0a6728c1fa7a9e552b8e59e1083c51fbbc3d013f2b5c0 \ - --hash=sha256:9b6dd70599005bd1bf29779f04a91978b92b5e719c11a20068a8f8e535f725b6 \ - --hash=sha256:bdbed8cf3b672b66acb032f33a253bc27f42bce6ece48ae3fab4fa483a5e96e0 \ - --hash=sha256:c07af6fc6d5557835f2b6ee7a96d8b3235d0c57a8e230efdedaee106a8a3cbc6 \ - --hash=sha256:ccce19c5f771b8268902f77d9fed9e88f9499465d6780808faa6611a789d33f0 \ - --hash=sha256:ee1109ef4ef27cad90e823399e61e03b3c6c7bfe0fb820b4baf3678c15be8b3c \ - --hash=sha256:f5fc48a91a046a6a5c9b147f83fb41d65d24d24923373b222cdd248f0f4f4aac +onnxruntime==1.24.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:046ff290045a387676941a02a8ae5c3ebec6b4f551ae228711968c4a69d8f6b7 \ + --hash=sha256:0bdfce8e9a6497cec584aab407b71bf697dac5e1b7b7974adc50bf7533bdb3a2 \ + --hash=sha256:0d640eb9f3782689b55cfa715094474cd5662f2f137be6a6f847a594b6e9705c \ + --hash=sha256:1700f559c8086d06b2a4d5de51e62cb4ff5e2631822f71a36db8c72383db71ee \ + --hash=sha256:1a5c5a544b22f90859c88617ecb30e161ee3349fcc73878854f43d77f00558b5 \ + --hash=sha256:4c74e268dc808e61e63784d43f9ddcdaf50a776c2819e8bd1d1b11ef64bf7e36 \ + --hash=sha256:cad1c2b3f455c55678ab2a8caa51fb420c25e6e3cf10f4c23653cdabedc8de78 \ + --hash=sha256:dc4aaed1e5e1aaacf2343c838a30a7c3ade78f13eeb16817411f929d04040a13 \ + --hash=sha256:e30c972bc02e072911aabb6891453ec73795386c0af2b761b65444b8a4c4745f \ + --hash=sha256:e54ad52e61d2d4618dcff8fa1480ac66b24ee2eab73331322db1049f11ccf330 \ + --hash=sha256:e99a48078baaefa2b50fe5836c319499f71f13f76ed32d0211f39109147a49e0 # via # fastembed # nemoguardrails -openai==2.41.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:20cc7952e8501c7e5773dd2ef7be437bae9cb549044902e1041a83a54516e375 \ - --hash=sha256:db5c362acd6604b84f076abbefa66826ea4b46ecba2954ed866e6a149a1352c0 +openai==2.35.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:164fd0477d001e784369f7cd81ccadb8db3c22f16b33973d8f95e3095c7f71d8 \ + --hash=sha256:607f62257d6be167240c6b82db052fabf940e3c4d9ad3e8629364e837a601395 # via # exa-py # instructor @@ -1899,7 +1631,6 @@ openai==2.41.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or ( # nemo-platform-plugin # nemo-platform-sdk # nemoguardrails - # nmp-evaluator # nmp-guardrails # oci-openai # ragas @@ -1907,20 +1638,20 @@ openai==2.41.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or ( openapi-pydantic==0.5.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146 \ --hash=sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d - # via fastmcp-slim + # via fastmcp openevals==0.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:2bce5964be9d162e3d38c2dfd026739156e1ac521536ade6b8e2f0a89b632f2c \ --hash=sha256:7e95fa64625be53eaa8c657d7f69b842a52bda10bdf3bb91781c7d09a385b069 # via nvidia-nat-langchain -openinference-semantic-conventions==0.1.30 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:36d946d3f95f699b7c4b12324ae9c1f02d6c7750df11eece56aa159cff430b3d \ - --hash=sha256:81fece76e09c83789e35c393b8b30523481eeabf1008745b955631a53e3221d9 +openinference-semantic-conventions==0.1.29 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:bbeb6472777a45a574169894bb9c4d80c6832a8befd32ab238cb875438ce1044 \ + --hash=sha256:f45e0b1cf79fe407af4722bcf391a01565f0878c95be3ebcc9382245d0367cc5 # via nvidia-nat-opentelemetry -opentelemetry-api==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714 \ - --hash=sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716 +opentelemetry-api==1.40.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:159be641c0b04d11e9ecd576906462773eb97ae1b657730f0ecf64d32071569f \ + --hash=sha256:82dd69331ae74b06f6a874704be0cfaa49a1650e1537d4a813b86ecef7d0ecf9 # via - # fastmcp-slim + # fastmcp # nemoguardrails # nvidia-nat-opentelemetry # opentelemetry-distro @@ -1937,44 +1668,41 @@ opentelemetry-api==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'da # opentelemetry-processor-baggage # opentelemetry-sdk # opentelemetry-semantic-conventions -opentelemetry-distro==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:b405b04ad70e430390265eb38e82e067a84ca1f49a21429eaadb930c13330d66 \ - --hash=sha256:f435098abc7953f58226e8bf79e4c90bc6b32e50aa75d6fa074201db8243b577 - # via - # nmp-evaluator - # nmp-guardrails -opentelemetry-exporter-otlp==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:2d9ebaed714377a67d224d46795ddcc11d2c877fa5de35fda70b6f3b010729a9 \ - --hash=sha256:aedd54545bb0587cd45210abdc8be545af9c01413f3307786e276df1e3c83bee +opentelemetry-distro==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:975b845f50181ad53753becf4fd4b123b54fa04df5a9d78812264436d6518981 \ + --hash=sha256:f21d1ac0627549795d75e332006dd068877f00e461b1b2e8fe4568d6eb7b9590 + # via nmp-guardrails +opentelemetry-exporter-otlp==1.40.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:48c87e539ec9afb30dc443775a1334cc5487de2f72a770a4c00b1610bf6c697d \ + --hash=sha256:7caa0870b95e2fcb59d64e16e2b639ecffb07771b6cd0000b5d12e5e4fef765a # via - # nmp-evaluator # nmp-guardrails # nvidia-nat-opentelemetry -opentelemetry-exporter-otlp-proto-common==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:04f1f01fb597c4249dfcd7f8b861c902c2102369d376d9d346ff38de4469a2ee \ - --hash=sha256:f48d395ab815b444da118868977e9798ea354c25737d5cf39578ae894011c140 +opentelemetry-exporter-otlp-proto-common==1.40.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:1cbee86a4064790b362a86601ee7934f368b81cd4cc2f2e163902a6e7818a0fa \ + --hash=sha256:7081ff453835a82417bf38dccf122c827c3cbc94f2079b03bba02a3165f25149 # via # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-http -opentelemetry-exporter-otlp-proto-grpc==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0ae1177e2038b18a929b3098215243631ef91136cba26b7e2b12790ceb7e87cc \ - --hash=sha256:975c4461f167dd8ed8857d68d3b6b25f3d272eab896f6a9470d0f5b90e2faf15 +opentelemetry-exporter-otlp-proto-grpc==1.40.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:2aa0ca53483fe0cf6405087a7491472b70335bc5c7944378a0a8e72e86995c52 \ + --hash=sha256:bd4015183e40b635b3dab8da528b27161ba83bf4ef545776b196f0fb4ec47740 # via # nmp-common # opentelemetry-exporter-otlp -opentelemetry-exporter-otlp-proto-http==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:00a16da1b312a1d6c7233d600d557c91df71125af73020f3b9a7765bd699d59d \ - --hash=sha256:bf142a21035d7571ac3a09cb2e5639f49886f243972883cfe777ed3bf02b734d +opentelemetry-exporter-otlp-proto-http==1.40.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:a8d1dab28f504c5d96577d6509f80a8150e44e8f45f82cdbe0e34c99ab040069 \ + --hash=sha256:db48f5e0f33217588bbc00274a31517ba830da576e59503507c839b38fa0869c # via # nmp-common # opentelemetry-exporter-otlp -opentelemetry-exporter-prometheus==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0efd00aa6b1939345ddcc6de141b83ebffa2b4401a37a68f880e54217602701d \ - --hash=sha256:31902e22c89431058a95b6dcdb644f9309f226aa4872cc755f0a780d2895e97f +opentelemetry-exporter-prometheus==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:3013b41f4370143d48d219a2351473761423e5882fa4c213811eaefacba39cb7 \ + --hash=sha256:7c4919bd8e79abd62b610767e80f42c9c3a06c5183f4dd9141eedeb57aea284b # via nmp-common -opentelemetry-instrumentation==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:32368d6ae52c8de20aa790a6ad86b10a76f09956092337ae37d675773990e541 \ - --hash=sha256:f1986716d52cc316ea5f60189098726a9071d8ecc0eee96c9ed110be08bade9c +opentelemetry-instrumentation==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:92a93a280e69788e8f88391247cc530fd81f16f2b011979d4d6398f805cfbc63 \ + --hash=sha256:cb21b48db738c9de196eba6b805b4ff9de3b7f187e4bbf9a466fa170514f1fc7 # via # opentelemetry-distro # opentelemetry-instrumentation-asgi @@ -1983,50 +1711,50 @@ opentelemetry-instrumentation==0.63b1 ; (platform_machine == 'arm64' and sys_pla # opentelemetry-instrumentation-requests # opentelemetry-instrumentation-sqlalchemy # opentelemetry-instrumentation-system-metrics -opentelemetry-instrumentation-asgi==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:1a22453dfa965f14799b10a674b8acbcb897a8a75c79136060af54214cc7886e \ - --hash=sha256:267b422416d768f3c7f4054883b41d9c3a7c943d86d20032b738c99a3dbb5862 +opentelemetry-instrumentation-asgi==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:9d08e127244361dc33976d39dd4ca8f128b5aa5a7ae425208400a80a095019b5 \ + --hash=sha256:e4b3ce6b66074e525e717efff20745434e5efd5d9df6557710856fba356da7a4 # via opentelemetry-instrumentation-fastapi -opentelemetry-instrumentation-fastapi==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:52ee2cde9a2ac094bdd45d79f85860e03a972928a2553006071fe61d94cf7281 \ - --hash=sha256:cc42dff56c96d0a2921510c4abab2a4c2e27fe64b26dc1254727fb550df100ba +opentelemetry-instrumentation-fastapi==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:3a24f35b07c557ae1bbc483bf8412221f25d79a405f8b047de8b670722e2fa9f \ + --hash=sha256:a1a844d846540d687d377516b2ff698b51d87c781b59f47c214359c4a241047c # via # nmp-common # nmp-guardrails -opentelemetry-instrumentation-httpx==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:14df6e99d81be9a8cd238f6639b6fa52404c4d3ce219058fcb5dc8c0f2211f86 \ - --hash=sha256:f41ec82f25c3abcdada621052db3e5fd648e3b43d55eec4b9c0c5d3ecb7b4ff4 +opentelemetry-instrumentation-httpx==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:6569ec097946c5551c2a4252f74c98666addd1bf047c1dde6b4ef426719ff8dd \ + --hash=sha256:dee05c93a6593a5dc3ae5d9d5c01df8b4e2c5d02e49275e5558534ee46343d5e # via # nmp-common # nmp-guardrails -opentelemetry-instrumentation-requests==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:513fcaa3d93debbdb359c00ce1a137a34a89ee908c51ac43beb7e8c18ac2b3cd \ - --hash=sha256:935c980a11e33bfd7ed969c741e4bd7c84077045651469f10e163534368d87f7 +opentelemetry-instrumentation-requests==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:15f879ce8fb206bd7e6fdc61663ea63481040a845218c0cf42902ce70bd7e9d9 \ + --hash=sha256:cce19b379949fe637eb73ba39b02c57d2d0805447ca6d86534aa33fcb141f683 # via nmp-guardrails -opentelemetry-instrumentation-sqlalchemy==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:621f9eb800ea24a98b4eda968373e3909bfede0ff47f77b96f8b8a18bc2a2a1a \ - --hash=sha256:d417414f6517963e9c1ee91ec971b94938b46904499114d035a43937bd62b6a1 +opentelemetry-instrumentation-sqlalchemy==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:13a3a159a2043a52f0180b3757fbaa26741b0e08abb50deddce4394c118956e6 \ + --hash=sha256:f115e0be54116ba4c327b8d7b68db4045ee18d44439d888ab8130a549c50d1c1 # via nmp-common -opentelemetry-instrumentation-system-metrics==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:995051f47876d79461aed8b7aa205d4584d90794ef864342cc748929c389bb42 \ - --hash=sha256:d6d4d7a1a854be4165143cf6420ee5894188762eb367d7bf9da5be4a83a4b632 +opentelemetry-instrumentation-system-metrics==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:3eb55f9a058797cf915946cbb7445e00b31316ac3e55050475792edf3367c321 \ + --hash=sha256:7d4fe3e0ce14e0e6eb18f5826100d6cc1af662e5a8ebc74e9b91fe23f192f3e8 # via nmp-common -opentelemetry-processor-baggage==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:334b77963ea5807efd6f05664a6064aa92fc6c03571edbf1f749b9dee370d567 \ - --hash=sha256:b205c343720ce4d5e420204e09862a043917ee433b2304d87bb6f388084f3c15 +opentelemetry-processor-baggage==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:4d1d2a624e3aa9a8b6c6d1f560ba2951f97acf875f57502a274c5078043a69d5 \ + --hash=sha256:f6b5937e93bda8f380d8f5f667355c7d127e9296b38dfacf39fd328ab410262c # via nmp-common -opentelemetry-proto==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:c6a51e6b4f05ae63565f3a113217f3d2bfaec68f78c02d7a6c85f9010d1cfca6 \ - --hash=sha256:dedb74cba2886c59c7789b227a7a670613025a07489040050aedff6e5c0fb43c +opentelemetry-proto==1.40.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:03f639ca129ba513f5819810f5b1f42bcb371391405d99c168fe6937c62febcd \ + --hash=sha256:266c4385d88923a23d63e353e9761af0f47a6ed0d486979777fe4de59dc9b25f # via # nmp-files # nmp-intake # opentelemetry-exporter-otlp-proto-common # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-http -opentelemetry-sdk==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:083cd4bbfaa5aa7b5a9e552430d9951219967cfb27aa61feb13a77aba1fc839d \ - --hash=sha256:8c834e8f8c9ba4171d4ec843d0cb8a67e4c7394d3f9e9297e582cbd9456ddbf7 +opentelemetry-sdk==1.40.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:18e9f5ec20d859d268c7cb3c5198c8d105d073714db3de50b593b8c1345a48f2 \ + --hash=sha256:787d2154a71f4b3d81f20524a8ce061b7db667d24e46753f32a7bc48f1c1f3f1 # via # nmp-common # nmp-guardrails @@ -2036,9 +1764,9 @@ opentelemetry-sdk==1.42.1 ; (platform_machine == 'arm64' and sys_platform == 'da # opentelemetry-exporter-otlp-proto-http # opentelemetry-exporter-prometheus # opentelemetry-processor-baggage -opentelemetry-semantic-conventions==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:3daf963611334b365e98a57438183eb012d3bfb40b2d931a9af613476b8701a9 \ - --hash=sha256:dfe5ef4dee82586b746f522b818ceb298d00b3d59f660042bd79404bff8d0682 +opentelemetry-semantic-conventions==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:072f65473c5d7c6dc0355b27d6c9d1a679d63b6d4b4b16a9773062cb7e31192a \ + --hash=sha256:fa530a96be229795f8cef353739b618148b0fe2b4b3f005e60e262926c4d38e2 # via # opentelemetry-instrumentation # opentelemetry-instrumentation-asgi @@ -2046,11 +1774,10 @@ opentelemetry-semantic-conventions==0.63b1 ; (platform_machine == 'arm64' and sy # opentelemetry-instrumentation-httpx # opentelemetry-instrumentation-requests # opentelemetry-instrumentation-sqlalchemy - # opentelemetry-instrumentation-system-metrics # opentelemetry-sdk -opentelemetry-util-http==0.63b1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:6284194028c59cd439f8acfe388145069a6127f11dc077e1344a2094adacc3f8 \ - --hash=sha256:ba1268f00922ee522dba2ae38458060f99486e7385a8056985901ca9685adfff +opentelemetry-util-http==0.61b0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:1039cb891334ad2731affdf034d8fb8b48c239af9b6dd295e5fabd07f1c95572 \ + --hash=sha256:8e715e848233e9527ea47e275659ea60a57a75edf5206a3b937e236a6da5fc33 # via # opentelemetry-instrumentation-asgi # opentelemetry-instrumentation-fastapi @@ -2060,38 +1787,26 @@ optuna==4.4.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p --hash=sha256:a9029f6a92a1d6c8494a94e45abd8057823b535c2570819072dbcdc06f1c1da4 \ --hash=sha256:fad8d9c5d5af993ae1280d6ce140aecc031c514a44c3b639d8c8658a8b7920ea # via nvidia-nat-config-optimizer -orjson==3.11.9 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:011382e2a60fda9d46f1cdee31068cfc52ffe952b587d683ec0463002802a0f4 \ - --hash=sha256:03db380e3780fa0015ed776a90f20e8e20bb11dde13b216ce19e5718e3dfba62 \ - --hash=sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a \ - --hash=sha256:147302878da387104b66bb4a8b0227d1d487e976ce41a8501916161072ed87b1 \ - --hash=sha256:26a473dbb4162108b27901492546f83c76fdcea3d0eadff00ae7a07e18dcce09 \ - --hash=sha256:33d7d766701847dc6729846362dc27895d2f2d2251264f9d10e7cb9878194877 \ - --hash=sha256:3513550321f8c8c811a7c3297b8a630e82dc08e4c10216d07703c997776236cd \ - --hash=sha256:380cdce7ba24989af81d0a7013d0aaec5d0e2a21734c0e2681b1bc4f141957fe \ - --hash=sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97 \ - --hash=sha256:3ebca4179031ee716ed076ffadc29428e900512f6fccee8614c9983157fcf19c \ - --hash=sha256:48ee05097750de0ff69ed5b7bbcf0732182fd57a24043dcc2a1da780a5ead3a5 \ - --hash=sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021 \ - --hash=sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362 \ - --hash=sha256:4d7fde5501b944f83b3e665e1b31343ff6e154b15560a16b7130ea1e594a4206 \ - --hash=sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218 \ - --hash=sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9 \ - --hash=sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f \ - --hash=sha256:63e0efbc991250c0b3143488fa57d95affcabbfc63c99c48d625dd37779aafe2 \ - --hash=sha256:71e63adb0e1f1ed5d9e168f50a91ceb93ae6420731d222dc7da5c69409aa47aa \ - --hash=sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c \ - --hash=sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677 \ - --hash=sha256:9ef6fe90aadef185c7b128859f40beb24720b4ecea95379fc9000931179c3a49 \ - --hash=sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0 \ - --hash=sha256:a6082706765a95a6680d812e1daf1c0cfe8adec7831b3ff3b625693f3b461b1c \ - --hash=sha256:a8f5f8bc7ce7d59f08d9f99fa510c06496164a24cb5f3d34537dbd9ca30132e2 \ - --hash=sha256:be4fa4f0af7fa18951f7ab3fc2148e223af211bf03f59e1c6034ec3f97f21d61 \ - --hash=sha256:c5d001196b89fa9cf0a4ab79766cd835b991a166e4b621ba95089edc50c429ff \ - --hash=sha256:d8ea516b3726d190e1b4297e6f4e7a8650347ae053868a18163b4dd3641d1fff \ - --hash=sha256:e5c9b8f28e726e97d97696c826bc7bea5d71cecd63576dba92924a32c1961291 \ - --hash=sha256:f01c4818b3fc9b0da8e096722a84318071eaa118df35f6ed2344da0e73a5444f \ - --hash=sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81 +orjson==3.11.8 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0022bb50f90da04b009ce32c512dc1885910daa7cb10b7b0cba4505b16db82a8 \ + --hash=sha256:003646067cc48b7fcab2ae0c562491c9b5d2cbd43f1e5f16d98fd118c5522d34 \ + --hash=sha256:093d489fa039ddade2db541097dbb484999fcc65fc2b0ff9819141e2ab364f25 \ + --hash=sha256:1cd0b77e77c95758f8e1100139844e99f3ccc87e71e6fc8e1c027e55807c549f \ + --hash=sha256:3f23426851d98478c8970da5991f84784a76682213cd50eb73a1da56b95239dc \ + --hash=sha256:53a0f57e59a530d18a142f4d4ba6dfc708dc5fdedce45e98ff06b44930a2a48f \ + --hash=sha256:5f8952d6d2505c003e8f0224ff7858d341fa4e33fef82b91c4ff0ef070f2393c \ + --hash=sha256:6a3d159d5ffa0e3961f353c4b036540996bf8b9697ccc38261c0eac1fd3347a6 \ + --hash=sha256:705b895b781b3e395c067129d8551655642dfe9437273211d5404e87ac752b53 \ + --hash=sha256:708c95f925a43ab9f34625e45dcdadf09ec8a6e7b664a938f2f8d5650f6c090b \ + --hash=sha256:76070a76e9c5ae661e2d9848f216980d8d533e0f8143e6ed462807b242e3c5e8 \ + --hash=sha256:88006eda83858a9fdf73985ce3804e885c2befb2f506c9a3723cdeb5a2880e3e \ + --hash=sha256:96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e \ + --hash=sha256:97c8f5d3b62380b70c36ffacb2a356b7c6becec86099b177f73851ba095ef623 \ + --hash=sha256:9b48e274f8824567d74e2158199e269597edf00823a1b12b63d48462bbf5123e \ + --hash=sha256:a5c370674ebabe16c6ccac33ff80c62bf8a6e59439f5e9d40c1f5ab8fd2215b7 \ + --hash=sha256:ebaed4cef74a045b83e23537b52ef19a367c7e3f536751e355a2a394f8648559 \ + --hash=sha256:ed193ce51d77a3830cad399a529cd4ef029968761f43ddc549e1bc62b40d88f8 \ + --hash=sha256:f30491bc4f862aa15744b9738517454f1e46e56c972a2be87d70d727d5b2a8f8 # via # langgraph-sdk # langsmith @@ -2099,35 +1814,29 @@ orjson==3.11.9 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or ( # pymilvus ormsgpack==1.12.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:0b39e629fd2e1c5b2f46f99778450b59454d1f901bc507963168985e79f09c5d \ - --hash=sha256:29a9f17a3dac6054c0dce7925e0f4995c727f7c41859adf9b5572180f640d172 \ --hash=sha256:34d5b28b3570e9fed9a5a76528fc7230c3c76333bc214798958e58e9b79cc18a \ - --hash=sha256:3708693412c28f3538fb5a65da93787b6bbab3484f6bc6e935bfb77a62400ae5 \ --hash=sha256:39c1bd2092880e413902910388be8715f70b9f15f20779d44e673033a6146f2d \ --hash=sha256:43013a3f3e2e902e1d05e72c0f1aeb5bedbb8e09240b51e26792a3c89267e181 \ --hash=sha256:50b7249244382209877deedeee838aef1542f3d0fc28b8fe71ca9d7e1896a0d7 \ --hash=sha256:58d379d72b6c5e964851c77cfedfb386e474adee4fd39791c2c5d9efb53505cc \ - --hash=sha256:5af04800d844451cf102a59c74a841324868d3f1625c296a06cc655c542a6685 \ --hash=sha256:5ea60cb5f210b1cfbad8c002948d73447508e629ec375acb82910e3efa8ff355 \ --hash=sha256:7a29d09b64b9694b588ff2f80e9826bdceb3a2b91523c5beae1fab27d5c940e7 \ --hash=sha256:7c8b1667a72cbba74f0ae7ecf3105a5e01304620ed14528b2cb4320679d2869b \ --hash=sha256:8463a3fc5f09832e67bdb0e2fda6d518dc4281b133166146a67f54c08496442e \ --hash=sha256:944a2233640273bee67521795a73cf1e959538e0dfb7ac635505010455e53b33 \ - --hash=sha256:958dcb270d30a7cb633a45ee62b9444433fa571a752d2ca484efdac07480876e \ --hash=sha256:bd5f4bf04c37888e864f08e740c5a573c4017f6fd6e99fa944c5c935fabf2dd9 \ --hash=sha256:c6a4c34ddef109647c769d69be65fa1de7a6022b02ad45546a69b3216573eb4a \ --hash=sha256:cec70477d4371cd524534cd16472d8b9cc187e0e3043a8790545a9a9b296c258 \ - --hash=sha256:df6961442140193e517303d0b5d7bc2e20e69a879c2d774316125350c4a76b92 \ - --hash=sha256:eddffb77eff0bad4e67547d67a130604e7e2dfbb7b0cde0796045be4090f35c6 \ --hash=sha256:f3601f19afdbea273ed70b06495e5794606a8b690a568d6c996a90d7255e51c1 \ --hash=sha256:fcd55e5f6ba0dbce624942adf9f152062135f991a0126064889f68eb850de0dd # via langgraph-checkpoint -packaging==26.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e \ - --hash=sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661 +packaging==26.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4 \ + --hash=sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529 # via # data-designer # datasets - # fastmcp-slim + # fastmcp # gunicorn # huggingface-hub # langchain-core @@ -2175,13 +1884,13 @@ pandas==2.3.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # nvidia-nat-config-optimizer # nvidia-nat-core # pymilvus -pathable==0.6.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:6404b8b82aef5ff0fd478934137128b99b12212ba35afdde5525ca4f8388ea58 \ - --hash=sha256:82c4ca6c98c502ad12e0d4e9779b6210afee93c38990988c8c5d1b49bdcdf566 +pathable==0.4.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2 \ + --hash=sha256:6905a3cd17804edfac7875b5f6c9142a218c7caef78693c2dbbbfbac186d88b2 # via jsonschema-path -pathspec==1.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a \ - --hash=sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189 +pathspec==1.0.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645 \ + --hash=sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723 # via sqlfluff pillow==12.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9 \ @@ -2225,9 +1934,9 @@ pillow==12.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or ( # data-designer-config # fastembed # ragas -pip==26.1.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:382ff9f685ee3bc25864f820aa50505825f10f5458ffff07e30a6d96e5715cab \ - --hash=sha256:f49cd134c61cf2fd75e0ce2676db03e4054504a5a4986d00f8299ae632dc4605 +pip==26.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:99cb1c2899893b075ff56e4ed0af55669a955b49ad7fb8d8603ecdaf4ed653fb \ + --hash=sha256:d36762751d156a4ee895de8af39aa0abeeeb577f93a2eca6ab62467bbf0f8a78 # via nvidia-nat-core pkce==1.0.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:55927e24c7d403b2491ebe182b95d9dcb1807643243d47e3879fbda5aad4471d \ @@ -2237,11 +1946,11 @@ pkginfo==1.12.1.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') o --hash=sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b \ --hash=sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343 # via nvidia-nat-core -platformdirs==4.10.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7 \ - --hash=sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a +platformdirs==4.9.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934 \ + --hash=sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868 # via - # fastmcp-slim + # fastmcp # nvidia-nat-core # sqlfluff pluggy==1.6.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ @@ -2262,9 +1971,9 @@ prettytable==3.17.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') --hash=sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0 \ --hash=sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287 # via ngcsdk -prometheus-client==0.25.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28 \ - --hash=sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1 +prometheus-client==0.24.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055 \ + --hash=sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9 # via # nmp-common # opentelemetry-exporter-prometheus @@ -2281,61 +1990,33 @@ prompt-toolkit==3.0.52 ; (platform_machine == 'arm64' and sys_platform == 'darwi # nemo-platform-ext # nemo-platform-sdk # nemoguardrails -propcache==0.5.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427 \ - --hash=sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa \ - --hash=sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a \ - --hash=sha256:0fd59b5af35f74da48d905dcbad55449ba13be91823cb05a9bd590bbf5b61660 \ - --hash=sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94 \ - --hash=sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42 \ - --hash=sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33 \ - --hash=sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a \ - --hash=sha256:2293949b855ce597f2826452d17c2d545fb5622379c4ea6fdf525e9b8e8a2511 \ - --hash=sha256:26a4dca084132874e639895c3135dfad5eb20bae209f62d1aeb31b03e601c3c0 \ - --hash=sha256:29f9309a2e42b0d273be006fdb4be2d6c39a47f6f57d8fb1cf9f81481df81b66 \ - --hash=sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb \ - --hash=sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853 \ - --hash=sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55 \ - --hash=sha256:3b199b9b2b3d6a7edf3183ba8a9a137a22b97f7df525feb5ae1eccf026d2a9c6 \ - --hash=sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704 \ - --hash=sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f \ - --hash=sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64 \ - --hash=sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d \ - --hash=sha256:552ffadf6ad409844bc5919c42a0a83d88314cedddaea0e41e80a8b8fffe881f \ - --hash=sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba \ - --hash=sha256:5aaa2b923c1944ac8febd6609cb373540a5563e7cbcb0fd770f75dace2eb817b \ - --hash=sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144 \ - --hash=sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e \ - --hash=sha256:66ea454f095ddf5b6b14f56c064c0941c4788be11e18d2464cf643bf7203ff67 \ - --hash=sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476 \ - --hash=sha256:74b70780220e2dd89175ca24b81b68b67c83db499ae611e7f2313cb329801c78 \ - --hash=sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a \ - --hash=sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba \ - --hash=sha256:85341b12b9d55bad0bded24cac341bb34289469e03a11f3f583ea1cc1db0326c \ - --hash=sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9 \ - --hash=sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913 \ - --hash=sha256:95f1e3f4760d404b13c9976c0229b2b49a3c8e2c62a9ce92efdd2b11ada75e3f \ - --hash=sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d \ - --hash=sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4 \ - --hash=sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f \ - --hash=sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836 \ - --hash=sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe \ - --hash=sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1 \ - --hash=sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a \ - --hash=sha256:c6844ba6364fb12f403928a82cfd295ab103a2b315c77c747b2dbe4a41894ea7 \ - --hash=sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a \ - --hash=sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164 \ - --hash=sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568 \ - --hash=sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4 \ - --hash=sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2 \ - --hash=sha256:e59bc9e66329185b93dab73f210f1a37f81cb40f321501db8017c9aea15dba27 \ - --hash=sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf \ - --hash=sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f \ - --hash=sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc \ - --hash=sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c \ - --hash=sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7 \ - --hash=sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098 \ - --hash=sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751 +propcache==0.4.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3 \ + --hash=sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf \ + --hash=sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe \ + --hash=sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75 \ + --hash=sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566 \ + --hash=sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf \ + --hash=sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1 \ + --hash=sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af \ + --hash=sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf \ + --hash=sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e \ + --hash=sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1 \ + --hash=sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b \ + --hash=sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f \ + --hash=sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66 \ + --hash=sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0 \ + --hash=sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237 \ + --hash=sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835 \ + --hash=sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74 \ + --hash=sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f \ + --hash=sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2 \ + --hash=sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72 \ + --hash=sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207 \ + --hash=sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d \ + --hash=sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e \ + --hash=sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570 \ + --hash=sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48 # via # aiohttp # yarl @@ -2343,7 +2024,6 @@ protobuf==6.33.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901 \ --hash=sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a \ --hash=sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135 \ - --hash=sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3 \ --hash=sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2 \ --hash=sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593 # via @@ -2368,71 +2048,48 @@ psutil==7.2.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # nemo-platform-sdk # ngcsdk # opentelemetry-instrumentation-system-metrics -psycopg2-binary==2.9.12 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:00814e40fa23c2b37ef0a1e3c749d89982c73a9cb5046137f0752a22d432e82f \ - --hash=sha256:0dc9228d47c46bda253d2ecd6bb93b56a9f2d7ad33b684a1fa3622bf74ffe30c \ - --hash=sha256:1c8ad4c08e00f7679559eaed7aff1edfffc60c086b976f93972f686384a95e2c \ - --hash=sha256:29d4d134bd0ab46ffb04e94aa3c5fa3ef582e9026609165e2f758ff76fc3a3be \ - --hash=sha256:3471336e1acfd9c7fe507b8bad5af9317b6a89294f9eb37bd9a030bb7bebcdc6 \ - --hash=sha256:3d999bd982a723113c1a45b55a7a6a90d64d0ed2278020ed625c490ff7bef96c \ - --hash=sha256:40e7b28b63aaf737cb3a1edc3a9bbc9a9f4ad3dcb7152e8c1130e4050eddcb7d \ - --hash=sha256:411e85815652d13560fbe731878daa5d92378c4995a22302071890ec3397d019 \ - --hash=sha256:4413d0caef93c5cf50b96863df4c2efe8c269bf2267df353225595e7e15e8df7 \ - --hash=sha256:4766ab678563054d3f1d064a4db19cc4b5f9e3a8d9018592a8285cf200c248f3 \ - --hash=sha256:4dfcf8e45ebb0c663be34a3442f65e17311f3367089cd4e5e3a3e8e62c978777 \ - --hash=sha256:5a0253224780c978746cb9be55a946bcdaf40fe3519c0f622924cdabdafe2c39 \ - --hash=sha256:5ac9444edc768c02a6b6a591f070b8aae28ff3a99be57560ac996001580f294c \ - --hash=sha256:612b965daee295ae2da8f8218ce1d274645dc76ef3f1abf6a0a94fd57eff876d \ - --hash=sha256:66a7685d7e548f10fb4ce32fb01a7b7f4aa702134de92a292c7bd9e0d3dbd290 \ - --hash=sha256:7af18183109e23502c8b2ae7f6926c0882766f35b5175a4cd737ad825e4d7a1b \ - --hash=sha256:83946ba43979ebfdc99a3cd0ee775c89f221df026984ba19d46133d8d75d3cd9 \ - --hash=sha256:89d19a9f7899e8eb0656a2b3a08e0da04c720a06db6e0033eab5928aabe60fa9 \ - --hash=sha256:98062447aebc20ed20add1f547a364fd0ef8933640d5372ff1873f8deb9b61be \ - --hash=sha256:995ce929eede89db6254b50827e2b7fd61e50d11f0b116b29fffe4a2e53c4580 \ - --hash=sha256:9fe06d93e72f1c048e731a2e3e7854a5bfaa58fc736068df90b352cefe66f03f \ - --hash=sha256:b4a9eaa6e7f4ff91bec10aa3fb296878e75187bced5cc4bafe17dc40915e1326 \ - --hash=sha256:b9a339b79d37c1b45f3235265f07cdeb0cb5ad7acd2ac7720a5920989c17c24e \ - --hash=sha256:c41321a14dd74aceb6a9a643b9253a334521babfa763fa873e33d89cfa122fb5 \ - --hash=sha256:c6528cefc8e50fcc6f4a107e27a672058b36cc5736d665476aeb413ba88dbb06 \ - --hash=sha256:d3227a3bc228c10d21011a99245edca923e4e8bf461857e869a507d9a41fe9f6 \ - --hash=sha256:e4e184b1fb6072bf05388aa41c697e1b2d01b3473f107e7ec44f186a32cfd0b8 \ - --hash=sha256:f921f3cd87035ef7df233383011d7a53ea1d346224752c1385f1edfd790ceb6a - # via - # nmp-entities - # nmp-evaluator -py-key-value-aio==0.4.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:ab862adbcb8c72547d1c57821f22cbbb71ab86509039c96f36e914e0336c8dd7 \ - --hash=sha256:c6563a2c6abe5da5e20f4f9e875c2a9b425a2244a54fadbf46cf140a9eea45d7 - # via fastmcp-slim -py-rust-stemmers==0.1.8 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:08c258deab6d994551a92e9468ce88e58f97e636e73d9c5763978a57d7675a13 \ - --hash=sha256:0a68745d4b3c7f5abc778ca967e8711df6154873abcfe4e62a6631fa2363cc32 \ - --hash=sha256:1686fc009869ff8bcc1d5a305f071eeb8c3b3612a9827bcadd4e61fdb5727179 \ - --hash=sha256:21ed8055cec1f78d666afad8ffd7a51775ba419d2c615b8a1df7b32ca7f33e2b \ - --hash=sha256:234fdcb58f4d907877ed03c9358668a149b5a66d096abcf43c324a4f5697d36d \ - --hash=sha256:2e86ad68fe297a6652f0f0390625ea81858b6f27862fd4c5ee1214bf5af29b9d \ - --hash=sha256:3007ad4ec51e0c352ae410234a24a9ac75fab0c1e06c585fbac9fcced69385f8 \ - --hash=sha256:35570098da02eb439afcd7270a12bf850bbe874b85cb912e0fb2d87a6e703920 \ - --hash=sha256:40c86be90cee4a709ad84fde4db7f11ca44d65630a56b77ec86fe84c23adfc09 \ - --hash=sha256:4a1e11d22a240318dc917266eb3c85919455b6ea834445b95997712d9ede6b93 \ - --hash=sha256:4b90fc81411943b114e8eb4988a876ba3b12bd2d20741559803eddc4131575dc \ - --hash=sha256:515884bcfb47b10335146648f276930d0c1201ae5e8b7b400fb46d8ea05c0ec2 \ - --hash=sha256:51d0042d2a92ef0f7048bfc06b6c2a02306af31ea47f09d24b34e4b7e63c4e80 \ - --hash=sha256:56cc2c2df742fa6529285b7d204720f34b7da789ed78eb578442f93c6de97d89 \ - --hash=sha256:5cc8fab9d0f1b274a26935a632362b8278f03e81b65e8b8644d5ca3f62a5a1a4 \ - --hash=sha256:6b0f6f48bc54d607aed802de872fcd5a71bae969a6760976dc78ce55e8eaf3da \ - --hash=sha256:6c92733b020534470ca5a0d7fe8b85c85622ff383d4f37fec75a1c677aa84921 \ - --hash=sha256:769f37882905da2311cb720681b112eb70a4e6bd56fb424d473427b5379c8396 \ - --hash=sha256:7cc0cc0b8eb45d2158c28ea43e2f338c110aad63052ad3bd00bc7446a595e12f \ - --hash=sha256:870afb2d1d4731bd2d74b715b34439b29734e4dc94c55342096f07669f7f9fa0 \ - --hash=sha256:89d3d34094b9b6078a8ea6fe1c7044e5fd32f14e76c94818c5008f49ae075f08 \ - --hash=sha256:9ab605a86c950ba7e8ab1392cf91296c0bec3084babb897a4aecf90a10c82395 \ - --hash=sha256:ae773e1d01e9aa328d175f461475d0cd7074a82bfcc71de6dc5765e51f1cc9f7 \ - --hash=sha256:bfc185b599e646a0e39d11df3f5e6d15edefb110496601556385d33b55fed5de \ - --hash=sha256:dca0ae40715238582d6f1824b61d09ea3982359a061b69798ab5732b3ba0d4c5 \ - --hash=sha256:eee4af7ada2ce9cb3ec59ffe8458148c3933a86507d816bf954ee506a0e45b61 \ - --hash=sha256:f16deb1557b8253d8c11693047bec4ed67d6b09ae0f84c8b896ea03ac2fc8925 \ - --hash=sha256:fa42f5f8feb694aaaa869eedf477fcaf66f67a192cd64d94302d06920c33864a +psycopg2-binary==2.9.11 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:04195548662fa544626c8ea0f06561eb6203f1984ba5b4562764fbeb4c3d14b1 \ + --hash=sha256:2c226ef95eb2250974bf6fa7a842082b31f68385c4f3268370e3f3870e7859ee \ + --hash=sha256:2e164359396576a3cc701ba8af4751ae68a07235d7a380c631184a611220d9a4 \ + --hash=sha256:366df99e710a2acd90efed3764bb1e28df6c675d33a7fb40df9b7281694432ee \ + --hash=sha256:5c6ff3335ce08c75afaed19e08699e8aacf95d4a260b495a4a8545244fe2ceb3 \ + --hash=sha256:62b6d93d7c0b61a1dd6197d208ab613eb7dcfdcca0a49c42ceb082257991de9d \ + --hash=sha256:763c93ef1df3da6d1a90f86ea7f3f806dc06b21c198fa87c3c25504abec9404a \ + --hash=sha256:8c55b385daa2f92cb64b12ec4536c66954ac53654c7f15a203578da4e78105c0 \ + --hash=sha256:ab8905b5dcb05bf3fb22e0cf90e10f469563486ffb6a96569e51f897c750a76a \ + --hash=sha256:b6aed9e096bf63f9e75edf2581aa9a7e7186d97ab5c177aa6c87797cd591236c \ + --hash=sha256:ba34475ceb08cccbdd98f6b46916917ae6eeb92b5ae111df10b544c3a4621dc4 \ + --hash=sha256:cffe9d7697ae7456649617e8bb8d7a45afb71cd13f7ab22af3e5c61f04840908 \ + --hash=sha256:ebb415404821b6d1c47353ebe9c8645967a5235e6d88f914147e7fd411419e6f \ + --hash=sha256:ef7a6beb4beaa62f88592ccc65df20328029d721db309cb3250b0aae0fa146c3 \ + --hash=sha256:f090b7ddd13ca842ebfe301cd587a76a4cf0913b1e429eb92c1be5dbeb1a19bc \ + --hash=sha256:fa0f693d3c68ae925966f0b14b8edda71696608039f4ed61b1fe9ffa468d16db + # via nmp-entities +py-key-value-aio==0.4.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:18e17564ecae61b987f909fc2cd41ee2012c84b4b1dcb8c055cf8b4bc1bf3f5d \ + --hash=sha256:e3012e6243ed7cc09bb05457bd4d03b1ba5c2b1ca8700096b3927db79ffbbe55 + # via fastmcp +py-rust-stemmers==0.1.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:191ea8bf922c984631ffa20bf02ef0ad7eec0465baeaed3852779e8f97c7e7a3 \ + --hash=sha256:1c3593d895453fa06bf70a7b76d6f00d06def0f91fc253fe4260920650c5e078 \ + --hash=sha256:1f9efc4da5e734bdd00612e7506de3d0c9b7abc4b89d192742a0569d0d1fe749 \ + --hash=sha256:31ff4fb9417cec35907c18a6463e3d5a4941a5aa8401f77fbb4156b3ada69e3f \ + --hash=sha256:4d62410ada44a01e02974b85d45d82f4b4c511aae9121e5f3c1ba1d0bea9126b \ + --hash=sha256:4e308fc7687901f0c73603203869908f3156fa9c17c4ba010a7fcc98a7a1c5f2 \ + --hash=sha256:5845709d48afc8b29e248f42f92431155a3d8df9ba30418301c49c6072b181b0 \ + --hash=sha256:804944eeb5c5559443d81f30c34d6e83c6292d72423f299e42f9d71b9d240941 \ + --hash=sha256:85944262c248ea30444155638c9e148a3adc61fe51cf9a3705b4055b564ec95d \ + --hash=sha256:910d87d39ba75da1fe3d65df88b926b4b454ada8d73893cbd36e258a8a648158 \ + --hash=sha256:96ccc7fd042ffc3f7f082f2223bb7082ed1423aa6b43d5d89ab23e321936c045 \ + --hash=sha256:a231dc6f0b2a5f12a080dfc7abd9e6a4ea0909290b10fd0a4620e5a0f52c3d17 \ + --hash=sha256:b28ef729a4c83c7d9418be3c23c0372493fcccc67e86783ff04596ef8a208cdf \ + --hash=sha256:c52c5c326de78c70cfc71813fa56818d1bd4894264820d037d2be0e805b477bd \ + --hash=sha256:d8f374c0f26ef35fb87212686add8dff394bcd9a1364f14ce40fe11504e25e30 \ + --hash=sha256:e48bfd5e3ce9d223bfb9e634dc1425cf93ee57eef6f56aa9a7120ada3990d4be \ + --hash=sha256:e9c310cfb5c2470d7c7c8a0484725965e7cab8b1237e106a0863d5741da3e1f7 \ + --hash=sha256:ef18cfced2c9c676e0d7d172ba61c3fab2aa6969db64cc8f5ca33a7759efbefe \ + --hash=sha256:ffd946a36e9ac17ca96821963663012e04bc0ee94d21e8b5ae034721070b436c # via fastembed pyarrow==22.0.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:1a812a5b727bc09c3d7ea072c4eebf657c2f7066155506ba31ebf4792f88f016 \ @@ -2464,9 +2121,9 @@ pycparser==3.0 ; (implementation_name != 'PyPy' and platform_machine == 'arm64' --hash=sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29 \ --hash=sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992 # via cffi -pydantic==2.13.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba \ - --hash=sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6 +pydantic==2.12.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49 \ + --hash=sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d # via # anthropic # data-designer-config @@ -2474,7 +2131,7 @@ pydantic==2.13.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # exa-py # fastapi # fastapi-cloud-cli - # fastmcp-slim + # fastmcp # instructor # langchain # langchain-aws @@ -2503,7 +2160,6 @@ pydantic==2.13.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # nmp-automodel # nmp-common # nmp-entities - # nmp-evaluator # nmp-files # nmp-inference-gateway # nmp-intake @@ -2520,49 +2176,33 @@ pydantic==2.13.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # ragas # sqlmodel # switchyard -pydantic-core==2.46.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0 \ - --hash=sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262 \ - --hash=sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b \ - --hash=sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2 \ - --hash=sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398 \ - --hash=sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3 \ - --hash=sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4 \ - --hash=sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df \ - --hash=sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7 \ - --hash=sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987 \ - --hash=sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712 \ - --hash=sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1 \ - --hash=sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be \ - --hash=sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea \ - --hash=sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826 \ - --hash=sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7 \ - --hash=sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d \ - --hash=sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc \ - --hash=sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3 \ - --hash=sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b \ - --hash=sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04 \ - --hash=sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b \ - --hash=sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce \ - --hash=sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4 \ - --hash=sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a \ - --hash=sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f \ - --hash=sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76 \ - --hash=sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109 \ - --hash=sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848 \ - --hash=sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526 \ - --hash=sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458 \ - --hash=sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf \ - --hash=sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4 \ - --hash=sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd \ - --hash=sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30 \ - --hash=sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7 \ - --hash=sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c \ - --hash=sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3 \ - --hash=sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76 \ - --hash=sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4 \ - --hash=sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c \ - --hash=sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e +pydantic-core==2.41.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740 \ + --hash=sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84 \ + --hash=sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0 \ + --hash=sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e \ + --hash=sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0 \ + --hash=sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34 \ + --hash=sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808 \ + --hash=sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a \ + --hash=sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284 \ + --hash=sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586 \ + --hash=sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc \ + --hash=sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c \ + --hash=sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b \ + --hash=sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b \ + --hash=sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858 \ + --hash=sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2 \ + --hash=sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc \ + --hash=sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1 \ + --hash=sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56 \ + --hash=sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c \ + --hash=sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e \ + --hash=sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69 \ + --hash=sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c \ + --hash=sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f \ + --hash=sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad \ + --hash=sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b # via # instructor # pydantic @@ -2570,12 +2210,11 @@ pydantic-extra-types==2.11.1 ; (platform_machine == 'arm64' and sys_platform == --hash=sha256:1722ea2bddae5628ace25f2aa685b69978ef533123e5638cfbddb999e0100ec1 \ --hash=sha256:46792d2307383859e923d8fcefa82108b1a141f8a9c0198982b3832ab5ef1049 # via fastapi -pydantic-settings==2.14.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de \ - --hash=sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa +pydantic-settings==2.8.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c \ + --hash=sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585 # via # fastapi - # fastmcp-slim # langchain-community # mcp # nemo-automodel-plugin @@ -2587,7 +2226,6 @@ pydantic-settings==2.14.1 ; (platform_machine == 'arm64' and sys_platform == 'da # nmp-automodel # nmp-common # nmp-entities - # nmp-evaluator # nmp-files # nmp-guardrails # nmp-inference-gateway @@ -2604,10 +2242,9 @@ pygments==2.20.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # nemo-anonymizer # pytest # rich - # rich-rst -pyjwt==2.13.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423 \ - --hash=sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728 +pyjwt==2.12.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c \ + --hash=sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b # via # mcp # nmp-common @@ -2623,7 +2260,6 @@ pymilvus==2.6.9 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:c53a3d84ff15814e251be13edda70a98a1c8a6090d7597a908387cbb94a9504a # via # langchain-milvus - # nmp-evaluator # nvidia-nat-core pyopenssl==26.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:4f9d971bc5298b8bc1fab282803da04bf000c755d4ad9d99b52de2569ca19a70 \ @@ -2634,21 +2270,11 @@ pyopenssl==26.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') o pyperclip==1.11.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6 \ --hash=sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273 - # via fastmcp-slim + # via fastmcp pytest==9.0.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9 \ --hash=sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c # via sqlfluff -python-box==7.4.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:3f76dad8be9d57d65a3edc792b952f7afe3991515aa6eba616cf5efb2fbb2e0c \ - --hash=sha256:85db37b43094bf6c4884b931fb149a7850db5ce331f6e191edf98b453e6cf2d6 \ - --hash=sha256:a3b0d84d003882fb6abe505b1b883b3a5dcbf226b0fe168d24bc5ff75d9826e5 \ - --hash=sha256:b7f977f00e715b030cee6ffef2322ff8ce100ffbf1dbcc4ef91099c75752d5f8 \ - --hash=sha256:bb204822c7638bd2dbed5c55d6ab264c6903c37d18dee5c45bdbda58b2e1e17a \ - --hash=sha256:c66582f41a94d46cb0896d468b0efebf9bc4c3a5634cd15373d871767c2e741d \ - --hash=sha256:dfb91effff00d9e23486c4f0db3b19e03d602ebb7c9e20fc6a287c704fad2552 \ - --hash=sha256:e412e36c25fca8223560516d53ef6c7993591c3b0ec8bb4ec582bf7defdd79f0 - # via nmp-evaluator python-dateutil==2.9.0.post0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 @@ -2665,7 +2291,7 @@ python-dotenv==1.2.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin' --hash=sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3 # via # exa-py - # fastmcp-slim + # fastmcp # litellm # nvidia-nat-core # pydantic-settings @@ -2681,14 +2307,13 @@ python-multipart==0.0.32 ; (platform_machine == 'arm64' and sys_platform == 'dar # via # data-designer-engine # fastapi - # fastmcp-slim # mcp # nemo-safe-synthesizer-plugin # nmp-guardrails # nvidia-nat-core -pytz==2026.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126 \ - --hash=sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a +pytz==2026.1.post1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1 \ + --hash=sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a # via # clickhouse-connect # oci @@ -2700,12 +2325,9 @@ pyyaml==6.0.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ - --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ - --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ - --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ @@ -2716,7 +2338,7 @@ pyyaml==6.0.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p # via # data-designer-config # datasets - # fastmcp-slim + # fastmcp # garak-api # huggingface-hub # jsonschema-path @@ -2748,61 +2370,37 @@ pyyaml==6.0.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (p ragas==0.3.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:164d5c0a96048d9c9373aa3e9123f0096649abbd2b58e747c2f0a454da6c2d6b \ --hash=sha256:3e917b12dc90ef692776263f66d220df40ff0573d2a96c8868198629f8b35206 - # via nmp-evaluator -referencing==0.37.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231 \ - --hash=sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8 + # via nemo-evaluator-sdk +referencing==0.36.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa \ + --hash=sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0 # via # jsonschema # jsonschema-path # jsonschema-specifications regex==2026.5.9 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:01f0f5f55f4b64dacec85dc116d3c05fd23ad3ff037bbc73a2085775953c2611 \ --hash=sha256:01f28d868834624c934b8d2e0aa1c8341337e37831f4a012f18a5afcba4cbaf3 \ - --hash=sha256:0f9eede6a5cbdc02d4978090186390936e1776a7d1359b21e41014c609880bcf \ --hash=sha256:1268eddd8486dc561d08eee1156e40aa3a8fe10f4bdec8fa653b455fcbffd12c \ - --hash=sha256:205109e96b3cf5adf8f4cd62bedde9487feb282b9497a3535451e5a24cd706a0 \ --hash=sha256:2a661a7d270a61f7cf460caee8b9fa2d5ef9e5c681234bcb9e0fe14f488e7dfc \ --hash=sha256:2acfb48634f64996b57f90f39afa692ff362162722581921fe92239a59960f3c \ --hash=sha256:2efa205e6d98b24d1f3ab395c11aa15cdf10935bca283d0285e0499c284fba21 \ - --hash=sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d \ - --hash=sha256:3dd4a3ff360dfb836fecdb93a4598f9d6e2ac81e3e397125145c6221bf58cf4c \ --hash=sha256:4ebe8f0b5ec5a5024dc4a4c59f444c4e9afc5f2abdbb8962065b75d27fb971f9 \ --hash=sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026 \ - --hash=sha256:508f56a89ba9cb26e4168cbc37dbd60a28d82430a9e18ad1d25fe0883c314ca2 \ - --hash=sha256:57e8915c7986aa33d25e4d3629cef711cd2863f2961b10409f0c04cb8b7d9020 \ --hash=sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06 \ --hash=sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0 \ --hash=sha256:728d8bfd28a8845c8b6bc5dc7ce010453d206396786c0765c2740cb65f37791e \ - --hash=sha256:7e30b874d341fac767d7df5a0870540541c2c054b80cfaac116e8d367a8a7ff2 \ - --hash=sha256:7e87577720152d2caae19fe2baaf1f8d5ca12091e9e229f03915c37d1e4b9178 \ - --hash=sha256:8e76e8161ad00694cfce6767d5dea860c6391ac5b83e5c3a39661e696f11fc7e \ --hash=sha256:8f3af7a4903c5c04a11a196a5aa75cdd7dd3f8508132f9fb3259d9f5908e3b88 \ - --hash=sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107 \ - --hash=sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309 \ - --hash=sha256:97cf3bc1b7d7d2306772ec07366c80d9df00ff79e79cea32898883a646d2fae2 \ --hash=sha256:992604d02e6d9c6d786c24a706a71ecffe1020fc1ef264044474cd81fa2c3919 \ --hash=sha256:a8234aa23ec39894bfe4a3f1b85616a7032481964a13ac6fc9f10de4f6fca270 \ --hash=sha256:a8820737949116ffff55fe18f9fc644530063ba6ebfcb8314239416e78f1347c \ --hash=sha256:aa0fbdbac82cb3e4450d0ccde7d7a35607f4cb2dd9fba4b8b69bfaf8c9fa6aed \ --hash=sha256:b6d189041f15691cfa2b6c4290448ec221244d225b3f5fe9e7771b34ffcdf6e2 \ --hash=sha256:b96350aa424e79d4fd6b567b344dcbe2b2d6bfc48dfe7717587e1fa6d43da6ff \ - --hash=sha256:c8b9b9d294cfea3cd19c718ade7cc93492b2c4991abd9a68d0b3477ae6d8e100 \ - --hash=sha256:c9411dd64ca95477225734a93dfc8583b51916b8d5942f99d6cac21e09965451 \ --hash=sha256:ccf5249114cc3e772ecdd88a98a86eca0fd74c61ce32a94743758c083fc05d48 \ - --hash=sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621 \ - --hash=sha256:d29eebfc9525db68cad3c97eedd7f754fa265aa5cd0cf4f863b2421e1b48fc9f \ --hash=sha256:d626b84406444b165fc0ba981604edea39f0588ff1f92baa23fe50799ea9afdb \ - --hash=sha256:d659eee77986549c9ea45b861c7567e44d6287c3dc9a4565478853f7b9fe2ff6 \ - --hash=sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66 \ --hash=sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8 \ - --hash=sha256:ddda5340e6c01a293027dd46232fa79eaff1b48058ce7a98f572b6445b088041 \ - --hash=sha256:debb893095e944091c16e641a6e33c1b0f4cb61ab945ec5afbf53ce7068834d8 \ --hash=sha256:dfbe4579b9f08036aa7d101d1835437a20783574ac66327e6b29b4018a138081 \ - --hash=sha256:e82db382b44d0111b22601c509c89f64434816c9e0eef9d1989cda8cc6ff1c04 \ - --hash=sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962 \ --hash=sha256:ef31cbfe458e21c6122ba8150ff060e0c7789ed0d26eb423f25472584920b555 \ - --hash=sha256:f079e50a0d3cc3cd5091fa9ff45869a2e6b2cd35895731edafb0327901a8d86d \ --hash=sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225 \ --hash=sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce \ --hash=sha256:fd190e88a895a8901325fad284a3f74ea52b1da8525b76cc811fa9b1edf0ce2b @@ -2812,9 +2410,9 @@ regex==2026.5.9 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # sqlfluff # tiktoken # transformers -requests==2.34.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \ - --hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed +requests==2.33.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517 \ + --hash=sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a # via # data-designer-config # datasets @@ -2824,6 +2422,7 @@ requests==2.34.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # garak-api # hvac # instructor + # jsonschema-path # kubernetes # langchain-classic # langchain-community @@ -2835,7 +2434,6 @@ requests==2.34.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # nemo-safe-synthesizer-plugin # nemoplatform # ngcsdk - # nmp-evaluator # nmp-guardrails # oci-openai # opentelemetry-exporter-otlp-proto-http @@ -2853,13 +2451,13 @@ requests-toolbelt==1.0.0 ; (platform_machine == 'arm64' and sys_platform == 'dar # via # langsmith # ngcsdk -rich==14.3.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:07e7adb4690f68864777b1450859253bed81a99a31ac321ac1817b2313558952 \ - --hash=sha256:817e02727f2b25b40ef56f5aa2217f400c8489f79ca8f46ea2b70dd5e14558a9 +rich==14.3.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d \ + --hash=sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b # via # cyclopts # data-designer-config - # fastmcp-slim + # fastmcp # instructor # nemo-agents-plugin # nemo-platform-ext @@ -2876,17 +2474,17 @@ rich==14.3.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pl # rich-rst # rich-toolkit # typer -rich-argparse==1.8.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:679df3d832fa94ad6e4bdb07ded088cd7ea2dddc58ae9b2b46346a40b06cbc0c \ - --hash=sha256:d2a3ce7854654e2253c578763ab0a32f05016f23a55fadba7b9a91b6c0e92142 +rich-argparse==1.7.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0559b1f47a19bbeb82bf15f95a057f99bcbbc98385532f57937f9fc57acc501a \ + --hash=sha256:64fd2e948fc96e8a1a06e0e72c111c2ce7f3af74126d75c0f5f63926e7289cd1 # via nmp-platform -rich-rst==2.0.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:7ee15f345ce25fa02b582c272a6cdbaf0c21243e38061cea273cff659bf3ef61 \ - --hash=sha256:cbe236ed0901d1ec8427cc6a50bf0a34353ba28ad014dc24def68bfe7f3b9e68 +rich-rst==1.3.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:a1196fdddf1e364b02ec68a05e8ff8f6914fee10fbca2e6b6735f166bb0da8d4 \ + --hash=sha256:a99b4907cbe118cf9d18b0b44de272efa61f15117c61e39ebdc431baf5df722a # via cyclopts -rich-toolkit==0.20.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:2a6d5f8e15759b9eba5a9ee63da10b275359ead20e5a0fc92bd5b4dbae8ce4bf \ - --hash=sha256:c7336ae281f435c785acecaedc4b71d4b663dc73d9c8079fea96372527e822a4 +rich-toolkit==0.19.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0288e9203728c47c5a4eb60fd2f0692d9df7455a65901ab6f898437a2ba5989d \ + --hash=sha256:133c0915872da91d4c25d85342d5ec1dfacc69b63448af1a08a0d4b4f23ef46e # via # fastapi-cli # fastapi-cloud-cli @@ -2902,99 +2500,57 @@ rignore==0.7.6 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or ( --hash=sha256:297e500c15766e196f68aaaa70e8b6db85fa23fdc075b880d8231fdfba738cd7 \ --hash=sha256:392dcabfecbe176c9ebbcb40d85a5e86a5989559c4f988c2741da7daf1b5be25 \ --hash=sha256:3efdcf1dd84d45f3e2bd2f93303d9be103888f56dfa7c3349b5bf4f0657ec696 \ - --hash=sha256:53fb28882d2538cb2d231972146c4927a9d9455e62b209f85d634408c4103538 \ - --hash=sha256:5719ea14ea2b652c0c0894be5dfde954e1853a80dea27dd2fbaa749618d837f5 \ - --hash=sha256:5991e46ab9b4868334c9e372ab0892b0150f3f586ff2b1e314272caeb38aaedb \ - --hash=sha256:62020dbb89a1dd4b84ab3d60547b3b2eb2723641d5fb198463643f71eaaed57d \ - --hash=sha256:65cece3b36e5b0826d946494734c0e6aaf5a0337e18ff55b071438efe13d559e \ - --hash=sha256:684014e42e4341ab3ea23a203551857fcc03a7f8ae96ca3aefb824663f55db32 \ --hash=sha256:6e01cad2b0b92f6b1993f29fc01f23f2d78caf4bf93b11096d28e9d578eb08ce \ --hash=sha256:77356ebb01ba13f8a425c3d30fcad40e57719c0e37670d022d560884a30e4767 \ - --hash=sha256:7bbcdc52b5bf9f054b34ce4af5269df5d863d9c2456243338bc193c28022bd7b \ - --hash=sha256:87409f7eeb1103d6b77f3472a3a0d9a5953e3ae804a55080bdcb0120ee43995b \ --hash=sha256:90f0a00ce0c866c275bf888271f1dc0d2140f29b82fcf33cdbda1e1a6af01010 \ - --hash=sha256:a04a3b73b75ddc12c9c9b21efcdaab33ca3832941d6f1d67bffd860941cd448a \ --hash=sha256:aaf938530dcc0b47c4cfa52807aa2e5bfd5ca6d57a621125fe293098692f6345 \ - --hash=sha256:b34acd532769d5a6f153a52a98dcb81615c949ab11697ce26b2eb776af2e174d \ - --hash=sha256:b5fd5ab3840b8c16851d327ed06e9b8be6459702a53e5ab1fc4073b684b3789e \ --hash=sha256:b9e624f6be6116ea682e76c5feb71ea91255c67c86cb75befe774365b2931961 \ - --hash=sha256:ba5524f5178deca4d7695e936604ebc742acb8958f9395776e1fcb8133f8257a \ --hash=sha256:bda49950d405aa8d0ebe26af807c4e662dd281d926530f03f29690a2e07d649a \ - --hash=sha256:c081f17290d8a2b96052b79207622aa635686ea39d502b976836384ede3d303c \ --hash=sha256:c1ad295537041dc2ed4b540fb1a3906bd9ede6ccdad3fe79770cd89e04e3c73c \ - --hash=sha256:ced2a248352636a5c77504cb755dc02c2eef9a820a44d3f33061ce1bb8a7f2d2 \ --hash=sha256:d24321efac92140b7ec910ac7c53ab0f0c86a41133d2bb4b0e6a7c94967f44dd \ - --hash=sha256:d7e4bb66c13cd7602dc8931822c02dfbbd5252015c750ac5d6152b186f0a8be0 \ --hash=sha256:d8955b57e42f2a5434670d5aa7b75eaf6e74602ccd8955dddf7045379cd762fb \ - --hash=sha256:ee4a18b82cbbc648e4aac1510066682fe62beb5dc88e2c67c53a83954e541360 \ - --hash=sha256:f782dbd3a65a5ac85adfff69e5c6b101285ef3f845c3a3cae56a54bebf9fe116 + --hash=sha256:ee4a18b82cbbc648e4aac1510066682fe62beb5dc88e2c67c53a83954e541360 # via fastapi-cloud-cli rouge-score==0.1.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:c7d4da2683e68c9abf0135ef915d63a46643666f848e558a1b9f7ead17ff0f04 # via nemo-evaluator-sdk -rpds-py==2026.5.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:01d17b29c0c23d82b1f4751147ec49cf451f1fc2554eb9ef5f957e55d2656ead \ - --hash=sha256:0408a24e44feb919423dc6d9da677cb5cddb894d2ca9e763967d156d9c60fab4 \ - --hash=sha256:07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256 \ - --hash=sha256:0b35217adefe87f2fe4db7e9766cabe84744bfe9616d9667be18988928c7f2dc \ - --hash=sha256:0fa92420128dadce7f54bd73ba1825a273e9268fe9e35dbf7e6362890efa4e08 \ - --hash=sha256:141c9498daf2ace9eda35d2b0e376f9ea8b058d84f2aef4f96fccfd449a2f251 \ - --hash=sha256:19cb09fab7b7fc96b2a6e28f2e34b72a3705ff27b37edb77455316e5d3f3dc9b \ - --hash=sha256:277f6c82f0580848796c7ecc8a7173aa3bfb928e4ff831261c2f60a81dc270db \ - --hash=sha256:27b74c10ed6a8f190f4287f53bcfea348b92a84a9c9f70d30183d1e6172d580d \ - --hash=sha256:296c799becfa849c779c8725494fe9ed94959ed886787df4364b058465bad7f0 \ - --hash=sha256:3350ec808fb538fe71a1f94dfaa0e29c598dfad805ce49f0caec5ae3183c652b \ - --hash=sha256:40ff257542e04796880e011e15cd4dc21c2599975df2aaa8f2c8495ca574e1a5 \ - --hash=sha256:4860b603ddda0475a8885499b3729e90229d480105b42651962a5397d995fa89 \ - --hash=sha256:4be8b1d2a705cc37d08256004e1d07de143fa0075c8e85a3df020b776f62b732 \ - --hash=sha256:4fb8d2e7cb2f850b169806d61d1b991738acec96500a75c30f49caf064ce7cef \ - --hash=sha256:58b1d94308ddf0b1982f61f2eb54bf92997c9ece8a8093ef014250f4a517906c \ - --hash=sha256:613fc4ee9eaef26dc5840666214dd6fbcebcf32f46e76f4abc473059f4e13dda \ - --hash=sha256:6142dbd80c4df62a5d899f0d616d417f84e0bc8d32526c8e5589019d75d028a7 \ - --hash=sha256:63c2c4c213f1a4e3f3de28ecab029dbdee976324e729c0d7a55211be72576b02 \ - --hash=sha256:66c93681c4729e4e3ecba31b8179fae083ff3118841672835140338b4b9867c1 \ - --hash=sha256:68700371c5d7ae1412862ddfa719090925c93ecf351c566d66f09d04b136ea00 \ - --hash=sha256:6f249f8b860a200ad35193af961183ebe9132710484e6f6ce0cf89fd83c63a9a \ - --hash=sha256:7559f72b94ae52659086c595dfa017cde03155f7832071d30959049052cb3ece \ - --hash=sha256:85264a90ff4c05c1568dd65f5921c837614b67c60358fb4c17df3b7f2e90690a \ - --hash=sha256:8895840ac4809e5f60c88fd07617cd71326e73d6e5a8aa783c5c0f7c24985de2 \ - --hash=sha256:8bff7073db3899158fff55ebf57b113a67030af26f80a18978f9f0aa60250ddf \ - --hash=sha256:8c43a8a973270fd173bf48cdf80bbe66312421cba68d40845034f174f2389049 \ - --hash=sha256:99ab6ba7bfa2cb0f96a04e3652355bf04e3f51aceb1e943b8541dab7ba4828cc \ - --hash=sha256:9e25b7088f9ccbfc0dfcaa52bf969300ca229e10ecf758974ebcbb080a4b37bb \ - --hash=sha256:a04df86b3f0fade39ec8fd0e0aab089b1da9fbd2b48df778a57ef96f5e7d38df \ - --hash=sha256:a05fa4f41f37ec97c9c260441a940450a192f78d774d2b097eee1379f1e1246a \ - --hash=sha256:ad3773236e95f7f33991eb125224b7da66f206504d032a253a02da7e134519fb \ - --hash=sha256:b1b964e3ab599e718dc46c018d104b1ebc007cbc6567d827c94a687fca56d77e \ - --hash=sha256:b5c30f3f04eef4fbd362226a6f31d7c8895ca4fbb6e0b790f6890a98d8da8559 \ - --hash=sha256:b6825cc329b290e93c5f6a9be2393118a763f6ccf6abd83704e0c102ca583644 \ - --hash=sha256:b95d5e11fc712b752081183a55a244c03cd00570489edd7014d8899f8ceb8162 \ - --hash=sha256:b9a6528956191c48c52294a592dbd4a8386d7048bdb25c0efcb6b966466c6d83 \ - --hash=sha256:c39f5b67a8a2e67179ada2a954227d670fe65fa9098457f698f56ddf248709b3 \ - --hash=sha256:c74005a7bb87752acf351c93897ec63ad77a07a0da7ecad9c050e32e7286ba34 \ - --hash=sha256:ca653c6546386227cd9800d1bef6a348099acf8db4250341da6d90f663d6dfcb \ - --hash=sha256:cacedb7a6e167680acba45ad5716e89067d225dc80da0d7040cae8c81d4572fa \ - --hash=sha256:d0efbe45632665e53e3db8fe1e5692db58fc5cb9bab4459d570b83efefe11164 \ - --hash=sha256:d3858b908218ee108d0bbfb2095ccc237648053c9bf98affad7cb079acaf1d97 \ - --hash=sha256:de42116e69cb53b911cc34aee5ab98f36c597b822545045d49e938818b99e5e4 \ - --hash=sha256:e0b360f316d966b048b085857630b3cc51f3db2f07b06f440eac8f695374d1e3 \ - --hash=sha256:fea6e836d10abbe191d557d33bd58bd5987725fe63aa1eefe557d230209855bd +rpds-py==0.30.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4 \ + --hash=sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89 \ + --hash=sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85 \ + --hash=sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb \ + --hash=sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4 \ + --hash=sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23 \ + --hash=sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27 \ + --hash=sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083 \ + --hash=sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738 \ + --hash=sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7 \ + --hash=sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05 \ + --hash=sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5 \ + --hash=sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394 \ + --hash=sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6 \ + --hash=sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e \ + --hash=sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95 \ + --hash=sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e \ + --hash=sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94 \ + --hash=sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28 \ + --hash=sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000 \ + --hash=sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7 \ + --hash=sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d \ + --hash=sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84 \ + --hash=sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a \ + --hash=sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8 \ + --hash=sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a # via # jsonschema # referencing ruff==0.15.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac \ --hash=sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580 \ - --hash=sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12 \ - --hash=sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036 \ --hash=sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c \ --hash=sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf \ --hash=sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e \ - --hash=sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85 \ - --hash=sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e \ - --hash=sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4 \ - --hash=sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5 \ - --hash=sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912 + --hash=sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5 # via data-designer-engine s3transfer==0.14.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456 \ @@ -3007,16 +2563,11 @@ sacrebleu==2.6.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # nemo-evaluator-sdk # nemoplatform safetensors==0.8.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:040070828e36dc8e122178bbbd5830ff9e97920affb84cbe0f46442497bed358 \ - --hash=sha256:4124502b78f03534117c848f87a39b8f31e577b15eff423bf8bfb95f2a8c30d0 \ - --hash=sha256:4a95ae2b05d7726d751da4ebf626a2ca782b706e101bd894c95bc2450b1cffcc \ --hash=sha256:7a46e5ff292c356d6991e60942ba7f79817682d3a2cef0702136448cb9c4d235 \ - --hash=sha256:7bc0a787ba8a35be368ee3574edfa2b1ad389eebd0a72e482ae275490e3f6c98 \ --hash=sha256:87eec7ffed2b809f05a398a8becb7d013f19f7837cd15d9748580d6cf30dbaf4 \ --hash=sha256:8e080062fcde23be189565e1c3305d16751a218ecf9412c8601e64204eb6f846 \ --hash=sha256:c80201d22cbf405b80647a60ada77bba06c8fba2da2743ba1e89cdcc39a81f25 \ --hash=sha256:fabaf3e0f18a6618d9b36560682562157f77c2b71fcffc7b432be2baed9d753d \ - --hash=sha256:fcdd41ec4628fee5799f807c73c353629130fbd942aa23d83c623dd6c9d52d78 \ --hash=sha256:fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774 # via transformers scikit-network==0.33.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ @@ -3064,9 +2615,9 @@ secretstorage==3.5.0 ; (platform_machine == 'aarch64' and sys_platform == 'linux --hash=sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137 \ --hash=sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be # via keyring -sentry-sdk==2.62.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:27f61d13a86c3c1648dec666dd5a64f79772dd6a84b446f11866601ecab24f6f \ - --hash=sha256:3c870b9f50d9fd15b58c817dbde1c7cfaa9fe3f05df0a4c6edd5571cb82f5491 +sentry-sdk==2.57.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:4be8d1e71c32fb27f79c577a337ac8912137bba4bcbc64a4ec1da4d6d8dc5199 \ + --hash=sha256:812c8bf5ff3d2f0e89c82f5ce80ab3a6423e102729c4706af7413fd1eb480585 # via fastapi-cloud-cli setuptools==82.0.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9 \ @@ -3093,9 +2644,9 @@ six==1.17.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pla # kubernetes # python-dateutil # rouge-score -smart-open==7.6.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:4347996e7ba21db7cd1e059632e0b30395407e4f6c660d2ddffc8f2a9ae5f990 \ - --hash=sha256:b4de6aebef023aca91cc9fb372052e1343ba3f152de215bd22391a663e3ddd21 +smart-open==7.0.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:8523ed805c12dff3eaa50e9c903a6cb0ae78800626631c5fe7ea073439847b89 \ + --hash=sha256:d3672003b1dbc85e2013e4983b88eb9a5ccfd389b0d4e5015f39a9ee5620ec18 # via streaming-form-data smmap==5.0.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c \ @@ -3109,28 +2660,32 @@ sniffio==1.3.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or ( # nemo-platform-sdk # openai # pyleak -soupsieve==2.8.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e \ - --hash=sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65 +soupsieve==2.8.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349 \ + --hash=sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95 # via beautifulsoup4 -sqlalchemy==2.0.50 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:03f4323c980ad0e918cc9e5369b015f759f4e534db5bbaf4dc36832c10d05064 \ - --hash=sha256:06a9210bdc5f4298cff0781087e2ff45683922252dacc452846373a58761f093 \ - --hash=sha256:0f5e4ac70e9e757f6b3e87c0491ff034442ecd8dfd36d041a50564c322dafc0e \ - --hash=sha256:0fec460e18cdbb4c7773531122ce9a27e96c6ca17af3933941d94da475ad2c86 \ - --hash=sha256:110fdac56ace278949f00de805edacbd6141e382d992f9ba28238b3a0827a600 \ - --hash=sha256:1aa6e403663a9c43c8fef7ce4bdb4cf48bcd8d352e91deda2a99f963270bd508 \ - --hash=sha256:23ae23d8b9d344d30d0a92f06d45825024a5790f1c1dd4cf452636a50d3e58cb \ - --hash=sha256:2b9dcc43afef8ac157cd92fce96985d6b8b0cfbd3df4d666f66b4d55a75d202f \ - --hash=sha256:2dab927761d9108550f0cf8e66ff21af56f907a0ce0a689793db615e2b55f62c \ - --hash=sha256:31648fa14460537e768a7303b078e4344d208e0d23e06867c1f376a227ed82db \ - --hash=sha256:47b71b933e7b4ebad407c8fdfd70d2c4f08b78b3238bb30eebdd6eb32ca51b89 \ - --hash=sha256:51b637a84f9fa35ae1f9017e786cb142974a25305085e1b378b3647a67f65ad3 \ - --hash=sha256:545eae198d37bcf837a10ede3684e2af32458d6f35c597c35c2de7502dc38fc4 \ - --hash=sha256:724f3dcbe53dd0151e3cb5e7ec4ba4c620bede579caacd16275dc35ce06e8615 \ - --hash=sha256:8b53784972ade4f8174b9aa661f31a06f8a936d2cfdd602913ff3c6dd40ae873 \ - --hash=sha256:92064363517a3ff8212b5a93b8c62876579d8dfd1ca5b561335f30152d884fa9 \ - --hash=sha256:af5607d11ef90fd6a5c0549fe0045dce1663d427426bcfb506dcb5346a85a3b9 +sqlalchemy==2.0.48 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:07edba08061bc277bfdc772dd2a1a43978f5a45994dd3ede26391b405c15221e \ + --hash=sha256:1b4c575df7368b3b13e0cebf01d4679f9a28ed2ae6c1cd0b1d5beffb6b2007dc \ + --hash=sha256:1ccd42229aaac2df431562117ac7e667d702e8e44afdb6cf0e50fa3f18160f0b \ + --hash=sha256:2645b7d8a738763b664a12a1542c89c940daa55196e8d73e55b169cc5c99f65f \ + --hash=sha256:34634e196f620c7a61d18d5cf7dc841ca6daa7961aed75d532b7e58b309ac894 \ + --hash=sha256:348174f228b99f33ca1f773e85510e08927620caa59ffe7803b37170df30332b \ + --hash=sha256:36ac4ddc3d33e852da9cb00ffb08cea62ca05c39711dc67062ca2bb1fae35fd8 \ + --hash=sha256:53667b5f668991e279d21f94ccfa6e45b4e3f4500e7591ae59a8012d0f010dcb \ + --hash=sha256:546572a1793cc35857a2ffa1fe0e58571af1779bcc1ffa7c9fb0839885ed69a9 \ + --hash=sha256:5b193a7e29fd9fa56e502920dca47dffe60f97c863494946bd698c6058a55658 \ + --hash=sha256:5ca74f37f3369b45e1f6b7b06afb182af1fd5dde009e4ffd831830d98cbe5fe7 \ + --hash=sha256:69f5bc24904d3bc3640961cddd2523e361257ef68585d6e364166dfbe8c78fae \ + --hash=sha256:6f7b7243850edd0b8b97043f04748f31de50cf426e939def5c16bedb540698f7 \ + --hash=sha256:82745b03b4043e04600a6b665cb98697c4339b24e34d74b0a2ac0a2488b6f94d \ + --hash=sha256:a66fe406437dd65cacd96a72689a3aaaecaebbcd62d81c5ac1c0fdbeac835096 \ + --hash=sha256:b19151e76620a412c2ac1c6f977ab1b9fa7ad43140178345136456d5265b32ed \ + --hash=sha256:e3070c03701037aa418b55d36532ecb8f8446ed0135acb71c678dbdf12f5b6e4 \ + --hash=sha256:e5e088bf43f6ee6fec7dbf1ef7ff7774a616c236b5c0cb3e00662dd71a56b571 \ + --hash=sha256:e83e3f959aaa1c9df95c22c528096d94848a1bc819f5d0ebf7ee3df0ca63db6c \ + --hash=sha256:f0dcbc588cd5b725162c076eb9119342f6579c7f7f55057bb7e3c6ff27e13121 \ + --hash=sha256:fd08b90d211c086181caed76931ecfa2bdfc83eea3cfccdb0f82abc6c4b876cb # via # alembic # langchain-classic @@ -3143,16 +2698,15 @@ sqlfluff==4.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or --hash=sha256:83dd4c081afb48c0af861833015a18b13d52726bfe52a286246dbd7a64b7d111 \ --hash=sha256:ae11123ca4a697abadbd2783f85f04e58c36e7dd26ae8024f400efccc6a44631 # via data-designer-engine -sqlmodel==0.0.38 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:84e3fa990a77395461ded72a6c73173438ce8449d5c1c4d97fbff1b1df692649 \ - --hash=sha256:d583ec237b14103809f74e8630032bc40ab68cd6b754a610f0813c56911a547b +sqlmodel==0.0.37 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:2137a4045ef3fd66a917a7717ada959a1ceb3630d95e1f6aaab39dd2c0aef278 \ + --hash=sha256:d2c19327175794faf50b1ee31cc966764f55b1dedefc046450bc5741a3d68352 # via - # nmp-evaluator # nmp-jobs # nmp-models -sse-starlette==3.4.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0 \ - --hash=sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973 +sse-starlette==3.3.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:84bb06e58939a8b38d8341f1bc9792f06c2b53f48c608dd207582b664fc8f3c1 \ + --hash=sha256:aaf92fc067af8a5427192895ac028e947b484ac01edbc3caf00e7e7137c7bef1 # via mcp starlette==0.52.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74 \ @@ -3161,7 +2715,6 @@ starlette==0.52.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') o # fastapi # mcp # nemoguardrails - # nmp-evaluator # nvidia-nat-core # prometheus-fastapi-instrumentator # sse-starlette @@ -3177,12 +2730,16 @@ streaming-form-data==2.0.0 ; (platform_machine == 'arm64' and sys_platform == 'd --hash=sha256:cebbcdf31e38bb3569d5cafc2f8cbcf9b8da5298eaff2464b5ba224abc915a29 \ --hash=sha256:e7bdbf78a5c44b2d1816300f5b461138c33efde774560e849c36302077dfe9a3 # via nmp-files -structlog==26.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:e081a26d6c373e6d201eca24eede26d8ffab07f88f477822e679183428d3d91e \ - --hash=sha256:f63a716cbd1b1291cf7661de7794b455acfa4c43c5bcf1630e6ad5ddc1adb3b7 +structlog==25.5.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:098522a3bebed9153d4570c6d0288abf80a031dfdb2048d59a49e9dc2190fc98 \ + --hash=sha256:a8453e9b9e636ec59bd9e79bbd4a72f025981b3ba0f5837aebf48f02f37a7f9f # via # nemo-safe-synthesizer # nmp-common +sympy==1.14.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517 \ + --hash=sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 + # via onnxruntime tabulate==0.10.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d \ --hash=sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3 @@ -3203,28 +2760,28 @@ tenacity==9.1.4 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # nmp-automodel # nmp-models # nmp-unsloth -tiktoken==0.13.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4 \ - --hash=sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2 \ - --hash=sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f \ - --hash=sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b \ - --hash=sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff \ - --hash=sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173 \ - --hash=sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7 \ - --hash=sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a \ - --hash=sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b \ - --hash=sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce \ - --hash=sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed \ - --hash=sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf \ - --hash=sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615 \ - --hash=sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d \ - --hash=sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545 \ - --hash=sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26 \ - --hash=sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91 \ - --hash=sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486 \ - --hash=sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649 \ - --hash=sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1 \ - --hash=sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2 +tiktoken==0.12.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:01d99484dc93b129cd0964f9d34eee953f2737301f18b3c7257bf368d7615baa \ + --hash=sha256:04f0e6a985d95913cabc96a741c5ffec525a2c72e9df086ff17ebe35985c800e \ + --hash=sha256:06a9f4f49884139013b138920a4c393aa6556b2f8f536345f11819389c703ebb \ + --hash=sha256:0ee8f9ae00c41770b5f9b0bb1235474768884ae157de3beb5439ca0fd70f3e25 \ + --hash=sha256:2b90f5ad190a4bb7c3eb30c5fa32e1e182ca1ca79f05e49b448438c3e225a49b \ + --hash=sha256:35a2f8ddd3824608b3d650a000c1ef71f730d0c56486845705a8248da00f9fe5 \ + --hash=sha256:47a5bc270b8c3db00bb46ece01ef34ad050e364b51d406b6f9730b64ac28eded \ + --hash=sha256:4a1a4fcd021f022bfc81904a911d3df0f6543b9e7627b51411da75ff2fe7a1be \ + --hash=sha256:508fa71810c0efdcd1b898fda574889ee62852989f7c1667414736bcb2b9a4bd \ + --hash=sha256:65b26c7a780e2139e73acc193e5c63ac754021f160df919add909c1492c0fb37 \ + --hash=sha256:83d16643edb7fa2c99eff2ab7733508aae1eebb03d5dfc46f5565862810f24e3 \ + --hash=sha256:981a81e39812d57031efdc9ec59fa32b2a5a5524d20d4776574c4b4bd2e9014a \ + --hash=sha256:9baf52f84a3f42eef3ff4e754a0db79a13a27921b457ca9832cf944c6be4f8f3 \ + --hash=sha256:a01b12f69052fbe4b080a2cfb867c4de12c704b56178edf1d1d7b273561db160 \ + --hash=sha256:a1af81a6c44f008cba48494089dd98cccb8b313f55e961a52f5b222d1e507967 \ + --hash=sha256:b18ba7ee2b093863978fcb14f74b3707cdc8d4d4d3836853ce7ec60772139931 \ + --hash=sha256:b4e7ed1c6a7a8a60a3230965bdedba8cc58f68926b835e519341413370e0399a \ + --hash=sha256:c06cf0fcc24c2cb2adb5e185c7082a82cba29c17575e828518c2f11a01f445aa \ + --hash=sha256:edde1ec917dfd21c1f2f8046b86348b0f54a2c0547f68149d8600859598769ad \ + --hash=sha256:f18f249b041851954217e9fd8e5c00b024ab2315ffda5ed77665a05fa91f42dc \ + --hash=sha256:fc530a28591a2d74bce821d10b418b26a094bf33839e69042a6e86ddb7a7fb27 # via # data-designer-engine # langchain-openai @@ -3232,36 +2789,32 @@ tiktoken==0.13.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or # nemo-anonymizer # ragas tokenizers==0.22.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e \ --hash=sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001 \ --hash=sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7 \ - --hash=sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd \ --hash=sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4 \ --hash=sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67 \ - --hash=sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a \ --hash=sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5 \ - --hash=sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917 \ - --hash=sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b + --hash=sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917 # via # fastembed # langchain-huggingface # litellm # transformers -tomlkit==0.15.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:4dbc8f0fc024412b57ced8757ac7461305126a648ff8c2c807fcb8e133a78738 \ - --hash=sha256:7d1a9ecba3086638211b13814ea79c90dd54dd11993564376f3aa92271f5c7a3 +tomlkit==0.14.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680 \ + --hash=sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064 # via nemoplatform -tornado==6.5.7 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163 \ - --hash=sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2 \ - --hash=sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92 \ - --hash=sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b \ - --hash=sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972 \ - --hash=sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5 +tornado==6.5.5 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9 \ + --hash=sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca \ + --hash=sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e \ + --hash=sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07 \ + --hash=sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa \ + --hash=sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5 # via nemoplatform -tqdm==4.68.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:89c230e8dbc67c7615c142487111222f878c77427ea09549960f62389e258add \ - --hash=sha256:d4240441fb5353290b87d6a85968c9decc131a99b8c7faa28269d829de669ede +tqdm==4.67.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb \ + --hash=sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf # via # datasets # fastembed @@ -3273,13 +2826,13 @@ tqdm==4.68.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (pl # ragas # sqlfluff # transformers -transformers==5.10.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:8a669db546f82c7c3618cb46ceb0f0afd89292bc70f319c058f8332ec63e268d \ - --hash=sha256:f9a44b9c8ca9ab1156b467f574d832ea066284299c2fd0ed84641ccb592751fc +transformers==5.5.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:821a9ff0961abbb29eb1eb686d78df1c85929fdf213a3fe49dc6bd94f9efa944 \ + --hash=sha256:c8db656cf51c600cd8c75f06b20ef85c72e8b8ff9abc880c5d3e8bc70e0ddcbd # via nemo-customizer-plugin -typer==0.25.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89 \ - --hash=sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc +typer==0.24.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e \ + --hash=sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45 # via # data-designer # fastapi-cli @@ -3302,17 +2855,17 @@ types-aioboto3==15.5.0 ; (platform_machine == 'arm64' and sys_platform == 'darwi --hash=sha256:5769a1c3df7ca1abedf3656ddf0b970c9b0436d0f88cf4686040b55cd2a02925 \ --hash=sha256:8aed7c9b6fe9b59e6ce74f7a6db7b8a9912a34c8f80ed639fac1fa59d6b20aa1 # via nmp-files -types-aiobotocore==3.7.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:fe35de52c12e5fdb89ca60b3989766e7fe827e3d2e95fcf4583e91581945205c \ - --hash=sha256:ff4139b3eae22d242b6b39ba56048344b2b86f67daeeca4680da1a6e191681fd +types-aiobotocore==3.3.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:017e9666d5cba2c26134256ad5e4efb320a68352358b9f3257b4e2aae3fb4c18 \ + --hash=sha256:c754c2888631d56c370cab4d2108da2bfd3afe80049303fb7132004ead3b21d6 # via types-aioboto3 types-aiobotocore-s3==2.25.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:151301e84bb2f1cbf30f0d1ef791bb75c141cfbfe47b93fd317b7f1ba3eb35e4 \ --hash=sha256:678aa425491af19bd6d011d59ecdbbb7ae7e95800efddcf4fd559ab72c94e194 # via types-aioboto3 -types-awscrt==0.34.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:20c752b6031544d8f694803c35174aee129f1be5ddf886ae46d22f7ffd9b7d75 \ - --hash=sha256:559aa04250f6a419a617dfb788f3e10903aaf74700ef23e521b64a411b83b803 +types-awscrt==0.31.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:09d3eaf00231e0f47e101bd9867e430873bc57040050e2a3bd8305cb4fc30865 \ + --hash=sha256:e5ce65a00a2ab4f35eacc1e3d700d792338d56e4823ee7b4dbe017f94cfc4458 # via botocore-stubs types-s3transfer==0.16.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:1c0cd111ecf6e21437cb410f5cddb631bfb2263b77ad973e79b9c6d0cb24e0ef \ @@ -3322,7 +2875,6 @@ typing-extensions==4.15.0 ; (platform_machine == 'arm64' and sys_platform == 'da --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 # via - # aiohttp # aiosignal # alembic # anthropic @@ -3331,7 +2883,6 @@ typing-extensions==4.15.0 ; (platform_machine == 'arm64' and sys_platform == 'da # exa-py # exceptiongroup # fastapi - # fastmcp-slim # grpcio # huggingface-hub # langchain-core @@ -3352,7 +2903,6 @@ typing-extensions==4.15.0 ; (platform_machine == 'arm64' and sys_platform == 'da # referencing # rich-toolkit # sqlalchemy - # sqlmodel # starlette # types-aioboto3 # types-aiobotocore @@ -3370,19 +2920,18 @@ typing-inspection==0.4.2 ; (platform_machine == 'arm64' and sys_platform == 'dar # fastapi # mcp # pydantic - # pydantic-settings -tzdata==2026.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10 \ - --hash=sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7 +tzdata==2025.3 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 \ + --hash=sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7 # via pandas tzlocal==5.3.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd \ --hash=sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d # via nvidia-nat-core -uncalled-for==0.3.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0ff60b142c7d1f8070bde9d42afaa70aedc77dcc10998c227687e9c15713418e \ - --hash=sha256:89f5dbcd71e2b8f47c030b1fa302e6cce2ec795d1ac565eeb6525c5fe55cb8a2 - # via fastmcp-slim +uncalled-for==0.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:2c0bd338faff5f930918f79e7eb9ff48290df2cb05fcc0b40a7f334e55d4d85f \ + --hash=sha256:b4f8fdbcec328c5a113807d653e041c5094473dd4afa7c34599ace69ccb7e69f + # via fastmcp urllib3==2.7.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c \ --hash=sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 @@ -3398,64 +2947,33 @@ urllib3==2.7.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or ( # oci # requests # sentry-sdk -uuid-utils==0.16.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:04af9966ecd82b78eeba5725e29aa1e86fb8eb84b5443dd6a9935f9fadb6678e \ - --hash=sha256:06fc7db470c37e5c1ab3fd2cd159697d6f8b279d7d23b5b96bd418b115f8caa9 \ - --hash=sha256:130f7452c1b87b7c16d0bdc1f32a1de531ae4cc4220ed4e691402bbcfc39e0a9 \ - --hash=sha256:13a797e5e8f0dadc18351a5aa013815ddac25dce6864072a539d510910c95f71 \ - --hash=sha256:1c3c5afaaa68b1d6393d653e9fc93a2fde9da1681da01f74b4593f41d31fb5f1 \ - --hash=sha256:24e6fa0d0ade7a9ad60a3c296022474983243df5b4e863babb4828a85ef2e52c \ - --hash=sha256:26fe23ab60f05de4ad70aaa5b6a4c2a7bbd43055e3dd6f6b31efba0532ac9c71 \ - --hash=sha256:27a071a899ba46a551d6524dbbc5a98b88be176d0f55ddf72cf71c005326ac10 \ - --hash=sha256:2e2f369dd734050fe96ae4905c58779b09276d47d5e9a0e5cd33ec7982784341 \ - --hash=sha256:39453f1ebf4398fbeb71607f3437e2ac469c9e38b5921755c1e17ad0158a8907 \ - --hash=sha256:3e1a1f57fe3631e164dad27b24aa81267810e20575f705af3b0fa734f3a21247 \ - --hash=sha256:3ee392fe59808a731b7b6bf4d453fb6e833774921331cceae5f254d1e9c5b97d \ - --hash=sha256:41985e342a30e76366a8becc60bbdb07d72cd1b86ec657b1f31654e9fb1baada \ - --hash=sha256:41a67e546d9adf11c4e4cb5c8e81f000f8b1f000c17912ced089b499855719a5 \ - --hash=sha256:420aa3ca403cedb73490b6ea3aeefeea7e0455f5ce60bbf856390ee872ae3306 \ - --hash=sha256:4e35e9a986e86806a61288fac3afbb51317f2580929feefd1661891ffd7b8c24 \ - --hash=sha256:50361aca5c2a770728a6343df85109fe57f89ac026827f34fe0153563cdc9ce7 \ - --hash=sha256:57c3583b1f1c00a94f59726a5e2b988fa209221143919a1af5c2fc24e318fc98 \ - --hash=sha256:57d85f48535dc541060f6b82f277cbcd12b78c04008ccc1039546cfcec027327 \ - --hash=sha256:727fae3f0682191ec9c8ce1cd0f71e81b471a2e26b7c5fd66712fc0f11640aa0 \ - --hash=sha256:73486b6aa3f755a6c97000f5ea67e7ac78d6df89bf22980789a1e943e24b74f0 \ - --hash=sha256:9152bff801ec2ccf630df06d67389090a2c612dea87fbf9a887ab4b222929f6f \ - --hash=sha256:91db59bad97ed2b9d2c6ed25082fe9762b2c422e694fe06786b28cf4e776ac4c \ - --hash=sha256:9346ce6eb1fbd8b03a6b331d66016afcb4edcdff6eac708e21391600529a016a \ - --hash=sha256:9a250e111903c4368745fce5ac2aa607bd477c62d3307e45347338fdb64b38e0 \ - --hash=sha256:a0fc6eb3fd821466fbab69cf356c6ec2b7327266bbbc740a2eb57c77c4bef965 \ - --hash=sha256:a4fd5c7936a876ba2606ba124603b559a5c2cea458c59b9c31677e6acc3c53cc \ - --hash=sha256:a750d8aeb8ae880aa9a2529606bde0e994bcc7448730c953107f357a28e6102e \ - --hash=sha256:b617a334bb01ef2ff8c22900f5a14125eb9063f602131494cc9dc59519beaa5b \ - --hash=sha256:b8a9a7b1065a12d40f2cc25b7d705ab34954cc57095034367bca39ebcf4a876b \ - --hash=sha256:bbb92feb4db08cd76e27b4d3b1a82bfde708447317150c614eb9f761a43b387e \ - --hash=sha256:c8083284488b84ad178e74add64cfd1e74e8be5e30821e5acbc5019281c658b0 \ - --hash=sha256:c9f504efeb20ffd9571621658f7c8093c646d33150406d5742e49ff7cd861615 \ - --hash=sha256:ceef237cf8467fddbf6d8466cc1f6e2c04605ec919046ef5eba10a895b559fcf \ - --hash=sha256:d34cf9681e8892fad2a63e393068e544505408748cd8bf0c3517d753a01528d4 \ - --hash=sha256:d5ee0bbbd4ca3968422cd8308f0072520bc73dc760cb26c6fa75ca1aca14d210 \ - --hash=sha256:d6902d4375dfba4c9902c736bb82d3c040417b67f7d0fa48910ddfdb1ac95de7 \ - --hash=sha256:dc0824a31898ef46a9d84d748c3abe27cdb615ac3773c53cc1f84fc8e66dc7c4 \ - --hash=sha256:ed45fb8732d216426227096b55accbb87cba57febc86a044d90780b090eb99d0 +uuid-utils==0.14.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0b5d2ad28063d422ccc2c28d46471d47b61a58de885d35113a8f18cb547e25bf \ + --hash=sha256:93a3b5dc798a54a1feb693f2d1cb4cf08258c32ff05ae4929b5f0a2ca624a4f0 \ + --hash=sha256:9bfc95f64af80ccf129c604fb6b8ca66c6f256451e32bc4570f760e4309c9b69 \ + --hash=sha256:b197cd5424cf89fb019ca7f53641d05bfe34b1879614bed111c9c313b5574cd8 \ + --hash=sha256:b56b0cacd81583834820588378e432b0696186683b813058b707aedc1e16c4b1 \ + --hash=sha256:bec8f8ef627af86abf8298e7ec50926627e29b34fa907fcfbedb45aaa72bca43 \ + --hash=sha256:c1dbe718765f70f5b7f9b7f66b6a937802941b1cc56bcf642ce0274169741e01 \ + --hash=sha256:c915d53f22945e55fe0d3d3b0b87fd965a57f5fd15666fd92d6593a73b1dd297 \ + --hash=sha256:ce6743ba194de3910b5feb1a62590cd2587e33a73ab6af8a01b642ceb5055862 # via # langchain-core # langsmith -uvicorn==0.49.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f \ - --hash=sha256:ebf4271aa580d9de97f93192d4595176df6e91f9aae919ca73e4fc07df1e66a3 +uvicorn==0.42.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:96c30f5c7abe6f74ae8900a70e92b85ad6613b745d4879eb9b16ccad15645359 \ + --hash=sha256:9b1f190ce15a2dd22e7758651d9b6d12df09a13d51ba5bf4fc33c383a48e1775 # via # fastapi # fastapi-cli # fastapi-cloud-cli - # fastmcp-slim + # fastmcp # mcp # nemo-safe-synthesizer-plugin # nemoguardrails # nemoplatform # nmp-auth # nmp-entities - # nmp-evaluator # nmp-files # nmp-guardrails # nmp-hello-world @@ -3490,77 +3008,57 @@ validators==0.35.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') --hash=sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a \ --hash=sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd # via ngcsdk -wasmtime==45.0.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:2ad4bf7ca286ceea35c1e420d10b368d7f83faf9a5ffde87b4ee334a9b7f55f3 \ - --hash=sha256:31d10f25c330cebcfb364e9a357123deeec96c41725ff2bba91b705587f38a93 \ - --hash=sha256:5d1416ec6da8cd87c29e2e9eb074358c91839c2fff971fe428c8921eaae68e73 \ - --hash=sha256:6251ee5074a8b8bfaa98e6e99cb5d49d6d0f2320b3265d5aa6c2ee5df5fb4519 \ - --hash=sha256:a0b6ca14b4628a5d1ffa91ccf2c0f2c58fa171f126ec085d564b09d5795395dd \ - --hash=sha256:a499f6ab0eebb70dca83d6a4904b743cd122f322af3abe86af08ad753533d946 \ - --hash=sha256:bef65282b7de744106a91da43e4d06ba19d2d587bc54abb83b3e757f0c4fc030 +wasmtime==43.0.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:30b042fd4a05d0f8a320baed53fcb971aff8a3789ed6967f4521f87931ace717 \ + --hash=sha256:341542e87caf1f2ef7ff648a78827fcef5751e3e9be2ee07a1fcf3a04413c213 \ + --hash=sha256:34ff18384ad62625cb1438fd0266f6c74b4a72ddcb8ba30c60a66be3632db44b \ + --hash=sha256:5a03c7aa03519df58fed5115ad8093d6deac46386115add715e725448e89ab25 \ + --hash=sha256:9441349d9346230420ed24d357d6f8330fe7251ac5938bb892147728bbe731d7 \ + --hash=sha256:c7025d477d807df30dad07c9318ea747c6cfc99764c7cb2a8e44e75b8c43e3be \ + --hash=sha256:eb98b8e2bc35d03dd69c9dd095a388044323622526fc94a9406b8efc48ddc259 # via nmp-auth watchdog==6.0.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2 \ - --hash=sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f \ - --hash=sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c \ --hash=sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c \ --hash=sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c \ --hash=sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0 \ --hash=sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13 \ - --hash=sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379 \ --hash=sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282 \ --hash=sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b \ --hash=sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c \ - --hash=sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948 \ - --hash=sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26 + --hash=sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948 # via nemoguardrails -watchfiles==1.2.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9 \ - --hash=sha256:094b9b70103d4e963499bdea001ee3c2697b144cd9ae6218a62c0f89ec9e31db \ - --hash=sha256:0d191c054d0715c3c95c99df9b8dbf6fd096d8c1e021e8f212e1bd8bc444ccb5 \ - --hash=sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427 \ - --hash=sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4 \ - --hash=sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa \ - --hash=sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906 \ - --hash=sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c \ - --hash=sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c \ - --hash=sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01 \ - --hash=sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9 \ - --hash=sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658 \ - --hash=sha256:53b2290c92e0506d102cd448fbc610d87079553f86caa39d67440856a8b8bba5 \ - --hash=sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0 \ - --hash=sha256:6543cf55d170003296d185c0af981f3e1311564907e1f4e08671fc7693a890a5 \ - --hash=sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8 \ - --hash=sha256:772b80df316480d894a0e3165fdd19cf77f5d17f9a787f94029465ad0e3529d1 \ - --hash=sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44 \ - --hash=sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5 \ - --hash=sha256:89d8c2394a065ca86f5d2910ff263ae67c127e1376ccc4f9fc35c71db879f80a \ - --hash=sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc \ - --hash=sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0 \ - --hash=sha256:a711b51aec4370d0dcda5b6c09463206f133a5759341d7744b953a7b62e1100e \ - --hash=sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0 \ - --hash=sha256:b0ef001f8c25ad0fa9529f914c1600647ecd0f542d11c19b7894768c67b6acb7 \ - --hash=sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55 \ - --hash=sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb \ - --hash=sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0 \ - --hash=sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3 \ - --hash=sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838 \ - --hash=sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71 \ - --hash=sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d \ - --hash=sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44 \ - --hash=sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2 \ - --hash=sha256:d516b3283a758e087841aedb8031549fb41ced08f3db10aa6d2bf32dc042525b \ - --hash=sha256:e0618518f282c4ebff60f5e5b1247b6d91bb8b9f4476947563a1e74acc66f3c6 \ - --hash=sha256:e2ca07fa7d89195ec0865d3d285666286740bfa83d83e5cee204043a31ecc165 \ - --hash=sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5 \ - --hash=sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72 \ - --hash=sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4 - # via - # fastmcp-slim +watchfiles==1.1.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219 \ + --hash=sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803 \ + --hash=sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94 \ + --hash=sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43 \ + --hash=sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10 \ + --hash=sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374 \ + --hash=sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051 \ + --hash=sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49 \ + --hash=sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77 \ + --hash=sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741 \ + --hash=sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a \ + --hash=sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701 \ + --hash=sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6 \ + --hash=sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef \ + --hash=sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af \ + --hash=sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336 \ + --hash=sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2 \ + --hash=sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606 \ + --hash=sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610 \ + --hash=sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b \ + --hash=sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d \ + --hash=sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24 \ + --hash=sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e \ + --hash=sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf + # via + # fastmcp # uvicorn -wcwidth==0.8.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:f453740b1e4a4f3291faa37944c555d71056c4da08d59809b307ef4feba695c8 \ - --hash=sha256:faf5b4a5366a72dc49cad48cdf21f52bdf63bdda995178e483ba247ff79089b9 +wcwidth==0.6.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad \ + --hash=sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159 # via # prettytable # prompt-toolkit @@ -3568,30 +3066,32 @@ websocket-client==1.9.0 ; (platform_machine == 'arm64' and sys_platform == 'darw --hash=sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98 \ --hash=sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef # via kubernetes -websockets==15.0.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2 \ - --hash=sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8 \ - --hash=sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375 \ - --hash=sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597 \ - --hash=sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3 \ - --hash=sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf \ - --hash=sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4 \ - --hash=sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22 \ - --hash=sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65 \ - --hash=sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151 \ - --hash=sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431 \ - --hash=sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee \ - --hash=sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413 \ - --hash=sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8 \ - --hash=sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905 \ - --hash=sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe \ - --hash=sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562 \ - --hash=sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215 \ - --hash=sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931 \ - --hash=sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f - # via - # fastmcp-slim - # langgraph-sdk +websockets==16.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c \ + --hash=sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe \ + --hash=sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec \ + --hash=sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64 \ + --hash=sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8 \ + --hash=sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2 \ + --hash=sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03 \ + --hash=sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8 \ + --hash=sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5 \ + --hash=sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f \ + --hash=sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00 \ + --hash=sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b \ + --hash=sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39 \ + --hash=sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9 \ + --hash=sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5 \ + --hash=sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c \ + --hash=sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1 \ + --hash=sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d \ + --hash=sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82 \ + --hash=sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5 \ + --hash=sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f \ + --hash=sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c \ + --hash=sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da + # via + # fastmcp # uvicorn wikipedia==1.4.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:db0fad1829fdd441b1852306e9856398204dc0786d2996dd2e0c8bb8e26133b2 @@ -3628,66 +3128,30 @@ xdg-base-dirs==6.0.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin' --hash=sha256:3c01d1b758ed4ace150ac960ac0bd13ce4542b9e2cdf01312dcda5012cfebabe \ --hash=sha256:950504e14d27cf3c9cb37744680a43bf0ac42efefc4ef4acf98dc736cab2bced # via garak-api -xxhash==3.7.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:030c0fd688fce3569fbb49a2feefd4110cbb0b650186fb4610759ecfac677548 \ - --hash=sha256:03f8ff4474ee61c845758ce00711d7087a770d77efb36f7e74a6e867301000b8 \ - --hash=sha256:073c23900a9fbf3d26616c17c830db28af9803677cd5b33aea3224d824111514 \ - --hash=sha256:0c72fe9c7e3d6dfd7f1e21e224a877917fa09c465694ba4e06464b9511b65544 \ - --hash=sha256:0ff71596bd79816975b3de7130ab1ff4541410285a3c084584eeb1c8239996fd \ - --hash=sha256:13805f0461cba0a857924e70ff91ae6d52d2598f79a884e788db80532614a4a1 \ - --hash=sha256:14bf7a54e43825ec131ee7fe3c60e142e7c2c1e676ad0f93fc893432d15414af \ - --hash=sha256:151d7520838d4465461a0b7f4ae488b3b00de16183dd3214c1a6b14bf89d7fb6 \ - --hash=sha256:1910df4756a5ab58cfad8744fc2d0f23926e3efcc346ee76e87b974abab922f4 \ - --hash=sha256:1ad86695c19b1d46fe106925db3c7a37f16be37669dcf58dcc70a9dd6e324676 \ - --hash=sha256:1cc07c639e3a77ef1d32987464d3e408565b8a3be57b545d3542b191054d9923 \ - --hash=sha256:1d398f372496152f1c6933a33566373f8d1b37b98b8c9d608fa6edc0976f23b2 \ - --hash=sha256:2220af08163baf5fa36c2b8af079dc2cbe6e66ae061385267f9472362dfd53c6 \ - --hash=sha256:31ab1461c77a11461d703c88eb949e132a1c6515933cf675d97ec680f4bd18de \ - --hash=sha256:31e3516a0f829d06ded4a2c0f3c7c5561993256bfa1c493975fb9dc7bfa828a1 \ - --hash=sha256:347a93f2b4ce67ce61959665e32a7447c380f8347e55e100daa23766baacf0e5 \ - --hash=sha256:363c139bf15e1ac5f136b981d3c077eb551299b1effede7f12faa010b8590a60 \ - --hash=sha256:3b6b3d28228af044ebcded71c4a3dd86e1dbd7e2f4645bf40f7b5da65bb5fb5a \ - --hash=sha256:3bb5fd680c038fd5229e44e9c493782f90df9bef632fd0499d442374688ff70b \ - --hash=sha256:3e1860f1e43d40e9d904cf22d93e587ea42e010ebce4160877e46bcab4bc232a \ - --hash=sha256:43475925a766d01ca8cd9a857fd87f3d50406983c8506a4c07c4df12adcc867f \ - --hash=sha256:44fba4a5f1d179b7ddc7b3dc40f56f9209046421679b57025d4d8821b376fd8d \ - --hash=sha256:48b542c347c2089f43dc5a6db31d2a6f3cdb04ee33505ec6e9f653834dbb0bde \ - --hash=sha256:496736f86a9bedaf64b0dc70e3539d0766df01c71ea22032698e88f3f04a1ce9 \ - --hash=sha256:503722d52a615f2604f5e7611de7d43878df010dc0053094ef91cb9a9ac3d987 \ - --hash=sha256:54876a4e45101cec2bf8f31a973cda073a23e2e108538dad224ba07f85f22487 \ - --hash=sha256:5b1bde10324f4c31812ae0d0502e92d916ae8917cad7209353f122b8b8f610c3 \ - --hash=sha256:5de686e73690cdaf72b96d4fa083c230ec9020bcc2627ce6316138e2cf2fe2d1 \ - --hash=sha256:5e7ce913b61f35b0c1c839a49ac9c8e75dd8d860150688aed353b0ce1bf409d8 \ - --hash=sha256:693d02c6dc7d1aa0a45921d54cd8c1ff629e09dfdc2238471507af1f7a1c6f04 \ - --hash=sha256:6be4d70d9ab76c9f324ead9c01af6ff52c324745ea0c3731682a0cf99720f1fe \ - --hash=sha256:6cc4eefbb542a5d6ffd6d70ea9c502957c925e800f998c5630ecc809d6702bae \ - --hash=sha256:6e934bbae1e0ec74e27d5f0d7f37ef547ce5ff9f0a7e63fb39e559fc99526734 \ - --hash=sha256:7c4d596b7676f811172687ec567cbafb9e4dea2f9be1bbb4f622410cb7f40f40 \ - --hash=sha256:8f4608a06e4d61b7a3425665a46d00e0579122e1a2fae97a0c52953a3aad9aa3 \ - --hash=sha256:9122ad6f867c4a0f5e655f5c3bdf89103852009dbb442a3d23e688b9e699e800 \ - --hash=sha256:91c3b07cf3362086d8f126c6aecd8e5e9396ad8b2f2219ea7e49a8250c318acd \ - --hash=sha256:921c14e93817842dd0dd9f372890a0f0c72e534650b6ab13c5be5cd0db11d47e \ - --hash=sha256:970f9f8c50961d639cbd0d988c96f80ddf66006de93641719282c4fe7a87c5e6 \ - --hash=sha256:a169a036bed0995e090d1493b283cc2cc8a6f5046821086b843abefff80643bc \ - --hash=sha256:a6545e6b409e3d5cbafc850fb84c55a1ca26ed15a6b11e3bf07a0e0cd84517c8 \ - --hash=sha256:a778b25874cb0f862eaab5986bff4ca49ffb0def7c0a34c237b948b3c6c775b2 \ - --hash=sha256:abb65b4e947e958f7b3b0d71db3ce447d1bc5f37f5eab871ce7223bda8768a04 \ - --hash=sha256:acbb48679ddf3852c45280c10ff10d52ca2cd1da2e552fb81db1ff786c75d0e4 \ - --hash=sha256:ae3a39a4d96bdb6f8d154fd7f490c4ad06f0532fcd2bb656052a9a7762cf5d31 \ - --hash=sha256:b59ee2ac81de57771a09ecad09191e840a1d2fae1ef684208320591055768f83 \ - --hash=sha256:c50269d0055ac1faecfd559886d2cbe4b730de236585aba0e873f9d9dadbe585 \ - --hash=sha256:c72500a3b6d6c30ebfc135035bcace9eb5884f2dc220804efcaaba43e9f611dd \ - --hash=sha256:c9b31ab1f28b078a6a1ac1a54eb35e7d5390deddd56870d0be3a0a733d1c321c \ - --hash=sha256:d006faf3b491957efcb433489be3c149efe4787b7063d5cddb8ddaefdc60e0c1 \ - --hash=sha256:d610aa62cdb7d4d497740741772a24a794903bf3e79eaa51d2e800082abe11e5 \ - --hash=sha256:d7d9110d0c3fb02679972837a033251fd186c529aa62f19c132fc909c74052b8 \ - --hash=sha256:dc026e3b89d98e30a8288c95cb696e77d150b3f0fb7a51f73dcd49ee6b5577fa \ - --hash=sha256:e64a7c9d7dfca3e0fafcbc5e455519090706a3e36e95d655cec3e04e79f95aaa \ - --hash=sha256:ea6daa712f4e094a30830cf01e9b47d03b24d05cc9dab8609f0d9a9db8454712 \ - --hash=sha256:f14bb8b22a4a91325813e3d553b8963c10cf8c756cff65ee50c194431296c655 \ - --hash=sha256:f3e7b689c3bce16699efcf736066f5c6cc4472c3840fe4b22bd8279daf4abdac \ - --hash=sha256:fddbbb69a6fff4f421e7a0d1fa28f894b20112e9e3fab306af451e2dfd0e459b \ - --hash=sha256:fe14c356f8b23ad811dc026077a6d4abccdaa7bce5ca98579605550657b6fcfb +xxhash==3.6.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:297b7fbf86c82c550e12e8fb71968b3f033d27b874276ba3624ea868c11165a8 \ + --hash=sha256:2b6821e94346f96db75abaa6e255706fb06ebd530899ed76d32cd99f20dc52fa \ + --hash=sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae \ + --hash=sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d \ + --hash=sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2 \ + --hash=sha256:51312c768403d8540487dbbfb557454cfc55589bbde6424456951f7fcd4facb3 \ + --hash=sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db \ + --hash=sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033 \ + --hash=sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f \ + --hash=sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd \ + --hash=sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1 \ + --hash=sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263 \ + --hash=sha256:881b47fc47e051b37d94d13e7455131054b56749b91b508b0907eb07900d1c13 \ + --hash=sha256:8b29ee68625ab37b04c0b40c3fafdf24d2f75ccd778333cfb698f65f6c463f62 \ + --hash=sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2 \ + --hash=sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204 \ + --hash=sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9 \ + --hash=sha256:c6dc31591899f5e5666f04cc2e529e69b4072827085c1ef15294d91a004bc1bd \ + --hash=sha256:dea26ae1eb293db089798d3973a5fc928a18fdd97cc8801226fae705b02b14b0 \ + --hash=sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6 \ + --hash=sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd \ + --hash=sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7 \ + --hash=sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee # via # datasets # langgraph @@ -3705,91 +3169,61 @@ yara-python==4.5.1 ; (platform_machine == 'arm64' and sys_platform == 'darwin') --hash=sha256:bb65c17657b4cdbe5adee7a6e617ee05e214e8afdbc82b195885354a72a16476 \ --hash=sha256:f533848781f0e46e44eda77055eae4ec934cf56c1f473e787704f1a348e90094 # via nmp-guardrails -yarl==1.24.2 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f \ - --hash=sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae \ - --hash=sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a \ - --hash=sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44 \ - --hash=sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9 \ - --hash=sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db \ - --hash=sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b \ - --hash=sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50 \ - --hash=sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1 \ - --hash=sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488 \ - --hash=sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f \ - --hash=sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d \ - --hash=sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003 \ - --hash=sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536 \ - --hash=sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a \ - --hash=sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e \ - --hash=sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035 \ - --hash=sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294 \ - --hash=sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7 \ - --hash=sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5 \ - --hash=sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c \ - --hash=sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992 \ - --hash=sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf \ - --hash=sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986 \ - --hash=sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d \ - --hash=sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d \ - --hash=sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617 \ - --hash=sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996 \ - --hash=sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8 \ - --hash=sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2 \ - --hash=sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592 \ - --hash=sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b \ - --hash=sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92 \ - --hash=sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8 \ - --hash=sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576 \ - --hash=sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712 \ - --hash=sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1 \ - --hash=sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b \ - --hash=sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a \ - --hash=sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1 \ - --hash=sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c \ - --hash=sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c \ - --hash=sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8 \ - --hash=sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056 +yarl==1.23.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25 \ + --hash=sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e \ + --hash=sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2 \ + --hash=sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860 \ + --hash=sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035 \ + --hash=sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4 \ + --hash=sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34 \ + --hash=sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512 \ + --hash=sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9 \ + --hash=sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5 \ + --hash=sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a \ + --hash=sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c \ + --hash=sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5 \ + --hash=sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b \ + --hash=sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7 \ + --hash=sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598 \ + --hash=sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8 \ + --hash=sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f \ + --hash=sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51 \ + --hash=sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa \ + --hash=sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a \ + --hash=sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99 \ + --hash=sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59 \ + --hash=sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432 \ + --hash=sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543 \ + --hash=sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24 # via aiohttp -zipp==4.1.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ - --hash=sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f \ - --hash=sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602 +zipp==3.23.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ + --hash=sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e \ + --hash=sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166 # via importlib-metadata zstandard==0.25.0 ; (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') \ --hash=sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a \ - --hash=sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6 \ - --hash=sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250 \ --hash=sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f \ --hash=sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3 \ --hash=sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6 \ - --hash=sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa \ --hash=sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611 \ --hash=sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b \ - --hash=sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e \ --hash=sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa \ --hash=sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf \ --hash=sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902 \ - --hash=sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc \ - --hash=sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98 \ - --hash=sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a \ --hash=sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097 \ --hash=sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea \ - --hash=sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb \ --hash=sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7 \ --hash=sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b \ --hash=sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a \ --hash=sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00 \ --hash=sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072 \ - --hash=sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065 \ - --hash=sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512 \ --hash=sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1 \ --hash=sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f \ --hash=sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b \ --hash=sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea \ --hash=sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277 \ - --hash=sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708 \ - --hash=sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313 \ - --hash=sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551 + --hash=sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313 # via # clickhouse-connect # langsmith diff --git a/tools/mcp-dev-tools/nmp_dev_mcp.py b/tools/mcp-dev-tools/nmp_dev_mcp.py index 00e3fbbd57..9e0a3db54b 100644 --- a/tools/mcp-dev-tools/nmp_dev_mcp.py +++ b/tools/mcp-dev-tools/nmp_dev_mcp.py @@ -445,7 +445,6 @@ async def run_pytest( Examples: - run_pytest("tools/mcp-dev-tools/tests") - Run all tests in directory - - run_pytest("services/evaluator/tests", markers="unit") - Run unit tests only - run_pytest("packages/nmp_common", verbose=False) - Run without verbose """ import re diff --git a/tools/nemo-platform-sdk-tools/tests/sdk/vendor/test_vendor_package.py b/tools/nemo-platform-sdk-tools/tests/sdk/vendor/test_vendor_package.py index 8b80445a57..1091792429 100644 --- a/tools/nemo-platform-sdk-tools/tests/sdk/vendor/test_vendor_package.py +++ b/tools/nemo-platform-sdk-tools/tests/sdk/vendor/test_vendor_package.py @@ -347,7 +347,7 @@ def test_process_bundle_packages_rebuilds_generated_dependency_groups(tmp_path: [project.optional-dependencies] # Generated from [tool.bundle-package]; do not edit by hand. -nemo-evaluator-plugin = ["nemo-evaluator-sdk", "nmp-evaluator"] +nemo-evaluator-plugin = ["nemo-evaluator-sdk", "stale-plugin-dep"] # Generated from [tool.bundle-package]; do not edit by hand. services = ["nemo-platform[core-service]", "old-service"] @@ -403,7 +403,6 @@ def test_process_bundle_packages_rebuilds_platform_seed_service_group(tmp_path: "packages/nemo_platform", "packages/nmp_common", "services/core/auth", - "services/evaluator", "services/guardrails", "services/platform-seed", ] @@ -421,7 +420,6 @@ def test_process_bundle_packages_rebuilds_platform_seed_service_group(tmp_path: nmp-common = { source = "../../packages/nmp_common/src/nmp/common", module = "nmp/common" } nmp-auth = { source = "../../services/core/auth/src/nmp/core/auth", module = "nmp/core/auth", deps_group = "auth-service" } nmp-guardrails = { source = "../../services/guardrails/src/nmp/guardrails", module = "nmp/guardrails", deps_group = "guardrails-service" } -nmp-evaluator = { source = "../../services/evaluator/src/nmp/evaluator", module = "nmp/evaluator", deps_group = "evaluator-service" } nmp-platform-seed = { source = "../../services/platform-seed/src/nmp/platform_seed", module = "nmp/platform_seed", deps_group = "platform-seed-service" } """.lstrip(), encoding="utf-8", @@ -430,14 +428,13 @@ def test_process_bundle_packages_rebuilds_platform_seed_service_group(tmp_path: """ [project] name = "nmp-platform-seed" -dependencies = ["nmp-common", "nmp-auth", "nmp-guardrails", "nmp-evaluator"] +dependencies = ["nmp-common", "nmp-auth", "nmp-guardrails"] """.lstrip(), encoding="utf-8", ) for package_path, package_name in [ ("packages/nmp_common", "nmp-common"), ("services/core/auth", "nmp-auth"), - ("services/evaluator", "nmp-evaluator"), ("services/guardrails", "nmp-guardrails"), ]: pyproject_path = tmp_path / package_path / "pyproject.toml" @@ -461,7 +458,6 @@ def test_process_bundle_packages_rebuilds_platform_seed_service_group(tmp_path: "nmp-common", "nmp-auth", "nmp-guardrails", - "nmp-evaluator", ] diff --git a/uv.lock b/uv.lock index ee0c8038c0..9fe0d7074c 100644 --- a/uv.lock +++ b/uv.lock @@ -51,7 +51,6 @@ members = [ "nmp-core-mcp", "nmp-dev-mcp", "nmp-entities", - "nmp-evaluator", "nmp-files", "nmp-guardrails", "nmp-hello-world", @@ -146,7 +145,7 @@ wheels = [ [[package]] name = "accelerate" -version = "1.13.0" +version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -157,9 +156,9 @@ dependencies = [ { name = "safetensors", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "torch", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/14/787e5498cd062640f0f3d92ef4ae4063174f76f9afd29d13fc52a319daae/accelerate-1.13.0.tar.gz", hash = "sha256:d631b4e0f5b3de4aff2d7e9e6857d164810dfc3237d54d017f075122d057b236", size = 402835, upload-time = "2026-03-04T19:34:12.359Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/75/94cd5d389649578aca399e5aa822637eec18319a1dadc400ffe2f9a7493f/accelerate-1.14.0.tar.gz", hash = "sha256:41b9c4377a54e0b460a959b0defa1b736e4ca0a2373252d9a539964c2afe3c8d", size = 412167, upload-time = "2026-06-11T13:45:52.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/46/02ac5e262d4af18054b3e922b2baedbb2a03289ee792162de60a865defc5/accelerate-1.13.0-py3-none-any.whl", hash = "sha256:cf1a3efb96c18f7b152eb0fa7490f3710b19c3f395699358f08decca2b8b62e0", size = 383744, upload-time = "2026-03-04T19:34:10.313Z" }, + { url = "https://files.pythonhosted.org/packages/a8/db/253133d7e7cb40d3af384bb2f5c0b4a2b7fdcffbc95c688cc67a20a3c103/accelerate-1.14.0-py3-none-any.whl", hash = "sha256:e94390c2863b873be18f623f9df48a0d8fe5eff13ea7f1a00092b0a7904888c6", size = 389246, upload-time = "2026-06-11T13:45:50.477Z" }, ] [[package]] @@ -200,14 +199,14 @@ boto3 = [ [[package]] name = "aiofile" -version = "3.11.1" +version = "3.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "caio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/41/2fea7e193e061ce54eacc3b7bc0e6a99e4fcff43c78cf0a76dd781ed8334/aiofile-3.11.1.tar.gz", hash = "sha256:1f91912c6643d2a4e49ca4ae3514f0bf3867ce948a36d99a6411b8f4755f4cf9", size = 19342, upload-time = "2026-05-16T08:18:33.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/e2/d7cb819de8df6b5c1968a2756c3cb4122d4fa2b8fc768b53b7c9e5edb646/aiofile-3.9.0.tar.gz", hash = "sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b", size = 17943, upload-time = "2024-10-08T10:39:35.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/cd/0d76dfc5de72bde52f55f53e925c7d152d9c7906634ec1e0cbc7e8d4ad93/aiofile-3.11.1-py3-none-any.whl", hash = "sha256:ce77d14ac07f77bc2b757834a5c129321f3f705c474593deed5ab209079a52c9", size = 20446, upload-time = "2026-05-16T08:18:32.051Z" }, + { url = "https://files.pythonhosted.org/packages/50/25/da1f0b4dd970e52bf5a36c204c107e11a0c6d3ed195eba0bfbc664c312b2/aiofile-3.9.0-py3-none-any.whl", hash = "sha256:ce2f6c1571538cbdfa0143b04e16b208ecb0e9cb4148e528af8a640ed51cc8aa", size = 19539, upload-time = "2024-10-08T10:39:32.955Z" }, ] [[package]] @@ -221,16 +220,16 @@ wheels = [ [[package]] name = "aiohappyeyeballs" -version = "2.6.2" +version = "2.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/c6/61a2d7b7572279226bb2e7f61d7a19ca7c90da0329c93fa0d560cbf288d8/aiohappyeyeballs-2.6.2.tar.gz", hash = "sha256:e202810ee718bd01fc6ef49e8ea53d023d5cb6b581076d7925aa499fa55dbe64", size = 22591, upload-time = "2026-05-20T15:12:24.631Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl", hash = "sha256:4708045e2d7a6c6bdf8aafa8ed39649eaf926a4543b54560659129e3365953c4", size = 15062, upload-time = "2026-05-20T15:12:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, ] [[package]] name = "aiohttp" -version = "3.14.1" +version = "3.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -239,56 +238,28 @@ dependencies = [ { name = "frozenlist", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "multidict", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "propcache", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "typing-extensions", marker = "(python_full_version < '3.13' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "yarl", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/78/8ea7308cac6934de8c74a14f3d5f65d1c89287426688be79538d0e5c013d/aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035", size = 7955794, upload-time = "2026-06-07T21:09:35.529Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/dd/bf526e6f0a1120dd6f2df2e97bacfe4d358f13d17a0ff5847301a1375a51/aiohttp-3.14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa00140699487bd435fde4342d85c94cb256b7cd3a5b9c3396c67f19922afda2", size = 765225, upload-time = "2026-06-07T21:06:07.957Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e7/c60c7b209e509cc787de3cea0550a518538cfc08003e1c1e14c1c63fff71/aiohttp-3.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d44ec478e713ee7f29b439f7eb8dc2b9d4079e11ae114d2c2ac3d5daf30516c8", size = 514139, upload-time = "2026-06-07T21:06:11.26Z" }, - { url = "https://files.pythonhosted.org/packages/5b/8d/614ace2f579702c9840ab1e1447fd8509e35b0b904f7196418fa2f57b25d/aiohttp-3.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3b1a184a9a8f548a6b73f1e26b96b052193e4b3175ed7342aaf1151a1f00a04", size = 1784088, upload-time = "2026-06-07T21:06:12.887Z" }, - { url = "https://files.pythonhosted.org/packages/49/e0/726e90f99542bf292f81a96a12cc4847deb86f3ccf62c6f4014a201f4d33/aiohttp-3.14.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5f2504bc0322437c9a1ff6d3333ca56c7477b727c995f036b976ae17b98372c8", size = 1737835, upload-time = "2026-06-07T21:06:14.564Z" }, - { url = "https://files.pythonhosted.org/packages/0b/4b/d176d5c4db9d33dacf0543102ea59503bc1d528af4cfd0b719949ca49389/aiohttp-3.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73f05ea02013e02512c3bf42714f1208c57168c779cc6fe23516e4543089d0a6", size = 1842801, upload-time = "2026-06-07T21:06:16.228Z" }, - { url = "https://files.pythonhosted.org/packages/dc/d6/5a99b563690ea0cbed912ae94a2ce33993a5709a651a3a4fe761e7dd973a/aiohttp-3.14.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:797457503c2d426bee06eef808d07b31ede30b65e054444e7de64cad0061b7af", size = 1929992, upload-time = "2026-06-07T21:06:17.947Z" }, - { url = "https://files.pythonhosted.org/packages/76/7f/a987b14a3859094b3cea3f4825219c3e5536242564af6e3f9c2f6c994eb2/aiohttp-3.14.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b821a1f7dedf7e37450654e620038ac3b2e81e8fa6ea269337e97101978ec730", size = 1786989, upload-time = "2026-06-07T21:06:19.677Z" }, - { url = "https://files.pythonhosted.org/packages/f1/1a/420e5c85a3e73349372ed22ce0b6af86bfa6ce16a4b20a64a2e94608c781/aiohttp-3.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4cd96b5ba05d67ed0cf00b5b405c8cd99586d8e3481e8ee0a831057591af7621", size = 1640129, upload-time = "2026-06-07T21:06:22.558Z" }, - { url = "https://files.pythonhosted.org/packages/a7/80/18a592ed3be0a402cc03670bd72ee1f8563ddbe1d8d5542dbf868f274136/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d459b98a932296c6f0e94f87511a0b1b90a8a02c30a50e60a297619cd5a58ee", size = 1756576, upload-time = "2026-06-07T21:06:24.8Z" }, - { url = "https://files.pythonhosted.org/packages/ec/0b/8b3d5713373858ff71a617daf6e3b0e81ad63e79d09a3cf2f6b6b983939c/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:764457a7be60825fb770a644852ff717bcbb5042f189f2bd16df61a81b3f6573", size = 1754668, upload-time = "2026-06-07T21:06:26.528Z" }, - { url = "https://files.pythonhosted.org/packages/9f/49/fd564575cf225821d7ba5a117cb8bc27213d8a7e1811162afb43ae077039/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7a16ef45b081454ef844502d87a848876c490c4cb5c650c230f6ec79ed2c1e7", size = 1817019, upload-time = "2026-06-07T21:06:28.297Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1b/e850c9ae6fc91356552ae668bb6c51e93fa29c8aef13398a10b56678557f/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2fbc3ed048b3475b9f0cbcb9978e9d2d3511acd91ead203af26ed9f0056004cf", size = 1631638, upload-time = "2026-06-07T21:06:30.242Z" }, - { url = "https://files.pythonhosted.org/packages/eb/94/3c337ba72451a89806ace6f75bddc92bafc5b8d53d90115a512858024b63/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bedb0cd073cc2dc035e30aeb99444389d3cd2113afe4ef9fcd23d439f5bade85", size = 1835660, upload-time = "2026-06-07T21:06:31.943Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9c/9c18cf367a0498212d9ba7daf990b504a5e8ae064cda4b504e2647c89c03/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b6feea921016eb3d4e04d65fc4e9ca402d1a3801f562aef94989f54694917af3", size = 1775698, upload-time = "2026-06-07T21:06:33.72Z" }, - { url = "https://files.pythonhosted.org/packages/1d/21/151624b51cd92553d95424daf4bf19f19ce9be9002d19253e7e7ce67197b/aiohttp-3.14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d35143e27778b4bb0fb189562d7f275bff79c62ab8e98459717c0ea617ff2480", size = 757402, upload-time = "2026-06-07T21:06:40.311Z" }, - { url = "https://files.pythonhosted.org/packages/55/b2/2aac325583aaa1353045f96dffa586d8a34e8322e14a7ba49cffeb103ab4/aiohttp-3.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27fd7c91e51729b4f7e1577865fa6d34c9adccbc39aabe9000285b48af9f0ec2", size = 512448, upload-time = "2026-06-07T21:06:43.813Z" }, - { url = "https://files.pythonhosted.org/packages/8a/72/a60607cb849faa8af8a356c9329ea2eb6f395d49e82cc82ccba1fd8deb8f/aiohttp-3.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c567bf9eaf664280116a8688f63016e6b32db2505908e2bdaca1b6438142f2", size = 1766854, upload-time = "2026-06-07T21:06:45.391Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d3/d9fe1c9ec7557ab4d0d82bebaa728c6418f0b93295ec2f4ab015f7710cc7/aiohttp-3.14.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f5e6ff2bdbb8f4cd3fbe41f99e25bbcd58e3bf9f13d3dd31a11e7917251cc77a", size = 1740884, upload-time = "2026-06-07T21:06:47.413Z" }, - { url = "https://files.pythonhosted.org/packages/c1/dc/f2cecfaf9337ba3e63f181500814ff502aa3d00d9c7ec93a9d23d10a27b2/aiohttp-3.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f73e01dc37122325caf079982621262f96d74823c179038a82fddfc50359264", size = 1810034, upload-time = "2026-06-07T21:06:50.165Z" }, - { url = "https://files.pythonhosted.org/packages/66/d7/2ff65c5e65c0d7476daf7e15c032e0805e36811185b9623e3238ad6c763e/aiohttp-3.14.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb2c0c80d431c0d03f2c7dbf125150fedd4f0de17366a7ca33f7ccb822391842", size = 1904054, upload-time = "2026-06-07T21:06:52.035Z" }, - { url = "https://files.pythonhosted.org/packages/20/9c/d445818389df371f56d141d881153ba23183c4735a03f7356ffb43f7757d/aiohttp-3.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e6fc1a85fa7194a1a7d19f44e8609180f4a8eb5fa4c7ed8b4355f080fad235c", size = 1790278, upload-time = "2026-06-07T21:06:54.049Z" }, - { url = "https://files.pythonhosted.org/packages/4d/aa/bf04cb4d865fc6101c2229a294ad744973b72e513fdc5a6b791e6983d72a/aiohttp-3.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:686b6c0d3911ec387b444ddf5dc62fb7f7c0a7d5186a7861626496a5ab4aff95", size = 1591795, upload-time = "2026-06-07T21:06:55.911Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b4/4dac0038960427ba832f6609dfb4ea5437d7fd80c72001b9e48f834f428b/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c6fa4dc7ad6f8109c70bb1499e589f76b0b792baf39f9b017eb92c8a81d0a199", size = 1728397, upload-time = "2026-06-07T21:06:57.777Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f9/7cd4e8ad7aa3b75f17d56bb5498dd604a93d4e6eece822ba0568c413fff0/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:87a5eea1b2a5e21e1ebdbb33ad4165359189327e63fc4e4894693e7f821ac817", size = 1766504, upload-time = "2026-06-07T21:07:00.009Z" }, - { url = "https://files.pythonhosted.org/packages/f9/df/fc01d9fcad0f73fed3f3d361f1f94f975947b50dff82919f6dc2bf4316cc/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c1421eb01d4fd608d88cc8290211d177a58532b55ad94076fb349c5bf467f0a", size = 1777806, upload-time = "2026-06-07T21:07:02.064Z" }, - { url = "https://files.pythonhosted.org/packages/41/09/47e2d090bddcc8fb4ccb4c314aadc32d7c5d9bb55f50f6ad1c92fc15d501/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:34b257ec41345c1e8f2df68fa908a7952f5de932723871eb633ecbbff396c9a4", size = 1580707, upload-time = "2026-06-07T21:07:03.942Z" }, - { url = "https://files.pythonhosted.org/packages/3d/36/f1a4ce904ae0b6930cfe9afc96d0896f7ec1a620c400405d63783bb95a9c/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:de538791a80e5d862addbc183f70f0158ac9b9bb872bb147f1fd2a683691e087", size = 1798121, upload-time = "2026-06-07T21:07:05.987Z" }, - { url = "https://files.pythonhosted.org/packages/70/0a/e0075ce9ca0279ee1d4f0c0b85f54fea02ebc83c3007651a72bece658fec/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f71173be42d3241d428f760122febb748de0623f44308a6f120d0dd9ec572e3", size = 1767580, upload-time = "2026-06-07T21:07:07.873Z" }, - { url = "https://files.pythonhosted.org/packages/fe/22/a73ccbf9dbd6e26dda0b24d5fd5db7da92ee3383a79f47677ffb834c5c5b/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:915fbb7b41b115192259f8c9ae58f3ddc444d2b5579917270211858e606a4afd", size = 485841, upload-time = "2026-06-07T21:07:19.555Z" }, - { url = "https://files.pythonhosted.org/packages/3b/b9/57ed8eaf596321c2ad747bd480fb1700dbd7177c60dfc9e4c187f629662e/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:7fb4bdf95b0561a79f259f9d28fbc109728c5ee7f27aff6391f0ca703a329abe", size = 492088, upload-time = "2026-06-07T21:07:21.581Z" }, - { url = "https://files.pythonhosted.org/packages/78/c0/5ebe5270a7c140d7c6f79dcb018640225f14d406c149e4eec04a7d82fe71/aiohttp-3.14.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1b9748363260121d2927704f5d4fc498150669ca3ae93625986ee89c8f80dcd4", size = 501564, upload-time = "2026-06-07T21:07:23.388Z" }, - { url = "https://files.pythonhosted.org/packages/75/7f/8cdaa24fc7983865e0915153b96a9ac5bcdd3548d64c5a27d17cecccad2d/aiohttp-3.14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:86a6dab78b0e43e2897a3bbe15745aa60dc5423ca437b7b0b164c069bf91b876", size = 751998, upload-time = "2026-06-07T21:07:25.046Z" }, - { url = "https://files.pythonhosted.org/packages/ab/01/a2d5f96cd4e74424864d30bc0a7e44d0a12dacdcfa91b5b2d1bd3dca6bf3/aiohttp-3.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:317acd9f8602858dc7d59679812c376c7f0b97bcbbf16e0d6237f54141d8a8a6", size = 508657, upload-time = "2026-06-07T21:07:29.252Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ed/3c0fb5c500fdd8e7ebc10d1889c04384fffa1a9163eac1356088ca9da1b1/aiohttp-3.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd869c427324e5cb15195793de951295710db28be7d818247f3097b4ab5d4b96", size = 1757907, upload-time = "2026-06-07T21:07:31.03Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ab/d4c924d9bd5be3050c226612413ce68cb54c70d2c31b661bfc8d9a5b6a70/aiohttp-3.14.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93b032b5ec3255473c143627d21a69ac74ae12f7f33974cb587c564d11b1066f", size = 1737565, upload-time = "2026-06-07T21:07:33.031Z" }, - { url = "https://files.pythonhosted.org/packages/19/2a/37326821ff779084020cdc33224d20b19f42f4183a500ff92022a739eda7/aiohttp-3.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f234b4deb12f3ad59127e037bc57c40c21e45b45282df7d3a55a0f409f595296", size = 1799018, upload-time = "2026-06-07T21:07:35.003Z" }, - { url = "https://files.pythonhosted.org/packages/b3/4f/6e947ba73e4ce09070761c05ed3a8ceb7c21f5e46798671d8b2aac0e4626/aiohttp-3.14.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9af6779bfb46abf124068327abcdf9ce95c9ef8287a3e8da76ccf2d0f16c28fa", size = 1894416, upload-time = "2026-06-07T21:07:36.956Z" }, - { url = "https://files.pythonhosted.org/packages/9d/6e/dbf1d0625dc711fb2851f4f3c3055c39ed58bae92082d8c627dbe6013736/aiohttp-3.14.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:faccab372e66bc76d5731525e7f1143c922271725b9d38c9f97edcc66266b451", size = 1783881, upload-time = "2026-06-07T21:07:39.063Z" }, - { url = "https://files.pythonhosted.org/packages/44/c2/5e25098a67268ed369483ae7d1a58bd0a13d03aab860d2a0e4a6eb25b046/aiohttp-3.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f380468b09d2a81633ee863b0ec5648d364bd17bb8ecfb8c2f387f7ac1faf42c", size = 1587572, upload-time = "2026-06-07T21:07:41.058Z" }, - { url = "https://files.pythonhosted.org/packages/2a/bd/cf9cee17e140f942a3de73e658a543aa8fbf35a5fc67a9d2538d52d77f0b/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:97e704dcd26271f5bda3fa07c3ce0fb76d6d3f8659f4baa1a24442cc9ba177ca", size = 1722137, upload-time = "2026-06-07T21:07:43.014Z" }, - { url = "https://files.pythonhosted.org/packages/89/6d/5684f8c59045c96f81a18cefbc1fbbd79d25b88f1c622f2a5c5c08fcb632/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:269b76ac5394092b95bc4a098f4fc6c191c083c3bd12775d1e30e663132f6a09", size = 1755953, upload-time = "2026-06-07T21:07:45.933Z" }, - { url = "https://files.pythonhosted.org/packages/a8/40/35caf3170f8359760740a7d9aa0fff2e344bef98e1d1186f5a0f6dec17e6/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0b3e614340c889d575451696374c9d17affd54cd607ca0babed8f8c37b9397", size = 1766479, upload-time = "2026-06-07T21:07:48.047Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a1/b0c61e7a137f0d81de49a82023a6df73c3c16d6fefb0f8e4a93d21639002/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5663ee9257cfa1add7253a7da3035a02f31b6600ec48261585e1800a81533080", size = 1580077, upload-time = "2026-06-07T21:07:50.069Z" }, - { url = "https://files.pythonhosted.org/packages/0b/41/194ea4623693009fcefebef7aef63c141754f153e9cd0d39d3b9e36c175c/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:603a2c834142172ffddc054067f5ec0ca65d57a0aa98a71bc81952573208e345", size = 1791688, upload-time = "2026-06-07T21:07:52.106Z" }, - { url = "https://files.pythonhosted.org/packages/ba/45/4de841f005cfe1fd63e2a2fe011262c515e2a62aa6994b15947e7d717ac9/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cb21957bb8aca671c1765e32f58164cf0c50e6bf41c0bbbd16da20732ecaf588", size = 1761094, upload-time = "2026-06-07T21:07:54.113Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/f5/a20c4ac64aeaef1679e25c9983573618ff765d7aa829fa2b84ae7573169e/aiohttp-3.13.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ab7229b6f9b5c1ba4910d6c41a9eb11f543eadb3f384df1b4c293f4e73d44d6", size = 757513, upload-time = "2026-03-31T21:57:02.146Z" }, + { url = "https://files.pythonhosted.org/packages/87/ec/e38ce072e724fd7add6243613f8d1810da084f54175353d25ccf9f9c7e5a/aiohttp-3.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7d2f8616f0ff60bd332022279011776c3ac0faa0f1b463f7bb12326fbc97a1c", size = 501673, upload-time = "2026-03-31T21:57:06.208Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ba/3bc7525d7e2beaa11b309a70d48b0d3cfc3c2089ec6a7d0820d59c657053/aiohttp-3.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2567b72e1ffc3ab25510db43f355b29eeada56c0a622e58dcdb19530eb0a3cb", size = 1763757, upload-time = "2026-03-31T21:57:07.882Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a5/0521aa32c1ddf3aa1e71dcc466be0b7db2771907a13f18cddaa45967d97b/aiohttp-3.13.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a807cabd5115fb55af198b98178997a5e0e57dead43eb74a93d9c07d6d4a7dc", size = 1759969, upload-time = "2026-03-31T21:57:16.146Z" }, + { url = "https://files.pythonhosted.org/packages/6f/41/27392a61ead8ab38072105c71aa44ff891e71653fe53d576a7067da2b4e8/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60869c7ac4aaabe7110f26499f3e6e5696eae98144735b12a9c3d9eae2b51a49", size = 1739844, upload-time = "2026-03-31T21:57:19.679Z" }, + { url = "https://files.pythonhosted.org/packages/e5/67/5b3ac26b80adb20ea541c487f73730dc8fa107d632c998f25bbbab98fcda/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7996023b2ed59489ae4762256c8516df9820f751cf2c5da8ed2fb20ee50abab3", size = 1752321, upload-time = "2026-03-31T21:57:30.549Z" }, + { url = "https://files.pythonhosted.org/packages/be/6f/353954c29e7dcce7cf00280a02c75f30e133c00793c7a2ed3776d7b2f426/aiohttp-3.13.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:023ecba036ddd840b0b19bf195bfae970083fd7024ce1ac22e9bba90464620e9", size = 748876, upload-time = "2026-03-31T21:57:36.319Z" }, + { url = "https://files.pythonhosted.org/packages/29/47/7be41556bfbb6917069d6a6634bb7dd5e163ba445b783a90d40f5ac7e3a7/aiohttp-3.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab2899f9fa2f9f741896ebb6fa07c4c883bfa5c7f2ddd8cf2aafa86fa981b2d2", size = 500258, upload-time = "2026-03-31T21:57:39.923Z" }, + { url = "https://files.pythonhosted.org/packages/67/84/c9ecc5828cb0b3695856c07c0a6817a99d51e2473400f705275a2b3d9239/aiohttp-3.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60eaa2d440cd4707696b52e40ed3e2b0f73f65be07fd0ef23b6b539c9c0b0b4", size = 1749199, upload-time = "2026-03-31T21:57:41.938Z" }, + { url = "https://files.pythonhosted.org/packages/57/d8/8d44036d7eb7b6a8ec4c5494ea0c8c8b94fbc0ed3991c1a7adf230df03bf/aiohttp-3.13.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b18f31b80d5a33661e08c89e202edabf1986e9b49c42b4504371daeaa11b47c1", size = 1767934, upload-time = "2026-03-31T21:57:51.171Z" }, + { url = "https://files.pythonhosted.org/packages/41/db/073e4ebe00b78e2dfcacff734291651729a62953b48933d765dc513bf798/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:327cc432fdf1356fb4fbc6fe833ad4e9f6aacb71a8acaa5f1855e4b25910e4a9", size = 1705219, upload-time = "2026-03-31T21:57:55.385Z" }, + { url = "https://files.pythonhosted.org/packages/84/63/7749337c90f92bc2cb18f9560d67aa6258c7060d1397d21529b8004fcf6f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:888e78eb5ca55a615d285c3c09a7a91b42e9dd6fc699b166ebd5dee87c9ccf14", size = 1732427, upload-time = "2026-03-31T21:58:06.337Z" }, + { url = "https://files.pythonhosted.org/packages/78/e9/d76bf503005709e390122d34e15256b88f7008e246c4bdbe915cd4f1adce/aiohttp-3.13.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5029cc80718bbd545123cd8fe5d15025eccaaaace5d0eeec6bd556ad6163d61", size = 742930, upload-time = "2026-03-31T21:58:13.155Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f5/0fb20fb49f8efdcdce6cd8127604ad2c503e754a8f139f5e02b01626523f/aiohttp-3.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a84792f8631bf5a94e52d9cc881c0b824ab42717165a5579c760b830d9392ac9", size = 497141, upload-time = "2026-03-31T21:58:17.009Z" }, + { url = "https://files.pythonhosted.org/packages/3b/86/b7c870053e36a94e8951b803cb5b909bfbc9b90ca941527f5fcafbf6b0fa/aiohttp-3.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57653eac22c6a4c13eb22ecf4d673d64a12f266e72785ab1c8b8e5940d0e8090", size = 1732476, upload-time = "2026-03-31T21:58:18.925Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d2/e2f77eef1acb7111405433c707dc735e63f67a56e176e72e9e7a2cd3f493/aiohttp-3.13.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3df334e39d4c2f899a914f1dba283c1aadc311790733f705182998c6f7cae665", size = 1754113, upload-time = "2026-03-31T21:58:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/ec/a6/9b3e91eb8ae791cce4ee736da02211c85c6f835f1bdfac0594a8a3b7018c/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7becdf835feff2f4f335d7477f121af787e3504b48b449ff737afb35869ba7bb", size = 1693205, upload-time = "2026-03-31T21:58:32.214Z" }, + { url = "https://files.pythonhosted.org/packages/01/a4/62f05a0a98d88af59d93b7fcac564e5f18f513cb7471696ac286db970d6a/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d6d44a5b48132053c2f6cd5c8cb14bc67e99a63594e336b0f2af81e94d5530c", size = 1730356, upload-time = "2026-03-31T21:58:44.049Z" }, ] [[package]] @@ -396,7 +367,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/07/38/e321b0e05d8cc068a [[package]] name = "anthropic" -version = "0.107.1" +version = "0.101.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -408,9 +379,9 @@ dependencies = [ { name = "sniffio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/f1/c6076a92e0bf6b0dfa126e213b3f9e8a510acd73567953210713aae6c256/anthropic-0.107.1.tar.gz", hash = "sha256:8e7169a6ab57fb806b778d9af018c867bad688144efec8969cdb4c5ccecd6670", size = 856312, upload-time = "2026-06-07T17:18:57.358Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/cb/9d0123243e749ac3a579972b2c398971bce1dc57bcc4efb08066df610360/anthropic-0.101.0.tar.gz", hash = "sha256:1116a6a87c55757e0fbe3e1ba40804fbd04de7963601a6dd6b539a889f18de3e", size = 758603, upload-time = "2026-05-11T15:46:33.944Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/0e/71432f0777a263701955a23ebcc6650485c2753be9afbce2a6a8d72526e3/anthropic-0.107.1-py3-none-any.whl", hash = "sha256:b74338d08000ba105dfc8adae29af3713ece845a4bffec9986a20697e087c7b3", size = 838729, upload-time = "2026-06-07T17:18:58.729Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b2/74ff06762d005ecf1658929a292df0acb786d025f6a6c54fcb30e2dc7761/anthropic-0.101.0-py3-none-any.whl", hash = "sha256:cc3cc6576989471e2aa9132258034ad0ff0d8fe500b04ac499e4e46ed68c5ed0", size = 753594, upload-time = "2026-05-11T15:46:32.216Z" }, ] [[package]] @@ -623,15 +594,15 @@ wheels = [ [[package]] name = "beautifulsoup4" -version = "4.15.0" +version = "4.14.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" }, + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, ] [[package]] @@ -651,7 +622,7 @@ wheels = [ [[package]] name = "black" -version = "26.5.1" +version = "26.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -661,27 +632,27 @@ dependencies = [ { name = "platformdirs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pytokens", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07", size = 666155, upload-time = "2026-03-12T03:36:03.593Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, - { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, - { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, - { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, - { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, + { url = "https://files.pythonhosted.org/packages/54/aa/340a1463660bf6831f9e39646bf774086dbd8ca7fc3cded9d59bbdf4ad0a/black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c", size = 1689499, upload-time = "2026-03-12T03:40:07.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/01/b726c93d717d72733da031d2de10b92c9fa4c8d0c67e8a8a372076579279/black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5", size = 1754369, upload-time = "2026-03-12T03:40:09.279Z" }, + { url = "https://files.pythonhosted.org/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f", size = 1718499, upload-time = "2026-03-12T03:40:15.239Z" }, + { url = "https://files.pythonhosted.org/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7", size = 1794994, upload-time = "2026-03-12T03:40:17.124Z" }, + { url = "https://files.pythonhosted.org/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f", size = 1718503, upload-time = "2026-03-12T03:40:23.666Z" }, + { url = "https://files.pythonhosted.org/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56", size = 1793557, upload-time = "2026-03-12T03:40:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b", size = 207542, upload-time = "2026-03-12T03:36:01.668Z" }, ] [[package]] name = "bleach" -version = "6.4.0" +version = "6.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/3c/e12ac860709702bd5ebeb9b56a4fe334f1001246ee1b8f2b7ee28912df7d/bleach-6.4.0.tar.gz", hash = "sha256:4202482733d85cedd04e59fcb2f89f4e4c7c385a78d3c3c23c30446843a37452", size = 204857, upload-time = "2026-06-05T13:01:13.734Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl", hash = "sha256:4b6b6a54fff2e69a3dde9d21cc6301220bee3c3cb792187d11403fd795031081", size = 165109, upload-time = "2026-06-05T13:01:12.504Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, ] [package.optional-dependencies] @@ -731,23 +702,23 @@ wheels = [ [[package]] name = "botocore-stubs" -version = "1.43.14" +version = "1.42.41" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-awscrt", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/81/79693e833291c00dc89ee610e5e915381b6f08233912e28df50106840780/botocore_stubs-1.43.14.tar.gz", hash = "sha256:9e3bc1fdd51da7473f0df726c82747a1b0ae913449d629659765c247fecc2039", size = 42738, upload-time = "2026-05-25T06:06:37.484Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/a8/a26608ff39e3a5866c6c79eda10133490205cbddd45074190becece3ff2a/botocore_stubs-1.42.41.tar.gz", hash = "sha256:dbeac2f744df6b814ce83ec3f3777b299a015cbea57a2efc41c33b8c38265825", size = 42411, upload-time = "2026-02-03T20:46:14.479Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/ca/f017727b11895908c5dedc829cf2ec35e0c4b2a26ba875db325fef2cefdf/botocore_stubs-1.43.14-py3-none-any.whl", hash = "sha256:fb98f1475c92fd718644e786b5c543a20f1b1f610e89e0a7191c3f1f429c75aa", size = 67093, upload-time = "2026-05-25T06:06:34.532Z" }, + { url = "https://files.pythonhosted.org/packages/32/76/cab7af7f16c0b09347f2ebe7ffda7101132f786acb767666dce43055faab/botocore_stubs-1.42.41-py3-none-any.whl", hash = "sha256:9423110fb0e391834bd2ed44ae5f879d8cb370a444703d966d30842ce2bcb5f0", size = 66759, upload-time = "2026-02-03T20:46:13.02Z" }, ] [[package]] name = "cachetools" -version = "7.1.4" +version = "7.0.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f4/8b/0d3945a13955303b81272f759a0331e54c5c793da455e6f5706b89d2639c/cachetools-7.1.4.tar.gz", hash = "sha256:437f55a4e0c1b01a4f3077cc470e6991d47430970e36fbcb77e2be0df4fc1cd6", size = 40085, upload-time = "2026-05-21T22:40:43.376Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/dd/57fe3fdb6e65b25a5987fd2cdc7e22db0aef508b91634d2e57d22928d41b/cachetools-7.0.5.tar.gz", hash = "sha256:0cd042c24377200c1dcd225f8b7b12b0ca53cc2c961b43757e774ebe190fd990", size = 37367, upload-time = "2026-03-09T20:51:29.451Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/7b/1fc1c09cc0756cf25861a3be10565915953876da48bb228fb9a672b20a42/cachetools-7.1.4-py3-none-any.whl", hash = "sha256:323dc4127934744db5b54eb4924482d7edafbf9554e820d1531c2e08c0e4ef54", size = 16761, upload-time = "2026-05-21T22:40:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/06/f3/39cf3367b8107baa44f861dc802cbf16263c945b62d8265d36034fc07bea/cachetools-7.0.5-py3-none-any.whl", hash = "sha256:46bc8ebefbe485407621d0a4264b23c080cedd913921bad7ac3ed2f26c183114", size = 13918, upload-time = "2026-03-09T20:51:27.33Z" }, ] [[package]] @@ -782,11 +753,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.5.20" +version = "2026.2.25" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] [[package]] @@ -800,22 +771,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8 wheels = [ { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, - { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, - { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, @@ -841,50 +806,26 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, - { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, - { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, - { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, - { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, - { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, - { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, - { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, - { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, - { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, - { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, - { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, - { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, - { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, - { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, - { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, - { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, - { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, - { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, - { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, - { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, - { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, - { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, - { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, - { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, - { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, - { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, - { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, - { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, - { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, - { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, - { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, - { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, + { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, + { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, + { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, + { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, ] [[package]] @@ -898,11 +839,11 @@ wheels = [ [[package]] name = "click" -version = "8.4.1" +version = "8.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] [[package]] @@ -947,30 +888,18 @@ sdist = { url = "https://files.pythonhosted.org/packages/46/9e/d8e40b29b6269a845 wheels = [ { url = "https://files.pythonhosted.org/packages/ec/e0/1ae285f4d5bb61bb62016deb38dc175a2b8cbe578dffdad5e1a5a02a176c/clickhouse_driver-0.2.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3572e74cd65828f72284bf607de259c059178b44b19a93cb67766b7e7458cf8e", size = 208477, upload-time = "2025-11-10T22:47:34.925Z" }, { url = "https://files.pythonhosted.org/packages/28/04/e2fb47a4aaf9653c9ed872e1505e997d42f834b0891351ef54169e100c5c/clickhouse_driver-0.2.10-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:767af2b2d2e02fb7abd8fc9619f8aa2de65be010d3024029d68bc9b1be564466", size = 1006131, upload-time = "2025-11-10T22:47:36.386Z" }, - { url = "https://files.pythonhosted.org/packages/e3/52/626cf3a908dde51638213a6c414e86bc66c47e384cb379c4a0533930a329/clickhouse_driver-0.2.10-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b00005a89f0e40ec0bc313f7e131d958aa17e6af5c3260dbb5c7daf5370c5443", size = 1059838, upload-time = "2025-11-10T22:47:38.266Z" }, - { url = "https://files.pythonhosted.org/packages/12/57/a5917930760e4032e98017916bd6770308e146d44c58e450da6fa87f2d4b/clickhouse_driver-0.2.10-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a62ad120dab6bcc68b6413b7ef0dbaef75ab5ca985d490a9e1ec13d93bf33dc3", size = 1069504, upload-time = "2025-11-10T22:47:40.681Z" }, { url = "https://files.pythonhosted.org/packages/f5/08/4419ce43b27b6349fd14af0d8f5d8594d270b9bb24cbaca575bacfec630e/clickhouse_driver-0.2.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9f65e71c99f0c8a64afa348977793967f897c4f731984ed54fed4eca8d375a0", size = 998284, upload-time = "2025-11-10T22:47:42.713Z" }, { url = "https://files.pythonhosted.org/packages/36/10/edbe55be3554e2cea7c68ed1761aaa2bea0153474d81a467a0ac862b3478/clickhouse_driver-0.2.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c120b182ea7e9713b119ba2b518dd75503c18f26cb001a6e436326765fddd123", size = 971989, upload-time = "2025-11-10T22:47:44.642Z" }, - { url = "https://files.pythonhosted.org/packages/2f/18/d0b883af04067c70e99c22dbab1f085062ae764a063f22d4e144e833048d/clickhouse_driver-0.2.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3da6f6d05f14780f3183f8b7b23ed9826d1e0f2f73c2471037d5335b474782e", size = 1022107, upload-time = "2025-11-10T22:47:46.148Z" }, - { url = "https://files.pythonhosted.org/packages/fe/40/11446c52c5330123354f2f88151c620e1b38ca6d5131b2cc71786ec3c067/clickhouse_driver-0.2.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9617c6ef154e58c6693be6e1169000957238f83d21fe20d57bb492412cc6128d", size = 1015750, upload-time = "2025-11-10T22:47:47.702Z" }, { url = "https://files.pythonhosted.org/packages/36/9b/32abe3c76fe8494ad1642febbe4c59dfd46477e27c401d2ac8cc8a0a6117/clickhouse_driver-0.2.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8c2dbee2083295c6d9789a10cb0c967c4e123e6315e3192e4ad935cd55967c3", size = 975901, upload-time = "2025-11-10T22:47:49.136Z" }, { url = "https://files.pythonhosted.org/packages/32/7b/8e526f6ffb9983c0c6d082e358df4b20fe1a9e95f453e704bc7a25ef4aab/clickhouse_driver-0.2.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:188775d38ff7cb36e7045441aabf3a6a8751127d8b37b6eb1b1518494eaac5bd", size = 207193, upload-time = "2025-11-10T22:47:55.146Z" }, { url = "https://files.pythonhosted.org/packages/65/96/40f274896abf287c378575f025c602fa4e834278930dd63574ff548815c4/clickhouse_driver-0.2.10-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ff5cba860df61845d6ae12f31d4a70ff4ae3be4e6a8a876e68af8aa4b0e45bc", size = 1046187, upload-time = "2025-11-10T22:47:58.246Z" }, - { url = "https://files.pythonhosted.org/packages/0c/80/7b6e110c3b803fa8b3f8cdba0e08553a62c5f64e5ad57e56de3ea95cd9e1/clickhouse_driver-0.2.10-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fad865009d96de44d548f1691ed92adee971f72c001cf4466b3ba2ac7d9db47b", size = 1088806, upload-time = "2025-11-10T22:47:59.834Z" }, - { url = "https://files.pythonhosted.org/packages/c5/d6/7f77bd00fc01df9db2e573de21bbc1f66083549d004864b892877dee8a76/clickhouse_driver-0.2.10-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cf0fe791e7c2adc0ab41d4770953c00f8a88bdd7e3ee83bb849a661a6c93d4ef", size = 1109839, upload-time = "2025-11-10T22:48:01.405Z" }, { url = "https://files.pythonhosted.org/packages/55/f7/57a80ff9cc44a333021e2caf8d35fc23da6ec7b602bbc3bf8dfac0253a6e/clickhouse_driver-0.2.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5744daafdd0ff7520c6ae95a78211a0ff5c2cfb3513a20f5602d2bc7eed580d", size = 1049773, upload-time = "2025-11-10T22:48:03.089Z" }, { url = "https://files.pythonhosted.org/packages/f6/3e/fcf8e9cb9edc717ce6c467a9ec7c96b4495d5f8ec4859175952149fbdaa8/clickhouse_driver-0.2.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f02f6c9f71ae5c06e3b760d3d9f4f758b32acf6f71504b6d90bacca9abbfec18", size = 1006817, upload-time = "2025-11-10T22:48:05.038Z" }, - { url = "https://files.pythonhosted.org/packages/95/ab/1bc25a385012c03595b91311d8341205a5790375207d80425e2285055d42/clickhouse_driver-0.2.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6df571410f149e16e0a0e5529f1c2a9e41bb62b9357a3c8b0bd0647d6bb0fd1e", size = 1051047, upload-time = "2025-11-10T22:48:07.115Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e1/9dd7331d08495beacf4291a6fbe5514fd0f6f8d53014121a8d70d8bd6c1e/clickhouse_driver-0.2.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1e891162226a44fa169bdc996efd49b22bcf59372c35118ec5785e936fe97178", size = 1052014, upload-time = "2025-11-10T22:48:08.608Z" }, { url = "https://files.pythonhosted.org/packages/ee/e9/af10e0ddbbd90c4ead933effff1b8914bc687bd52a70d244404db4c91529/clickhouse_driver-0.2.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3a261947ba0cf0034d044c30563ad151d1cf8156a5ff419b017c423b4235e0ac", size = 1020937, upload-time = "2025-11-10T22:48:10.993Z" }, { url = "https://files.pythonhosted.org/packages/34/92/ee5a2d7a812b65d9690e46222218f33064c4bd44f3535b1ba564fb4b528b/clickhouse_driver-0.2.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8be64c77d58d4a33b3c957cdb7c5a4deeac56bf93f4188dbfb5c5454eb04c985", size = 205158, upload-time = "2025-11-10T22:48:17.745Z" }, { url = "https://files.pythonhosted.org/packages/03/00/6c532a0aea89e3d09dd4150b1df0b92e787a306b8711d54d003d18fd1ddd/clickhouse_driver-0.2.10-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23abafd0c883ccc1baea527c1d05a6bc0c59aae6c29ae65e1b84d498b265f8c0", size = 1033476, upload-time = "2025-11-10T22:48:19.239Z" }, - { url = "https://files.pythonhosted.org/packages/ea/9b/137ea1ff9539da77cd022331ec4fa079cbefbd4ebbcb5c51bdd7dcd0bca0/clickhouse_driver-0.2.10-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:77ffe2063469c637c5e57bf0713ca1b617b612d55a8392799f97e34c353e6908", size = 1079495, upload-time = "2025-11-10T22:48:20.744Z" }, - { url = "https://files.pythonhosted.org/packages/ec/1c/e13766af7e4e174c6f17b1fbc5a078b28584f53adc91f103caacc73f569b/clickhouse_driver-0.2.10-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df2d77779fcc1ddb68614b75bf45b8db61cf63f42a03d5624ce6922a305e609f", size = 1100658, upload-time = "2025-11-10T22:48:22.277Z" }, { url = "https://files.pythonhosted.org/packages/41/e5/0686ad3ef1b594c16e8b13394c73ee4860fd025d70211a360f797dd7a28a/clickhouse_driver-0.2.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e46e31e4b14626571819e669341a3017376ce935d25b2cc0bfea9343b1b562", size = 1034175, upload-time = "2025-11-10T22:48:24.117Z" }, { url = "https://files.pythonhosted.org/packages/d8/32/fea4e971297b50e5af3318fd90d400269ae1c74ad4d83a9453b89f578d3c/clickhouse_driver-0.2.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7435d1ff2bc577aeedf8f01d94b5777af382484f8973a9c5018d5afd0dd175c", size = 995963, upload-time = "2025-11-10T22:48:25.824Z" }, - { url = "https://files.pythonhosted.org/packages/02/c4/d42f2b69ab5903e5bc9119b179f55c9aef79fe667f77cab4d8ae90492dcd/clickhouse_driver-0.2.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b60c7e3321214eec4568811bcd953836671fa078c57f6607f236414447636de2", size = 1044626, upload-time = "2025-11-10T22:48:27.927Z" }, - { url = "https://files.pythonhosted.org/packages/78/36/043b6b2d967396172a60f10bf26de2c83248857f9a1e75b481f02218d1d7/clickhouse_driver-0.2.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13fdf6571e20ac79992605ad65058296ac0f2437c1e7428a98dd6d173753119e", size = 1045772, upload-time = "2025-11-10T22:48:29.439Z" }, { url = "https://files.pythonhosted.org/packages/0c/cf/bc5c807cbe68ce9eeac6a1997b937c81774ca86b2ab593c6efb9121a9f08/clickhouse_driver-0.2.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06b6b683af086f9049d0c5e7e660fb76013439efa640e6c8ff6673622c3838fa", size = 1006716, upload-time = "2025-11-10T22:48:31.086Z" }, { url = "https://files.pythonhosted.org/packages/40/7d/9abdd95b0da0dcf6dc644336459f132575bfbdee1a4ba377195c2032c03a/clickhouse_driver-0.2.10-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68e96e04282d126486b3820391a8ebf1d7c32b61e5fcbd701aeeda79017349e5", size = 216933, upload-time = "2025-11-10T22:49:47.474Z" }, { url = "https://files.pythonhosted.org/packages/5a/a4/33d4b6f1650847280265756e4d54f94730cdac082ab3f9e6518ba97502bf/clickhouse_driver-0.2.10-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fd9f72fcfe86e0fef0681cd124325714e92e96ad1fd675dfbeaccdfb7bd2f64", size = 219670, upload-time = "2025-11-10T22:49:49.401Z" }, @@ -1014,47 +943,31 @@ wheels = [ [[package]] name = "coverage" -version = "7.14.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, - { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, - { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, - { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, - { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, - { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, - { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, - { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, - { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, - { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, - { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, - { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, - { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, - { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, - { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, - { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, - { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, - { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, - { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, - { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, - { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, - { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, - { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, - { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, - { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, - { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, +version = "7.13.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, + { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, + { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, + { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, + { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, + { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, + { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, ] [package.optional-dependencies] @@ -1062,38 +975,6 @@ toml = [ { name = "tomli", marker = "(python_full_version <= '3.11' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version <= '3.11' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version <= '3.11' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -[[package]] -name = "crc32c" -version = "2.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7f/4c/4e40cc26347ac8254d3f25b9f94710b8e8df24ee4dddc1ba41907a88a94d/crc32c-2.7.1.tar.gz", hash = "sha256:f91b144a21eef834d64178e01982bb9179c354b3e9e5f4c803b0e5096384968c", size = 45712, upload-time = "2024-09-24T06:20:17.553Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/8e/2f37f46368bbfd50edfc11b96f0aa135699034b1b020966c70ebaff3463b/crc32c-2.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19e03a50545a3ef400bd41667d5525f71030488629c57d819e2dd45064f16192", size = 49672, upload-time = "2024-09-24T06:18:18.032Z" }, - { url = "https://files.pythonhosted.org/packages/25/ee/0cfa82a68736697f3c7e435ba658c2ef8c997f42b89f6ab4545efe1b2649/crc32c-2.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ebbf144a1a56a532b353e81fa0f3edca4f4baa1bf92b1dde2c663a32bb6a15", size = 35372, upload-time = "2024-09-24T06:18:20.983Z" }, - { url = "https://files.pythonhosted.org/packages/aa/92/c878aaba81c431fcd93a059e9f6c90db397c585742793f0bf6e0c531cc67/crc32c-2.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96b794fd11945298fdd5eb1290a812efb497c14bc42592c5c992ca077458eeba", size = 54879, upload-time = "2024-09-24T06:18:23.085Z" }, - { url = "https://files.pythonhosted.org/packages/6a/2b/9e29e9ac4c4213d60491db09487125db358cd9263490fbadbd55e48fbe03/crc32c-2.7.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d698eec444b18e296a104d0b9bb6c596c38bdcb79d24eba49604636e9d747305", size = 53674, upload-time = "2024-09-24T06:18:25.624Z" }, - { url = "https://files.pythonhosted.org/packages/79/ed/df3c4c14bf1b29f5c9b52d51fb6793e39efcffd80b2941d994e8f7f5f688/crc32c-2.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e07cf10ef852d219d179333fd706d1c415626f1f05e60bd75acf0143a4d8b225", size = 54691, upload-time = "2024-09-24T06:18:26.578Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6f/26fc3dda5835cda8f6cd9d856afe62bdeae428de4c34fea200b0888e8835/crc32c-2.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1738259802978cdf428f74156175da6a5fdfb7256f647fdc0c9de1bc6cd7173", size = 53554, upload-time = "2024-09-24T06:18:29.104Z" }, - { url = "https://files.pythonhosted.org/packages/1d/02/998dc21333413ce63fe4c1ca70eafe61ca26afc7eb353f20cecdb77d614e/crc32c-2.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f7d1c4e761fe42bf856130daf8b2658df33fe0ced3c43dadafdfeaa42b57b950", size = 49568, upload-time = "2024-09-24T06:18:32.425Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7d/5ff9904046ad15a08772515db19df43107bf5e3901a89c36a577b5f40ba0/crc32c-2.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd778fc8ac0ed2ffbfb122a9aa6a0e409a8019b894a1799cda12c01534493e0", size = 35373, upload-time = "2024-09-24T06:18:35.02Z" }, - { url = "https://files.pythonhosted.org/packages/4d/41/4aedc961893f26858ab89fc772d0eaba91f9870f19eaa933999dcacb94ec/crc32c-2.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56ef661b34e9f25991fface7f9ad85e81bbc1b3fe3b916fd58c893eabe2fa0b8", size = 54675, upload-time = "2024-09-24T06:18:35.954Z" }, - { url = "https://files.pythonhosted.org/packages/79/13/13576941bf7cf95026abae43d8427c812c0054408212bf8ed490eda846b0/crc32c-2.7.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c02a3bd67dea95cdb25844aaf44ca2e1b0c1fd70b287ad08c874a95ef4bb38db", size = 53495, upload-time = "2024-09-24T06:18:38.099Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b6/55ffb26d0517d2d6c6f430ce2ad36ae7647c995c5bfd7abce7f32bb2bad1/crc32c-2.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d17637c4867672cb8adeea007294e3c3df9d43964369516cfe2c1f47ce500a", size = 54456, upload-time = "2024-09-24T06:18:39.051Z" }, - { url = "https://files.pythonhosted.org/packages/48/ec/ce4138eaf356cd9aae60bbe931755e5e0151b3eca5f491fce6c01b97fd59/crc32c-2.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:588587772e55624dd9c7a906ec9e8773ae0b6ac5e270fc0bc84ee2758eba90d5", size = 53332, upload-time = "2024-09-24T06:18:40.925Z" }, - { url = "https://files.pythonhosted.org/packages/bf/98/1a6d60d5b3b5edc8382777b64100343cb4aa6a7e172fae4a6cfcb8ebbbd9/crc32c-2.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:24949bffb06fc411cc18188d33357923cb935273642164d0bb37a5f375654169", size = 49567, upload-time = "2024-09-24T06:18:44.485Z" }, - { url = "https://files.pythonhosted.org/packages/47/02/2bd65fdef10139b6a802d83a7f966b7750fe5ffb1042f7cbe5dbb6403869/crc32c-2.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba110df60c64c8e2d77a9425b982a520ccdb7abe42f06604f4d98a45bb1fff62", size = 35374, upload-time = "2024-09-24T06:18:46.304Z" }, - { url = "https://files.pythonhosted.org/packages/a9/0d/3e797d1ed92d357a6a4c5b41cea15a538b27a8fdf18c7863747eb50b73ad/crc32c-2.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c277f9d16a3283e064d54854af0976b72abaa89824955579b2b3f37444f89aae", size = 54641, upload-time = "2024-09-24T06:18:47.207Z" }, - { url = "https://files.pythonhosted.org/packages/01/cf/32f019be5de9f6e180926a50ee5f08648e686c7d9a59f2c5d0806a77b1c7/crc32c-2.7.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:724d5ff4d29ff093a983ae656be3307093706d850ea2a233bf29fcacc335d945", size = 53447, upload-time = "2024-09-24T06:18:50.296Z" }, - { url = "https://files.pythonhosted.org/packages/b2/8b/92f3f62f3bafe8f7ab4af7bfb7246dc683fd11ec0d6dfb73f91e09079f69/crc32c-2.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2416c4d88696ac322632555c0f81ab35e15f154bc96055da6cf110d642dbc10", size = 54484, upload-time = "2024-09-24T06:18:51.311Z" }, - { url = "https://files.pythonhosted.org/packages/b4/6c/309229e9acda8cf36a8ff4061d70b54d905f79b7037e16883ce6590a24ab/crc32c-2.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:edefc0e46f3c37372183f70338e5bdee42f6789b62fcd36ec53aa933e9dfbeaf", size = 53367, upload-time = "2024-09-24T06:18:53.49Z" }, - { url = "https://files.pythonhosted.org/packages/1b/80/61dcae7568b33acfde70c9d651c7d891c0c578c39cc049107c1cf61f1367/crc32c-2.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db9ac92294284b22521356715784b91cc9094eee42a5282ab281b872510d1831", size = 49386, upload-time = "2024-09-24T06:18:56.813Z" }, - { url = "https://files.pythonhosted.org/packages/63/42/5fcfc71a3de493d920fd2590843762a2749981ea56b802b380e5df82309d/crc32c-2.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5c056ef043393085523e149276a7ce0cb534b872e04f3e20d74d9a94a75c0ad7", size = 35292, upload-time = "2024-09-24T06:18:58.676Z" }, - { url = "https://files.pythonhosted.org/packages/03/de/fef962e898a953558fe1c55141644553e84ef4190693a31244c59a0856c7/crc32c-2.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03a92551a343702629af91f78d205801219692b6909f8fa126b830e332bfb0e0", size = 54223, upload-time = "2024-09-24T06:18:59.675Z" }, - { url = "https://files.pythonhosted.org/packages/13/3b/13d40a7dfbf9ef05c84a0da45544ee72080dca4ce090679e5105689984bd/crc32c-2.7.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88732070f6175530db04e0bb36880ac45c33d49f8ac43fa0e50cfb1830049d23", size = 52678, upload-time = "2024-09-24T06:19:02.661Z" }, - { url = "https://files.pythonhosted.org/packages/36/09/65ffc4fb9fa60ff6714eeb50a92284a4525e5943f0b040b572c0c76368c1/crc32c-2.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:57a20dfc27995f568f64775eea2bbb58ae269f1a1144561df5e4a4955f79db32", size = 53847, upload-time = "2024-09-24T06:19:03.705Z" }, - { url = "https://files.pythonhosted.org/packages/3c/d8/4526d5380189d6f2fa27256c204100f30214fe402f47cf6e9fb9a91ab890/crc32c-2.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:55a77e29a265418fa34bef15bd0f2c60afae5348988aaf35ed163b4bbf93cf37", size = 52508, upload-time = "2024-09-24T06:19:05.731Z" }, -] - [[package]] name = "cryptography" version = "46.0.7" @@ -1107,11 +988,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" }, { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" }, { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" }, - { url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" }, { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" }, - { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" }, { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" }, - { url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" }, { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" }, { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" }, { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" }, @@ -1119,11 +997,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" }, { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" }, { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" }, - { url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" }, { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" }, - { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" }, { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" }, - { url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" }, { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" }, { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" }, { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" }, @@ -1136,18 +1011,16 @@ wheels = [ [[package]] name = "cuda-bindings" -version = "13.3.1" +version = "12.9.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-pathfinder", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "cuda-pathfinder", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/51/6b/457ca12dad3ee9bfcc9a545cfd6b64b359ba49de40f776f6e028e678f262/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5879712accf6e14bb01aa5e67440eb84998b8d104b509cc7a6dc0b8f656a474", size = 6053539, upload-time = "2026-05-29T23:11:43.19Z" }, - { url = "https://files.pythonhosted.org/packages/95/7a/c5e3c34a409b148f5c0f5a4ea374158f95d488862c1dffedf9aa5c639df9/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04436a9364059c84b8f9636f359eccda1cf814341f5b670c71d80d2f79dbc708", size = 6674166, upload-time = "2026-05-29T23:11:45.478Z" }, - { url = "https://files.pythonhosted.org/packages/ce/67/5e7dba1ba576dd73da5dee894ca076ca5e959450dfff66d6d510a255d1f7/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7855c4868aabc0cfae28abbe83d56734bdfbd08f08fc234ac1912a12858bf49", size = 6025351, upload-time = "2026-05-29T23:11:49.685Z" }, - { url = "https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a", size = 6657965, upload-time = "2026-05-29T23:11:52.227Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6e/2394f8163360f8391f8f1b7e72d300a82724edb81a7b7084c799fbd4c91f/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9efb21c1ee64981e184b9e0ba5eb3179e5ba3d4b51665a6cb52b8ef3d01a7cbf", size = 5920504, upload-time = "2026-05-29T23:11:56.883Z" }, - { url = "https://files.pythonhosted.org/packages/34/c2/ef9b6a63f7dc432712a462c816662e662e00d38caa9b861c8c2588195d03/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2732904099e0a4d4db774a5fc6d91ee95fae065b4d2ecabb4968c5fe2406c9d7", size = 6476660, upload-time = "2026-05-29T23:11:59.188Z" }, + { url = "https://files.pythonhosted.org/packages/45/e7/b47792cc2d01c7e1d37c32402182524774dadd2d26339bd224e0e913832e/cuda_bindings-12.9.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c912a3d9e6b6651853eed8eed96d6800d69c08e94052c292fec3f282c5a817c9", size = 12210593, upload-time = "2025-10-21T14:51:36.574Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c1/dabe88f52c3e3760d861401bb994df08f672ec893b8f7592dc91626adcf3/cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fda147a344e8eaeca0c6ff113d2851ffca8f7dfc0a6c932374ee5c47caa649c8", size = 12151019, upload-time = "2025-10-21T14:51:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/56/e465c31dc9111be3441a9ba7df1941fe98f4aa6e71e8788a3fb4534ce24d/cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:32bdc5a76906be4c61eb98f546a6786c5773a881f3b166486449b5d141e4a39f", size = 11906628, upload-time = "2025-10-21T14:51:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/a3/84/1e6be415e37478070aeeee5884c2022713c1ecc735e6d82d744de0252eee/cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56e0043c457a99ac473ddc926fe0dc4046694d99caef633e92601ab52cbe17eb", size = 11925991, upload-time = "2025-10-21T14:51:56.535Z" }, ] [[package]] @@ -1158,53 +1031,14 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/c8/26f2e4aae92f11522a96043892ba39a90eac610d5242523aa863212bc1c7/cuda_pathfinder-1.5.5-py3-none-any.whl", hash = "sha256:0228c023f95d1480f143ef5c8922d27a2ab052087a942e81dc289c9eb8f91689", size = 51671, upload-time = "2026-05-27T01:21:25.413Z" }, ] -[[package]] -name = "cuda-toolkit" -version = "13.0.2" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", size = 2364, upload-time = "2025-12-19T23:24:07.328Z" }, -] - -[package.optional-dependencies] -cudart = [ - { name = "nvidia-cuda-runtime", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -cufft = [ - { name = "nvidia-cufft", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -cufile = [ - { name = "nvidia-cufile", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -cupti = [ - { name = "nvidia-cuda-cupti", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -curand = [ - { name = "nvidia-curand", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -cusolver = [ - { name = "nvidia-cusolver", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -cusparse = [ - { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -nvjitlink = [ - { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -nvrtc = [ - { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -nvtx = [ - { name = "nvidia-nvtx", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] - [[package]] name = "cut-cross-entropy" version = "25.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "torch", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "triton", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "torch", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "triton", version = "3.6.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "triton", version = "3.7.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7e/97/45ff09cfcda7b200389204daa0125168e6544fba257adbbcdf728501d4f9/cut_cross_entropy-25.1.1.tar.gz", hash = "sha256:5fe5924509248b1aea5c890f8887c6a7759f7c8b1ebc0490e42c247c4f7c1e34", size = 22972, upload-time = "2025-01-07T12:21:53.896Z" } wheels = [ @@ -1213,7 +1047,7 @@ wheels = [ [[package]] name = "cyclopts" -version = "4.17.0" +version = "4.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -1221,9 +1055,9 @@ dependencies = [ { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rich-rst", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/b7/2e64e26e7189c2f0f88cea467d068ec968f2fa24628b0ffb93132a0f2b14/cyclopts-4.17.0.tar.gz", hash = "sha256:6b3231f18b404879e978214ef26fa174e8b505bd0f2117290b4135560666004b", size = 181338, upload-time = "2026-06-09T13:41:26.801Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/c4/2ce2ca1451487dc7d59f09334c3fa1182c46cfcf0a2d5f19f9b26d53ac74/cyclopts-4.10.1.tar.gz", hash = "sha256:ad4e4bb90576412d32276b14a76f55d43353753d16217f2c3cd5bdceba7f15a0", size = 166623, upload-time = "2026-03-23T14:43:01.098Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/26/1614f15b8ea89ee201a2484ea5bede7319a2b07c796c321ffdadd705559e/cyclopts-4.17.0-py3-none-any.whl", hash = "sha256:6ee947c9f3bbe9679b9fa9cea1bb327298db80b302df62d7f1d1bd82726508e0", size = 219147, upload-time = "2026-06-09T13:41:24.97Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0b/2261922126b2e50c601fe22d7ff5194e0a4d50e654836260c0665e24d862/cyclopts-4.10.1-py3-none-any.whl", hash = "sha256:35f37257139380a386d9fe4475e1e7c87ca7795765ef4f31abba579fcfcb6ecd", size = 204331, upload-time = "2026-03-23T14:43:02.625Z" }, ] [[package]] @@ -1331,16 +1165,16 @@ provides-extras = ["test"] [[package]] name = "databricks-sdk" -version = "0.115.0" +version = "0.102.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-auth", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "protobuf", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/be/49/1fd8121d4517849ea67fddbd827e535871b94037fab985235c011fdc60d1/databricks_sdk-0.115.0.tar.gz", hash = "sha256:a91f219313ea1afcde9575ea083825cbcb3dde2d00cb4c858c49d9dfd61b3129", size = 965481, upload-time = "2026-06-08T09:43:01.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/b3/41ff1c3afe092df9085e084e0dc81c45bca5ed65f7b60dc59df0ade43c76/databricks_sdk-0.102.0.tar.gz", hash = "sha256:8fa5f82317ee27cc46323c6e2543d2cfefb4468653f92ba558271043c6f72fb9", size = 887450, upload-time = "2026-03-19T08:15:54.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/fd/80f87c4036b84a87102e95e87b1427b07c2b2de9e3101ff890bbf81ae2f4/databricks_sdk-0.115.0-py3-none-any.whl", hash = "sha256:4c6b32d7360442e99f4e662d8fe2638f217ce4dc3c1901a4d1ccc80e6c199f59", size = 912341, upload-time = "2026-06-08T09:42:59.327Z" }, + { url = "https://files.pythonhosted.org/packages/02/8c/d082bd5f72d7613524d5b35dfe1f71732b2246be2704fad68cd0e3fdd020/databricks_sdk-0.102.0-py3-none-any.whl", hash = "sha256:75d1253276ee8f3dd5e7b00d62594b7051838435e618f74a8570a6dbd723ec12", size = 838533, upload-time = "2026-03-19T08:15:52.248Z" }, ] [[package]] @@ -1358,7 +1192,7 @@ wheels = [ [[package]] name = "datamodel-code-generator" -version = "0.61.0" +version = "0.55.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "argcomplete", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -1369,10 +1203,11 @@ dependencies = [ { name = "jinja2", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "tomli", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/df/b2e7c15387d309bb7474dc4dbea96e624cfc42c1076e33abaed2d9164892/datamodel_code_generator-0.61.0.tar.gz", hash = "sha256:42d1b530bfa80d18a7bbfd2a24c21e53cb99a2dd4ef9d29f966a434d859c89c7", size = 1149717, upload-time = "2026-06-08T18:01:02.302Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/36/ec505ce62c143c0f045e82e2bb0360e2ede765c0cfe3a70bf32c5661b8a2/datamodel_code_generator-0.55.0.tar.gz", hash = "sha256:20ae7a4fbbb12be380f0bd02544db4abae96c5b644d4b3f2b9c3fc0bc9ee1184", size = 833828, upload-time = "2026-03-10T20:41:15.796Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/19/82582eae8ccd00ab76cb942d4a08f710c9044bbb1fe3dded804cc9a1208c/datamodel_code_generator-0.61.0-py3-none-any.whl", hash = "sha256:2c0ddcf5203c182e533c3567836ab5131d4b2ae4c8698419a59de3063e3cb447", size = 340657, upload-time = "2026-06-08T18:01:00.565Z" }, + { url = "https://files.pythonhosted.org/packages/be/c6/2abc9d11adbbf689b6b4dfb7a136d57b9ccaa3b3f1ba83504462109e8dbb/datamodel_code_generator-0.55.0-py3-none-any.whl", hash = "sha256:efa5a925288ca2a135fdc3361c7d774ae5b24b4fd632868363e249d55ea2f137", size = 256860, upload-time = "2026-03-10T20:41:13.488Z" }, ] [[package]] @@ -1402,26 +1237,26 @@ wheels = [ [[package]] name = "debugpy" -version = "1.8.21" +version = "1.8.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/aa/12037145b7a56eaa5b29b41872f7a21b538e807e13f32c4d3c46e59be084/debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6", size = 1697577, upload-time = "2026-06-01T19:30:35.156Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/fb/cbf306d6e07a313a91e7171a98669054502840931432c227cfd505ee367f/debugpy-1.8.21-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:da456226c7b4c69e35dbe35dcee6623d912000a77816db7856a41af1c72a0264", size = 2203120, upload-time = "2026-06-01T19:30:43.964Z" }, - { url = "https://files.pythonhosted.org/packages/aa/57/aa739bd4ad2cbf96aeb1b20b56918ddd5ae4c28b68709bfcd327f02123ee/debugpy-1.8.21-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:f68b891688e61bdc08b8d364d919ff0051e0b94657b39dcd027bc3173edb7cdc", size = 3059958, upload-time = "2026-06-01T19:30:45.622Z" }, - { url = "https://files.pythonhosted.org/packages/a2/df/bf625547431a9cadc9f4cbfeda38866e2b17f6aed147b625377e87834449/debugpy-1.8.21-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:9f96713896f39c3dff0ee841f47320c3f2983d33c341e009361bb0ebc79adc4e", size = 2483609, upload-time = "2026-06-01T19:30:50.794Z" }, - { url = "https://files.pythonhosted.org/packages/bf/09/59324b903599031ff9faaec1758292409f6561a0ec2492fe4b703327705a/debugpy-1.8.21-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c193d474f0a211191f2b4449d2d06157c689013035bd952f3b617e0ef422b176", size = 3968900, upload-time = "2026-06-01T19:30:52.341Z" }, - { url = "https://files.pythonhosted.org/packages/77/6b/d817e1f8cc77aa055d37fba092e0febfdff40fe652d8d53d4cd7a86ad98d/debugpy-1.8.21-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:13678151fc401e2d68c9880b91e28714f797d40422994572b24560ef80910a88", size = 2477398, upload-time = "2026-06-01T19:30:57.644Z" }, - { url = "https://files.pythonhosted.org/packages/48/57/412421516afc3055fa577516f00beec3d663f9b0ab330639547ae6c57720/debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2", size = 3962096, upload-time = "2026-06-01T19:30:59.235Z" }, - { url = "https://files.pythonhosted.org/packages/95/51/67e7cf11a53e40694f720457d5b3a1cdaaa3d5a9a633e482f225456b93ff/debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92", size = 5352888, upload-time = "2026-06-01T19:31:25.186Z" }, + { url = "https://files.pythonhosted.org/packages/51/56/c3baf5cbe4dd77427fd9aef99fcdade259ad128feeb8a786c246adb838e5/debugpy-1.8.20-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:eada6042ad88fa1571b74bd5402ee8b86eded7a8f7b827849761700aff171f1b", size = 2208318, upload-time = "2026-01-29T23:03:36.481Z" }, + { url = "https://files.pythonhosted.org/packages/9a/7d/4fa79a57a8e69fe0d9763e98d1110320f9ecd7f1f362572e3aafd7417c9d/debugpy-1.8.20-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:7de0b7dfeedc504421032afba845ae2a7bcc32ddfb07dae2c3ca5442f821c344", size = 3171493, upload-time = "2026-01-29T23:03:37.775Z" }, + { url = "https://files.pythonhosted.org/packages/14/57/7f34f4736bfb6e00f2e4c96351b07805d83c9a7b33d28580ae01374430f7/debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d", size = 2550686, upload-time = "2026-01-29T23:03:42.023Z" }, + { url = "https://files.pythonhosted.org/packages/ab/78/b193a3975ca34458f6f0e24aaf5c3e3da72f5401f6054c0dfd004b41726f/debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b", size = 4310588, upload-time = "2026-01-29T23:03:43.314Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/fc500524cc6f104a9d049abc85a0a8b3f0d14c0a39b9c140511c61e5b40b/debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a", size = 2539560, upload-time = "2026-01-29T23:03:48.738Z" }, + { url = "https://files.pythonhosted.org/packages/90/83/fb33dcea789ed6018f8da20c5a9bc9d82adc65c0c990faed43f7c955da46/debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf", size = 4293272, upload-time = "2026-01-29T23:03:50.169Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" }, ] [[package]] name = "decorator" -version = "5.3.1" +version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] [[package]] @@ -1445,18 +1280,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/c7/d1ec24fb280caa5a79b6b950db565dab30210a66259d17d5bb2b3a9f878d/dependency_groups-1.3.1-py3-none-any.whl", hash = "sha256:51aeaa0dfad72430fcfb7bcdbefbd75f3792e5919563077f30bc0d73f4493030", size = 8664, upload-time = "2025-05-02T00:34:27.085Z" }, ] -[[package]] -name = "detect-installer" -version = "0.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5f/ce/6897d812825e9d4c53e3c7112726e800cc5231b013b2223bf64f653ff362/detect_installer-0.1.0.tar.gz", hash = "sha256:00ad7ba0a36e3cf7d08a40d3643011746dbc112597c7d475cc91c416710ca4e7", size = 3049, upload-time = "2026-02-23T10:40:22.567Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/34/8cc73273414405086c58852916e4031812a6a30fe04c057e37ad99397b7f/detect_installer-0.1.0-py3-none-any.whl", hash = "sha256:034fb20fd665c36e6ba52b8821525ea07fb4f7f938cac459df889fb33801528a", size = 4539, upload-time = "2026-02-23T10:40:23.807Z" }, -] - [[package]] name = "diff-cover" -version = "10.3.0" +version = "10.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chardet", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -1464,9 +1290,9 @@ dependencies = [ { name = "pluggy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pygments", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/21/057e816125c162662d2a2cc2ebcd72dd333e78e51678298d07dd3146011a/diff_cover-10.3.0.tar.gz", hash = "sha256:474dbc63e815fbb7567d7b7ca5b104123e96129f25426ebdbc9a1bdbb935b2c6", size = 106546, upload-time = "2026-05-30T14:17:14.32Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/b4/eee71d1e338bc1f9bd3539b46b70e303dac061324b759c9a80fa3c96d90d/diff_cover-10.2.0.tar.gz", hash = "sha256:61bf83025f10510c76ef6a5820680cf61b9b974e8f81de70c57ac926fa63872a", size = 102473, upload-time = "2026-01-09T01:59:07.605Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/0a/a96e57a7a3fca419cd5ceff0d13dee2166520fa67103fb82624ad64700fb/diff_cover-10.3.0-py3-none-any.whl", hash = "sha256:2e47d5ab3868d1e92131c11f364f3f4a8583c97123d3bbc6b6cc8ce0a4cc2202", size = 58989, upload-time = "2026-05-30T14:17:12.858Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2c/61eeb887055a37150db824b6bf830e821a736580769ac2fea4eadb0d613f/diff_cover-10.2.0-py3-none-any.whl", hash = "sha256:59c328595e0b8948617cc5269af9e484c86462e2844bfcafa3fb37f8fca0af87", size = 56748, upload-time = "2026-01-09T01:59:06.028Z" }, ] [[package]] @@ -1491,11 +1317,11 @@ wheels = [ [[package]] name = "dill" -version = "0.4.0" +version = "0.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload-time = "2024-01-27T23:42:16.145Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload-time = "2024-01-27T23:42:14.239Z" }, ] [[package]] @@ -1518,11 +1344,11 @@ wheels = [ [[package]] name = "distlib" -version = "0.4.2" +version = "0.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/8d/873e9252ea2c0e0c857884e0a2899ec43ade132345df1925ef24cbe64f18/distlib-0.4.2.tar.gz", hash = "sha256:baeb401c90f27acd15c4861ae0847d1e731c27ac3dbf4210643ba61fa1e813db", size = 614914, upload-time = "2026-06-08T16:24:15.439Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/60/aa891c893821d4d127292ed66c6940d1d715894bd5a0ce048056bc641773/distlib-0.4.2-py2.py3-none-any.whl", hash = "sha256:ca4cb11e5d746b5ec13c199cbf19ae27a241f89702b54e153a74332955446067", size = 470510, upload-time = "2026-06-08T16:24:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] [[package]] @@ -1558,11 +1384,11 @@ wheels = [ [[package]] name = "docstring-parser" -version = "0.18.0" +version = "0.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484, upload-time = "2026-04-14T04:09:18.638Z" }, + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, ] [[package]] @@ -1576,22 +1402,22 @@ wheels = [ [[package]] name = "duckdb" -version = "1.5.3" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/69/00/d579dcb2a536b6ea3a2563cdad6844f77d81a9b2d4b22a858097f2468acf/duckdb-1.5.3.tar.gz", hash = "sha256:df39428eb130faa35ae96fd35245bdeae6ecf43936250b116b5fead568eb9f16", size = 18026640, upload-time = "2026-05-20T11:55:31.901Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/62/590caabec6c41003f46a244b6fd707d35ca2e552e0c70cbf454e08bf6685/duckdb-1.5.1.tar.gz", hash = "sha256:b370d1620a34a4538ef66524fcee9de8171fa263c701036a92bc0b4c1f2f9c6d", size = 17995082, upload-time = "2026-03-23T12:12:15.894Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/fc/a8a89c6c73f31c2b58c6abbc2f543e0b736042dd5ef7cc1784c24ec31428/duckdb-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:341a2672e2551ba51c95c1898f0ade983e76675e79038ccb16342c3d6cfb82d7", size = 32583465, upload-time = "2026-05-20T11:54:13.132Z" }, - { url = "https://files.pythonhosted.org/packages/e1/1a/7bf5ba1b7ea520557e6b2dbee1c85abab016bdac0c1779d9d0ef76c87300/duckdb-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70a18f932cf6d87bd0e554613657a515c1443a1724aacfc7ec5137dd28698b03", size = 15424794, upload-time = "2026-05-20T11:54:19.891Z" }, - { url = "https://files.pythonhosted.org/packages/ad/16/ce4b1e386e45fab0268edbf1b85bace20e9437589e9edb2bd5f9a226fa44/duckdb-1.5.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e80eb4d0fb59869cb2c7d7ef494c07fb92014fe8e77d96c170cd1ebc1488a708", size = 19306666, upload-time = "2026-05-20T11:54:22.77Z" }, - { url = "https://files.pythonhosted.org/packages/99/1f/651f8453f26931e8061b7e27b3090f868868185814ecb9216d0bd71ec8ef/duckdb-1.5.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3248b49cd835ea322574bc6aac0ae7a83be85547f49d4f5f5777cb380ee6627f", size = 21418306, upload-time = "2026-05-20T11:54:25.616Z" }, - { url = "https://files.pythonhosted.org/packages/e7/c4/2e34929b16c8d544ef664fad8f7f3a2a9db05746aae1e7c8c4ee3a8b23e4/duckdb-1.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ff11a457258148337ef9a392148a8cdbd1069b6c27c21958816c7b67fe6c542d", size = 32626494, upload-time = "2026-05-20T11:54:33.738Z" }, - { url = "https://files.pythonhosted.org/packages/15/e2/c80af1eac2ab5d35fc2c372ef0a84668842e549fbbf7799277b3fccf3e39/duckdb-1.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10960400ed60cdf0fe05bab2086fa8eb733889cb0ceca18d07ff9a00c0e0be7b", size = 15449283, upload-time = "2026-05-20T11:54:39.777Z" }, - { url = "https://files.pythonhosted.org/packages/2d/9a/c63af233c9f761bf5178a5210437e1bc6bcb30fa8a9073de6398cfb12c03/duckdb-1.5.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5f18e7561403054433706c187589e86629a7af09a7efc23a06a8b308e6acc68", size = 19332762, upload-time = "2026-05-20T11:54:42.51Z" }, - { url = "https://files.pythonhosted.org/packages/21/cc/2d77af4fff86012f334ef82e6d54a995a86c8745e58074f1218ed7d25171/duckdb-1.5.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fb7516255a8764545e30f7efacea408cc847764a3027b3b0b3e7d1a7bebbc5c", size = 21453290, upload-time = "2026-05-20T11:54:45.272Z" }, - { url = "https://files.pythonhosted.org/packages/cc/9c/a528eb09d8be51954c485864bd06753e616939a080cbc3dd4417e8c94a57/duckdb-1.5.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e75a6122c12579a99848517f6f00a4e342aebda3590c30fe9b5cc5f39d5e6afc", size = 32626254, upload-time = "2026-05-20T11:54:53.65Z" }, - { url = "https://files.pythonhosted.org/packages/23/fa/beafb91e6e152d2161c4a9cbc472334c87607eb61ad7104b5a7fa8d8d7b1/duckdb-1.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3d5db8c0b55e072cf437948ebb5d7e23d7b9d03d905fa5f9145583e65aa447f7", size = 15449411, upload-time = "2026-05-20T11:54:59.089Z" }, - { url = "https://files.pythonhosted.org/packages/50/0a/49b6fe04e2fcd63729eb607dadd44818dde77342a4f5ce086c6c92f1dd4d/duckdb-1.5.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ce80aed7a538422129a57eaca9141e3afb51f8bf562b1908b1576c9725b5b22", size = 19333120, upload-time = "2026-05-20T11:55:01.727Z" }, - { url = "https://files.pythonhosted.org/packages/63/4c/0907c3f76adb9dd90e67610b31e0304a35814e65c4c41a354a262c09b885/duckdb-1.5.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787df63824f07bf18022dbc3b8ca4b2bfab0ebe616464f55c6e8cd0f59ea762e", size = 21453266, upload-time = "2026-05-20T11:55:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/42/3e/827ffcf58f0abc6ad6dcf826c5d24ebfc65e03ad1a20d74cad9806f91c99/duckdb-1.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bc7ca6a1a40e7e4c933017e6c09ef18032add793df4e42624c6c0c87e0bebdad", size = 30067835, upload-time = "2026-03-23T12:10:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/dd/da/ed804006cd09ba303389d573c8b15d74220667cbd1fd990c26e98d0e0a5b/duckdb-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b8b0808dba0c63b7633bdaefb34e08fe0612622224f9feb0e7518904b1615101", size = 14222994, upload-time = "2026-03-23T12:10:45.162Z" }, + { url = "https://files.pythonhosted.org/packages/b3/43/c904d81a61306edab81a9d74bb37bbe65679639abb7030d4c4fec9ed84f7/duckdb-1.5.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:553c273a6a8f140adaa6da6a6135c7f95bdc8c2e5f95252fcdf9832d758e2141", size = 19244880, upload-time = "2026-03-23T12:10:48.529Z" }, + { url = "https://files.pythonhosted.org/packages/50/db/358715d677bfe5e117d9e1f2d6cc2fc2b0bd621144d1f15335b8b59f95d7/duckdb-1.5.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:40c5220ec93790b18ec6278da9c6ac2608d997ee6d6f7cd44c5c3992764e8e71", size = 21350874, upload-time = "2026-03-23T12:10:52.095Z" }, + { url = "https://files.pythonhosted.org/packages/3f/06/be4c62f812c6e23898733073ace0482eeb18dffabe0585d63a3bf38bca1e/duckdb-1.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6f7361d66cc801d9eb4df734b139cd7b0e3c257a16f3573ebd550ddb255549e6", size = 30113703, upload-time = "2026-03-23T12:11:02.536Z" }, + { url = "https://files.pythonhosted.org/packages/87/03/293bccd838a293d42ea26dec7f4eb4f58b57b6c9ffcfabc6518a5f20a24a/duckdb-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed6d23a3f806898e69c77430ebd8da0c79c219f97b9acbc9a29a653e09740c59", size = 14246803, upload-time = "2026-03-23T12:11:09.624Z" }, + { url = "https://files.pythonhosted.org/packages/15/2c/7b4f11879aa2924838168b4640da999dccda1b4a033d43cb998fd6dc33ea/duckdb-1.5.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6af347debc8b721aa72e48671166282da979d5e5ae52dbc660ab417282b48e23", size = 19271654, upload-time = "2026-03-23T12:11:13.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d6/8f9a6b1fbcc669108ec6a4d625a70be9e480b437ed9b70cd56b78cd577a6/duckdb-1.5.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8150c569b2aa4573b51ba8475e814aa41fd53a3d510c1ffb96f1139f46faf611", size = 21386100, upload-time = "2026-03-23T12:11:16.758Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f2/af476945e3b97417945b0f660b5efa661863547c0ea104251bb6387342b1/duckdb-1.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:26e56b5f0c96189e3288d83cf7b476e23615987902f801e5788dee15ee9f24a9", size = 30113759, upload-time = "2026-03-23T12:11:26.5Z" }, + { url = "https://files.pythonhosted.org/packages/53/a5/b59cff67f5e0420b8f337ad86406801cffacae219deed83961dcceefda67/duckdb-1.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:482f8a13f2600f527e427f73c42b5aa75536f9892868068f0aaf573055a0135f", size = 14246482, upload-time = "2026-03-23T12:11:33.33Z" }, + { url = "https://files.pythonhosted.org/packages/e9/12/d72a82fe502aae82b97b481bf909be8e22db5a403290799ad054b4f90eb4/duckdb-1.5.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da137802688190835b4c863cafa77fd7e29dff662ee6d905a9ffc14f00299c91", size = 19270816, upload-time = "2026-03-23T12:11:36.79Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c3/ee49319b15f139e04c067378f0e763f78336fbab38ba54b0852467dd9da4/duckdb-1.5.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d4147422d91ccdc2d2abf6ed24196025e020259d1d267970ae20c13c2ce84b1", size = 21385695, upload-time = "2026-03-23T12:11:40.465Z" }, ] [[package]] @@ -1744,10 +1570,9 @@ standard = [ [[package]] name = "fastapi-cloud-cli" -version = "0.19.0" +version = "0.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "detect-installer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fastar", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -1757,57 +1582,37 @@ dependencies = [ { name = "typer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "uvicorn", extra = ["standard"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/7c/f194925af8fabdb0b7a886a1b89087c0b7f327f99e79497a882aa94c1e34/fastapi_cloud_cli-0.19.0.tar.gz", hash = "sha256:f97b31c2ad6af3832eb4065870bdca3365b6e827a0ccf6eeb15e477bc1662b13", size = 57476, upload-time = "2026-06-01T08:24:03.407Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/f2/fcd66ce245b7e3c3d84ca8717eda8896945fbc17c87a9b03f490ff06ace7/fastapi_cloud_cli-0.15.1.tar.gz", hash = "sha256:71a46f8a1d9fea295544113d6b79f620dc5768b24012887887306d151165745d", size = 43851, upload-time = "2026-03-26T10:23:12.932Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/e6/1a2ec890fc273b9da2b173ca45f692a2e24a369bdd39ea7812c1d8a799e5/fastapi_cloud_cli-0.19.0-py3-none-any.whl", hash = "sha256:a2dfc4074c321e63ec88589cc1f90573d4b5bf980ddc44a7033e6f3cd8e96628", size = 38239, upload-time = "2026-06-01T08:24:02.437Z" }, + { url = "https://files.pythonhosted.org/packages/b2/11/ecb0d5e1d114e8aaec1cdc8ee2d7b0f54292585067effe2756bde7e7a4b0/fastapi_cloud_cli-0.15.1-py3-none-any.whl", hash = "sha256:b1e8b3b26dc314e180fc0ab67dfd39d7d9fe160d3951081d09184eafaacf5649", size = 32284, upload-time = "2026-03-26T10:23:14.151Z" }, ] [[package]] name = "fastar" -version = "0.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/0f/0aeb3fc50046617702acc0078b277b58367fd62eb727b9ec733ae0e8bbcc/fastar-0.11.0.tar.gz", hash = "sha256:aa7f100f7313c03fdb20f1385927ba95671071ba308ad0c1763fef295e1895ce", size = 70238, upload-time = "2026-04-13T17:11:17.143Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/ff/b87efb0dcfd081c62c7c7601d7681dabe63103cd51fc16f8d57a1ab45961/fastar-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27eed386fd0558e6daa29211111bbd7b740f7c7e881197f8a00ac7c0f3cdb1d7", size = 631668, upload-time = "2026-04-13T17:09:40.537Z" }, - { url = "https://files.pythonhosted.org/packages/58/ce/8b7fb3f23855accebaaf2d2637eac7f261a7a5d936f861a172079f1ef511/fastar-0.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f72ce42a5e28a74fbd4d5fbf1a3ac1a1163d13cbc200cbd005fb0fabc54bd", size = 762938, upload-time = "2026-04-13T17:07:54.51Z" }, - { url = "https://files.pythonhosted.org/packages/07/cc/5491e2b677bb841f768e3aba052d0344338a5c78aa5d4c18b443831a8e8d/fastar-0.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5b83c1f61f7017d6e1498568038f8745440cfc16ca2f697ec81bac83050108f6", size = 759232, upload-time = "2026-04-13T17:08:08.864Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b7/643630bdbd179e41e9fae31c03b4cf6061dbf4d6fbbae8425d16eb12545d/fastar-0.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db73a9b765a516e73983b25341e7b5e0189733878279e278b2295131b0e3a21e", size = 926271, upload-time = "2026-04-13T17:08:23.68Z" }, - { url = "https://files.pythonhosted.org/packages/09/5d/37ade50003b4540e0a53ef100f6692d7ab2ac1122d5acf39920cc09a3e8b/fastar-0.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:625827d52eb4e8fec942e0233f125ff8010fcf6a67c0a974a8e5f4666b771e3c", size = 818634, upload-time = "2026-04-13T17:08:54.268Z" }, - { url = "https://files.pythonhosted.org/packages/c3/ff/135d177de32cc1e837c99019e4643e6e79352bde49544d4ece5b5eebf56b/fastar-0.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7f5fd8fa21ec0a88296a38dc5d7fc35efd3b26d46a17b8b7c73c5563925ca15", size = 822755, upload-time = "2026-04-13T17:09:25.01Z" }, - { url = "https://files.pythonhosted.org/packages/27/cb/b835dbe76ceac7fa6105851468c259ffd06830eb9c029402e499d0ec153b/fastar-0.11.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8c15af91b8cd87ddf23ea55355ae513c1de3ab67178f26dad017c9e9c0af6096", size = 887101, upload-time = "2026-04-13T17:08:39.248Z" }, - { url = "https://files.pythonhosted.org/packages/9e/54/aa8289eb57fc550535470397cb051f5a58a7c89ca4de31d5502b916dd894/fastar-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:03a112395a8b0bff251423bd1564c012f0cc058ad8b6bd8fba96f3d7fc117e44", size = 973606, upload-time = "2026-04-13T17:10:10.98Z" }, - { url = "https://files.pythonhosted.org/packages/1f/fd/776d50a0897c01dc6bfd0926772ee913436fdae91b9affaf0a0cbd09f0a1/fastar-0.11.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f2994bb8f5f8c11eb12beae1e6e77a907173c9819236b8a4c8f0573652ceccce", size = 1036696, upload-time = "2026-04-13T17:10:28.502Z" }, - { url = "https://files.pythonhosted.org/packages/f8/9e/21e4701aec4a1123d4dc4d31578dc18875582b5710e4725f7ceb752a248b/fastar-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29c9c386dc0d5dda78845a8e6b1480d26ab861c1e0b68f42ae5735cb70ca07f1", size = 1032336, upload-time = "2026-04-13T17:11:02.364Z" }, - { url = "https://files.pythonhosted.org/packages/cc/a6/d5e2a4e48495616440a21eed07558219ca90243ad00b0502586f95bd4833/fastar-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0d9d6b052baf5380baea866675dab6ccd04ec2460d12b1c46f10ce3f4ee6a820", size = 628417, upload-time = "2026-04-13T17:09:42.145Z" }, - { url = "https://files.pythonhosted.org/packages/5b/0d/f88daad53aff2e754b6b5ff2a7113f72447a34f6ef17cc23ca99988117b7/fastar-0.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1e6e74aba1ae77ca4aedcaf1697cd413319f4c88a5ccbe5b42c709517c5097e", size = 760737, upload-time = "2026-04-13T17:07:55.958Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a6/82ef4ecd969d50d92ed3ed9dbd8fe77faa24be5e5736f716edc9f4ce8d62/fastar-0.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38ef77fe940bbc9b37a98bd838727f844b11731cd39358a2640ff864fb385086", size = 757603, upload-time = "2026-04-13T17:08:10.623Z" }, - { url = "https://files.pythonhosted.org/packages/03/35/50249f0d827251f8ac511495e2eacccebda80a00a0ad73e9615b8113b84f/fastar-0.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8955e61b32d6aff82c983217abf80933fd823b0e727586fc72f08043d996fd59", size = 923952, upload-time = "2026-04-13T17:08:25.526Z" }, - { url = "https://files.pythonhosted.org/packages/7b/d8/faee41659e9c379d906d24eaee6d6833ac8cfef0a5df480e5c2a8d3efb33/fastar-0.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:483532442cdb08fbff0169510224eae0836f2f672cea6aacb52847d90fefdc46", size = 816574, upload-time = "2026-04-13T17:08:56.076Z" }, - { url = "https://files.pythonhosted.org/packages/22/47/0448ea7992b997dad2bf004bfd98eca74b5858630eae080b50c7b17d9ddc/fastar-0.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef5a6071121e05d8287fc75bccb054bcbac8bb0501200a0c0a8feeace5303ea4", size = 819382, upload-time = "2026-04-13T17:09:26.66Z" }, - { url = "https://files.pythonhosted.org/packages/33/ef/0d63eb43586831b7a6f8b22c4d77125a7c594423af1f4f090fa9541b9b40/fastar-0.11.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:e45e598af5afe8412197d4786efd6cf29be02e7d3d4f6a3461149eae5d7e94f1", size = 885254, upload-time = "2026-04-13T17:08:40.9Z" }, - { url = "https://files.pythonhosted.org/packages/01/25/edd584675d69e49a165052c3ee886df1c5d574f3e7d813c990306387c623/fastar-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2e160919b1c47ddb8538e7e8eb4cd527281b40f0bf75110a75993838ef61f286", size = 971239, upload-time = "2026-04-13T17:10:12.997Z" }, - { url = "https://files.pythonhosted.org/packages/a5/37/e8bb24f506ba2b08fbaf36c5800e843bd4d542954e9331f00418e2d23349/fastar-0.11.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4bb4dc0fc8f7a6807febcebce8a2f3626ba4955a9263d81ecc630aad83be84c0", size = 1035185, upload-time = "2026-04-13T17:10:30.207Z" }, - { url = "https://files.pythonhosted.org/packages/d2/cd/a81c1aaafb5a22ce57c98ae22f39c89413ed53e4ee6e1b1444b0bd666a6c/fastar-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:136cf342735464091c39dc3708168f9fdeb9ebea40b1ead937c61afaf46143d9", size = 1028054, upload-time = "2026-04-13T17:11:04.293Z" }, - { url = "https://files.pythonhosted.org/packages/e1/cd/7867aefb1784662554a335f2952c75a50f0c70585ed0d2210d6cc15e5627/fastar-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:91c1c792447e4a642745f347ff9847c52af39633071c57ee67ed53c157fc3506", size = 628460, upload-time = "2026-04-13T17:09:43.776Z" }, - { url = "https://files.pythonhosted.org/packages/25/39/d3f428b318fa940b1b6e785b8d54fc895dfb5d5b945ef8d5442ffa904fb2/fastar-0.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:863b7929845c9fec92ef6c8d59579cf46af5136655e5342f8df5cebe46cab06c", size = 760247, upload-time = "2026-04-13T17:07:57.396Z" }, - { url = "https://files.pythonhosted.org/packages/9e/04/03949aee82aabb8ede06ac5a4a5579ffaf98a8fe59ce958494508ff15513/fastar-0.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96b4a57df12bf3211662627a3ea29d62ecb314a2434a0d0843f9fc23e47536e5", size = 756512, upload-time = "2026-04-13T17:08:12.415Z" }, - { url = "https://files.pythonhosted.org/packages/3f/0c/2ca1ae0a3828ca51047962d932b80daca2522db73e8cb9d040cb6ebe28d5/fastar-0.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceef1c2c4df7b7b8ebd3f5d718bbf457b9bbdf25ce0bd07870211ec4fbd9aff4", size = 922183, upload-time = "2026-04-13T17:08:27.187Z" }, - { url = "https://files.pythonhosted.org/packages/65/68/7fe808b1f73a68e686f25434f538c6dc10ef4dfb3db0ace22cd861744bf8/fastar-0.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8e545918441910a779659d4759ad0eef349e935fbdb4668a666d3681567eb05", size = 816394, upload-time = "2026-04-13T17:08:57.657Z" }, - { url = "https://files.pythonhosted.org/packages/1f/17/07d086080f8a83b8d7966955e29bcdbd6a060f5bd949dc9d5abd3658cead/fastar-0.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28095bb8f821e85fc2764e1a55f03e5e2876dee2abe7cd0ee9420d929905d643", size = 818983, upload-time = "2026-04-13T17:09:28.46Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e2/2c4edf0910af2e814ff6d65b77a91196d472ca8a9fb2033bd983f6856caa/fastar-0.11.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0fafb95ecbe70f666a5e9b35dd63974ccdc9bb3d99ccdbd4014a823ec3e659b5", size = 884689, upload-time = "2026-04-13T17:08:42.763Z" }, - { url = "https://files.pythonhosted.org/packages/fa/ba/04fdcbd6558e60de4ced3b55230fac47675d181252582b2fcec3c74608e5/fastar-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af48fed039b94016629dcdad1c95c90c486326dd068de2b0a4df419ee09b6821", size = 970677, upload-time = "2026-04-13T17:10:15.124Z" }, - { url = "https://files.pythonhosted.org/packages/df/b3/2b860a9658550167dbd5824c85e88d0b4b912bf493e42a6322544d6e483d/fastar-0.11.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:74cd96163f39b8638ab4e8d49708ca887959672a22871d8170d01f067319533b", size = 1034026, upload-time = "2026-04-13T17:10:32.318Z" }, - { url = "https://files.pythonhosted.org/packages/95/c8/d2e501556dca9f1fbc9246111a31792fb49ad908fa4927f34938a97a3604/fastar-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfe39d91fc28e37e06162d94afe01050220edb7df554acb5b702b5503e564816", size = 1028377, upload-time = "2026-04-13T17:11:06.374Z" }, - { url = "https://files.pythonhosted.org/packages/7e/af/ae5cf39d4fb82d0c592705f5ec6db1b065be5265c151b108f86126ee8773/fastar-0.11.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:298a827ec04ade43733f6ca960d0faec38706aa1494175869ea7ea17f5bad5d3", size = 634371, upload-time = "2026-04-13T17:09:52.083Z" }, - { url = "https://files.pythonhosted.org/packages/bf/46/724dc796e1756d3977970f820d30d59bb8cab8e3671b285f1d82ab513aec/fastar-0.11.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7496def0a2befd82d429cb004ef7ca831585cc887947bd6b9abb68a5ef852b0b", size = 764469, upload-time = "2026-04-13T17:08:05.638Z" }, - { url = "https://files.pythonhosted.org/packages/99/e3/74d6859e632e8fb9339a14f652fb9f800c2bd6aa53071e311c0be3fbab8b/fastar-0.11.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:878eaf15463eb572e3538af7ca3a8534e5e279cf8196db902d24e5725c4af86e", size = 761375, upload-time = "2026-04-13T17:08:20.669Z" }, - { url = "https://files.pythonhosted.org/packages/a3/e7/cc70e2be5ef8731a7525552b1c35c1448cf9eae6a62cb3a56f12c1bf27ea/fastar-0.11.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0324ed1d1ef0186e1bbd843b17807d6d837d0906899d4c99378b02c5d86bdd9c", size = 928189, upload-time = "2026-04-13T17:08:35.663Z" }, - { url = "https://files.pythonhosted.org/packages/3c/33/c9a969e78dca323547276a6fee5f4f9588f7cd5ab45acec3778c67399589/fastar-0.11.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdf9bd863205590beaf8ef6e66f315310196632180dceaf674985d01a876cac3", size = 820864, upload-time = "2026-04-13T17:09:06.366Z" }, - { url = "https://files.pythonhosted.org/packages/84/bd/6b9434b541fe55c125b5f2e017a565596a2d215aa09207e4555e4585064f/fastar-0.11.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59af8dbb683b24b90fb5b506de080faeab0a17a908e6c2a5d93a97260ed75d7b", size = 824060, upload-time = "2026-04-13T17:09:37.377Z" }, - { url = "https://files.pythonhosted.org/packages/24/8d/871d5f8cf4c6f13987119fb0a9ae8be131e34f2756c2524e9974adf33824/fastar-0.11.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:9f3df73a3c4292cfe15696cdf59cdb6c309ab59d30b34c733be13c6e32d9a264", size = 889217, upload-time = "2026-04-13T17:08:50.884Z" }, - { url = "https://files.pythonhosted.org/packages/d0/26/cca0fd2704f3ed20165e5613ed911549aef3aaf3b0b5b02fee0e8e23e6cc/fastar-0.11.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa3762cbb16e41a76b61f4a6914937a71aab3a7b6c2d82ca233bc686ebaf756b", size = 975418, upload-time = "2026-04-13T17:10:24.307Z" }, - { url = "https://files.pythonhosted.org/packages/99/94/8bbb0b13f5b6cbe2492f0b7cbba5103e6163976a3331466d010e781fa189/fastar-0.11.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:a8c7bc8ac74cb359bb546b199288c83236372d094b402e557c197e85527495cd", size = 1038492, upload-time = "2026-04-13T17:10:41.939Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6d/56ef943ea524784598c035ccbd42e564e937da0438ae3f55f0e76cb95571/fastar-0.11.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a1c56957ac82408be37a3f63594bc83e0919e8760492a4475e542f9f1828778", size = 1034886, upload-time = "2026-04-13T17:11:15.617Z" }, +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/00/dab9ca274cf1fde19223fea7104631bea254751026e75bf99f2b6d0d1568/fastar-0.9.0.tar.gz", hash = "sha256:d49114d5f0b76c5cc242875d90fa4706de45e0456ddedf416608ecd0787fb410", size = 70124, upload-time = "2026-03-20T14:26:34.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/6a/085b3cae0e04da4d42306dc07e2cc4f95d9c8f27df4dfd1a25d0f80516cb/fastar-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c8ac3e8aaee57dfc822b04f570f0a963c2381a9dc8990fe0c6e965efd23fd451", size = 629764, upload-time = "2026-03-20T14:25:19.017Z" }, + { url = "https://files.pythonhosted.org/packages/30/d4/4a5a3c341d26197ea3ae6bed79fc9bb4ead8ddc74a93bdb74e4ee0bac18e/fastar-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17e2c3b46408193ea13c1e1177275ca7951e88bd3dce16baccb8de4f5e0dc2e8", size = 762096, upload-time = "2026-03-20T14:23:49.175Z" }, + { url = "https://files.pythonhosted.org/packages/b0/f8/521438041d69873bb68b144b09080ae4f1621cebb8238b1e54821057206b/fastar-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c75e779f72d845037d4bf6692d01ac66f014eaef965c9231d41d5cc1276b89fc", size = 822380, upload-time = "2026-03-20T14:25:06.825Z" }, + { url = "https://files.pythonhosted.org/packages/60/32/6e7cb45dce544f97b0199325084a0a5a895cb903e0539690619e78d8d7cf/fastar-0.9.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec7852de506d022ad36ad56f4aefb10c259dd59e485bf87af827954d404ba9d5", size = 969993, upload-time = "2026-03-20T14:25:44.222Z" }, + { url = "https://files.pythonhosted.org/packages/1f/44/a1c9f6afe93d1cc1abb68a7cda2bada509d756d24e22d5d949ca86b4f45e/fastar-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5c03fad1ad9ac57cf03a4db9e18c7109c37416ff4eb9ebfca98fcd2b233a26c4", size = 1029251, upload-time = "2026-03-20T14:26:23.215Z" }, + { url = "https://files.pythonhosted.org/packages/95/97/f1e34c8224dc373c6fab5b33e33be0d184751fdc27013af3278b1e4e6e6c/fastar-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9ec841a69fea73361c6df6d9183915c09e9ce3bd96493763fa46019e79918400", size = 627422, upload-time = "2026-03-20T14:25:20.318Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/b6ad68b2ab1d7b74b0d38725d817418016bdd64880b36108be80d2460b4d/fastar-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de264da9e8ef6407aa0b23c7c47ed4e34fde867e7c1f6e3cb98945a93e5f89f2", size = 760583, upload-time = "2026-03-20T14:23:50.447Z" }, + { url = "https://files.pythonhosted.org/packages/41/df/d663214d35380b07a24a796c48d7d7d4dc3a28ec0756edbcb7e2a81dc572/fastar-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acb62e2369834fb23d26327157f0a2dbec40b230c709fa85b1ce96cf010e6fbf", size = 819050, upload-time = "2026-03-20T14:25:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/4f/dd/0a8ea7b910293b07f8c82ef4e6451262ccf2a6f2020e880f184dc4abd6c2/fastar-0.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87006c8770dfc558aefe927590bbcdaf9648ca4472a9ee6d10dfb7c0bda4ce5b", size = 968135, upload-time = "2026-03-20T14:25:45.614Z" }, + { url = "https://files.pythonhosted.org/packages/8b/53/6ddda28545b428d54c42f341d797046467c689616a36eae9a43ba56f2545/fastar-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:59bc500d7b6bdaf2ffb2b632bc6b0f97ddfb3bb7d31b54d61ceb00b5698d6484", size = 1025314, upload-time = "2026-03-20T14:26:24.624Z" }, + { url = "https://files.pythonhosted.org/packages/77/52/f3b06867e5ca8d5b2c1c15a1563415e0037b5831f2058ee72b03960296d9/fastar-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f07c6bdeedfeb30ef459f21fa9ab06e2b6727f7e7653176d3abb7a85f447c400", size = 627615, upload-time = "2026-03-20T14:25:21.608Z" }, + { url = "https://files.pythonhosted.org/packages/3f/54/e2e1b4c8512d670373047e5e585b1d1ff9ffd722b0a17647d22c9c9bd248/fastar-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:108bb46c080ca152bb331f1e0576177d36e9badba51b1d5724d2823542e0dd1f", size = 760246, upload-time = "2026-03-20T14:23:51.964Z" }, + { url = "https://files.pythonhosted.org/packages/db/5e/8fcc662db1fd0985f4f8a54e79276416565a0d1fcb8da66665b2061ead30/fastar-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a67b061b1099cf3b8b6234dd3605fa16f5078ab6b51c8d77ad7a5d11c3cf834", size = 818980, upload-time = "2026-03-20T14:25:09.545Z" }, + { url = "https://files.pythonhosted.org/packages/94/19/7b3b7af978ae4f012664781554716d67549ab19ddbcb6e6d1adc04d7a5e7/fastar-0.9.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2394980cc126a3263e115600bc4ff9e7320cddde83c99fc334ab530be5b7166e", size = 967790, upload-time = "2026-03-20T14:25:46.975Z" }, + { url = "https://files.pythonhosted.org/packages/10/4f/6ec0c123c15bbcb9a9b82e979dc81273789ebbfbb4a2b41a1a6941577c94/fastar-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c9bd8879ebf05aa247e60e454bb7568cbdd44f016b8c58e31e5398039403e61d", size = 1025768, upload-time = "2026-03-20T14:26:25.957Z" }, + { url = "https://files.pythonhosted.org/packages/d0/19/9f8fb5c0e803254c5d535c362102dd604d9bdb206d5a36150f4637cadf09/fastar-0.9.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:76be31936cabce31cbb6381128f851cf0a6da2d5c25357615cd1504b26dc31cf", size = 633000, upload-time = "2026-03-20T14:25:28.496Z" }, + { url = "https://files.pythonhosted.org/packages/ef/04/366937320b1cca522570c527a45b1254bd68d057e68956baefc49eacae27/fastar-0.9.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b665c33afcd1d581b82235b690d999c5446ccc2c4d80c4a95f30df3b43d22494", size = 763872, upload-time = "2026-03-20T14:23:59.122Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e0/cec25d43df7ea4b4e3e875352c6d51c848c855792ba276c546732a7170af/fastar-0.9.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9ac410d32cbb514e966c45f0fedd0f9447b0dea9e734af714648da503603df6", size = 824024, upload-time = "2026-03-20T14:25:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ac/eb2a01ed94e79b72003840448d2b69644a54a47f615c7d693432a1337caa/fastar-0.9.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d62a4fd86eda3bea7cc32efd64d43b6d0fcdbbec009558b750fc362f20142789", size = 972503, upload-time = "2026-03-20T14:25:54.207Z" }, + { url = "https://files.pythonhosted.org/packages/a4/45/1ea024be428ad9d89e9f738c9379507e97df9f9ed97e50e4a1d10ff90fef/fastar-0.9.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:fad70e257daefb42bab68dcd68beaf2e2a99da056d65f2c9f988449a4e869306", size = 1031304, upload-time = "2026-03-20T14:26:33.294Z" }, ] [[package]] @@ -1842,64 +1647,35 @@ wheels = [ [[package]] name = "fastmcp" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastmcp-slim", extra = ["client", "server"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/24/519739e98daf92ebc64580e9d3320649bf9a1612c029a913dd88c3474d73/fastmcp-3.4.0.tar.gz", hash = "sha256:29055fb6816f4862c615aabaf0112ae8feb8b469740db13403a0ce5b799ec1dc", size = 28754939, upload-time = "2026-06-03T02:32:40.206Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/72/9f9bbfc3a8d26870dbdbbd633cd1c6f42b8d3bec379426c760676d936e86/fastmcp-3.4.0-py3-none-any.whl", hash = "sha256:34523083d6149400a0655a8aa769eb34f85b1ce6dac6d66efb07503ebbe5f44b", size = 8017, upload-time = "2026-06-03T02:32:38.05Z" }, -] - -[[package]] -name = "fastmcp-slim" -version = "3.4.0" +version = "3.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "platformdirs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pydantic-settings", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "python-dotenv", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/b0/4da6078c2d6aa0a38a8b1ae0271e1ed400f9e2cd1b3b46e6453fb1fe2b75/fastmcp_slim-3.4.0.tar.gz", hash = "sha256:faa0ccf16e85ec4b9f79c006fed3546b866d7e6dba3f60cd32cd98e84753a496", size = 575895, upload-time = "2026-06-03T02:32:18.744Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/66/cc283d4efd3faf325c26f51cfb43a118270ea732e70dda509f49d80ea625/fastmcp_slim-3.4.0-py3-none-any.whl", hash = "sha256:17cd0a1535972d3748d8c2416f0826dfc86c18df7a6cbc38602373277d44baa6", size = 748849, upload-time = "2026-06-03T02:32:17.435Z" }, -] - -[package.optional-dependencies] -client = [ - { name = "authlib", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "exceptiongroup", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "mcp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -server = [ { name = "authlib", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "cyclopts", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "exceptiongroup", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "griffelib", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "joserfc", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jsonref", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jsonschema-path", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "mcp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "openapi-pydantic", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "platformdirs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyperclip", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "python-multipart", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "python-dotenv", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "uncalled-for", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "uvicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "watchfiles", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "websockets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/d0/32/4f1b2cfd7b50db89114949f90158b1dcc2c92a1917b9f57c0ff24e47a2f4/fastmcp-3.2.0.tar.gz", hash = "sha256:d4830b8ffc3592d3d9c76dc0f398904cf41f04910e41a0de38cc1004e0903bef", size = 26318581, upload-time = "2026-03-30T20:25:37.692Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/67/684fa2d2de1e7504549d4ca457b4f854ccec3cd3be03bd86b33b599fbf58/fastmcp-3.2.0-py3-none-any.whl", hash = "sha256:e71aba3df16f86f546a4a9e513261d3233bcc92bef0dfa647bac3fa33623f681", size = 705550, upload-time = "2026-03-30T20:25:35.499Z" }, +] [[package]] name = "fastuuid" @@ -1929,11 +1705,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.29.1" +version = "3.25.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1f/f9/f38573ed5844586db374d085911740a501ccfa373b455fc9413f09f85237/filelock-3.29.1.tar.gz", hash = "sha256:d97e6b1b9757569626c58caa07dc4beb1613f4a2938b1e8cc81afca398906c9e", size = 59335, upload-time = "2026-06-03T15:19:04.053Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/b8/00651a0f559862f3bb7d6f7477b192afe3f583cc5e26403b44e59a55ab34/filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694", size = 40480, upload-time = "2026-03-11T20:45:38.487Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/a0/614c5fe402fd88951df45f4dda2fa3b4e17a99ecd92340771929169b3b95/filelock-3.29.1-py3-none-any.whl", hash = "sha256:85199dfd706869641b72b2e8955d5416a4b2b7dc4b0e8e6d97b4cc1299a6983b", size = 40750, upload-time = "2026-06-03T15:19:02.959Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, ] [[package]] @@ -2021,60 +1797,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, - { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, - { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, - { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, - { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, - { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, - { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, - { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, - { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, - { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, - { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, - { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, - { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, - { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, - { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, - { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, ] [[package]] name = "fsspec" -version = "2025.9.0" +version = "2025.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/e0/bab50af11c2d75c9c4a2a26a5254573c0bd97cea152254401510950486fa/fsspec-2025.9.0.tar.gz", hash = "sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19", size = 304847, upload-time = "2025-09-02T19:10:49.215Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/f4/5721faf47b8c499e776bc34c6a8fc17efdf7fdef0b00f398128bc5dcb4ac/fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972", size = 298491, upload-time = "2025-03-07T21:47:56.461Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/71/70db47e4f6ce3e5c37a607355f80da8860a33226be640226ac52cb05ef2e/fsspec-2025.9.0-py3-none-any.whl", hash = "sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7", size = 199289, upload-time = "2025-09-02T19:10:47.708Z" }, + { url = "https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3", size = 193615, upload-time = "2025-03-07T21:47:54.809Z" }, ] [package.optional-dependencies] @@ -2151,109 +1903,88 @@ wheels = [ [[package]] name = "google-auth" -version = "2.53.0" +version = "2.49.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyasn1-modules", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/ad/ff781329bbbdc0974a098d996e89c9e1f7024262f9e3eec442fbb9ad1ac6/google_auth-2.53.0.tar.gz", hash = "sha256:e7e6aa16f6bee7b2b264830fd04f08087a1d5a836df516251a5d15327b246c9c", size = 335844, upload-time = "2026-05-15T20:53:07.928Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/80/6a696a07d3d3b0a92488933532f03dbefa4a24ab80fb231395b9a2a1be77/google_auth-2.49.1.tar.gz", hash = "sha256:16d40da1c3c5a0533f57d268fe72e0ebb0ae1cc3b567024122651c045d879b64", size = 333825, upload-time = "2026-03-12T19:30:58.135Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/c9/db44165ba7c581268c6d46017ef63339110378305062830104fc7fa144cb/google_auth-2.53.0-py3-none-any.whl", hash = "sha256:6e7449917c599b35126a99ec268ec6880301f2fea41dce198fe8fd83ff642b68", size = 246071, upload-time = "2026-05-15T20:53:05.609Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/c6c2478d8a8d633460be40e2a8a6f8f429171997a35a96f81d3b680dec83/google_auth-2.49.1-py3-none-any.whl", hash = "sha256:195ebe3dca18eddd1b3db5edc5189b76c13e96f29e73043b923ebcf3f1a860f7", size = 240737, upload-time = "2026-03-12T19:30:53.159Z" }, ] [[package]] name = "googleapis-common-protos" -version = "1.75.0" +version = "1.73.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/c0/4a54c386282c13449eca8bbe2ddb518181dc113e78d240458a68856b4d69/googleapis_common_protos-1.73.1.tar.gz", hash = "sha256:13114f0e9d2391756a0194c3a8131974ed7bffb06086569ba193364af59163b6", size = 147506, upload-time = "2026-03-26T22:17:38.451Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631, upload-time = "2026-05-07T08:03:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/dc/82/fcb6520612bec0c39b973a6c0954b6a0d948aadfe8f7e9487f60ceb8bfa6/googleapis_common_protos-1.73.1-py3-none-any.whl", hash = "sha256:e51f09eb0a43a8602f5a915870972e6b4a394088415c79d79605a46d8e826ee8", size = 297556, upload-time = "2026-03-26T22:15:58.455Z" }, ] [[package]] name = "greenlet" -version = "3.5.1" +version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/6e/802acd792aebb2256fbbee8cacf2727faaeb6f240ac11008f09eae4414bc/greenlet-3.5.1.tar.gz", hash = "sha256:5a56aeb7d5d9cc4b3a735efb5095bd4b4f6f0e4f93e5ca876d0e2315137b7829", size = 197356, upload-time = "2026-05-20T15:05:03.917Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", size = 188267, upload-time = "2026-02-20T20:54:15.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/3c/ff890b466eaba2b0f5e6bdfff025f8c75f41b8ffdc3dbc3d24ad261e764a/greenlet-3.5.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:73f78f9b9f0a5c06e5c946ba1e8e36f5114923b6be109ee618c54f079c3ea14f", size = 284764, upload-time = "2026-05-20T13:09:10.204Z" }, - { url = "https://files.pythonhosted.org/packages/81/0e/5e5457be3d256918f6a4756f073548a3f0190836e2cc94aa6d0d617a940b/greenlet-3.5.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0cbed8bb44e23c5b199f888f4e4ce096b45ad9f25ff74a7ad0213875e936bb2", size = 603479, upload-time = "2026-05-20T14:00:04.757Z" }, - { url = "https://files.pythonhosted.org/packages/6d/e1/f89a21d58d308298e6f275f13a1b472ed96c680b601a371b08be6a725989/greenlet-3.5.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a203a8bd0acb0701653d3bbb26e404854a68674139ed5cbb778830f42b09bb33", size = 615495, upload-time = "2026-05-20T14:05:40.87Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f2/8fd452fd81adb9ec79c8275c1375702ab0fd6bee4952da12eaa09b9508d8/greenlet-3.5.1-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ebeb75c81211f5c702576cf81f315e77e23cfdb2c7c6fcb9dd143e6de35c360", size = 623515, upload-time = "2026-05-20T14:09:07.853Z" }, - { url = "https://files.pythonhosted.org/packages/75/de/af6cef182862d2ccd6975440d21c9058a77c3f9b469abf94e322dfd2e0e3/greenlet-3.5.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a271fcd66c74615cda6a964fda3f304267a12e50a084472218a39bb0376f563", size = 614754, upload-time = "2026-05-20T13:14:24.947Z" }, - { url = "https://files.pythonhosted.org/packages/ec/bc/c318aa9f3ffc77320fddcee3d892be957b42e2ff947198d9450b004f3a38/greenlet-3.5.1-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:017a544f0385d441e88714160d089d6900ef46c9eff9d99b6715a5ef2d127747", size = 418439, upload-time = "2026-05-20T14:01:38.446Z" }, - { url = "https://files.pythonhosted.org/packages/1a/c6/50e520283a9f19388a7326b05f9e8637e566003475eacaadad04f558c68d/greenlet-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ded7b068c7c31c1a8657d4fd42d886b3e051ae29f88b80c5ff9d502257b0f071", size = 1574097, upload-time = "2026-05-20T14:02:24.003Z" }, - { url = "https://files.pythonhosted.org/packages/21/1c/13abd1f4860d987fa5e1170a01930d6e6cd40d328de487a3c9fdaff0ffd0/greenlet-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0932b81d72f552ded9d810d00021b64d89f2195a91ce115b893f943b7a4ab3c", size = 1641058, upload-time = "2026-05-20T13:14:31.83Z" }, - { url = "https://files.pythonhosted.org/packages/c4/37/4549f149c9797c21b32c2683c33522af22522099de128b2406672526d005/greenlet-3.5.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:fa4f98af3a528f0c3fd592a26df7f376f93329c8f4d987f6bb979057af8bf5e2", size = 286220, upload-time = "2026-05-20T13:07:28.463Z" }, - { url = "https://files.pythonhosted.org/packages/38/ff/a4f436709716965eaab9f36ea7b906c8a927fbe32fb1372a2071d964f6b1/greenlet-3.5.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffea73584b216150eab159b6d12348fb253e68757974de1e2c40d8a318ac89ed", size = 601585, upload-time = "2026-05-20T14:00:06.141Z" }, - { url = "https://files.pythonhosted.org/packages/65/ad/54bc3fcee3ad368a61b19b67d88117f7a8c29727bf71fffdeda81fbd946e/greenlet-3.5.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1072b4f9edcc1e192d9283a66a3e68d6b84c561de33a83d7858beb9ba1effe10", size = 614215, upload-time = "2026-05-20T14:05:42.675Z" }, - { url = "https://files.pythonhosted.org/packages/7c/6c/de5b1b388cd2d9fbdfeab324863daba37d54e6e233ddbefd70b385a8c591/greenlet-3.5.1-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:89101bfd5011e069be974903cb3a4e4523845e4ece2d62dcd8d358933c0ef249", size = 620094, upload-time = "2026-05-20T14:09:09.18Z" }, - { url = "https://files.pythonhosted.org/packages/40/69/b91cda0647df839483201545913514c2827ebea5e5ccdf931842763bc127/greenlet-3.5.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:add5217d68b31130f0beca584d7fef4878327d2e31642b66618a14eef312b63b", size = 611358, upload-time = "2026-05-20T13:14:26.37Z" }, - { url = "https://files.pythonhosted.org/packages/4a/43/1204baffab8a6476464795a7ccf394a3248d4f22c9f87173a15b36b6d971/greenlet-3.5.1-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:e6cd99ea59dd5d89f0c956606571d79bfe6f68c9eb7f4a4083a41a7f1587edee", size = 422782, upload-time = "2026-05-20T14:01:39.597Z" }, - { url = "https://files.pythonhosted.org/packages/59/90/3cf77e080350cd02fa307bb2abf05df48f4482c240275bbd2c203ba8bb1c/greenlet-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a5ea42a752d47a145eae922b605cd1634665ac3d5ec1e72402d5048e8d60d207", size = 1570475, upload-time = "2026-05-20T14:02:25.29Z" }, - { url = "https://files.pythonhosted.org/packages/65/2c/18cece62045e74598c3c393f70dce4a63f56222015ba29a5d4eeb04f764c/greenlet-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5551170cf4f5ff5623e9af81323751979fee2c731e2287b61f73cd27257b823", size = 1635625, upload-time = "2026-05-20T13:14:34.027Z" }, - { url = "https://files.pythonhosted.org/packages/27/69/7f7e5372d998b81001899b1c0823c957aa413ba0f2662e65821611cc31e4/greenlet-3.5.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:51518ff74664078fc51bffcc6fc529b0df5ae58da192691cee765d45ce944a2b", size = 285060, upload-time = "2026-05-20T13:08:51.899Z" }, - { url = "https://files.pythonhosted.org/packages/b1/bf/387f9b6b865fd2ae0d0be09e0004827295a01b71be76ed350dd1e28a91a4/greenlet-3.5.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ffdb3c0bb002c99cd8f298957e046c3dbf6006b5b7cdf11a4e19194624a0a0a", size = 604370, upload-time = "2026-05-20T14:00:07.492Z" }, - { url = "https://files.pythonhosted.org/packages/32/f5/169ce3d4e4c67291bd18f8cbe0299c9f3e45102c7f1fb3c14780c93e4532/greenlet-3.5.1-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7715a5a2c3378ba602c3a440558261e13a820bb53a82693aacd7b7f6d964e283", size = 616987, upload-time = "2026-05-20T14:05:44.237Z" }, - { url = "https://files.pythonhosted.org/packages/19/ba/c24110c55dffa55aa6e1d98b45310da33801aeba7686ff0190fe5d46fd32/greenlet-3.5.1-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d40a890035c0058cadbdc4af7569800fd28a0e527a0fdbb7b5f9418f176846ce", size = 622911, upload-time = "2026-05-20T14:09:10.598Z" }, - { url = "https://files.pythonhosted.org/packages/ee/e5/7f2e41d5273be07e77560d61ea4e56485b4d6c316d2a84518c62d1364061/greenlet-3.5.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc71ff466927a201b08305acac451ebe1aedfcea002f62f1f2f2ac2ac1e6a135", size = 613911, upload-time = "2026-05-20T13:14:27.539Z" }, - { url = "https://files.pythonhosted.org/packages/ec/7b/d20db2e8a5ad6c038702f3179b136f93f0a3d1a21a0c0777f3e470cdf4b2/greenlet-3.5.1-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:67821bb03e4e98664490edb787ff6af501194c29bbee0f5c1dfdcf1dc3d9d436", size = 425228, upload-time = "2026-05-20T14:01:40.837Z" }, - { url = "https://files.pythonhosted.org/packages/c5/a4/fbdc67579b73615a1f91615e814303cc71e06128f7baaba87be79b8fb90c/greenlet-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cd443683db272ebaaca03af98c0b063ab30db70ea8a31a1559f35e3f7b744ccd", size = 1570689, upload-time = "2026-05-20T14:02:27.225Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b4/77abbe35078be39718a46cd49caf16bceb35662f97a34101dca28aa98e47/greenlet-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:089fff7a6ce8d9316d1f65ebc00273a56be258c1725b32b94de90a3a979557e1", size = 1635602, upload-time = "2026-05-20T13:14:36.344Z" }, -] - -[[package]] -name = "griffelib" -version = "2.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", size = 166461, upload-time = "2026-03-27T11:34:51.091Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", size = 142357, upload-time = "2026-03-27T11:34:46.275Z" }, + { url = "https://files.pythonhosted.org/packages/f3/47/16400cb42d18d7a6bb46f0626852c1718612e35dcb0dffa16bbaffdf5dd2/greenlet-3.3.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86", size = 278890, upload-time = "2026-02-20T20:19:39.263Z" }, + { url = "https://files.pythonhosted.org/packages/a3/90/42762b77a5b6aa96cd8c0e80612663d39211e8ae8a6cd47c7f1249a66262/greenlet-3.3.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f", size = 581120, upload-time = "2026-02-20T20:47:30.161Z" }, + { url = "https://files.pythonhosted.org/packages/72/83/3e06a52aca8128bdd4dcd67e932b809e76a96ab8c232a8b025b2850264c5/greenlet-3.3.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358", size = 594156, upload-time = "2026-02-20T20:20:59.955Z" }, + { url = "https://files.pythonhosted.org/packages/70/79/0de5e62b873e08fe3cef7dbe84e5c4bc0e8ed0c7ff131bccb8405cd107c8/greenlet-3.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99", size = 1554649, upload-time = "2026-02-20T20:49:32.293Z" }, + { url = "https://files.pythonhosted.org/packages/5a/00/32d30dee8389dc36d42170a9c66217757289e2afb0de59a3565260f38373/greenlet-3.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be", size = 1619472, upload-time = "2026-02-20T20:21:07.966Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, + { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, + { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, + { url = "https://files.pythonhosted.org/packages/ac/48/f8b875fa7dea7dd9b33245e37f065af59df6a25af2f9561efa8d822fde51/greenlet-3.3.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", size = 279120, upload-time = "2026-02-20T20:19:01.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/8d/9771d03e7a8b1ee456511961e1b97a6d77ae1dea4a34a5b98eee706689d3/greenlet-3.3.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", size = 603238, upload-time = "2026-02-20T20:47:32.873Z" }, + { url = "https://files.pythonhosted.org/packages/7a/34/259b28ea7a2a0c904b11cd36c79b8cef8019b26ee5dbe24e73b469dea347/greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", size = 616774, upload-time = "2026-02-20T20:21:02.454Z" }, + { url = "https://files.pythonhosted.org/packages/0a/03/996c2d1689d486a6e199cb0f1cf9e4aa940c500e01bdf201299d7d61fa69/greenlet-3.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", size = 1571277, upload-time = "2026-02-20T20:49:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c4/2570fc07f34a39f2caf0bf9f24b0a1a0a47bc2e8e465b2c2424821389dfc/greenlet-3.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", size = 1640455, upload-time = "2026-02-20T20:21:10.261Z" }, ] [[package]] name = "grpcio" -version = "1.81.0" +version = "1.80.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/15/f3/23f47b24f8d8c2028eba501db3acfbb2f592cbb5995eaa6e363a627b74d7/grpcio-1.81.0.tar.gz", hash = "sha256:a5acd7efd3b1fe9b4eb0bcaaa1507eed68a0ad0678b654c3f7b464df9ba9dca5", size = 13032272, upload-time = "2026-06-01T05:56:22.827Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/a8/9916ab10a0201f4c7afb6918125aa2f38a7626ee18ffbc066dd9cb04a74d/grpcio-1.81.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:794e6aa648e8df47d8f908dc8c3b42347d04ec58438f1dcd4e445f09b4f6b0ce", size = 6093557, upload-time = "2026-06-01T05:54:32.64Z" }, - { url = "https://files.pythonhosted.org/packages/a7/43/99e969a048904a65df3129ee53c5f523b7c4e43127786460cac4bee82470/grpcio-1.81.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:cd78145b7f7784661c524624f3526c9c6f891b30a4b54cb93a40806d0d0d61e9", size = 12075345, upload-time = "2026-06-01T05:54:35.77Z" }, - { url = "https://files.pythonhosted.org/packages/83/70/4c3a204e190333768d4f63f4ff56bd0bf405f05b9188f3a59a8bcf161f8b/grpcio-1.81.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:638ccc1b86f7540170a169cb900799b9296a1381e47879ce60b0de9d3db73d33", size = 6640664, upload-time = "2026-06-01T05:54:38.854Z" }, - { url = "https://files.pythonhosted.org/packages/f4/18/7c8e3d0dda2fb7a17076fcd6c9085209eabad3354696c64230f87b3a14eb/grpcio-1.81.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dbdb99986548a7e87f8343805ef315fd4eb50ffaabf4fb1206e42f2542bb805d", size = 6842564, upload-time = "2026-06-01T05:54:43.57Z" }, - { url = "https://files.pythonhosted.org/packages/f6/19/2f1726c2e03ad3f3fe241e6b41534532ad580d595de14a4054ad84999c80/grpcio-1.81.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c36f5d5e97944cbda2d4096b4ae262e6e68506246b61582acf1b8591607f3ccc", size = 7446236, upload-time = "2026-06-01T05:54:46.042Z" }, - { url = "https://files.pythonhosted.org/packages/e5/20/0e7ea7494955cf1beea3077b2fd2c04c84d4480c2ae85a1e1cfa150c62d7/grpcio-1.81.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:77eb4e9fe61486bd1198cc7236ebb0f70e66234e63c0348f40bc2553ed16a88b", size = 7873958, upload-time = "2026-06-01T05:54:52.135Z" }, - { url = "https://files.pythonhosted.org/packages/82/d5/896a3aaf07068d707d88b282a04914b872db4d32d3c7e6d88e43a3b911fa/grpcio-1.81.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:57b3b0e73a518fa286959b40c3eddd02703504ca186e8b7b2945954519bd8b2c", size = 6053538, upload-time = "2026-06-01T05:54:58.965Z" }, - { url = "https://files.pythonhosted.org/packages/68/6a/7e3eafa4727cd405ff917605ed2949e2af162f233f5cbdd773723a5fea7d/grpcio-1.81.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:8bb1789c94322a13336a2b6c58d9c14d68f8628b6e24205a799c69f5bf8516ce", size = 12053447, upload-time = "2026-06-01T05:55:01.862Z" }, - { url = "https://files.pythonhosted.org/packages/16/79/a4302aa82428de48a922421f522b027a1a727ab4d0926368454aa953d36d/grpcio-1.81.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e4d053900a0d24b75d7521139a3872150301b3d6bde3bed5e12318fb25791e4d", size = 6595872, upload-time = "2026-06-01T05:55:04.946Z" }, - { url = "https://files.pythonhosted.org/packages/e2/98/1f3896a9baae1f2aedf4e99c55291d6fa1f30ad9603d63bc18bda967b53e/grpcio-1.81.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19f201da7b4e5c0559198abe5a97157e726f3abe6e8f5e832d4a50740f6dcc22", size = 6809676, upload-time = "2026-06-01T05:55:09.513Z" }, - { url = "https://files.pythonhosted.org/packages/34/8b/3441983718095208c5d797fd3239882e97ea89a629f41c8df94b4eef4df9/grpcio-1.81.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:275144b0115353339dbb8a6f28a9cf8997b5bf40e37f8f66ac0b0ea57e95b43f", size = 7412654, upload-time = "2026-06-01T05:55:12.777Z" }, - { url = "https://files.pythonhosted.org/packages/5c/73/3860341e6a1f5347be6ab35c6c0e1e3a8eb59d010388207fd561dcf01a88/grpcio-1.81.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6ff087cb1f563f47b504b4e29e684129fc5ae4863faf3ebca08a327764ee6cb", size = 7849498, upload-time = "2026-06-01T05:55:18.078Z" }, - { url = "https://files.pythonhosted.org/packages/f3/29/779ee53c931d0fd55c1d459fde43e485172caa3ac87cbd43d003a13a0185/grpcio-1.81.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:62bbe463c9f0f2ff24e31bd25f8dd8b4bae78900e315915a3195a0ef1471a855", size = 6054973, upload-time = "2026-06-01T05:55:25.043Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b6/7211807926b5a17f8d9a5d47c739a163d6812fefe3e4714e81cf92945ed7/grpcio-1.81.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:43c121e135ae44d1559b430db2b2dfad7421cbbe40e1deba506c7dc62b439719", size = 12048662, upload-time = "2026-06-01T05:55:28.453Z" }, - { url = "https://files.pythonhosted.org/packages/64/89/b1b93ef6b34bd20bbaf707fa99133bc9cc302139d5ec6f77a165c7169796/grpcio-1.81.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f345de40ef2e65f63645d53d251824e6070e07804827c5b00ec2e44555f9f901", size = 6599116, upload-time = "2026-06-01T05:55:31.185Z" }, - { url = "https://files.pythonhosted.org/packages/65/4a/1df2a4cb4a1386e066ab7e4175e34bb884b35ccb60d3621c09c84af6aabb/grpcio-1.81.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a524cd530900bd24511fcb7f2ed144da4ea37711c4b094475d0bceca7a93a170", size = 6811797, upload-time = "2026-06-01T05:55:36.731Z" }, - { url = "https://files.pythonhosted.org/packages/8d/dc/fa189d20601a1be25b08850cfb733879bbb1047b62a8feec3a60e3e1a87b/grpcio-1.81.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e7746ba3e6efc9e2b748eff59470a2b8684d5a9ec607c6580bcaa5be175820bc", size = 7415131, upload-time = "2026-06-01T05:55:39.451Z" }, - { url = "https://files.pythonhosted.org/packages/75/34/0f8202c6809a46c2b4d69125ef3667c40b1c211f8e19930e5fa1f1197039/grpcio-1.81.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0fba53cb96004b2b7fb758b46b2288cb49d0b658316a4e73f3ef67230616ee65", size = 7844481, upload-time = "2026-06-01T05:55:44.849Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b7/48/af6173dbca4454f4637a4678b67f52ca7e0c1ed7d5894d89d434fecede05/grpcio-1.80.0.tar.gz", hash = "sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257", size = 12978905, upload-time = "2026-03-30T08:49:10.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/18/c83f3cad64c5ca63bca7e91e5e46b0d026afc5af9d0a9972472ceba294b3/grpcio-1.80.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5c07e82e822e1161354e32da2662f741a4944ea955f9f580ec8fb409dd6f6060", size = 12035295, upload-time = "2026-03-30T08:46:49.099Z" }, + { url = "https://files.pythonhosted.org/packages/0f/8e/e14966b435be2dda99fbe89db9525ea436edc79780431a1c2875a3582644/grpcio-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba0915d51fd4ced2db5ff719f84e270afe0e2d4c45a7bdb1e8d036e4502928c2", size = 6610297, upload-time = "2026-03-30T08:46:52.123Z" }, + { url = "https://files.pythonhosted.org/packages/25/51/bd267c989f85a17a5b3eea65a6feb4ff672af41ca614e5a0279cc0ea381c/grpcio-1.80.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09e5e478b3d14afd23f12e49e8b44c8684ac3c5f08561c43a5b9691c54d136ab", size = 6813442, upload-time = "2026-03-30T08:46:57.056Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d9/d80eef735b19e9169e30164bbf889b46f9df9127598a83d174eb13a48b26/grpcio-1.80.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:00168469238b022500e486c1c33916acf2f2a9b2c022202cf8a1885d2e3073c1", size = 7414743, upload-time = "2026-03-30T08:46:59.682Z" }, + { url = "https://files.pythonhosted.org/packages/62/29/73ef0141b4732ff5eacd68430ff2512a65c004696997f70476a83e548e7e/grpcio-1.80.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce1794f4ea6cc3ca29463f42d665c32ba1b964b48958a66497917fe9069f26e6", size = 7851641, upload-time = "2026-03-30T08:47:05.462Z" }, + { url = "https://files.pythonhosted.org/packages/3e/97/b1282161a15d699d1e90c360df18d19165a045ce1c343c7f313f5e8a0b77/grpcio-1.80.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:f49eddcac43c3bf350c0385366a58f36bed8cc2c0ec35ef7b74b49e56552c0c2", size = 12014204, upload-time = "2026-03-30T08:47:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5e/d319c6e997b50c155ac5a8cb12f5173d5b42677510e886d250d50264949d/grpcio-1.80.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d334591df610ab94714048e0d5b4f3dd5ad1bee74dfec11eee344220077a79de", size = 6563866, upload-time = "2026-03-30T08:47:18.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/f0/a3deb5feba60d9538a962913e37bd2e69a195f1c3376a3dd44fe0427e996/grpcio-1.80.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e78c4ac0d97dc2e569b2f4bcbbb447491167cb358d1a389fc4af71ab6f70411", size = 6782121, upload-time = "2026-03-30T08:47:23.827Z" }, + { url = "https://files.pythonhosted.org/packages/ca/84/36c6dcfddc093e108141f757c407902a05085e0c328007cb090d56646cdf/grpcio-1.80.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2ed770b4c06984f3b47eb0517b1c69ad0b84ef3f40128f51448433be904634cd", size = 7383811, upload-time = "2026-03-30T08:47:26.517Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8d/9d4d27ed7f33d109c50d6b5ce578a9914aa68edab75d65869a17e630a8d1/grpcio-1.80.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a6284a5d907c37db53350645567c522be314bac859a64a7a5ca63b77bb7958f", size = 7830132, upload-time = "2026-03-30T08:47:33.254Z" }, + { url = "https://files.pythonhosted.org/packages/04/19/21a9806eb8240e174fd1ab0cd5b9aa948bb0e05c2f2f55f9d5d7405e6d08/grpcio-1.80.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0", size = 12010840, upload-time = "2026-03-30T08:47:43.11Z" }, + { url = "https://files.pythonhosted.org/packages/18/3a/23347d35f76f639e807fb7a36fad3068aed100996849a33809591f26eca6/grpcio-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f", size = 6567644, upload-time = "2026-03-30T08:47:46.806Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e2/da1506ecea1f34a5e365964644b35edef53803052b763ca214ba3870c856/grpcio-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140", size = 6783216, upload-time = "2026-03-30T08:47:52.817Z" }, + { url = "https://files.pythonhosted.org/packages/44/83/3b20ff58d0c3b7f6caaa3af9a4174d4023701df40a3f39f7f1c8e7c48f9d/grpcio-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d", size = 7385866, upload-time = "2026-03-30T08:47:55.687Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/dd06f4c24c01db9cf11341b547d0a016b2c90ed7dbbb086a5710df7dd1d7/grpcio-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7", size = 7826752, upload-time = "2026-03-30T08:48:01.311Z" }, ] [[package]] name = "gunicorn" -version = "26.0.0" +version = "25.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/b7/a4a3f632f823e432ce6bc65f62961b7980c898c77f075a2f7118cb3846fe/gunicorn-26.0.0.tar.gz", hash = "sha256:ca9346f85e3a4aeeb64d491045c16b9a35647abd37ea15efe53080eb8b090baf", size = 727286, upload-time = "2026-05-05T06:38:25.529Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/f4/e78fa054248fab913e2eab0332c6c2cb07421fca1ce56d8fe43b6aef57a4/gunicorn-25.3.0.tar.gz", hash = "sha256:f74e1b2f9f76f6cd1ca01198968bd2dd65830edc24b6e8e4d78de8320e2fe889", size = 634883, upload-time = "2026-03-27T00:00:26.092Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/40/9c2384fc2be4ad25dd4a49decd5ad9ea5a3639814c11bd40ab77cb9f0a14/gunicorn-26.0.0-py3-none-any.whl", hash = "sha256:40233d26a5f0d1872916188c276e21641155111c2853f0c2cd55260aec0d24fc", size = 212009, upload-time = "2026-05-05T06:38:23.007Z" }, + { url = "https://files.pythonhosted.org/packages/43/c8/8aaf447698c4d59aa853fd318eed300b5c9e44459f242ab8ead6c9c09792/gunicorn-25.3.0-py3-none-any.whl", hash = "sha256:cacea387dab08cd6776501621c295a904fe8e3b7aae9a1a3cbb26f4e7ed54660", size = 208403, upload-time = "2026-03-27T00:00:27.386Z" }, ] [[package]] @@ -2267,7 +1998,7 @@ wheels = [ [[package]] name = "hatchling" -version = "1.30.1" +version = "1.29.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -2275,9 +2006,9 @@ dependencies = [ { name = "pluggy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "trove-classifiers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/4c/8717ccb844b4fa5a5ba6352e97d743ed24e9a22cf90b7c109c17030a46a1/hatchling-1.30.1.tar.gz", hash = "sha256:eee4fd45357f72ebb3d7a42e5d72cfb5e29ed426d79e8836288926c4258d5f2e", size = 56929, upload-time = "2026-06-02T00:09:41.487Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/9c/b4cfe330cd4f49cff17fd771154730555fa4123beb7f292cf0098b4e6c20/hatchling-1.29.0.tar.gz", hash = "sha256:793c31816d952cee405b83488ce001c719f325d9cda69f1fc4cd750527640ea6", size = 55656, upload-time = "2026-02-23T19:42:06.539Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/49/2797ec0ef88008a653a8867bb8d1e5c223cd2df8e40390dd5c6a0279cbc5/hatchling-1.30.1-py3-none-any.whl", hash = "sha256:161eacafb3c6f91526e92116d21426369f2c36e98c36a864f11a96345ad4ee31", size = 77489, upload-time = "2026-06-02T00:09:40.139Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/44032265776062a89171285ede55a0bdaadc8ac00f27f0512a71a9e3e1c8/hatchling-1.29.0-py3-none-any.whl", hash = "sha256:50af9343281f34785fab12da82e445ed987a6efb34fd8c2fc0f6e6630dbcc1b0", size = 76356, upload-time = "2026-02-23T19:42:05.197Z" }, ] [[package]] @@ -2288,38 +2019,32 @@ sdist = { url = "https://files.pythonhosted.org/packages/1a/eb/8fc64f40388c29ce8 wheels = [ { url = "https://files.pythonhosted.org/packages/ea/2e/3d60b1a9e9f29a2152aa66c823bf5e399ae7be3fef310ff0de86779c5d2d/hf_transfer-0.1.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ebc4ab9023414880c8b1d3c38174d1c9989eb5022d37e814fa91a3060123eb0", size = 1343558, upload-time = "2025-01-07T10:04:42.313Z" }, { url = "https://files.pythonhosted.org/packages/fb/38/130a5ac3747f104033591bcac1c961cb1faadfdc91704f59b09c0b465ff2/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8674026f21ed369aa2a0a4b46000aca850fc44cd2b54af33a172ce5325b4fc82", size = 3726676, upload-time = "2025-01-07T10:04:11.539Z" }, - { url = "https://files.pythonhosted.org/packages/15/a1/f4e27c5ad17aac616ae0849e2aede5aae31db8267a948c6b3eeb9fd96446/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a736dfbb2c84f5a2c975478ad200c0c8bfcb58a25a35db402678fb87ce17fa4", size = 3062920, upload-time = "2025-01-07T10:04:16.297Z" }, - { url = "https://files.pythonhosted.org/packages/50/d0/2b213eb1ea8b1252ccaf1a6c804d0aba03fea38aae4124df6a3acb70511a/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c7fc1b85f4d0f76e452765d7648c9f4bfd0aedb9ced2ae1ebfece2d8cfaf8e2", size = 3398837, upload-time = "2025-01-07T10:04:22.778Z" }, { url = "https://files.pythonhosted.org/packages/8c/8a/79dbce9006e0bd6b74516f97451a7b7c64dbbb426df15d901dd438cfeee3/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d991376f0eac70a60f0cbc95602aa708a6f7c8617f28b4945c1431d67b8e3c8", size = 3546986, upload-time = "2025-01-07T10:04:36.415Z" }, { url = "https://files.pythonhosted.org/packages/a9/f7/9ac239b6ee6fe0bad130325d987a93ea58c4118e50479f0786f1733b37e8/hf_transfer-0.1.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e6ac4eddcd99575ed3735ed911ddf9d1697e2bd13aa3f0ad7e3904dd4863842e", size = 4071715, upload-time = "2025-01-07T10:04:53.224Z" }, - { url = "https://files.pythonhosted.org/packages/d8/a3/0ed697279f5eeb7a40f279bd783cf50e6d0b91f24120dcf66ef2cf8822b4/hf_transfer-0.1.9-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:57fd9880da1ee0f47250f735f791fab788f0aa1ee36afc49f761349869c8b4d9", size = 3388081, upload-time = "2025-01-07T10:04:57.818Z" }, { url = "https://files.pythonhosted.org/packages/45/07/6661e43fbee09594a8a5e9bb778107d95fe38dac4c653982afe03d32bd4d/hf_transfer-0.1.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a5b366d34cd449fe9b20ef25941e6eef0460a2f74e7389f02e673e1f88ebd538", size = 3690551, upload-time = "2025-01-07T10:05:09.238Z" }, { url = "https://files.pythonhosted.org/packages/41/ba/8d9fd9f1083525edfcb389c93738c802f3559cb749324090d7109c8bf4c2/hf_transfer-0.1.9-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:8669dbcc7a3e2e8d61d42cd24da9c50d57770bd74b445c65123291ca842a7e7a", size = 1348126, upload-time = "2025-01-07T10:04:45.712Z" }, { url = "https://files.pythonhosted.org/packages/8e/a2/cd7885bc9959421065a6fae0fe67b6c55becdeda4e69b873e52976f9a9f0/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fd0167c4407a3bc4cdd0307e65ada2294ec04f1813d8a69a5243e379b22e9d8", size = 3728604, upload-time = "2025-01-07T10:04:14.173Z" }, - { url = "https://files.pythonhosted.org/packages/f6/2e/a072cf196edfeda3310c9a5ade0a0fdd785e6154b3ce24fc738c818da2a7/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee8b10afedcb75f71091bcc197c526a6ebf5c58bbbadb34fdeee6160f55f619f", size = 3064995, upload-time = "2025-01-07T10:04:18.663Z" }, - { url = "https://files.pythonhosted.org/packages/29/63/b560d39651a56603d64f1a0212d0472a44cbd965db2fa62b99d99cb981bf/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc6bd19e1cc177c66bdef15ef8636ad3bde79d5a4f608c158021153b4573509d", size = 3400839, upload-time = "2025-01-07T10:04:26.122Z" }, { url = "https://files.pythonhosted.org/packages/d6/d8/f87ea6f42456254b48915970ed98e993110521e9263472840174d32c880d/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdca9bfb89e6f8f281890cc61a8aff2d3cecaff7e1a4d275574d96ca70098557", size = 3552664, upload-time = "2025-01-07T10:04:40.123Z" }, { url = "https://files.pythonhosted.org/packages/d6/56/1267c39b65fc8f4e2113b36297320f102718bf5799b544a6cbe22013aa1d/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:89a23f58b7b7effbc047b8ca286f131b17728c99a9f972723323003ffd1bb916", size = 4073732, upload-time = "2025-01-07T10:04:55.624Z" }, - { url = "https://files.pythonhosted.org/packages/82/1a/9c748befbe3decf7cb415e34f8a0c3789a0a9c55910dea73d581e48c0ce5/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:dc7fff1345980d6c0ebb92c811d24afa4b98b3e07ed070c8e38cc91fd80478c5", size = 3390096, upload-time = "2025-01-07T10:04:59.98Z" }, { url = "https://files.pythonhosted.org/packages/e7/6e/e597b04f753f1b09e6893075d53a82a30c13855cbaa791402695b01e369f/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d2fde99d502093ade3ab1b53f80da18480e9902aa960dab7f74fb1b9e5bc5746", size = 3695243, upload-time = "2025-01-07T10:05:11.411Z" }, ] [[package]] name = "hf-xet" -version = "1.5.1" +version = "1.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4b/2d/57fd21d84d93efb4bd0b962383790e19dd1bc053501b4264c97903b4e83e/hf_xet-1.5.1.tar.gz", hash = "sha256:51ef4500dab3764b41135ee1381a4b62ce56fc54d4c92b719b59e597d6df5bf6", size = 876636, upload-time = "2026-06-08T23:02:53.897Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/92/ec9ad04d0b5728dca387a45af7bc98fbb0d73b2118759f5f6038b61a57e8/hf_xet-1.4.3.tar.gz", hash = "sha256:8ddedb73c8c08928c793df2f3401ec26f95be7f7e516a7bee2fbb546f6676113", size = 670477, upload-time = "2026-03-31T22:40:07.874Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/bc/9cae6cfeb4e03070874e73e5c97c66eb90369d3206b6a2b1ef5f96520888/hf_xet-1.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78e4e5192ad2b674c2e1160b651cb9134db974f8ae1835bdfbfb0166b894a43", size = 3838493, upload-time = "2026-06-08T23:02:15.282Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b4/d5c01e0eb6d9f2ca2dacd84d0d1b71e6cfbb2ef3208c968528e010e9b3d7/hf_xet-1.5.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6f7a04a8ad962422e225bc49fbbac99dc1806764b1f3e54dbd154bffa7593947", size = 4505658, upload-time = "2026-06-08T23:02:17.196Z" }, - { url = "https://files.pythonhosted.org/packages/76/c5/29a7598c0c6383c523dc22186d577f4e04267a626cd95ae60f67c00bfe66/hf_xet-1.5.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:d48199c2bf4f8df0adc55d31d1368b6ec0e4d4f45bc86b08038089c23db0bed8", size = 4292822, upload-time = "2026-06-08T23:02:18.608Z" }, - { url = "https://files.pythonhosted.org/packages/04/9a/dceaf6ca69390126b86ea825fb354b93d01163199070b7bd849225de9468/hf_xet-1.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:97f212a88d14bbf573619a74b7fecb238de77d08fc702e54dec6f78276ca3283", size = 4491255, upload-time = "2026-06-08T23:02:20.124Z" }, - { url = "https://files.pythonhosted.org/packages/48/a7/e5a7afaacf6c1791fdbeeac42951fb81c3d2bc482992b115dedcc86d963e/hf_xet-1.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f61e3665892a6c8c5e765395838b8ddf36185da835253d4bc4509a81e49fb342", size = 4711062, upload-time = "2026-06-08T23:02:21.863Z" }, - { url = "https://files.pythonhosted.org/packages/35/94/4b2ecfbad8f8b04701a23aefb62f540b9137d058b7e1dbef16a32676f0e9/hf_xet-1.5.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:94e761bbd266bf4c03cee73753916062665ce8365aa40ed321f45afcb934b41e", size = 3845354, upload-time = "2026-06-08T23:02:42.702Z" }, - { url = "https://files.pythonhosted.org/packages/de/cc/f99f4bc7295023d7bd9ebbfd51f75cc530ca262c1227666268b8208f4b77/hf_xet-1.5.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:892e3a3a3aecc12aded8b93cf4f9cd059282c7de0732f7d55026f3abdf474350", size = 4514864, upload-time = "2026-06-08T23:02:44.497Z" }, - { url = "https://files.pythonhosted.org/packages/cd/6e/21f7e5a2381278bd3b7b7a5a4d90038518bb6308a0c1daf5d9f8268bb178/hf_xet-1.5.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a93df2039190502835b1db8cd7e178b0b7b889fe9ab51299d5ced26e0dd879a4", size = 4303784, upload-time = "2026-06-08T23:02:46.203Z" }, - { url = "https://files.pythonhosted.org/packages/35/0e/f992bb6927ac1cb30ef74e62268f551f338bc32b2191f7c96a44c6f7283e/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0c97106032ef70467b4f6bc2d0ccc266d7613ee076afc56516c502f87ce1c4a6", size = 4500703, upload-time = "2026-06-08T23:02:47.628Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d1/90a498d05447980b977b1669246eeeeae4cfb0ea3e7a286eaba627f91bf9/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6208adb15d192b90e4c2ad2a27ed864359b2cb0f2494eb6d7c7f3699ac02e2bf", size = 4719498, upload-time = "2026-06-08T23:02:49.268Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d2/8bee5996b699262edb87dbb54118d287c0e1b2fc78af7cdc41857ba5e3c4/hf_xet-1.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bee693ada985e7045997f05f081d0e12c4c08bd7626dc397f8a7c487e6c04f7f", size = 3558942, upload-time = "2026-03-31T22:39:47.938Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a1/e993d09cbe251196fb60812b09a58901c468127b7259d2bf0f68bf6088eb/hf_xet-1.4.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21644b404bb0100fe3857892f752c4d09642586fd988e61501c95bbf44b393a3", size = 4207657, upload-time = "2026-03-31T22:39:39.69Z" }, + { url = "https://files.pythonhosted.org/packages/64/44/9eb6d21e5c34c63e5e399803a6932fa983cabdf47c0ecbcfe7ea97684b8c/hf_xet-1.4.3-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:987f09cfe418237812896a6736b81b1af02a3a6dcb4b4944425c4c4fca7a7cf8", size = 3986765, upload-time = "2026-03-31T22:39:37.936Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/8ad6f16fdb82f5f7284a34b5ec48645bd575bdcd2f6f0d1644775909c486/hf_xet-1.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:60cf7fc43a99da0a853345cf86d23738c03983ee5249613a6305d3e57a5dca74", size = 4188162, upload-time = "2026-03-31T22:39:58.382Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c4/39d6e136cbeea9ca5a23aad4b33024319222adbdc059ebcda5fc7d9d5ff4/hf_xet-1.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2815a49a7a59f3e2edf0cf113ae88e8cb2ca2a221bf353fb60c609584f4884d4", size = 4424525, upload-time = "2026-03-31T22:40:00.225Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f8/7aacb8e5f4a7899d39c787b5984e912e6c18b11be136ef13947d7a66d265/hf_xet-1.4.3-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:e23717ce4186b265f69afa66e6f0069fe7efbf331546f5c313d00e123dc84583", size = 3562178, upload-time = "2026-03-31T22:39:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/df/9a/a24b26dc8a65f0ecc0fe5be981a19e61e7ca963b85e062c083f3a9100529/hf_xet-1.4.3-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc360b70c815bf340ed56c7b8c63aacf11762a4b099b2fe2c9bd6d6068668c08", size = 4212320, upload-time = "2026-03-31T22:39:42.922Z" }, + { url = "https://files.pythonhosted.org/packages/53/60/46d493db155d2ee2801b71fb1b0fd67696359047fdd8caee2c914cc50c79/hf_xet-1.4.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:39f2d2e9654cd9b4319885733993807aab6de9dfbd34c42f0b78338d6617421f", size = 3991546, upload-time = "2026-03-31T22:39:41.335Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f5/067363e1c96c6b17256910830d1b54099d06287e10f4ec6ec4e7e08371fc/hf_xet-1.4.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:49ad8a8cead2b56051aa84d7fce3e1335efe68df3cf6c058f22a65513885baac", size = 4193200, upload-time = "2026-03-31T22:40:01.936Z" }, + { url = "https://files.pythonhosted.org/packages/42/4b/53951592882d9c23080c7644542fda34a3813104e9e11fa1a7d82d419cb8/hf_xet-1.4.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7716d62015477a70ea272d2d68cd7cad140f61c52ee452e133e139abfe2c17ba", size = 4429392, upload-time = "2026-03-31T22:40:03.492Z" }, ] [[package]] @@ -2337,28 +2062,28 @@ wheels = [ [[package]] name = "httptools" -version = "0.8.0" +version = "0.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/d2/c3eedaef57de65c3cc5f8dc244cf12d09c84ad258a479055aad6db23206c/httptools-0.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed377e64805bdba4943c82717333f8f8603a13b09aff9cead2717c6c817fb168", size = 208428, upload-time = "2026-05-25T22:16:59.717Z" }, - { url = "https://files.pythonhosted.org/packages/f1/94/dfe435d90d0ef61ec0f2cc3d480eef78c59727c6c2ce039f433882f6131a/httptools-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9518c406d7b310f05adb1a37f80acabac40504a575d7c0da6d3e365c695ac20d", size = 113366, upload-time = "2026-05-25T22:17:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/cc/d4/13025f1a56e615dcb331e0bbe2d9a1143212b58c263385fc5d2e558f5bac/httptools-0.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:57278e6fa0424c42a8a3e454828ab4f0aff27b40cddf9679579b98c6dce6a376", size = 464676, upload-time = "2026-05-25T22:17:02.014Z" }, - { url = "https://files.pythonhosted.org/packages/bf/95/4c1c26c0b985f8a3331682d802598f14e32dc41bf7509266eb2c04ad4801/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbb8caadb2b742d293169d2b458b5c001ef70e3158704aa3d3ef9597624c5d1d", size = 464235, upload-time = "2026-05-25T22:17:03.109Z" }, - { url = "https://files.pythonhosted.org/packages/a2/82/6735be2b0ca527718c431cdb8e5f70c3862c0844a687df0f572c51e11497/httptools-0.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:52dd695b865fe96d9d2b16b64a895f3f57bf3cb064e8383cd3b5713a069e8085", size = 449809, upload-time = "2026-05-25T22:17:04.443Z" }, - { url = "https://files.pythonhosted.org/packages/b5/f9/5811c74f37a758c8a4aa3dc430375119d335947e883efc4664d8f3559a41/httptools-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20b4aac66ff65f7db06a375808b78f42a94970aa22e826b3cb2b43eb09174124", size = 452174, upload-time = "2026-05-25T22:17:05.476Z" }, - { url = "https://files.pythonhosted.org/packages/14/88/1d21a36da8f5cb0fa49eafd4b169eba5608d57e75bbcf61845cbc6243216/httptools-0.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880490234c10f70a9830743097e8958d6e4b9f5a0ffc24515023afeef984054d", size = 208247, upload-time = "2026-05-25T22:17:07.843Z" }, - { url = "https://files.pythonhosted.org/packages/a5/42/cc4feea2945cb3051038f090c9b36bd5b8a9d7f5a894a506a8983e33fd1c/httptools-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5931891fb7b441b8a3853cf1b85c82c903defce084dd5f6771ca46e31bf862c5", size = 113064, upload-time = "2026-05-25T22:17:09.136Z" }, - { url = "https://files.pythonhosted.org/packages/e3/a6/febbb8b8db0f58b38e44ad6cb946e6a255ae49b55f2e8543408fb7501ccd/httptools-0.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b15fc622b0f869d19207c4089a501d9bcc63ca5e071ffdd2f03f922df882dcb2", size = 523851, upload-time = "2026-05-25T22:17:10.106Z" }, - { url = "https://files.pythonhosted.org/packages/b7/e4/f90a0df0b83beff265b7e3b65f2a4cefd95792d4be0ac3e16049f2acd3c2/httptools-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:425f83884fd6343828d8c565f046cb72b6d19063f6924093e11bcd8e1548cd09", size = 518842, upload-time = "2026-05-25T22:17:11.218Z" }, - { url = "https://files.pythonhosted.org/packages/9e/2d/0c9ac76dd2c893841fbf6498d6acec4f2442e1b7067f6e3e316a80e494e8/httptools-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7c3c97f4311c7be57e2986629df89d49cb434dbff78eafcd48c2bff986b15a", size = 501238, upload-time = "2026-05-25T22:17:12.728Z" }, - { url = "https://files.pythonhosted.org/packages/ca/42/906adc91ae3a5fa9c59c0a2f21c139725bd7e5b41ae6acd485cd14123ebf/httptools-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a1afd7c9fbff0d9f5d489c4ce2768bd09c84a46ddefc7161e6aa82ae35c85745", size = 509567, upload-time = "2026-05-25T22:17:13.842Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e5/8cfcabc5546e8022f168be28bcdaa128a240a0befdd03b59d558b4f18bd6/httptools-0.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8", size = 205148, upload-time = "2026-05-25T22:17:16.333Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0e/0fb14848c19a686c8062ff9067c1a48793e3224b47bc5b201535b6036fce/httptools-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c", size = 111368, upload-time = "2026-05-25T22:17:17.586Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1b/46f1cecf06b9bbde8e4b8c88034ac7908989e5ff7a3a388ef38392949c1f/httptools-0.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7", size = 486447, upload-time = "2026-05-25T22:17:18.564Z" }, - { url = "https://files.pythonhosted.org/packages/77/00/258bfc0837221f81d9725c45f9b948a6a6b2994a147a4fb66e85100c668f/httptools-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d", size = 482448, upload-time = "2026-05-25T22:17:19.912Z" }, - { url = "https://files.pythonhosted.org/packages/04/ab/d1cef3b5523f4d272a70f42a776c3169a2dddfe3a54de4b2ce4a36341528/httptools-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681", size = 464460, upload-time = "2026-05-25T22:17:20.882Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/5d1d072442277bb2b3434e0e60690b8e8c23840ef7de8b6ea54040a536d3/httptools-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683", size = 471312, upload-time = "2026-05-25T22:17:22.085Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, + { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, ] [[package]] @@ -2391,14 +2116,14 @@ wheels = [ [[package]] name = "httpx-retries" -version = "0.5.0" +version = "0.4.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/f5/046cac13877ce9b55aebdbb3999e0e45b19b989a95c5fd1040fa04bd1f92/httpx_retries-0.5.0.tar.gz", hash = "sha256:d8c8e1e0852d84be3837aba0bcf78aeb89a4b77db95e8cc988c8c058830b3044", size = 15647, upload-time = "2026-04-20T01:21:47.154Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/13/5eac2df576c02280f79e4639a6d4c93a25cfe94458275f5aa55f5e6c8ea0/httpx_retries-0.4.6.tar.gz", hash = "sha256:a076d8a5ede5d5794e9c241da17b15b393b482129ddd2fdf1fa56a3fa1f28a7f", size = 13466, upload-time = "2026-02-17T16:16:05.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/a8/aadeaa9a28510727d538636ee8688f0782a98523147852b29404ce696f1b/httpx_retries-0.5.0-py3-none-any.whl", hash = "sha256:d3124592979a9dc6197e666d1f02e9ab996a0c58fce59fad8db6201a6a87304e", size = 8908, upload-time = "2026-04-20T01:21:46.157Z" }, + { url = "https://files.pythonhosted.org/packages/f2/97/63f56da4400034adde22adfe7524635dba068f17d6858f92ecd96f55b53e/httpx_retries-0.4.6-py3-none-any.whl", hash = "sha256:d66d912173b844e065ffb109345a453b922f4c2cd9c9e11139304cb33e7a1ee1", size = 8490, upload-time = "2026-02-17T16:16:04.137Z" }, ] [[package]] @@ -2412,10 +2137,9 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "1.18.0" +version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "filelock", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fsspec", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "hf-xet", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -2426,9 +2150,9 @@ dependencies = [ { name = "typer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d8/748ea0a47f0fa15227fe682f7a80826b4b7c096e4818044b8f56d6cb66d6/huggingface_hub-1.18.0.tar.gz", hash = "sha256:f0c5ecd1ef8c6a60f86f61ee278f2c1570ba9e279c9f54de9094210723b3613b", size = 812699, upload-time = "2026-06-05T09:26:33.401Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/b6/e22bd20a25299c34b8c5922c1545a6320825b13906eb0f7298edfd034a0b/huggingface_hub-1.15.0.tar.gz", hash = "sha256:28abfdddda3927fd4de6a63cf26ab012498a2c24dae52baf150c5c6edf98a1d5", size = 784100, upload-time = "2026-05-15T11:42:52.149Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/03/40a05316cb6616e5b7efd7773656441ab04b4b022c2199e79bb4622a92a3/huggingface_hub-1.18.0-py3-none-any.whl", hash = "sha256:729be4a976fb706dcc02d176bcda8a3f32bdf21a294e8f4b3dda6fbcbc9c1ab1", size = 684411, upload-time = "2026-06-05T09:26:31.48Z" }, + { url = "https://files.pythonhosted.org/packages/6e/11/0b64cc9024329b76d7547c19a67604a61d21d3ba678a69d1b220c29d5112/huggingface_hub-1.15.0-py3-none-any.whl", hash = "sha256:a4a59af04cbc41a3fe3fec429b171ef994ef8c971eda10136746f408dd4e3744", size = 663602, upload-time = "2026-05-15T11:42:50.487Z" }, ] [[package]] @@ -2454,20 +2178,20 @@ wheels = [ [[package]] name = "identify" -version = "2.6.19" +version = "2.6.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/c4/7fb4db12296cdb11893d61c92048fe617ee853f8523b9b296ac03b43757e/identify-2.6.18.tar.gz", hash = "sha256:873ac56a5e3fd63e7438a7ecbc4d91aca692eb3fefa4534db2b7913f3fc352fd", size = 99580, upload-time = "2026-03-15T18:39:50.319Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, + { url = "https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl", hash = "sha256:8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737", size = 99394, upload-time = "2026-03-15T18:39:48.915Z" }, ] [[package]] name = "idna" -version = "3.18" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] @@ -2481,14 +2205,14 @@ wheels = [ [[package]] name = "importlib-metadata" -version = "8.9.0" +version = "8.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/72/c600ae4f68c28fc19f9c31b9403053e5dbb8cace2e6842c7b7c3e4d42fe9/importlib_metadata-8.9.0.tar.gz", hash = "sha256:58850626cef4bd2df100378b0f2aea9724a7b92f10770d547725b047078f99ee", size = 56140, upload-time = "2026-03-20T16:56:26.362Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304, upload-time = "2024-09-11T14:56:08.937Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/f9/97f2ca8bb3ec6e4b1d64f983ebe98b9a192faddff67fac3d6303a537e670/importlib_metadata-8.9.0-py3-none-any.whl", hash = "sha256:e0f761b6ea91ced3b0844c14c9d955224d538105921f8e6754c00f6ca79fba7f", size = 27220, upload-time = "2026-03-20T16:56:25.07Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514, upload-time = "2024-09-11T14:56:07.019Z" }, ] [[package]] @@ -2535,19 +2259,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d8/c8/36c5d9b80aaf40ba9a7084a8fc18c967db6bf248a4cc8d0f0816b14284be/instructor-1.15.1-py3-none-any.whl", hash = "sha256:be81d17ba2b154a04ab4720808f24f9d6b598f80992f82eaf9cc79006099cf6c", size = 178156, upload-time = "2026-04-03T01:51:23.098Z" }, ] -[[package]] -name = "ipdb" -version = "0.13.13" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "decorator", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "ipython", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/1b/7e07e7b752017f7693a0f4d41c13e5ca29ce8cbcfdcc1fd6c4ad8c0a27a0/ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726", size = 17042, upload-time = "2023-03-09T15:40:57.487Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/4c/b075da0092003d9a55cf2ecc1cae9384a1ca4f650d51b00fc59875fe76f6/ipdb-0.13.13-py3-none-any.whl", hash = "sha256:45529994741c4ab6d2388bfa5d7b725c2cf7fe9deffabdb8a6113aa5ed449ed4", size = 12130, upload-time = "2023-03-09T15:40:55.021Z" }, -] - [[package]] name = "ipykernel" version = "7.2.0" @@ -2648,26 +2359,26 @@ wheels = [ [[package]] name = "jaraco-functools" -version = "4.5.0" +version = "4.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/cf/ea4ef2920830dea3f5ab2ea4da6fb67724e6dca80ee2553788c3607243d0/jaraco_functools-4.5.0.tar.gz", hash = "sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03", size = 20272, upload-time = "2026-05-15T21:34:10.025Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl", hash = "sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4", size = 10594, upload-time = "2026-05-15T21:34:08.595Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481, upload-time = "2025-12-21T09:29:42.27Z" }, ] [[package]] name = "jedi" -version = "0.20.0" +version = "0.19.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, ] [[package]] @@ -2693,43 +2404,27 @@ wheels = [ [[package]] name = "jiter" -version = "0.13.0" +version = "0.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/f6/566364c777d2ab450b92100bea11333c64c38d32caf8dc378b48e5b20c46/jiter-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66aa3e663840152d18cc8ff1e4faad3dd181373491b9cfdc6004b92198d67911", size = 319729, upload-time = "2026-02-02T12:35:39.246Z" }, - { url = "https://files.pythonhosted.org/packages/73/dd/560f13ec5e4f116d8ad2658781646cca91b617ae3b8758d4a5076b278f70/jiter-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3524798e70655ff19aec58c7d05adb1f074fecff62da857ea9be2b908b6d701", size = 354766, upload-time = "2026-02-02T12:35:40.662Z" }, - { url = "https://files.pythonhosted.org/packages/7c/0d/061faffcfe94608cbc28a0d42a77a74222bdf5055ccdbe5fd2292b94f510/jiter-0.13.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec7e287d7fbd02cb6e22f9a00dd9c9cd504c40a61f2c61e7e1f9690a82726b4c", size = 362587, upload-time = "2026-02-02T12:35:42.025Z" }, - { url = "https://files.pythonhosted.org/packages/92/c9/c66a7864982fd38a9773ec6e932e0398d1262677b8c60faecd02ffb67bf3/jiter-0.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47455245307e4debf2ce6c6e65a717550a0244231240dcf3b8f7d64e4c2f22f4", size = 487537, upload-time = "2026-02-02T12:35:43.459Z" }, - { url = "https://files.pythonhosted.org/packages/6c/86/84eb4352cd3668f16d1a88929b5888a3fe0418ea8c1dfc2ad4e7bf6e069a/jiter-0.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ee9da221dca6e0429c2704c1b3655fe7b025204a71d4d9b73390c759d776d165", size = 373717, upload-time = "2026-02-02T12:35:44.928Z" }, - { url = "https://files.pythonhosted.org/packages/6e/09/9fe4c159358176f82d4390407a03f506a8659ed13ca3ac93a843402acecf/jiter-0.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24ab43126d5e05f3d53a36a8e11eb2f23304c6c1117844aaaf9a0aa5e40b5018", size = 362683, upload-time = "2026-02-02T12:35:46.636Z" }, - { url = "https://files.pythonhosted.org/packages/12/4c/05b8629ad546191939e6f0c2f17e29f542a398f4a52fb987bc70b6d1eb8b/jiter-0.13.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b34c519e17658ed88d5047999a93547f8889f3c1824120c26ad6be5f27b6cf5", size = 517775, upload-time = "2026-02-02T12:35:49.482Z" }, - { url = "https://files.pythonhosted.org/packages/4d/88/367ea2eb6bc582c7052e4baf5ddf57ebe5ab924a88e0e09830dfb585c02d/jiter-0.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2a6394e6af690d462310a86b53c47ad75ac8c21dc79f120714ea449979cb1d3", size = 551325, upload-time = "2026-02-02T12:35:51.104Z" }, - { url = "https://files.pythonhosted.org/packages/c3/27/e57f9a783246ed95481e6749cc5002a8a767a73177a83c63ea71f0528b90/jiter-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f917a04240ef31898182f76a332f508f2cc4b57d2b4d7ad2dbfebbfe167eb505", size = 318597, upload-time = "2026-02-02T12:35:58.591Z" }, - { url = "https://files.pythonhosted.org/packages/cf/52/e5719a60ac5d4d7c5995461a94ad5ef962a37c8bf5b088390e6fad59b2ff/jiter-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1e2b199f446d3e82246b4fd9236d7cb502dc2222b18698ba0d986d2fecc6152", size = 348821, upload-time = "2026-02-02T12:36:00.093Z" }, - { url = "https://files.pythonhosted.org/packages/61/db/c1efc32b8ba4c740ab3fc2d037d8753f67685f475e26b9d6536a4322bcdd/jiter-0.13.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04670992b576fa65bd056dbac0c39fe8bd67681c380cb2b48efa885711d9d726", size = 364163, upload-time = "2026-02-02T12:36:01.937Z" }, - { url = "https://files.pythonhosted.org/packages/55/8a/fb75556236047c8806995671a18e4a0ad646ed255276f51a20f32dceaeec/jiter-0.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a1aff1fbdb803a376d4d22a8f63f8e7ccbce0b4890c26cc7af9e501ab339ef0", size = 483709, upload-time = "2026-02-02T12:36:03.41Z" }, - { url = "https://files.pythonhosted.org/packages/7e/16/43512e6ee863875693a8e6f6d532e19d650779d6ba9a81593ae40a9088ff/jiter-0.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b3fb8c2053acaef8580809ac1d1f7481a0a0bdc012fd7f5d8b18fb696a5a089", size = 370480, upload-time = "2026-02-02T12:36:04.791Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4c/09b93e30e984a187bc8aaa3510e1ec8dcbdcd71ca05d2f56aac0492453aa/jiter-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdaba7d87e66f26a2c45d8cbadcbfc4bf7884182317907baf39cfe9775bb4d93", size = 360735, upload-time = "2026-02-02T12:36:06.994Z" }, - { url = "https://files.pythonhosted.org/packages/15/9e/26184760e85baee7162ad37b7912797d2077718476bf91517641c92b3639/jiter-0.13.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e404ea551d35438013c64b4f357b0474c7abf9f781c06d44fcaf7a14c69ff9e2", size = 513990, upload-time = "2026-02-02T12:36:09.993Z" }, - { url = "https://files.pythonhosted.org/packages/e9/34/2c9355247d6debad57a0a15e76ab1566ab799388042743656e566b3b7de1/jiter-0.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f4748aad1b4a93c8bdd70f604d0f748cdc0e8744c5547798acfa52f10e79228", size = 548021, upload-time = "2026-02-02T12:36:11.376Z" }, - { url = "https://files.pythonhosted.org/packages/7c/02/be5b870d1d2be5dd6a91bdfb90f248fbb7dcbd21338f092c6b89817c3dbf/jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a", size = 317507, upload-time = "2026-02-02T12:36:18.351Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/b25d2ec333615f5f284f3a4024f7ce68cfa0604c322c6808b2344c7f5d2b/jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb", size = 350560, upload-time = "2026-02-02T12:36:19.746Z" }, - { url = "https://files.pythonhosted.org/packages/be/ec/74dcb99fef0aca9fbe56b303bf79f6bd839010cb18ad41000bf6cc71eec0/jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2", size = 363232, upload-time = "2026-02-02T12:36:21.243Z" }, - { url = "https://files.pythonhosted.org/packages/1b/37/f17375e0bb2f6a812d4dd92d7616e41917f740f3e71343627da9db2824ce/jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f", size = 483727, upload-time = "2026-02-02T12:36:22.688Z" }, - { url = "https://files.pythonhosted.org/packages/77/d2/a71160a5ae1a1e66c1395b37ef77da67513b0adba73b993a27fbe47eb048/jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159", size = 370799, upload-time = "2026-02-02T12:36:24.106Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/ed5e478ff0eb4e8aa5fd998f9d69603c9fd3f32de3bd16c2b1194f68361c/jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663", size = 359120, upload-time = "2026-02-02T12:36:25.519Z" }, - { url = "https://files.pythonhosted.org/packages/d1/84/e0787856196d6d346264d6dcccb01f741e5f0bd014c1d9a2ebe149caf4f3/jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820", size = 513543, upload-time = "2026-02-02T12:36:28.217Z" }, - { url = "https://files.pythonhosted.org/packages/65/50/ecbd258181c4313cf79bca6c88fb63207d04d5bf5e4f65174114d072aa55/jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68", size = 547262, upload-time = "2026-02-02T12:36:29.678Z" }, - { url = "https://files.pythonhosted.org/packages/49/19/a929ec002ad3228bc97ca01dbb14f7632fffdc84a95ec92ceaf4145688ae/jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10", size = 316616, upload-time = "2026-02-02T12:36:36.579Z" }, - { url = "https://files.pythonhosted.org/packages/52/56/d19a9a194afa37c1728831e5fb81b7722c3de18a3109e8f282bfc23e587a/jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef", size = 346850, upload-time = "2026-02-02T12:36:38.058Z" }, - { url = "https://files.pythonhosted.org/packages/36/4a/94e831c6bf287754a8a019cb966ed39ff8be6ab78cadecf08df3bb02d505/jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6", size = 358551, upload-time = "2026-02-02T12:36:39.417Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ae/60993e4b07b1ac5ebe46da7aa99fdbb802eb986c38d26e3883ac0125c4e0/jiter-0.13.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:db367d8be9fad6e8ebbac4a7578b7af562e506211036cba2c06c3b998603c3d2", size = 305024, upload-time = "2026-02-02T12:37:44.774Z" }, - { url = "https://files.pythonhosted.org/packages/77/fa/2227e590e9cf98803db2811f172b2d6460a21539ab73006f251c66f44b14/jiter-0.13.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f6f8efb2f3b0603092401dc2df79fa89ccbc027aaba4174d2d4133ed661434", size = 339337, upload-time = "2026-02-02T12:37:46.668Z" }, - { url = "https://files.pythonhosted.org/packages/2d/92/015173281f7eb96c0ef580c997da8ef50870d4f7f4c9e03c845a1d62ae04/jiter-0.13.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:597245258e6ad085d064780abfb23a284d418d3e61c57362d9449c6c7317ee2d", size = 346395, upload-time = "2026-02-02T12:37:48.09Z" }, - { url = "https://files.pythonhosted.org/packages/d2/73/a009f41c5eed71c49bec53036c4b33555afcdee70682a18c6f66e396c039/jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:ff732bd0a0e778f43d5009840f20b935e79087b4dc65bd36f1cd0f9b04b8ff7f", size = 303808, upload-time = "2026-02-02T12:37:52.092Z" }, - { url = "https://files.pythonhosted.org/packages/c4/10/528b439290763bff3d939268085d03382471b442f212dca4ff5f12802d43/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab44b178f7981fcaea7e0a5df20e773c663d06ffda0198f1a524e91b2fde7e59", size = 337384, upload-time = "2026-02-02T12:37:53.582Z" }, - { url = "https://files.pythonhosted.org/packages/67/8a/a342b2f0251f3dac4ca17618265d93bf244a2a4d089126e81e4c1056ac50/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb00b6d26db67a05fe3e12c76edc75f32077fb51deed13822dc648fa373bc19", size = 343768, upload-time = "2026-02-02T12:37:55.055Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", size = 162759, upload-time = "2025-05-18T19:04:59.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/cf/fc33f5159ce132be1d8dd57251a1ec7a631c7df4bd11e1cd198308c6ae32/jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc", size = 321971, upload-time = "2025-05-18T19:03:27.255Z" }, + { url = "https://files.pythonhosted.org/packages/68/a4/da3f150cf1d51f6c472616fb7650429c7ce053e0c962b41b68557fdf6379/jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d", size = 345574, upload-time = "2025-05-18T19:03:28.63Z" }, + { url = "https://files.pythonhosted.org/packages/81/5a/0e73541b6edd3f4aada586c24e50626c7815c561a7ba337d6a7eb0a915b4/jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5", size = 352174, upload-time = "2025-05-18T19:03:34.965Z" }, + { url = "https://files.pythonhosted.org/packages/41/22/5beb5ee4ad4ef7d86f5ea5b4509f680a20706c4a7659e74344777efb7739/jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605", size = 523741, upload-time = "2025-05-18T19:03:38.168Z" }, + { url = "https://files.pythonhosted.org/packages/ea/10/768e8818538e5817c637b0df52e54366ec4cebc3346108a4457ea7a98f32/jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5", size = 514527, upload-time = "2025-05-18T19:03:39.577Z" }, + { url = "https://files.pythonhosted.org/packages/9c/4a/6a2397096162b21645162825f058d1709a02965606e537e3304b02742e9b/jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744", size = 320124, upload-time = "2025-05-18T19:03:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/2a/85/1ce02cade7516b726dd88f59a4ee46914bf79d1676d1228ef2002ed2f1c9/jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2", size = 345330, upload-time = "2025-05-18T19:03:47.596Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ba/77013b0b8ba904bf3762f11e0129b8928bff7f978a81838dfcc958ad5728/jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a", size = 352038, upload-time = "2025-05-18T19:03:53.703Z" }, + { url = "https://files.pythonhosted.org/packages/c0/72/0d6b7e31fc17a8fdce76164884edef0698ba556b8eb0af9546ae1a06b91d/jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea", size = 523557, upload-time = "2025-05-18T19:03:56.386Z" }, + { url = "https://files.pythonhosted.org/packages/2f/09/bc1661fbbcbeb6244bd2904ff3a06f340aa77a2b94e5a7373fd165960ea3/jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b", size = 514202, upload-time = "2025-05-18T19:03:57.675Z" }, + { url = "https://files.pythonhosted.org/packages/91/e3/0916334936f356d605f54cc164af4060e3e7094364add445a3bc79335d46/jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a", size = 318947, upload-time = "2025-05-18T19:04:03.347Z" }, + { url = "https://files.pythonhosted.org/packages/6a/8e/fd94e8c02d0e94539b7d669a7ebbd2776e51f329bb2c84d4385e8063a2ad/jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6", size = 344618, upload-time = "2025-05-18T19:04:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/42/3e/df2235c54d365434c7f150b986a6e35f41ebdc2f95acea3036d99613025d/jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041", size = 350671, upload-time = "2025-05-18T19:04:10.98Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d3/ef774b6969b9b6178e1d1e7a89a3bd37d241f3d3ec5f8deb37bbd203714a/jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4", size = 522989, upload-time = "2025-05-18T19:04:14.261Z" }, + { url = "https://files.pythonhosted.org/packages/0c/41/9becdb1d8dd5d854142f45a9d71949ed7e87a8e312b0bede2de849388cb9/jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e", size = 513495, upload-time = "2025-05-18T19:04:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/54/46/caa2c1342655f57d8f0f2519774c6d67132205909c65e9aa8255e1d7b4f4/jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca", size = 318225, upload-time = "2025-05-18T19:04:20.583Z" }, + { url = "https://files.pythonhosted.org/packages/43/84/c7d44c75767e18946219ba2d703a5a32ab37b0bc21886a97bc6062e4da42/jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070", size = 350235, upload-time = "2025-05-18T19:04:22.363Z" }, ] [[package]] @@ -2752,14 +2447,14 @@ wheels = [ [[package]] name = "joserfc" -version = "1.7.1" +version = "1.6.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/44/90/25cb27518750218e4f850be63d8bbb2343efaad1c01c3571aaa4b3c33bd7/joserfc-1.7.1.tar.gz", hash = "sha256:77d0b76514879c68c6f433bc5b7357a4ab72008ff1e33d8379fd11d72bd8ca81", size = 233181, upload-time = "2026-06-08T07:21:33.412Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/dc/5f768c2e391e9afabe5d18e3221346deb5fb6338565f1ccc9e7c6d7befdd/joserfc-1.6.5.tar.gz", hash = "sha256:1482a7db78fb4602e44ed89e51b599d052e091288c7c532c5b694e20149dec48", size = 231881, upload-time = "2026-05-06T04:58:13.408Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/00/fa62404c3e347f946faa13aa21085205f9cc06ad17671e37f81a51662ae8/joserfc-1.7.1-py3-none-any.whl", hash = "sha256:b3e3d655612e2e1ef67b2600f2f420e12e537b020208fab1761fad647319c164", size = 70423, upload-time = "2026-06-08T07:21:32.001Z" }, + { url = "https://files.pythonhosted.org/packages/54/3b/ad1cb22e75c963b1f07c8a2329bf47227ce7e4361df5eb2fb101b2ce33ef/joserfc-1.6.5-py3-none-any.whl", hash = "sha256:e9878a0f8243fe7b95e11fdda81374ca9f7a689e302751579d3dfdeec559675e", size = 70464, upload-time = "2026-05-06T04:58:11.668Z" }, ] [[package]] @@ -2809,39 +2504,23 @@ sdist = { url = "https://files.pythonhosted.org/packages/ad/1d/68607c574dd78f030 wheels = [ { url = "https://files.pythonhosted.org/packages/8f/90/8391d14ac97e253d2637dab0eab370903510e0ba3a48510eff33df026742/jsonpath_rust_bindings-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ca169ac219bc141775fb19df8165d4d0162e6ed77102e1ab19a74a80c1f9051", size = 814574, upload-time = "2025-11-16T19:01:53.739Z" }, { url = "https://files.pythonhosted.org/packages/b0/bd/1fb1e4c6635cfcc2936d9bfd8870c47ae2b1351d0bbd3ac241494e42446e/jsonpath_rust_bindings-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13446ad021abe05d622a01eaa648c238ef3b98e9fc0bd837a589bafb246ca3bc", size = 832886, upload-time = "2025-11-16T19:00:15.109Z" }, - { url = "https://files.pythonhosted.org/packages/cc/7d/77479e07955e1808390faa24b1ec6d57c3970bf96584bbe7a3f285a2c43a/jsonpath_rust_bindings-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9583e965fe5f8f21cd0d047244db9716a119e0e82a06f2336e6b14c9a9637af", size = 837021, upload-time = "2025-11-16T19:00:31.979Z" }, - { url = "https://files.pythonhosted.org/packages/1c/fb/e8254b8c0bc112914b05d91c09ddc83f393d421c238ad5f25dcbc92b174d/jsonpath_rust_bindings-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36a40ed04d2db70897cde2ac92f6c9aae2ed1b426aa4c97a47f3e2be911ea4ba", size = 932671, upload-time = "2025-11-16T19:00:48.349Z" }, - { url = "https://files.pythonhosted.org/packages/c9/de/d71c31e2fcdc9a82bb6390ee804aee21a84237cd8284ca2767085957179a/jsonpath_rust_bindings-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50f16c3dd6eb572dda74731508d2fca1abbb927ab4f6511fb65eeba6e59fd041", size = 960293, upload-time = "2025-11-16T19:01:05.211Z" }, { url = "https://files.pythonhosted.org/packages/3c/9e/159ab37a111f4a8ef7a781b50e6b9fe39663bb9e69e720f1827858f45e76/jsonpath_rust_bindings-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d656507b5913f9515ff136797c5850df907c5040fa1368baa428f7e829e33f0", size = 947441, upload-time = "2025-11-16T19:01:36.917Z" }, { url = "https://files.pythonhosted.org/packages/17/c8/ff82ee574f5508793599481f2632a02ceb25da23223b81d0a5d080de2396/jsonpath_rust_bindings-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a43107f6efc4e66ee046c338741429a268fd972e887721b01bf0f32e47387e30", size = 1067748, upload-time = "2025-11-16T19:02:30.136Z" }, - { url = "https://files.pythonhosted.org/packages/89/e5/97a4e4f3ed1bd069feba3f9810c94ae0ea1001a52c243ecf655b667bd14b/jsonpath_rust_bindings-1.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:dc0c3488f04dbd318fa876fb880e8cb7d1e53abcf8b0d9e697e10a0a15ac3158", size = 1149298, upload-time = "2025-11-16T19:02:46.232Z" }, { url = "https://files.pythonhosted.org/packages/a5/8f/613120a36b281619a13394eb8ede093941d939c530c6595d62070fa10f3d/jsonpath_rust_bindings-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbfeb05c7a6854104e97a0e3234f312004b3f4e678d14b68180a6a4f33f4d7c3", size = 1134382, upload-time = "2025-11-16T19:03:19.881Z" }, { url = "https://files.pythonhosted.org/packages/9e/f6/02301a17826e0f5d253146918e52436831f43fdf018031819ab4dc2af8e4/jsonpath_rust_bindings-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:44de7464ad227028c36e8d713653b4bfe5eb7524ac1a4b0a71e8bcb3bd4f4f3a", size = 814583, upload-time = "2025-11-16T19:01:55.251Z" }, { url = "https://files.pythonhosted.org/packages/7b/63/8860fc926e25ef3dfbc61d6366932f3e106a089308e3ad6a36987fac3efe/jsonpath_rust_bindings-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c220c2d27ab6a0791e3af10e2a7c53ccd1dc2dfc8681999fed4458392aa0372", size = 831964, upload-time = "2025-11-16T19:00:17.016Z" }, - { url = "https://files.pythonhosted.org/packages/84/2d/5f16683333b298969c24b6a09b5cb071fe4d603e4e8788e5db6b82231618/jsonpath_rust_bindings-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e423363b47080830bbb4d8257c0f26bda8ee655a18c4f934952bfe4c46e8d510", size = 836196, upload-time = "2025-11-16T19:00:33.647Z" }, - { url = "https://files.pythonhosted.org/packages/da/c9/5c75bad74f27eca1853d9d58fabc4ed838e94997d65177d9f29cc9bb3229/jsonpath_rust_bindings-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:366cba544c080c08530cef0cc19922f0380f0caab6e7e5a0ddfb70de288d5abc", size = 931327, upload-time = "2025-11-16T19:00:50.823Z" }, - { url = "https://files.pythonhosted.org/packages/b7/5f/8e3a65a8053945d0c63ea8e5c11832b051e0919b342f29e1365108165472/jsonpath_rust_bindings-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7bf30e27a81d07c79cc58c86600687e5adfe0f7b1aaf8069a737085bebfaea71", size = 959445, upload-time = "2025-11-16T19:01:06.891Z" }, { url = "https://files.pythonhosted.org/packages/2f/5a/f44c4b55cecc6eb1a4b22dc2aacb9cf9f434b600706527ab619f6076ced0/jsonpath_rust_bindings-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c390c33582cd268d35b86eb0f550229e0cf26f03bb06c470db4712d6fa4dc0f", size = 947132, upload-time = "2025-11-16T19:01:38.408Z" }, { url = "https://files.pythonhosted.org/packages/5f/9d/e35fdaea0a065584d4864af8711a9be501015d4354d3eb9f61de0fedccc6/jsonpath_rust_bindings-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0017af7054fb6bce55863a7065ae465a9c47fd93fb94f002ca98bb8adf15101a", size = 1066860, upload-time = "2025-11-16T19:02:31.654Z" }, - { url = "https://files.pythonhosted.org/packages/8b/25/8ca3c1b67435f3a29d121c86867afdb86e02ec932c7a5343af61554c5788/jsonpath_rust_bindings-1.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9212d3746a57015fc3722488f61c4afc465d993f68371d864be8fa5b0c58d635", size = 1148553, upload-time = "2025-11-16T19:02:47.91Z" }, { url = "https://files.pythonhosted.org/packages/c6/be/708f5c15718e796d3d3fb3d139fe5dfa8aa6b0eff44adadc0bf66822d388/jsonpath_rust_bindings-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d21101114514d34b21ab216eef1d7bb41155311fa61284e8f2dbdb93bde41c78", size = 1133969, upload-time = "2025-11-16T19:03:21.839Z" }, { url = "https://files.pythonhosted.org/packages/7b/4c/2a7995761e247610551cb218b5fcfa9c95a542d8a38915a91579178eba73/jsonpath_rust_bindings-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f55ee1e7fdb6bb2363c40a6d6ce0285e53bd52b4ecae7bef3909eeb11a9b4cd2", size = 815031, upload-time = "2025-11-16T19:01:56.972Z" }, { url = "https://files.pythonhosted.org/packages/f1/fb/f1375e4f254fdf088ebbb397cfb42f3bdd5c7fed3349ad140f09d052ae09/jsonpath_rust_bindings-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:734eee89754c829a0fb55a30467c8a33081976375b763c907f71f7018682c26c", size = 832342, upload-time = "2025-11-16T19:00:18.79Z" }, - { url = "https://files.pythonhosted.org/packages/17/5f/bccd6178fc9655e03b01917531c08a25951b55455189a98faa13f7125d4a/jsonpath_rust_bindings-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6716caa0855dbf9d021509a3caa00a9fa7cc241930f40830c24e85d0e17a6246", size = 836616, upload-time = "2025-11-16T19:00:35.477Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e6/e809c31962c161230ef136646e7a6bc1783ab9299255f043923af1d55a90/jsonpath_rust_bindings-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02373d581a093d0640e60858884d67ec93259e7b6d6bd8e5874400ad99558e00", size = 931852, upload-time = "2025-11-16T19:00:52.271Z" }, - { url = "https://files.pythonhosted.org/packages/e1/51/9d29b9f642012d545233416138c96562aefdab78d3602b61e19267fc4098/jsonpath_rust_bindings-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:146b69ce20cb9869e05a6d369f4a10b52f98e1f8575f1ac5b49e285fa2032380", size = 959626, upload-time = "2025-11-16T19:01:08.348Z" }, { url = "https://files.pythonhosted.org/packages/1c/95/696e02d5af89b95da829b79473cde3e7a1c0d73c571d1dc7c32e886e04e0/jsonpath_rust_bindings-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe44737c6c72079ef30c85f975c19fa0114c13039fe538d8c5b259007a35a0ff", size = 947152, upload-time = "2025-11-16T19:01:41.146Z" }, { url = "https://files.pythonhosted.org/packages/66/5c/b7eb6647de1721b632cccbfe3de777f1030fa0525a89b119ed70ebafc2c6/jsonpath_rust_bindings-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40c23781d28a8b126c8a2b337e4fe275cc8f35a149bda769e3ec2760dfb58b91", size = 1067196, upload-time = "2025-11-16T19:02:33.289Z" }, - { url = "https://files.pythonhosted.org/packages/c5/80/1c56c148c92f43aca6799716f549ff2463ee328c377b9c1e630d4057a607/jsonpath_rust_bindings-1.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4eacb98f80fff7d43956503ca7b42e491f7084c7b9bd8b5b6bad3f50d08480df", size = 1148940, upload-time = "2025-11-16T19:02:49.647Z" }, { url = "https://files.pythonhosted.org/packages/7e/df/b0c2fd033c5f5714a7ea4c03dabe8ab66dbaabab4fa7d9385344ab7a16e7/jsonpath_rust_bindings-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7f2a526c87a245f708dc1d8d4988c471384c369a5909b8b730e63b6a7f0c2d60", size = 1134078, upload-time = "2025-11-16T19:03:23.799Z" }, { url = "https://files.pythonhosted.org/packages/93/75/47695316d55a13d475490ca5aa41e02b8eab8b4eea696cc08536e2f05694/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ddbf025592bf88fc5395d9d023d7bcc8fab977898c406e0a5722925c3b887c71", size = 814128, upload-time = "2025-11-16T19:02:08.847Z" }, { url = "https://files.pythonhosted.org/packages/69/0b/bbe0f2ba599a3aa59bcf44589188641528be507a2b7e45e8c2edfb17f77f/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1c6804706012c3c7a194903ef20befafa3cc913a4ef553696bc837ac738a66", size = 832484, upload-time = "2025-11-16T19:00:27.089Z" }, - { url = "https://files.pythonhosted.org/packages/67/2f/fc61ad93957f01cbb683c78e842348f11832da98274574ff28b886da2cbe/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa7e9d25b00c227c51e7a916a13fbf22cf483df622699dbc3ef051861ec1de85", size = 836786, upload-time = "2025-11-16T19:00:43.535Z" }, - { url = "https://files.pythonhosted.org/packages/11/e9/3859c3c118f02b5413ef6a1ddfd1b9f2ecdaf2d1a2eaa58e656bc8d4a887/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb9a05a2b80195ac47aec0ce98d861c102459d16225fefb0f7e0158196c4a58", size = 932463, upload-time = "2025-11-16T19:01:00.129Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f5/56e48adb9dad2a97172b905e305c2de478ae8748a0467996d9aae72f4667/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ff4cd052f733d5f270329c552a04e08a1520053355d35f0be886714dff46955", size = 959317, upload-time = "2025-11-16T19:01:16.435Z" }, { url = "https://files.pythonhosted.org/packages/6f/77/d4ddd5710121ffa18f270d0af2c906786db0d5fd914ed47ce704beba9a75/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7039a2f497674785a423076e803a1fa547c2f9cf568b25e2ac83ff5890b98f", size = 947180, upload-time = "2025-11-16T19:01:49.08Z" }, { url = "https://files.pythonhosted.org/packages/3c/38/7f3e03ae9655d1f7d97f34e2f8e95d55aa3f0790ba4743f648844048fab4/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a239166bd1418897de327c952a9d9ff912d1fabc9da82e688204ccfcd7b22584", size = 1067329, upload-time = "2025-11-16T19:02:41.053Z" }, - { url = "https://files.pythonhosted.org/packages/ca/a6/2a96e232a6f0164320801c68bd99b407aea22d1a101892ccb4fc8a2d2198/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:330f457556d06abc1ea36b6738eb172288afff6bd251350eaba42bed2f459fd3", size = 1149213, upload-time = "2025-11-16T19:02:57.714Z" }, { url = "https://files.pythonhosted.org/packages/c9/c1/4f7b7f5f78dcf23c7a2a208b3088875ae3596f22db5f0612367d95bdb5f7/jsonpath_rust_bindings-1.1.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26955685acf0208b6061419cab4bd79fe869ebce57f3cec1e9b20f0e0af56b35", size = 1133989, upload-time = "2025-11-16T19:03:32.485Z" }, ] @@ -2865,7 +2544,7 @@ wheels = [ [[package]] name = "jsonschema" -version = "4.26.0" +version = "4.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -2873,9 +2552,9 @@ dependencies = [ { name = "referencing", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rpds-py", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778, upload-time = "2024-07-08T18:40:05.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462, upload-time = "2024-07-08T18:40:00.165Z" }, ] [package.optional-dependencies] @@ -2886,24 +2565,23 @@ format-nongpl = [ { name = "jsonpointer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rfc3339-validator", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rfc3986-validator", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "rfc3987-syntax", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "uri-template", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "webcolors", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] [[package]] name = "jsonschema-path" -version = "0.5.0" +version = "0.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "attrs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pathable", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "referencing", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/79/cd02a4df6d9270efdc7d3feefe6edd730b0820c39eeaa107a2faee8322d5/jsonschema_path-0.5.0.tar.gz", hash = "sha256:493b156ba895c97602655b620a8456caa2ce08c1aa389f5a7addec065e6e855c", size = 19597, upload-time = "2026-05-19T20:45:00.971Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/45/41ebc679c2a4fced6a722f624c18d658dee42612b83ea24c1caf7c0eb3a8/jsonschema_path-0.3.4.tar.gz", hash = "sha256:8365356039f16cc65fddffafda5f58766e34bebab7d6d105616ab52bc4297001", size = 11159, upload-time = "2025-01-24T14:33:16.547Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/2c/9e69d73c4297508be9e3b64a970ea3971b3eb8db64ffc5802d40bd25981f/jsonschema_path-0.5.0-py3-none-any.whl", hash = "sha256:2790a070bc7abb08ea3dbe4d340ece4efadf639223001f020c7503229ba068e2", size = 24077, upload-time = "2026-05-19T20:44:59.225Z" }, + { url = "https://files.pythonhosted.org/packages/cb/58/3485da8cb93d2f393bce453adeef16896751f14ba3e2024bc21dc9597646/jsonschema_path-0.3.4-py3-none-any.whl", hash = "sha256:f502191fdc2b22050f9a81c9237be9d27145b9001c55842bece5e94e382e52f8", size = 14810, upload-time = "2025-01-24T14:33:14.652Z" }, ] [[package]] @@ -2920,7 +2598,7 @@ wheels = [ [[package]] name = "jupyter-client" -version = "8.9.1" +version = "8.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -2928,11 +2606,10 @@ dependencies = [ { name = "pyzmq", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tornado", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "traitlets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/dc/5512503b088997c2250b8bf18258fba9d9ce5ead641183700960d3c9d342/jupyter_client-8.9.1.tar.gz", hash = "sha256:a58f730dd9e728ba16ba1d62ebccf7ffe1ebbdbce4e95cfae941b7321ae1f4fa", size = 359256, upload-time = "2026-06-09T13:15:01.033Z" } +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/6f/56d39bf385c5c27988aebaf0c18a2a17e960575740100973511018bd904e/jupyter_client-8.9.1-py3-none-any.whl", hash = "sha256:0b7a295bc46e8751e9adae84781f726c851c1d911bd793edc4a3bde942e3da81", size = 109828, upload-time = "2026-06-09T13:14:58.835Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, ] [[package]] @@ -2950,7 +2627,7 @@ wheels = [ [[package]] name = "jupyter-events" -version = "0.12.1" +version = "0.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonschema", extra = ["format-nongpl"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -2962,26 +2639,26 @@ dependencies = [ { name = "rfc3986-validator", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "traitlets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/f8/475c4241b2b75af0deaae453ed003c6c851766dbc44d332d8baf245dc931/jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3", size = 62854, upload-time = "2026-04-20T23:17:50.66Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload-time = "2025-02-03T17:23:41.485Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf", size = 19512, upload-time = "2026-04-20T23:17:48.927Z" }, + { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload-time = "2025-02-03T17:23:38.643Z" }, ] [[package]] name = "jupyter-lsp" -version = "2.3.1" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-server", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/ff/1e4a61f5170a9a1d978f3ac3872449de6c01fc71eaf89657824c878b1549/jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6", size = 55677, upload-time = "2026-04-02T08:10:06.749Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/5a/9066c9f8e94ee517133cd98dba393459a16cd48bba71a82f16a65415206c/jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245", size = 54823, upload-time = "2025-08-27T17:47:34.671Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81", size = 77513, upload-time = "2026-04-02T08:10:01.753Z" }, + { url = "https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f", size = 76687, upload-time = "2025-08-27T17:47:33.15Z" }, ] [[package]] name = "jupyter-server" -version = "2.19.0" +version = "2.18.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3003,9 +2680,9 @@ dependencies = [ { name = "traitlets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "websocket-client", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/a0/eb3c511f54df7b54ca5fc7bff3f4d2277d69052d6a7f521643dfed5279d6/jupyter_server-2.19.0.tar.gz", hash = "sha256:1731236bc32b680223e1ceb9d68209a845203475012ef68773a81434b46a31a7", size = 754561, upload-time = "2026-05-29T11:21:26.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/15/1eacb0fcb79ef86e8a0a79a708e6ad7435f6f223097dd29a4ce861fabc44/jupyter_server-2.18.2.tar.gz", hash = "sha256:06b4f40d8a7a00bb39d5216859c81374a0e7cfefe6d8a5a7facc5a5c37c679a7", size = 753177, upload-time = "2026-05-06T07:04:36.274Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/78/d2881e68894cecdcd05912a9c585cfb776ef1fb38b62c8dba98f12ab3adc/jupyter_server-2.19.0-py3-none-any.whl", hash = "sha256:cb76591b76d7093584c2ad2ae72ac3d58614a4b597507a1bb04e1f9f683cf9ea", size = 392244, upload-time = "2026-05-29T11:21:23.871Z" }, + { url = "https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl", hash = "sha256:fa5e46539ded65791838035a2b6001f13e54d5f64b8b3752eb1e91fdd641a5b8", size = 391907, upload-time = "2026-05-06T07:04:34.014Z" }, ] [[package]] @@ -3022,7 +2699,7 @@ wheels = [ [[package]] name = "jupyterlab" -version = "4.5.8" +version = "4.5.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-lru", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3039,9 +2716,9 @@ dependencies = [ { name = "tornado", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "traitlets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0e/74/089613e6099e851a6130816f2df592c839d8565f8746a701edada05a33e4/jupyterlab-4.5.8.tar.gz", hash = "sha256:af54d7242cc689a1e6c3ad213cc9b6d9781787d9ec67c52ec9a8f4707088cadd", size = 23994076, upload-time = "2026-06-04T12:32:12.906Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/22/8440ec827762146e7cdecf04335bd348795899d29dc6ae82238707353a2c/jupyterlab-4.5.7.tar.gz", hash = "sha256:55a9822c4754da305f41e113452c68383e214dcf96de760146af89ce5d5117b0", size = 23992763, upload-time = "2026-04-29T16:43:51.328Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/d1/56a400100559cbf154a23cd29989261941ae5c9f743898fc10e8a5508b7c/jupyterlab-4.5.8-py3-none-any.whl", hash = "sha256:7d514c856d0d607601ec7692374da4f26e2aaf3b6e7cd363136b422a50588d6c", size = 12449443, upload-time = "2026-06-04T12:32:08.442Z" }, + { url = "https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl", hash = "sha256:fba4cb0e2c44a52859669d8c98b45de029d5e515f8407bf8534d2a8fc5f0964d", size = 12450123, upload-time = "2026-04-29T16:43:46.639Z" }, ] [[package]] @@ -3090,10 +2767,9 @@ wheels = [ [[package]] name = "kubernetes" -version = "36.0.2" +version = "35.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "certifi", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "durationpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "python-dateutil", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3104,23 +2780,23 @@ dependencies = [ { name = "urllib3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "websocket-client", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/57/8b538af5076bc3372949d76f70ba3449bdfe52f9e6488170fa5d4f7cbe70/kubernetes-36.0.2.tar.gz", hash = "sha256:03551fcb49cae1f708f63624041e37403545b7aaed10cbf54e2b01a37a5438e3", size = 2336738, upload-time = "2026-06-01T18:20:30.785Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/8f/85bf51ad4150f64e8c665daf0d9dfe9787ae92005efb9a4d1cba592bd79d/kubernetes-35.0.0.tar.gz", hash = "sha256:3d00d344944239821458b9efd484d6df9f011da367ecb155dadf9513f05f09ee", size = 1094642, upload-time = "2026-01-16T01:05:27.76Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/2c/5c160dbdef7123f8cc97fd8ece7e0198627a426a2a49614845e9086feb8d/kubernetes-36.0.2-py2.py3-none-any.whl", hash = "sha256:faf9b5241b58de0c4a5069f2a0ffc8ac06fece7215156cd3d3ba081a78a858b6", size = 4617568, upload-time = "2026-06-01T18:20:28.737Z" }, + { url = "https://files.pythonhosted.org/packages/0c/70/05b685ea2dffcb2adbf3cdcea5d8865b7bc66f67249084cf845012a0ff13/kubernetes-35.0.0-py2.py3-none-any.whl", hash = "sha256:39e2b33b46e5834ef6c3985ebfe2047ab39135d41de51ce7641a7ca5b372a13d", size = 2017602, upload-time = "2026-01-16T01:05:25.991Z" }, ] [[package]] name = "langchain" -version = "1.3.4" +version = "1.2.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langgraph", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/3f/034eb6cbef90bfccc89b7f8ed0c1d853dc9cb0bea17c7a269534c647ba3a/langchain-1.3.4.tar.gz", hash = "sha256:d6e0654c22848925534f5c0a706f9be481bb09a619ec60a738fbd1e5502e457a", size = 606617, upload-time = "2026-06-02T20:04:49.411Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2b/0ca77ee988a9f1c1f1d923115d7c91221ab434067bc36f2f637201aeee81/langchain-1.2.14.tar.gz", hash = "sha256:fc5511e8f8af7efee9e5a144da4392d700d627b301d240470db97272940ad317", size = 574190, upload-time = "2026-03-31T13:50:37.398Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/29/9ffe99c7dc4891a0215ec59c423bea320f943c08a231bc5bae392a438a83/langchain-1.3.4-py3-none-any.whl", hash = "sha256:e51b05ab23d056bc6bf2d97d8c694fb92d6d5765126fef74565d007c27581672", size = 125286, upload-time = "2026-06-02T20:04:48.13Z" }, + { url = "https://files.pythonhosted.org/packages/4c/87/324ae5fd9993f024339a452fc89e3fd808bccde87ef95c8dafab3de023c0/langchain-1.2.14-py3-none-any.whl", hash = "sha256:96da6d7338d5a6fc41eb4ec0db83f7ef5d03bb5efd17bb269f34ba4378ebdb4d", size = 112715, upload-time = "2026-03-31T13:50:35.997Z" }, ] [[package]] @@ -3158,7 +2834,7 @@ wheels = [ [[package]] name = "langchain-community" -version = "0.3.31" +version = "0.3.27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3174,14 +2850,14 @@ dependencies = [ { name = "sqlalchemy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tenacity", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/49/2ff5354273809e9811392bc24bcffda545a196070666aef27bc6aacf1c21/langchain_community-0.3.31.tar.gz", hash = "sha256:250e4c1041539130f6d6ac6f9386cb018354eafccd917b01a4cff1950b80fd81", size = 33241237, upload-time = "2025-10-07T20:17:57.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/76/200494f6de488217a196c4369e665d26b94c8c3642d46e2fd62f9daf0a3a/langchain_community-0.3.27.tar.gz", hash = "sha256:e1037c3b9da0c6d10bf06e838b034eb741e016515c79ef8f3f16e53ead33d882", size = 33237737, upload-time = "2025-07-02T18:47:02.329Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/0a/b8848db67ad7c8d4652cb6f4cb78d49b5b5e6e8e51d695d62025aa3f7dbc/langchain_community-0.3.31-py3-none-any.whl", hash = "sha256:1c727e3ebbacd4d891b07bd440647668001cea3e39cbe732499ad655ec5cb569", size = 2532920, upload-time = "2025-10-07T20:17:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/c8/bc/f8c7dae8321d37ed39ac9d7896617c4203248240a4835b136e3724b3bb62/langchain_community-0.3.27-py3-none-any.whl", hash = "sha256:581f97b795f9633da738ea95da9cb78f8879b538090c9b7a68c0aed49c828f0d", size = 2530442, upload-time = "2025-07-02T18:47:00.246Z" }, ] [[package]] name = "langchain-core" -version = "1.4.2" +version = "1.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3194,9 +2870,9 @@ dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "uuid-utils", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/13/446580dc9f26e4e524d57f727a9007b4c2484decd2c00269b7fd4f51326d/langchain_core-1.4.2.tar.gz", hash = "sha256:242abe763db71de05fe0d7ecff03f9cc6022fbceba8be15902fb89e35b7292f9", size = 935103, upload-time = "2026-06-08T18:19:41.611Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/ae/8b74458fc3850ec3d150eb9f45e857db129dafa801fb5cf173dfc9f8bbf3/langchain_core-1.3.3.tar.gz", hash = "sha256:fa510a5db8efdc0c6ff41c0939fb5c00a0183c11f6b84233e892e3227ff69182", size = 915041, upload-time = "2026-05-05T19:02:36.612Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/2c/92a6a6f5af07f1c347021d81aea307d405ed9d34a4f8ea6b78cfa3c3b189/langchain_core-1.4.2-py3-none-any.whl", hash = "sha256:a2906d339514e02a46d6c0888021dd2651ed5acc661a1f546fe33e1453adfcb9", size = 550103, upload-time = "2026-06-08T18:19:40.197Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/4771b7ab2af1d1aba5b710bd8f13d9225c609425214b357590a17b01be77/langchain_core-1.3.3-py3-none-any.whl", hash = "sha256:18aae8506f37da7f74398492279a7d6efcee4f8e23c4c41c7af080eeb7ef7bd1", size = 543857, upload-time = "2026-05-05T19:02:34.52Z" }, ] [[package]] @@ -3228,7 +2904,7 @@ wheels = [ [[package]] name = "langchain-litellm" -version = "0.6.6" +version = "0.6.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3236,9 +2912,9 @@ dependencies = [ { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "litellm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/70/e1f42ceccd5fdad78ed7fd1a150c12661b63b92647d768168cd9efcdcf15/langchain_litellm-0.6.6.tar.gz", hash = "sha256:fb4399ae4c239b5bb85c19574a5bb4c17988433d48ec716e62144f0dad4a63af", size = 346225, upload-time = "2026-05-21T11:27:56.869Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/42/0b9eea0b57dd225850f9965c1d77d84ad7be1f5101c9040143e8751cfbd6/langchain_litellm-0.6.5.tar.gz", hash = "sha256:30741fda59803336d0d39788be441f6ccd2b4e41d7747ff0d2b002950a07453b", size = 339627, upload-time = "2026-05-08T12:48:43.116Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/d0/adda5508115c28d78b408cc8f6b1e3fa3b2cc83a551b62cd613bb705535c/langchain_litellm-0.6.6-py3-none-any.whl", hash = "sha256:d49d0353254e10e38c351d7eae3d7b34128a0d31a3a22928ac289a8987c21a30", size = 26393, upload-time = "2026-05-21T11:27:55.709Z" }, + { url = "https://files.pythonhosted.org/packages/5e/48/99e81a0d33334f3bc7c310d15c19a2a972d0cf8d708c8369258a5db2d74e/langchain_litellm-0.6.5-py3-none-any.whl", hash = "sha256:dce2ebfddddd0dfd6b1ed473399ccc095dd2f5cb6adfe1336d7bbe489ef32b4b", size = 26359, upload-time = "2026-05-08T12:48:42.154Z" }, ] [[package]] @@ -3256,7 +2932,7 @@ wheels = [ [[package]] name = "langchain-nvidia-ai-endpoints" -version = "1.4.1" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3264,14 +2940,14 @@ dependencies = [ { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/26/cae8babfecb9b7b503dbf5d6c0d98df74149c3151247d20e7bbfd17ca461/langchain_nvidia_ai_endpoints-1.4.1.tar.gz", hash = "sha256:8835f7e56d559b370b87164f937c1eb048ab837f25de91598f00555a705c2d16", size = 58092, upload-time = "2026-06-03T19:34:15.117Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/2f/29036df9a99212f27369a123d2b44b5eec0ffb1b15b1277bf71cc0a37606/langchain_nvidia_ai_endpoints-1.3.0.tar.gz", hash = "sha256:5223aa7988ee5044f38715ae757faa0af4ba64f2ed0c82851a99c052592eaa09", size = 58015, upload-time = "2026-05-07T23:06:33.579Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/50/9dcb23c73270e775c38e8d264ccbf8b1b352dbac089bce3746756d895e46/langchain_nvidia_ai_endpoints-1.4.1-py3-none-any.whl", hash = "sha256:3edd1678a3e2c55789128e53ba32aab3dffe94cb201c70e6cea521fab7c261ff", size = 63203, upload-time = "2026-06-03T19:34:11.08Z" }, + { url = "https://files.pythonhosted.org/packages/1f/34/dd21237e0534938061207ee733ef6da6c2dc62c9712932b379714817abc9/langchain_nvidia_ai_endpoints-1.3.0-py3-none-any.whl", hash = "sha256:cc2b356e96e86ffb92dcfe83980aa73227e1fad8f3a4cbdd76cdcf980c42e7cc", size = 63126, upload-time = "2026-05-07T23:06:32.585Z" }, ] [[package]] name = "langchain-oci" -version = "0.2.7" +version = "0.2.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3279,41 +2955,40 @@ dependencies = [ { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langchain-openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langgraph", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "oci", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "oci-openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/45/8b/71ae3c8aba70770b088c0699cda2378cb05b37a1da919e251f89b443a585/langchain_oci-0.2.7.tar.gz", hash = "sha256:1fb7ef305008ebbb1fb53e32af4823daa754d256947b3462b2f85e147638dc55", size = 100132, upload-time = "2026-06-02T23:42:08.735Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/c7/a43f7b3b5a5b542bc17972bc9a95ee40fd7029aab98c9504ff2bf456b6ef/langchain_oci-0.2.6.tar.gz", hash = "sha256:92538d3ee45e3323290fcc672e3f6618b13878b464abd8692ade9b7441b5863b", size = 85514, upload-time = "2026-05-13T21:22:42.244Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/7c/5397d1b748fa27ac50339fd224de4c8a479a86f8f419bf56fd25bf38db76/langchain_oci-0.2.7-py3-none-any.whl", hash = "sha256:cf793058d3b76334b57e1c80203bb2ba42941a41ce236b5825d5dbc4fe188151", size = 126442, upload-time = "2026-06-02T23:42:07.484Z" }, + { url = "https://files.pythonhosted.org/packages/95/22/92cc0ac1194ea285668b02ef2bcc39d04a846dc6e2e943b2a1f1e968d777/langchain_oci-0.2.6-py3-none-any.whl", hash = "sha256:3451385da788926d5cffd19de8afb912e15bdb28fb76f3844d3d88a5683142b0", size = 107591, upload-time = "2026-05-13T21:22:41.056Z" }, ] [[package]] name = "langchain-openai" -version = "1.2.2" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tiktoken", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/1b/c506c7f41156d3a6b4582b4c487f480001b8741deecc6e2d4931fdf4cf2c/langchain_openai-1.2.2.tar.gz", hash = "sha256:8698ffcee9a086e91ab6d207f0026181a03effcbf86bf9aee1808ee35af69dcc", size = 1147539, upload-time = "2026-05-21T22:08:31.123Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/0e/d8e16c28aa67106d285e63b8ffc04c5af68341e345ce24a0751dbf2e167e/langchain_openai-1.2.1.tar.gz", hash = "sha256:ee4480b787706361b7125fad46930589a624df87aa158c6986ef1fad10d10675", size = 1146092, upload-time = "2026-04-24T19:46:43.328Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/8e/7406c99afacafc8c2ce0fa4152f9f8b9598c93ceb291959821abd053b982/langchain_openai-1.2.2-py3-none-any.whl", hash = "sha256:7da39a3c70cbafa93853456199e39a264dc70651be79b12ac49b4f6a448bce2d", size = 99631, upload-time = "2026-05-21T22:08:29.527Z" }, + { url = "https://files.pythonhosted.org/packages/dc/55/2865b18ee3a3dd11160b8c4b2cf37e75bf2a4a8d1d38868ffffc7b7cc180/langchain_openai-1.2.1-py3-none-any.whl", hash = "sha256:a80732185030d4f453dda6c25feef46f645f665423fdffe38ae3edf1ac3c6c4d", size = 98626, upload-time = "2026-04-24T19:46:41.971Z" }, ] [[package]] name = "langchain-protocol" -version = "0.0.16" +version = "0.0.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/e7/8300ba22d968653051fd06e3117d783872dddf3dcebdd6b1d386836eb43c/langchain_protocol-0.0.16.tar.gz", hash = "sha256:806c7cdd951b1c4f692fa40fce60821ff0f221d4360e27673ddf2c2b99c2b7ff", size = 5969, upload-time = "2026-05-28T23:05:11.121Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/24/9777489d6fbbee64af0c8f96d4f840239c408cf694f3394672807dafc490/langchain_protocol-0.0.15.tar.gz", hash = "sha256:9ab2d11ee73944754f10e037e717098d3a6796f0e58afa9cadda6154e7655ade", size = 5862, upload-time = "2026-05-01T22:30:04.748Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/9c/06dfcc88d02a6364e8d864c421ddd3736305cb0a6c853f75c302c80fe17c/langchain_protocol-0.0.16-py3-none-any.whl", hash = "sha256:3658c142c5d0fb3a023a4be442ce4c15c6d626aab6135eb79a76dc64ad19c3c3", size = 7037, upload-time = "2026-05-28T23:05:10.163Z" }, + { url = "https://files.pythonhosted.org/packages/1d/7a/9c97a7b9cbe4c5dc6a44cdb1545450c28f0c8ce89b9c1f0ee7fbad896263/langchain_protocol-0.0.15-py3-none-any.whl", hash = "sha256:461eb794358f83d5e42635a5797799ffec7b4702314e34edf73ac21e75d3ef79", size = 6982, upload-time = "2026-05-01T22:30:03.877Z" }, ] [[package]] @@ -3345,7 +3020,7 @@ wheels = [ [[package]] name = "langgraph" -version = "1.2.4" +version = "1.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3355,51 +3030,48 @@ dependencies = [ { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "xxhash", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/43/dac5a2621c1e57f8eb7f0703f6f6fe34a5caf62f8f0fb4d2bb395bb454ea/langgraph-1.2.4.tar.gz", hash = "sha256:5df076973a2d23efb13eceb279d1e5b46feebcbbeded0a86a2ef669abd9e4399", size = 720374, upload-time = "2026-06-02T17:07:37.347Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/ba/8a8f48ca1248ecff4844cb27247d10a85f05b4ac6b903298d36b2ca090fd/langgraph-1.1.4.tar.gz", hash = "sha256:c951a859f68a021c69a27500db4eafc1900fc7ac32a54f7fc31d277165d04bed", size = 545440, upload-time = "2026-03-31T12:56:45.344Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/9e/31ca236104966d7bb14ea9e93cfd73350aea8c41008ddf057b65794ed10d/langgraph-1.2.4-py3-none-any.whl", hash = "sha256:ffe3e1e31dce28907640f82525858470f293506d2b272d07ea3b3ce97974b067", size = 245402, upload-time = "2026-06-02T17:07:35.977Z" }, + { url = "https://files.pythonhosted.org/packages/d0/74/22ea4734247b59e7c98e575e31a1f463366b084e0dc83cf63715b079ff28/langgraph-1.1.4-py3-none-any.whl", hash = "sha256:77ebe7ed44a2699f13696bf41f1dabe7b5fa8e6ad51e3597f2f175492e8f3656", size = 168190, upload-time = "2026-03-31T12:56:44.221Z" }, ] [[package]] name = "langgraph-checkpoint" -version = "4.1.1" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "ormsgpack", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/47/886af6f886f0bff2273164a45f008694e48a96ff3cd25ff0228f2aa9480e/langgraph_checkpoint-4.1.1.tar.gz", hash = "sha256:6c2bdb530c91f91d7d9c1bd100925d0fc4f498d418c17f3587d1526279482a25", size = 184020, upload-time = "2026-05-22T16:57:38.503Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/44/a8df45d1e8b4637e29789fa8bae1db022c953cc7ac80093cfc52e923547e/langgraph_checkpoint-4.0.1.tar.gz", hash = "sha256:b433123735df11ade28829e40ce25b9be614930cd50245ff2af60629234befd9", size = 158135, upload-time = "2026-02-27T21:06:16.092Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/b4/71425e3e38be92611300b9cc5e46a5bf98ab23f5ea8a75b73d02a2f1413c/langgraph_checkpoint-4.1.1-py3-none-any.whl", hash = "sha256:25d29144b082827218e7bc3f1e9b0566a4bb007895cd6cc26f66a8428739f56e", size = 56212, upload-time = "2026-05-22T16:57:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/65/4c/09a4a0c42f5d2fc38d6c4d67884788eff7fd2cfdf367fdf7033de908b4c0/langgraph_checkpoint-4.0.1-py3-none-any.whl", hash = "sha256:e3adcd7a0e0166f3b48b8cf508ce0ea366e7420b5a73aa81289888727769b034", size = 50453, upload-time = "2026-02-27T21:06:14.293Z" }, ] [[package]] name = "langgraph-prebuilt" -version = "1.1.0" +version = "1.0.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langgraph-checkpoint", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/29/66/ed9b93f56bc17ef22d551892f0ac2b225a97fe0fcf23a511b857f70d590b/langgraph_prebuilt-1.1.0.tar.gz", hash = "sha256:3c579cf6eed2d17f9c157c2d0fcaddcd8688524e7022d3b22b37a3bf4589d528", size = 178833, upload-time = "2026-05-12T03:37:49.332Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/06/dd61a5c2dce009d1b03b1d56f2a85b3127659fdddf5b3be5d8f1d60820fb/langgraph_prebuilt-1.0.8.tar.gz", hash = "sha256:0cd3cf5473ced8a6cd687cc5294e08d3de57529d8dd14fdc6ae4899549efcf69", size = 164442, upload-time = "2026-02-19T18:14:39.083Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/43/3fe1a700b8490ed02679cdbbc8c915eb23a092faf496c9c1118abcd10be3/langgraph_prebuilt-1.1.0-py3-none-any.whl", hash = "sha256:51e311747d755b751d5c6b39b0c1446124d3a7643d2515017e6714b323508fc9", size = 41043, upload-time = "2026-05-12T03:37:48.007Z" }, + { url = "https://files.pythonhosted.org/packages/dc/41/ec966424ad3f2ed3996d24079d3342c8cd6c0bd0653c12b2a917a685ec6c/langgraph_prebuilt-1.0.8-py3-none-any.whl", hash = "sha256:d16a731e591ba4470f3e313a319c7eee7dbc40895bcf15c821f985a3522a7ce0", size = 35648, upload-time = "2026-02-19T18:14:37.611Z" }, ] [[package]] name = "langgraph-sdk" -version = "0.4.2" +version = "0.3.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "langchain-core", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "langchain-protocol", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "orjson", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "websockets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/2b/bd8ac26d4e97f6df88ef05ce5b6a38945a3903e1025d926f4752aa88aa97/langgraph_sdk-0.4.2.tar.gz", hash = "sha256:b88f0f5f6328ac0680d6790614a905b2bcfa257f2276dba4e38f0e86db0aa738", size = 348327, upload-time = "2026-06-01T17:51:19.856Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/a1/012f0e0f5c9fd26f92bdc9d244756ad673c428230156ef668e6ec7c18cee/langgraph_sdk-0.3.12.tar.gz", hash = "sha256:c9c9ec22b3c0fcd352e2b8f32a815164f69446b8648ca22606329f4ff4c59a71", size = 194932, upload-time = "2026-03-18T22:15:54.592Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/05/aac507337cceae773c2cc9ab91eb6301963af7aeeb55b4217a00e15aff17/langgraph_sdk-0.4.2-py3-none-any.whl", hash = "sha256:75fa5096c1177ce39c847096a8fe3745ffd480ddb412995f836e9f5f884c43dd", size = 160521, upload-time = "2026-06-01T17:51:18.849Z" }, + { url = "https://files.pythonhosted.org/packages/17/4d/4f796e86b03878ab20d9b30aaed1ad459eda71a5c5b67f7cfe712f3548f2/langgraph_sdk-0.3.12-py3-none-any.whl", hash = "sha256:44323804965d6ec2a07127b3cf08a0428ea6deaeb172c2d478d5cd25540e3327", size = 95834, upload-time = "2026-03-18T22:15:53.545Z" }, ] [[package]] @@ -3465,7 +3137,7 @@ wheels = [ [[package]] name = "litellm" -version = "1.88.1" +version = "1.83.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3481,9 +3153,18 @@ dependencies = [ { name = "tiktoken", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tokenizers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/ea/f99ececb7f22703fe120f1d8be9ffb749ec9453fbbbbbebc0d6a6b4d7864/litellm-1.88.1.tar.gz", hash = "sha256:89c6b74cc7912d6365793006ff951c0450fe847625008dfe49de8a7dc4529aa5", size = 13885969, upload-time = "2026-06-09T01:06:25.192Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/7c/c095649380adc96c8630273c1768c2ad1e74aa2ee1dd8dd05d218a60569f/litellm-1.83.14.tar.gz", hash = "sha256:24aef9b47cdc424c833e32f3727f411741c690832cd1fe4405e0077144fe09c9", size = 14836599, upload-time = "2026-04-26T03:16:10.176Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/5c/1b5691575420135e90578543b2bf219497caa33cfd0af64cb38f30288450/litellm-1.83.14-py3-none-any.whl", hash = "sha256:92b11ba2a32cf80707ddf388d18526696c7999a21b418c5e3b6eda1243d2cfdb", size = 16457054, upload-time = "2026-04-26T03:16:05.72Z" }, +] + +[[package]] +name = "llguidance" +version = "1.7.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/91/6bc8bb503dc259e46d253b5424385a54fe06c38a4c7a12befe69a3c2455a/llguidance-1.7.6.tar.gz", hash = "sha256:db7febbe412ed2015501904646750071d7e00e6df7f85c4b956ad4f206fd2df7", size = 1156574, upload-time = "2026-06-03T20:13:25.316Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/9a/8f8909201b4bebaf96498c09226f6baa8540086a4c4188ad57d7dfbd97c1/litellm-1.88.1-py3-none-any.whl", hash = "sha256:369b84e57d9426582ddc35e731956ddb6618cda97cc44e4e4d2dfa75982a6e3a", size = 15276206, upload-time = "2026-06-09T01:06:16.72Z" }, + { url = "https://files.pythonhosted.org/packages/46/fe/bb185f11bad82f2637e3cd8cbf6b200cbb6ed56ac395de47ea05a60d4649/llguidance-1.7.6-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:9c54c899db8cb4b4fba128a7d844730066576c70d806c95ada92b2bd2d6ab498", size = 3138127, upload-time = "2026-06-03T20:13:11.649Z" }, ] [[package]] @@ -3497,51 +3178,35 @@ wheels = [ [[package]] name = "lxml" -version = "6.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/b0/83f481780d1548750b8ce2ec824073deef2f452d9cd1a6faff8507e3d16d/lxml-6.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2", size = 8526461, upload-time = "2026-05-18T19:17:25.862Z" }, - { url = "https://files.pythonhosted.org/packages/4f/d2/edb71cf0e561581a7c5eb2626244320eb04e9f8ce6d563184fd668b45073/lxml-6.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510", size = 4923654, upload-time = "2026-05-18T19:17:42.917Z" }, - { url = "https://files.pythonhosted.org/packages/4c/77/1bc7eeb0de4577d783fb625aa092cc9357883bba35845a3666bf1259f3dc/lxml-6.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a", size = 5067921, upload-time = "2026-05-18T19:17:49.175Z" }, - { url = "https://files.pythonhosted.org/packages/1b/3c/c0690d74bd2bc17bc03b5b0d093569ead597dd0bfa088bf99eef8c24e19c/lxml-6.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d", size = 5002456, upload-time = "2026-05-18T19:17:59.715Z" }, - { url = "https://files.pythonhosted.org/packages/66/8d/d1b3271af0c0f1e27e8472a849e4d2c65bc7766884b9ad2da9e76e145c88/lxml-6.1.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8", size = 5202776, upload-time = "2026-05-18T19:18:08.924Z" }, - { url = "https://files.pythonhosted.org/packages/5d/c0/ef73af53767e958fd87d437c170f272e2f6e6c0f854939f133a895f1e711/lxml-6.1.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6", size = 4659237, upload-time = "2026-05-18T19:18:18.657Z" }, - { url = "https://files.pythonhosted.org/packages/a0/5e/e1158e40397585e91cb0472374a1f63d0926a1ddeaa92f13d1a1ffe306d5/lxml-6.1.1-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8", size = 5265904, upload-time = "2026-05-18T19:18:24.883Z" }, - { url = "https://files.pythonhosted.org/packages/a0/16/8687e5d1400ed1c0bc41dace232ebb7553952b618ea1f2e5fb6e2cfbbe23/lxml-6.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83", size = 5045225, upload-time = "2026-05-18T19:17:20.073Z" }, - { url = "https://files.pythonhosted.org/packages/ca/18/d877bd1ae2e5ffdfd4836565aba350db31feb2f2656d6ce70316ed66a05e/lxml-6.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6", size = 4712721, upload-time = "2026-05-18T19:17:40.512Z" }, - { url = "https://files.pythonhosted.org/packages/44/4d/1f44fd1d770b10dacbf6b5c6e520f4d6e0708744930f719dc04e67cab981/lxml-6.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c", size = 5252549, upload-time = "2026-05-18T19:17:51.236Z" }, - { url = "https://files.pythonhosted.org/packages/64/5d/1d66b84f850089254c230ef6ea6b267a5a54e2e179a5d960036a05d501d7/lxml-6.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08", size = 5226877, upload-time = "2026-05-18T19:18:00.875Z" }, - { url = "https://files.pythonhosted.org/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821, upload-time = "2026-05-18T19:17:42.068Z" }, - { url = "https://files.pythonhosted.org/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" }, - { url = "https://files.pythonhosted.org/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" }, - { url = "https://files.pythonhosted.org/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" }, - { url = "https://files.pythonhosted.org/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" }, - { url = "https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" }, - { url = "https://files.pythonhosted.org/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" }, - { url = "https://files.pythonhosted.org/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" }, - { url = "https://files.pythonhosted.org/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" }, - { url = "https://files.pythonhosted.org/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" }, - { url = "https://files.pythonhosted.org/packages/a5/eb/7e6f37c5584ccbb2ff267f56fd0339016938c1c8684cfefab9b33ffc2f36/lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736", size = 8559780, upload-time = "2026-05-18T19:17:57.661Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139, upload-time = "2026-05-18T19:19:04.873Z" }, - { url = "https://files.pythonhosted.org/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329, upload-time = "2026-05-18T19:19:09.728Z" }, - { url = "https://files.pythonhosted.org/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564, upload-time = "2026-05-18T19:19:13.608Z" }, - { url = "https://files.pythonhosted.org/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467, upload-time = "2026-05-18T19:19:16.228Z" }, - { url = "https://files.pythonhosted.org/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304, upload-time = "2026-05-18T19:19:19.354Z" }, - { url = "https://files.pythonhosted.org/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168, upload-time = "2026-05-18T19:19:25.133Z" }, - { url = "https://files.pythonhosted.org/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487, upload-time = "2026-05-18T19:19:28.603Z" }, - { url = "https://files.pythonhosted.org/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231, upload-time = "2026-05-18T19:18:42.246Z" }, - { url = "https://files.pythonhosted.org/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450, upload-time = "2026-05-18T19:18:48.013Z" }, - { url = "https://files.pythonhosted.org/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874, upload-time = "2026-05-18T19:18:51.914Z" }, - { url = "https://files.pythonhosted.org/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987, upload-time = "2026-05-18T19:18:59.715Z" }, - { url = "https://files.pythonhosted.org/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276, upload-time = "2026-05-18T19:19:03.834Z" }, - { url = "https://files.pythonhosted.org/packages/40/44/d832e82af08723761556d004b1d04d281c09f9a8cecd7d3148548c9941a3/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004", size = 4210769, upload-time = "2026-05-18T19:20:41.427Z" }, - { url = "https://files.pythonhosted.org/packages/6d/39/0dc5949f759ed7d951e0bb8c2f2d9d7aca1908d22352fa84a8afd2ea54af/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e", size = 4318163, upload-time = "2026-05-18T19:20:44.702Z" }, - { url = "https://files.pythonhosted.org/packages/e6/fb/8ab3845fe046ba4cbf74536bcf6801a774b7caf4350de1c5d37f1f0a9e90/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2", size = 4250945, upload-time = "2026-05-18T19:20:47.385Z" }, - { url = "https://files.pythonhosted.org/packages/68/1b/7553ab136894374ffae8851ec06f98f511cd8e66246e41b6be059d0a7289/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf", size = 4401664, upload-time = "2026-05-18T19:20:50.489Z" }, +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/28/30/9abc9e34c657c33834eaf6cd02124c61bdf5944d802aa48e69be8da3585d/lxml-6.1.0.tar.gz", hash = "sha256:bfd57d8008c4965709a919c3e9a98f76c2c7cb319086b3d26858250620023b13", size = 4197006, upload-time = "2026-04-18T04:32:51.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/5d/3bccad330292946f97962df9d5f2d3ae129cce6e212732a781e856b91e07/lxml-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cec05be8c876f92a5aa07b01d60bbb4d11cfbdd654cad0561c0d7b5c043a61b9", size = 8526232, upload-time = "2026-04-18T04:27:40.389Z" }, + { url = "https://files.pythonhosted.org/packages/54/84/5a9ec07cbe1d2334a6465f863b949a520d2699a755738986dcd3b6b89e3f/lxml-6.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:942454ff253da14218f972b23dc72fa4edf6c943f37edd19cd697618b626fac5", size = 4923771, upload-time = "2026-04-18T04:32:17.402Z" }, + { url = "https://files.pythonhosted.org/packages/a7/23/851cfa33b6b38adb628e45ad51fb27105fa34b2b3ba9d1d4aa7a9428dfe0/lxml-6.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d036ee7b99d5148072ac7c9b847193decdfeac633db350363f7bce4fff108f0e", size = 5068101, upload-time = "2026-04-18T04:32:21.437Z" }, + { url = "https://files.pythonhosted.org/packages/b0/38/41bf99c2023c6b79916ba057d83e9db21d642f473cac210201222882d38b/lxml-6.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ae5d8d5427f3cc317e7950f2da7ad276df0cfa37b8de2f5658959e618ea8512", size = 5002573, upload-time = "2026-04-18T04:32:25.373Z" }, + { url = "https://files.pythonhosted.org/packages/c2/20/053aa10bdc39747e1e923ce2d45413075e84f70a136045bb09e5eaca41d3/lxml-6.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:363e47283bde87051b821826e71dde47f107e08614e1aa312ba0c5711e77738c", size = 5202816, upload-time = "2026-04-18T04:32:29.393Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2b/d44d0e5c79226017f4ab8c87a802ebe4f89f97e6585a8e4166dffcdd7b6e/lxml-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fcf3da95e93349e0647d48d4b36a12783105bcc74cb0c416952f9988410846a3", size = 5045444, upload-time = "2026-04-18T04:32:44.512Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ee/12e6c1b39a77666c02eaa77f94a870aaf63c4ac3a497b2d52319448b01c6/lxml-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:976a6b39b1b13e8c354ad8d3f261f3a4ac6609518af91bdb5094760a08f132c4", size = 5226822, upload-time = "2026-04-18T04:32:53.437Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d4/9326838b59dc36dfae42eec9656b97520f9997eee1de47b8316aaeed169c/lxml-6.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d2f17a16cd8751e8eb233a7e41aecdf8e511712e00088bf9be455f604cd0d28d", size = 8570663, upload-time = "2026-04-18T04:27:48.253Z" }, + { url = "https://files.pythonhosted.org/packages/90/97/a517944b20f8fd0932ad2109482bee4e29fe721416387a363306667941f6/lxml-6.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc46da94826188ed45cb53bd8e3fc076ae22675aea2087843d4735627f867c6d", size = 4930895, upload-time = "2026-04-18T04:32:56.29Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/e08a970727d556caa040a44773c7b7e3ad0f0d73dedc863543e9a8b931f2/lxml-6.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9147d8e386ec3b82c3b15d88927f734f565b0aaadef7def562b853adca45784a", size = 5093820, upload-time = "2026-04-18T04:32:58.94Z" }, + { url = "https://files.pythonhosted.org/packages/88/ee/2a5c2aa2c32016a226ca25d3e1056a8102ea6e1fe308bf50213586635400/lxml-6.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5715e0e28736a070f3f34a7ccc09e2fdcba0e3060abbcf61a1a5718ff6d6b105", size = 5005790, upload-time = "2026-04-18T04:33:01.272Z" }, + { url = "https://files.pythonhosted.org/packages/31/ba/3c13d3fc24b7cacf675f808a3a1baabf43a30d0cd24c98f94548e9aa58eb/lxml-6.1.0-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc783ee3147e60a25aa0445ea82b3e8aabb83b240f2b95d32cb75587ff781814", size = 5240445, upload-time = "2026-04-18T04:33:06.87Z" }, + { url = "https://files.pythonhosted.org/packages/00/a8/1346726af7d1f6fca1f11223ba34001462b0a3660416986d37641708d57c/lxml-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73becf6d8c81d4c76b1014dbd3584cb26d904492dcf73ca85dc8bff08dcd6d2d", size = 5048054, upload-time = "2026-04-18T04:33:16.965Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d9/d609a11fb567da9399f525193e2b49847b5a409cdebe737f06a8b7126bdc/lxml-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:264c605ab9c0e4aa1a679636f4582c4d3313700009fac3ec9c3412ed0d8f3e1d", size = 5261333, upload-time = "2026-04-18T04:33:28.984Z" }, + { url = "https://files.pythonhosted.org/packages/08/03/69347590f1cf4a6d5a4944bb6099e6d37f334784f16062234e1f892fdb1d/lxml-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0092f2b107b69601adf562a57c956fbb596e05e3e6651cabd3054113b007e45", size = 8559689, upload-time = "2026-04-18T04:31:57.785Z" }, + { url = "https://files.pythonhosted.org/packages/f5/54/92ad98a94ac318dc4f97aaac22ff8d1b94212b2ae8af5b6e9b354bf825f7/lxml-6.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:419c58fc92cc3a2c3fa5f78c63dbf5da70c1fa9c1b25f25727ecee89a96c7de2", size = 4923489, upload-time = "2026-04-18T04:33:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/15/3b/a20aecfab42bdf4f9b390590d345857ad3ffd7c51988d1c89c53a0c73faf/lxml-6.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:37fabd1452852636cf38ecdcc9dd5ca4bba7a35d6c53fa09725deeb894a87491", size = 5082162, upload-time = "2026-04-18T04:33:34.262Z" }, + { url = "https://files.pythonhosted.org/packages/45/26/2cdb3d281ac1bd175603e290cbe4bad6eff127c0f8de90bafd6f8548f0fd/lxml-6.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2853c8b2170cc6cd54a6b4d50d2c1a8a7aeca201f23804b4898525c7a152cfc", size = 4993247, upload-time = "2026-04-18T04:33:36.674Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b8/ead7c10efff731738c72e59ed6eb5791854879fbed7ae98781a12006263a/lxml-6.1.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e69aa6805905807186eb00e66c6d97a935c928275182eb02ee40ba00da9623b2", size = 5228304, upload-time = "2026-04-18T04:33:41.647Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/b06875665e53aaba7127611a7bed3b7b9658e20b22bc2dd217a0b7ab0091/lxml-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cc16682cc987a3da00aa56a3aa3075b08edb10d9b1e476938cfdbee8f3b67181", size = 5043654, upload-time = "2026-04-18T04:33:52.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/75/90c4eefda0c08c92221fe0753db2d6699a4c628f76ff4465ec20dea84cc1/lxml-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7f4a77d6f7edf9230cee3e1f7f6764722a41604ee5681844f18db9a81ea0ec33", size = 5250241, upload-time = "2026-04-18T04:34:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/b5/97/28b985c2983938d3cb696dd5501423afb90a8c3e869ef5d3c62569282c0f/lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5cfa1a34df366d9dc0d5eaf420f4cf2bb1e1bebe1066d1c2fc28c179f8a4004c", size = 4210749, upload-time = "2026-04-18T04:36:03.626Z" }, + { url = "https://files.pythonhosted.org/packages/29/67/dfab2b7d58214921935ccea7ce9b3df9b7d46f305d12f0f532ac7cf6b804/lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db88156fcf544cdbf0d95588051515cfdfd4c876fc66444eb98bceb5d6db76de", size = 4318463, upload-time = "2026-04-18T04:36:06.309Z" }, + { url = "https://files.pythonhosted.org/packages/32/a2/4ac7eb32a4d997dd352c32c32399aae27b3f268d440e6f9cfa405b575d2f/lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:07f98f5496f96bf724b1e3c933c107f0cbf2745db18c03d2e13a291c3afd2635", size = 4251124, upload-time = "2026-04-18T04:36:09.056Z" }, + { url = "https://files.pythonhosted.org/packages/33/ef/d6abd850bb4822f9b720cfe36b547a558e694881010ff7d012191e8769c6/lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4642e04449a1e164b5ff71ffd901ddb772dfabf5c9adf1b7be5dffe1212bc037", size = 4401758, upload-time = "2026-04-18T04:36:11.803Z" }, ] [[package]] @@ -3578,23 +3243,23 @@ wheels = [ [[package]] name = "markdown-it-py" -version = "4.2.0" +version = "4.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] name = "marko" -version = "2.2.3" +version = "2.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/cc/01b80dc58e4d44fe039403ef1ac0008bcb9375364ccd246a4b8bfec29b46/marko-2.2.3.tar.gz", hash = "sha256:e31ec2875383bc62f9093d16babed5a2c2cde601c00d834ea935a2222120ec19", size = 144531, upload-time = "2026-05-28T02:07:39.479Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/2f/050b6d485f052ddf17d76a41f9334d6fb2a8a85df35347a12d97ed3bc5c1/marko-2.2.2.tar.gz", hash = "sha256:6940308e655f63733ca518c47a68ec9510279dbb916c83616e4c4b5829f052e8", size = 143641, upload-time = "2026-01-05T11:04:41.935Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/50/0a8fab45fa374820c27cc4c3178c4914c60902ba9d6404a692a979e20dbc/marko-2.2.3-py3-none-any.whl", hash = "sha256:8e1d7a0387281e59dfbc52a381b58c570156970e36b2bbe047f8a3a2f368cacc", size = 42951, upload-time = "2026-05-28T02:07:38.373Z" }, + { url = "https://files.pythonhosted.org/packages/83/f8/36d79bac5701e6786f9880c61bbe57574760a13c1af84ab71e5ed21faecc/marko-2.2.2-py3-none-any.whl", hash = "sha256:f064ae8c10416285ad1d96048dc11e98ef04e662d3342ae416f662b70aa7959e", size = 42701, upload-time = "2026-01-05T11:04:40.75Z" }, ] [[package]] @@ -3606,30 +3271,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, - { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, - { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, - { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, ] @@ -3647,14 +3304,14 @@ wheels = [ [[package]] name = "matplotlib-inline" -version = "0.2.2" +version = "0.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] [[package]] @@ -3668,7 +3325,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.27.2" +version = "1.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3685,21 +3342,21 @@ dependencies = [ { name = "typing-inspection", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "uvicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/3c/347cf965d313f5d41764e7d46bea6ffe7d9ef13b983cc429b0340962a082/mcp-1.27.2.tar.gz", hash = "sha256:8e02db104096d1c25b28e64bde29a5c32b31bc241710213e12fd4d84985bdfef", size = 621116, upload-time = "2026-05-29T17:16:04.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/11/252c6f971dc4f16af1d98a1c469d8ba523aab00d1bb76b4d3bc1ff32eacc/mcp-1.27.2-py3-none-any.whl", hash = "sha256:d6ff5160c6ca65d93013626efb3fc249de683c30b2d8570755ceddd490344de5", size = 220498, upload-time = "2026-05-29T17:16:02.442Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" }, ] [[package]] name = "mdit-py-plugins" -version = "0.6.1" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, ] [[package]] @@ -3711,6 +3368,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "miniaudio" +version = "1.71" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/d5/e5439dc08561f73656bfeb3340fc64ab63163e101426593d8fb9a025ff1e/miniaudio-1.71.tar.gz", hash = "sha256:ff51e2887bb673e2e757752b586b3dc924d59aa5fbcae9bbc45f4a111bd3262b", size = 1116480, upload-time = "2026-04-29T21:20:38.182Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/c1/4b13ac3c36a2574e0d70f322246d80259606cd24523279f542abc9ac6063/miniaudio-1.71-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5009b4e29cd43de3631d2d5ab09cc074192c085b4c8dd8a121b856ce1af6bab7", size = 351405, upload-time = "2026-04-29T21:20:10.533Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ac/30a324f758bed1b193e017ec25183cfb10a79e549656331f5d068a2d343a/miniaudio-1.71-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fc1a4f084cc1b4b25c567d22f54d1e46bfa505c17ed777c8b198e5c53d0f785", size = 351485, upload-time = "2026-04-29T21:20:17.761Z" }, + { url = "https://files.pythonhosted.org/packages/bd/d1/071a560000c8ce903dc919968ecce40fbe7a73213ac399051b887184f8a3/miniaudio-1.71-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d9dc15eff711bcfc62a9d05e0c78e4bc34821a455595e049629f2fea7491a523", size = 351488, upload-time = "2026-04-29T21:20:25.183Z" }, +] + [[package]] name = "mistune" version = "3.2.1" @@ -3722,7 +3393,7 @@ wheels = [ [[package]] name = "mlflow-skinny" -version = "3.13.0" +version = "3.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3742,13 +3413,104 @@ dependencies = [ { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sqlparse", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "starlette", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "uvicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/13/840db21a4f46ebe6ba9837a38bc93d748e23b6b61986799c8040cd4bf728/mlflow_skinny-3.13.0.tar.gz", hash = "sha256:d2273bfa21f776359f7d6ab2267967e3a6732a5fb00996ad433d0e777dfa3b71", size = 2814837, upload-time = "2026-06-01T05:54:54.175Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/65/5b2c28e74c167ba8a5afe59399ef44291a0f140487f534db1900f09f59f6/mlflow_skinny-3.10.1.tar.gz", hash = "sha256:3d1c5c30245b6e7065b492b09dd47be7528e0a14c4266b782fe58f9bcd1e0be0", size = 2478631, upload-time = "2026-03-05T10:49:01.47Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/fd/f2739de1b6a09da981927aa90db87340cbe4b3cf6cd175fd5e6e4366208e/mlflow_skinny-3.13.0-py3-none-any.whl", hash = "sha256:ced3d9a580564fae093d14732df8531fb180574f6483d4c642b6083879eb86fc", size = 3365675, upload-time = "2026-06-01T05:54:52.166Z" }, + { url = "https://files.pythonhosted.org/packages/4b/52/17460157271e70b0d8444d27f8ad730ef7d95fb82fac59dc19f11519b921/mlflow_skinny-3.10.1-py3-none-any.whl", hash = "sha256:df1dd507d8ddadf53bfab2423c76cdcafc235cd1a46921a06d1a6b4dd04b023c", size = 2987098, upload-time = "2026-03-05T10:48:59.566Z" }, +] + +[[package]] +name = "mlx" +version = "0.31.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mlx-metal", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/89/1e77ec3ff380e8fb9e7258047374d31452a0f9828a0e370f127b07dd8288/mlx-0.31.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4a3f181b367d404e44a6bd68ef5eb573930809ac60cacd51d0c851c629b1b651", size = 586911, upload-time = "2026-04-22T03:14:29.675Z" }, + { url = "https://files.pythonhosted.org/packages/6a/41/c1907f05f8a3fc54025fb78ad68d3c4a4b931664d03c0a24f7f431cc4087/mlx-0.31.2-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:70297cbef7479429f69c966bfed10da20a6f0c2aa997eec2b4f6ba1a07caf2ef", size = 586915, upload-time = "2026-04-22T03:14:31.403Z" }, + { url = "https://files.pythonhosted.org/packages/97/b0/61ac2c14773c786fecbda28067b0207a0c654cb4d10c548808c51284d700/mlx-0.31.2-cp311-cp311-macosx_26_0_arm64.whl", hash = "sha256:c0ff158b7ac93a4b5659adbc70053498b30a5964fc45f78596398e056a96c36a", size = 587030, upload-time = "2026-04-22T03:14:32.961Z" }, + { url = "https://files.pythonhosted.org/packages/c3/47/5f33906cb03d6a378a697cd2d2641a26b37dea17ee3d9124d7e39e8eca01/mlx-0.31.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:e5067aaf2be1f3d7bba5be52348775804f111173c1ed04639618fd713b1a530f", size = 584863, upload-time = "2026-04-22T03:14:38.211Z" }, + { url = "https://files.pythonhosted.org/packages/08/e7/a851a451b1327af9fb4df3991b9ae87d066b6f6630e854af55c288b0995a/mlx-0.31.2-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:edb9797db7d852477ca1c99708058654ee860d4148fe5765f0d55528e2b1aa22", size = 584860, upload-time = "2026-04-22T03:14:39.746Z" }, + { url = "https://files.pythonhosted.org/packages/3b/15/0d1dc0597644e5e7b011ca954ba0c47e13cd880a3b909b0c3f1b4d8bf8f1/mlx-0.31.2-cp312-cp312-macosx_26_0_arm64.whl", hash = "sha256:51ca102db641b01e7cb083ce8ecb580e281530a141a7ca12544bb370641630ae", size = 584887, upload-time = "2026-04-22T03:14:41.585Z" }, + { url = "https://files.pythonhosted.org/packages/a3/3f/888f8664d4f8e23a1363a5f50024be5216e199ab7ad0ba20988c7ed6d729/mlx-0.31.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1b3fb0dda955b0d552ce57bdd6f42b3309ab21b067e40587d6848443d307e91f", size = 584796, upload-time = "2026-04-22T03:14:47.215Z" }, + { url = "https://files.pythonhosted.org/packages/dd/14/e9cd18b51f9e1dbcb060eec0fafc2d2428c8e1eacd9b0a02d7c5ce75b661/mlx-0.31.2-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:34b0171cd9eb5c43fdd82091f6135d6ccc5a065363a4a3e68fac64fb4e53d37c", size = 584790, upload-time = "2026-04-22T03:14:48.519Z" }, + { url = "https://files.pythonhosted.org/packages/ca/20/c6c5fb998c7834d094b2bfb9f003b5246cb270f0266da055c55546c34999/mlx-0.31.2-cp313-cp313-macosx_26_0_arm64.whl", hash = "sha256:c05981684279a8935d58b0dde3ea5b02d210c3bad3319aa0e9934ec2df165752", size = 584795, upload-time = "2026-04-22T03:14:49.904Z" }, +] + +[[package]] +name = "mlx-audio" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "miniaudio", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "mlx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "mlx-lm", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "numpy", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "scipy", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "sounddevice", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "tqdm", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "transformers", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/1e/f712c9f7997e5051c4da3b658f38162203bb703c750741984c8358c8b897/mlx_audio-0.4.4.tar.gz", hash = "sha256:d751e5f477517e4e7f04de5567318e2fe91b4606af5d7e4b2973603c4777814a", size = 1386491, upload-time = "2026-06-06T15:32:03.504Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/4d/93ac0e0526591c856a1ea2cd00a41f31530d9e021cc95bc9400550926d51/mlx_audio-0.4.4-py3-none-any.whl", hash = "sha256:39fe81b03e2b1354be70de82dc8bf01dd6e75efcb464150afef89f18f734d0d5", size = 1669932, upload-time = "2026-06-06T15:32:01.807Z" }, +] + +[[package]] +name = "mlx-lm" +version = "0.31.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "mlx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "numpy", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "protobuf", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "pyyaml", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "sentencepiece", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "transformers", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/94/9a38d6b0c6fcca995b9136c94eb7da1e9c5165652edf228b96b29960fa7a/mlx_lm-0.31.3.tar.gz", hash = "sha256:61eb0e3ba09444f77f874aff295401d7ccd20b39495cbbce0c782a15474ce733", size = 304318, upload-time = "2026-04-22T07:37:27.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/02/9a67b8e4f87e3e2e5cd7b1ad79304b93c09a0db6af34bee75e6551c06c60/mlx_lm-0.31.3-py3-none-any.whl", hash = "sha256:758cfddf1180053b7613db76fad3d246a331a2a905808e1164a275621fc983b8", size = 408890, upload-time = "2026-04-22T07:37:25.965Z" }, +] + +[[package]] +name = "mlx-metal" +version = "0.31.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/69/fe3b783ebe999f3118234e1e940feb622518bfb1dea6ac5d13b1d36a8449/mlx_metal-0.31.2-py3-none-macosx_14_0_arm64.whl", hash = "sha256:b25385bcee18fc194092255b8b53b9a3d8489eb650e59160f1b57aadd07aa2dc", size = 40055588, upload-time = "2026-04-22T03:14:14.43Z" }, + { url = "https://files.pythonhosted.org/packages/4f/5d/4c690d5b93c30ba002656c37363159d978705bf8eb801b8481840fb942c2/mlx_metal-0.31.2-py3-none-macosx_15_0_arm64.whl", hash = "sha256:e9d4e5fce6ca10a87a0e388597f99519ad594d09e674708b5312bd8bd4f5997d", size = 40053220, upload-time = "2026-04-22T03:14:18.048Z" }, + { url = "https://files.pythonhosted.org/packages/99/82/11fd62a8d7a3e96e5c43220b17de0151e3f10101f8bb3b865f5bd9cdd074/mlx_metal-0.31.2-py3-none-macosx_26_0_arm64.whl", hash = "sha256:84ffb60ee503f03eb684f5fb168d5cff31e2a16b7f27c1731eaf7662bd6e9b46", size = 55792151, upload-time = "2026-04-22T03:14:22.059Z" }, +] + +[[package]] +name = "mlx-vlm" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "datasets", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "fastapi", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "llguidance", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "miniaudio", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "mlx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "mlx-audio", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "mlx-lm", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "numpy", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "opencv-python", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "pillow", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "requests", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "tqdm", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "transformers", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "uvicorn", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/a3/70dce014f6a72efd2cecc07b6a68fc11c0694fbe54ea553b2e00499c7b36/mlx_vlm-0.5.0.tar.gz", hash = "sha256:24563cd1b3a399fd941b2359100628306e2754db1b48780516d1283138258793", size = 1033154, upload-time = "2026-05-06T21:09:33.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/66/fb955ccc442aa556e5e9d8836fb9041a7aadff5a88fa80c285e53dc19bf5/mlx_vlm-0.5.0-py3-none-any.whl", hash = "sha256:3351d6ccf609cbf57a4c8cd8308e9a1ce469883d8679d9968c6c6f77af016419", size = 1218132, upload-time = "2026-05-06T21:09:32.071Z" }, ] [[package]] @@ -3761,21 +3523,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/b4/9cd284bd6062d711e13d26c04d4778ab3f690c1c38a4563e3c767ec8802e/mmh3-5.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0634581290e6714c068f4aa24020acf7880927d1f0084fa753d9799ae9610082", size = 40079, upload-time = "2026-03-05T15:54:02.743Z" }, { url = "https://files.pythonhosted.org/packages/ee/93/723e317dd9e041c4dc4566a2eb53b01ad94de31750e0b834f1643905e97c/mmh3-5.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db0562c5f71d18596dcd45e854cf2eeba27d7543e1a3acdafb7eef728f7fe85d", size = 103082, upload-time = "2026-03-05T15:54:06.387Z" }, { url = "https://files.pythonhosted.org/packages/61/b5/f96121e69cc48696075071531cf574f112e1ffd08059f4bffb41210e6fc5/mmh3-5.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d9f9a3ce559a5267014b04b82956993270f63ec91765e13e9fd73daf2d2738e", size = 106054, upload-time = "2026-03-05T15:54:07.506Z" }, - { url = "https://files.pythonhosted.org/packages/82/49/192b987ec48d0b2aecf8ac285a9b11fbc00030f6b9c694664ae923458dde/mmh3-5.2.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:960b1b3efa39872ac8b6cc3a556edd6fb90ed74f08c9c45e028f1005b26aa55d", size = 112910, upload-time = "2026-03-05T15:54:09.403Z" }, - { url = "https://files.pythonhosted.org/packages/cf/a1/03e91fd334ed0144b83343a76eb11f17434cd08f746401488cfeafb2d241/mmh3-5.2.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d30b650595fdbe32366b94cb14f30bb2b625e512bd4e1df00611f99dc5c27fd4", size = 120551, upload-time = "2026-03-05T15:54:10.587Z" }, { url = "https://files.pythonhosted.org/packages/93/b9/b89a71d2ff35c3a764d1c066c7313fc62c7cc48fa48a4b3b0304a4a0146f/mmh3-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:82f3802bfc4751f420d591c5c864de538b71cea117fce67e4595c2afede08a15", size = 99096, upload-time = "2026-03-05T15:54:11.76Z" }, - { url = "https://files.pythonhosted.org/packages/5e/0e/1524566fe8eaf871e4f7bc44095929fcd2620488f402822d848df19d679c/mmh3-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fc78739b5ec6e4fb02301984a3d442a91406e7700efbe305071e7fd1c78278f2", size = 106239, upload-time = "2026-03-05T15:54:14.601Z" }, - { url = "https://files.pythonhosted.org/packages/04/94/21adfa7d90a7a697137ad6de33eeff6445420ca55e433a5d4919c79bc3b5/mmh3-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:41aac7002a749f08727cb91babff1daf8deac317c0b1f317adc69be0e6c375d1", size = 109797, upload-time = "2026-03-05T15:54:15.819Z" }, { url = "https://files.pythonhosted.org/packages/b5/e6/1aacc3a219e1aa62fa65669995d4a3562b35be5200ec03680c7e4bec9676/mmh3-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9d8089d853c7963a8ce87fff93e2a67075c0bc08684a08ea6ad13577c38ffc38", size = 97228, upload-time = "2026-03-05T15:54:16.992Z" }, { url = "https://files.pythonhosted.org/packages/92/94/bc5c3b573b40a328c4d141c20e399039ada95e5e2a661df3425c5165fd84/mmh3-5.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0cc21533878e5586b80d74c281d7f8da7932bc8ace50b8d5f6dbf7e3935f63f1", size = 56087, upload-time = "2026-03-05T15:54:21.92Z" }, { url = "https://files.pythonhosted.org/packages/8b/72/e6d6602ce18adf4ddcd0e48f2e13590cc92a536199e52109f46f259d3c46/mmh3-5.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:eee884572b06bbe8a2b54f424dbd996139442cf83c76478e1ec162512e0dd2c7", size = 40034, upload-time = "2026-03-05T15:54:23.943Z" }, { url = "https://files.pythonhosted.org/packages/e5/e2/51ed62063b44d10b06d975ac87af287729eeb5e3ed9772f7584a17983e90/mmh3-5.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e6c219e375f6341d0959af814296372d265a8ca1af63825f65e2e87c618f006", size = 103274, upload-time = "2026-03-05T15:54:26.44Z" }, { url = "https://files.pythonhosted.org/packages/75/ce/12a7524dca59eec92e5b31fdb13ede1e98eda277cf2b786cf73bfbc24e81/mmh3-5.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26fb5b9c3946bf7f1daed7b37e0c03898a6f062149127570f8ede346390a0825", size = 106158, upload-time = "2026-03-05T15:54:28.578Z" }, - { url = "https://files.pythonhosted.org/packages/86/1f/d3ba6dd322d01ab5d44c46c8f0c38ab6bbbf9b5e20e666dfc05bf4a23604/mmh3-5.2.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3c38d142c706201db5b2345166eeef1e7740e3e2422b470b8ba5c8727a9b4c7a", size = 113005, upload-time = "2026-03-05T15:54:29.767Z" }, - { url = "https://files.pythonhosted.org/packages/b6/a9/15d6b6f913294ea41b44d901741298e3718e1cb89ee626b3694625826a43/mmh3-5.2.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50885073e2909251d4718634a191c49ae5f527e5e1736d738e365c3e8be8f22b", size = 120744, upload-time = "2026-03-05T15:54:30.931Z" }, { url = "https://files.pythonhosted.org/packages/76/b3/70b73923fd0284c439860ff5c871b20210dfdbe9a6b9dd0ee6496d77f174/mmh3-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3f99e1756fc48ad507b95e5d86f2fb21b3d495012ff13e6592ebac14033f166", size = 99111, upload-time = "2026-03-05T15:54:32.353Z" }, - { url = "https://files.pythonhosted.org/packages/fd/68/6e292c0853e204c44d2f03ea5f090be3317a0e2d9417ecb62c9eb27687df/mmh3-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8f767ba0911602ddef289404e33835a61168314ebd3c729833db2ed685824211", size = 106437, upload-time = "2026-03-05T15:54:35.177Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c6/fedd7284c459cfb58721d461fcf5607a4c1f5d9ab195d113d51d10164d16/mmh3-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:67e41a497bac88cc1de96eeba56eeb933c39d54bc227352f8455aa87c4ca4000", size = 110002, upload-time = "2026-03-05T15:54:36.673Z" }, { url = "https://files.pythonhosted.org/packages/3b/ac/ca8e0c19a34f5b71390171d2ff0b9f7f187550d66801a731bb68925126a4/mmh3-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d74a03fb57757ece25aa4b3c1c60157a1cece37a020542785f942e2f827eed5", size = 97507, upload-time = "2026-03-05T15:54:37.804Z" }, { url = "https://files.pythonhosted.org/packages/62/fb/648bfddb74a872004b6ee751551bfdda783fe6d70d2e9723bad84dbe5311/mmh3-5.2.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e48d4dbe0f88e53081da605ae68644e5182752803bbc2beb228cca7f1c4454d6", size = 39114, upload-time = "2026-03-05T15:54:45.205Z" }, { url = "https://files.pythonhosted.org/packages/95/c2/ab7901f87af438468b496728d11264cb397b3574d41506e71b92128e0373/mmh3-5.2.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a482ac121de6973897c92c2f31defc6bafb11c83825109275cffce54bb64933f", size = 39819, upload-time = "2026-03-05T15:54:46.509Z" }, @@ -3784,11 +3538,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d4/4c/8e3af1b6d85a299767ec97bd923f12b06267089c1472c27c1696870d1175/mmh3-5.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be77c402d5e882b6fbacfd90823f13da8e0a69658405a39a569c6b58fdb17b03", size = 40033, upload-time = "2026-03-05T15:54:50.994Z" }, { url = "https://files.pythonhosted.org/packages/bb/0d/2c5f9893b38aeb6b034d1a44ecd55a010148054f6a516abe53b5e4057297/mmh3-5.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:707151644085dd0f20fe4f4b573d28e5130c4aaa5f587e95b60989c5926653b5", size = 103299, upload-time = "2026-03-05T15:54:53.569Z" }, { url = "https://files.pythonhosted.org/packages/1c/fc/2ebaef4a4d4376f89761274dc274035ffd96006ab496b4ee5af9b08f21a9/mmh3-5.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3737303ca9ea0f7cb83028781148fcda4f1dac7821db0c47672971dabcf63593", size = 106222, upload-time = "2026-03-05T15:54:55.092Z" }, - { url = "https://files.pythonhosted.org/packages/57/09/ea7ffe126d0ba0406622602a2d05e1e1a6841cc92fc322eb576c95b27fad/mmh3-5.2.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2778fed822d7db23ac5008b181441af0c869455b2e7d001f4019636ac31b6fe4", size = 113048, upload-time = "2026-03-05T15:54:56.305Z" }, - { url = "https://files.pythonhosted.org/packages/85/57/9447032edf93a64aa9bef4d9aa596400b1756f40411890f77a284f6293ca/mmh3-5.2.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d57dea657357230cc780e13920d7fa7db059d58fe721c80020f94476da4ca0a1", size = 120742, upload-time = "2026-03-05T15:54:57.453Z" }, { url = "https://files.pythonhosted.org/packages/53/82/a86cc87cc88c92e9e1a598fee509f0409435b57879a6129bf3b3e40513c7/mmh3-5.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:169e0d178cb59314456ab30772429a802b25d13227088085b0d49b9fe1533104", size = 99132, upload-time = "2026-03-05T15:54:58.583Z" }, - { url = "https://files.pythonhosted.org/packages/e8/88/a601e9f32ad1410f438a6d0544298ea621f989bd34a0731a7190f7dec799/mmh3-5.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2bd9f19f7f1fcebd74e830f4af0f28adad4975d40d80620be19ffb2b2af56c9f", size = 106479, upload-time = "2026-03-05T15:55:01.532Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5c/ce29ae3dfc4feec4007a437a1b7435fb9507532a25147602cd5b52be86db/mmh3-5.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c88653877aeb514c089d1b3d473451677b8b9a6d1497dbddf1ae7934518b06d2", size = 110030, upload-time = "2026-03-05T15:55:02.934Z" }, { url = "https://files.pythonhosted.org/packages/13/30/ae444ef2ff87c805d525da4fa63d27cda4fe8a48e77003a036b8461cfd5c/mmh3-5.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fceef7fe67c81e1585198215e42ad3fdba3a25644beda8fbdaf85f4d7b93175a", size = 97536, upload-time = "2026-03-05T15:55:04.135Z" }, ] @@ -3812,11 +3562,11 @@ dev = [] [[package]] name = "more-itertools" -version = "11.1.0" +version = "10.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, + { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, ] [[package]] @@ -3860,50 +3610,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, - { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, - { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, - { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, - { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, - { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, - { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, - { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, - { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, - { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, - { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, - { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, - { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, - { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, - { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, - { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, - { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, - { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, - { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, - { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] @@ -3961,7 +3687,7 @@ wheels = [ [[package]] name = "myst-parser" -version = "5.1.0" +version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3969,17 +3695,25 @@ dependencies = [ { name = "markdown-it-py", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "mdit-py-plugins", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/dc/603751677fff302f34396e206b610f556a59d7fe58b9a2145f54e96b48e8/myst_parser-5.1.0.tar.gz", hash = "sha256:ab69322dc6719dcc7f296479dbb70181b66df6ed315064f92dbc85c0e1bf2f02", size = 101182, upload-time = "2026-05-13T09:38:19.361Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/fa/7b45eef11b7971f0beb29d27b7bfe0d747d063aa29e170d9edd004733c8a/myst_parser-5.0.0.tar.gz", hash = "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a", size = 98535, upload-time = "2026-01-15T09:08:18.036Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/dc/f3dfb7488b770f3f67e6545085bf2abea5172e88f57b8ad25ef860ca704c/myst_parser-5.1.0-py3-none-any.whl", hash = "sha256:9c91c52b3cdb4d94a6506e4fab4e2f296c7623a0da0dcbe6de1565c3dad67a8a", size = 85817, upload-time = "2026-05-13T09:38:17.904Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl", hash = "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", size = 84533, upload-time = "2026-01-15T09:08:16.788Z" }, +] + +[[package]] +name = "narwhals" +version = "2.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/3c/c4ef2164a71c1a63d7f1ae411c4082c5fa872405106db60a4b7114989ad7/narwhals-2.22.1.tar.gz", hash = "sha256:d62920805a0a43b7ff8b54b0c0d3142d796f8a9301836ada37e573d6a33cbcd9", size = 647493, upload-time = "2026-06-05T12:34:34.051Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl", hash = "sha256:60567d774edf77db53906f89d9fbd164e66e56d66d388e1e6990f17ac33cfb53", size = 454815, upload-time = "2026-06-05T12:34:32.289Z" }, ] [[package]] name = "nbclient" -version = "0.11.0" +version = "0.10.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-client", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -3987,9 +3721,9 @@ dependencies = [ { name = "nbformat", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "traitlets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/a5/b3bae4b590c0cbcada2c63a34f7580024e834a8ba213e949a2f906705787/nbclient-0.11.0.tar.gz", hash = "sha256:04a134a5b087f2c5887f228aca155db50169b8cd9334dee6942c8e927e56081a", size = 62535, upload-time = "2026-06-05T07:52:41.746Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/c9/94d73e5a01c5b926c3fa2496e97d7a8dc28ed5a77c0b2ed712f1a62e6694/nbclient-0.11.0-py3-none-any.whl", hash = "sha256:ef7fa0d59d6e1d41103933d8a445a18d5de860ca6b613b87b8574accdb3c2895", size = 25288, upload-time = "2026-06-05T07:52:40.115Z" }, + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, ] [[package]] @@ -4394,10 +4128,13 @@ dependencies = [ { name = "jinja2", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jsonpath-ng", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jsonschema", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "langchain-nvidia-ai-endpoints", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "langchain-openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pandas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyarrow", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "ragas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rouge-score", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sacrebleu", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] @@ -4418,11 +4155,14 @@ requires-dist = [ { name = "jinja2", specifier = ">=3.1.6" }, { name = "jsonpath-ng", specifier = ">=1.7.0" }, { name = "jsonschema", specifier = ">=4.23.0" }, + { name = "langchain-nvidia-ai-endpoints", specifier = ">=1.0.0,<2.0.0" }, + { name = "langchain-openai", specifier = ">=1.1.14" }, { name = "nemo-platform-sdk", marker = "extra == 'nemo-platform'", editable = "sdk/python/nemo-platform" }, { name = "openai", specifier = ">=1.61.0" }, { name = "pandas", specifier = ">=1.5.3" }, { name = "pyarrow", specifier = ">=19.0.1" }, { name = "pydantic", specifier = ">=2.10.6" }, + { name = "ragas", specifier = "==0.3.5" }, { name = "rouge-score", specifier = "==0.1.2" }, { name = "sacrebleu", specifier = ">=2.5.1" }, ] @@ -4484,8 +4224,7 @@ version = "0.5.0" source = { editable = "packages/nemo_nb" } dependencies = [ { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] @@ -4512,7 +4251,6 @@ aiohttp = [ ] all = [ { name = "aioboto3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "aiofiles", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "aiosqlite", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "alembic", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -4537,12 +4275,9 @@ all = [ { name = "greenlet", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "gunicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "hvac", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "jsonpath-ng", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "kubernetes", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langchain-aws", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "langchain-community", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langchain-nvidia-ai-endpoints", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langchain-openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "lark", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -4573,16 +4308,12 @@ all = [ { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic-settings", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyleak", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pymilvus", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "python-box", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "python-multipart", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "ragas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sqlalchemy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sqlmodel", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "starlette", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "streaming-form-data", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "switchyard", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tenacity", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -4668,34 +4399,6 @@ entities-service = [ { name = "sqlalchemy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "uvicorn", extra = ["standard"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -evaluator-service = [ - { name = "aiofiles", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "alembic", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "base58", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "datasets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "fastapi", extra = ["standard"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "jsonpath-ng", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "kubernetes", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "langchain-community", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "langchain-nvidia-ai-endpoints", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nemo-evaluator-sdk", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nmp-common", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "opentelemetry-distro", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "opentelemetry-exporter-otlp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "psycopg2-binary", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pydantic-settings", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pymilvus", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "python-box", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "ragas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sqlmodel", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "starlette", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "uvicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] files-service = [ { name = "aioboto3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -4845,10 +4548,13 @@ nemo-evaluator-sdk = [ { name = "jinja2", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jsonpath-ng", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jsonschema", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "langchain-nvidia-ai-endpoints", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "langchain-openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pandas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyarrow", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "ragas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rouge-score", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sacrebleu", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] @@ -4889,6 +4595,7 @@ nemo-platform-sdk = [ { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] nemo-safe-synthesizer-plugin = [ + { name = "datasets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fastapi", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fsspec", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "gunicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -4948,6 +4655,7 @@ plugins = [ { name = "data-designer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "data-designer-nemo", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "dataclasses-json", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "datasets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fastapi", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fsspec", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "garak-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -4982,7 +4690,6 @@ secrets-service = [ ] services = [ { name = "aioboto3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "aiofiles", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "aiosqlite", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "alembic", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -5007,12 +4714,9 @@ services = [ { name = "greenlet", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "gunicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "hvac", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "jsonpath-ng", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "kubernetes", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langchain-aws", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "langchain-community", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langchain-nvidia-ai-endpoints", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "langchain-openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "lark", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -5043,16 +4747,12 @@ services = [ { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic-settings", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyleak", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pymilvus", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "python-box", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "python-multipart", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "ragas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sqlalchemy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sqlmodel", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "starlette", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "streaming-form-data", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "switchyard", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tenacity", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -5081,15 +4781,11 @@ requires-dist = [ { name = "aioboto3", marker = "extra == 'core-service'", specifier = ">=15.5.0" }, { name = "aioboto3", marker = "extra == 'files-service'", specifier = ">=15.5.0" }, { name = "aioboto3", marker = "extra == 'services'", specifier = ">=15.5.0" }, - { name = "aiofiles", marker = "extra == 'all'", specifier = ">=25.1.0" }, - { name = "aiofiles", marker = "extra == 'evaluator-service'", specifier = ">=25.1.0" }, { name = "aiofiles", marker = "extra == 'nmp-common'", specifier = ">=24.1.0" }, - { name = "aiofiles", marker = "extra == 'services'", specifier = ">=25.1.0" }, { name = "aiohttp", marker = "extra == 'aiohttp'" }, { name = "aiohttp", marker = "extra == 'all'", specifier = ">=3.13.4" }, { name = "aiohttp", marker = "extra == 'auditor-service'", specifier = ">=3.13.4" }, { name = "aiohttp", marker = "extra == 'core-service'", specifier = ">=3.13.4" }, - { name = "aiohttp", marker = "extra == 'evaluator-service'", specifier = ">=3.13.4" }, { name = "aiohttp", marker = "extra == 'files-service'", specifier = ">=3.13.4" }, { name = "aiohttp", marker = "extra == 'services'", specifier = ">=3.13.4" }, { name = "aiohttp", extras = ["speedups"], marker = "extra == 'all'", specifier = ">=3.13.4" }, @@ -5102,14 +4798,11 @@ requires-dist = [ { name = "aiosqlite", marker = "extra == 'services'", specifier = ">=0.20.0" }, { name = "alembic", marker = "extra == 'all'", specifier = ">=1.10.4,<2.0.0" }, { name = "alembic", marker = "extra == 'all'", specifier = ">=1.13.1" }, - { name = "alembic", marker = "extra == 'all'", specifier = ">=1.13.1,<2.0.0" }, { name = "alembic", marker = "extra == 'core-service'", specifier = ">=1.13.1" }, { name = "alembic", marker = "extra == 'entities-service'", specifier = ">=1.13.1" }, - { name = "alembic", marker = "extra == 'evaluator-service'", specifier = ">=1.13.1,<2.0.0" }, { name = "alembic", marker = "extra == 'guardrails-service'", specifier = ">=1.10.4,<2.0.0" }, { name = "alembic", marker = "extra == 'services'", specifier = ">=1.10.4,<2.0.0" }, { name = "alembic", marker = "extra == 'services'", specifier = ">=1.13.1" }, - { name = "alembic", marker = "extra == 'services'", specifier = ">=1.13.1,<2.0.0" }, { name = "anthropic", marker = "extra == 'all'", specifier = ">=0.88.0" }, { name = "anthropic", marker = "extra == 'nemo-agents-plugin'", specifier = ">=0.88.0" }, { name = "anthropic", marker = "extra == 'nemo-platform-plugin'", specifier = ">=0.88.0" }, @@ -5128,16 +4821,13 @@ requires-dist = [ { name = "asyncpg", marker = "extra == 'services'", specifier = ">=0.31.0" }, { name = "base58", marker = "extra == 'all'", specifier = ">=2.1.0" }, { name = "base58", marker = "extra == 'all'", specifier = ">=2.1.1" }, - { name = "base58", marker = "extra == 'all'", specifier = ">=2.1.1,<3.0.0" }, { name = "base58", marker = "extra == 'core-service'", specifier = ">=2.1.0" }, { name = "base58", marker = "extra == 'core-service'", specifier = ">=2.1.1" }, { name = "base58", marker = "extra == 'entities-service'", specifier = ">=2.1.0" }, - { name = "base58", marker = "extra == 'evaluator-service'", specifier = ">=2.1.1,<3.0.0" }, { name = "base58", marker = "extra == 'jobs-service'", specifier = ">=2.1.1" }, { name = "base58", marker = "extra == 'nmp-common'", specifier = ">=2.1.1" }, { name = "base58", marker = "extra == 'services'", specifier = ">=2.1.0" }, { name = "base58", marker = "extra == 'services'", specifier = ">=2.1.1" }, - { name = "base58", marker = "extra == 'services'", specifier = ">=2.1.1,<3.0.0" }, { name = "boto3", marker = "extra == 'all'", specifier = ">=1.40.46,<1.40.62" }, { name = "boto3", marker = "extra == 'nemo-agents-plugin'", specifier = ">=1.40.46,<1.40.62" }, { name = "boto3", marker = "extra == 'plugins'", specifier = ">=1.40.46,<1.40.62" }, @@ -5169,9 +4859,10 @@ requires-dist = [ { name = "dataclasses-json", marker = "extra == 'nemo-guardrails-plugin'", specifier = ">=0.6.7" }, { name = "dataclasses-json", marker = "extra == 'plugins'", specifier = ">=0.6.7" }, { name = "dataclasses-json", marker = "extra == 'services'", specifier = ">=0.6.7" }, - { name = "datasets", marker = "extra == 'all'", specifier = ">=3.3.1" }, - { name = "datasets", marker = "extra == 'evaluator-service'", specifier = ">=3.3.1" }, - { name = "datasets", marker = "extra == 'services'", specifier = ">=3.3.1" }, + { name = "datasets", marker = "extra == 'all'", specifier = ">=3.3.1,<=4.3.0" }, + { name = "datasets", marker = "extra == 'nemo-safe-synthesizer-plugin'", specifier = ">=3.3.1,<=4.3.0" }, + { name = "datasets", marker = "extra == 'plugins'", specifier = ">=3.3.1,<=4.3.0" }, + { name = "datasets", marker = "extra == 'services'", specifier = ">=3.3.1,<=4.3.0" }, { name = "distro", marker = "extra == 'nemo-platform-sdk'", specifier = ">=1.7.0,<2" }, { name = "docker", marker = "extra == 'all'", specifier = ">=7.1.0" }, { name = "docker", marker = "extra == 'core-service'", specifier = ">=7.1.0" }, @@ -5217,7 +4908,6 @@ requires-dist = [ { name = "fastapi", extras = ["standard"], marker = "extra == 'all'", specifier = ">=0.115.4" }, { name = "fastapi", extras = ["standard"], marker = "extra == 'auth-service'", specifier = ">=0.115.4" }, { name = "fastapi", extras = ["standard"], marker = "extra == 'core-service'", specifier = ">=0.115.4" }, - { name = "fastapi", extras = ["standard"], marker = "extra == 'evaluator-service'", specifier = ">=0.115.4" }, { name = "fastapi", extras = ["standard"], marker = "extra == 'hello-world-service'", specifier = ">=0.115.4" }, { name = "fastapi", extras = ["standard"], marker = "extra == 'nmp-common'", specifier = ">=0.115.4" }, { name = "fastapi", extras = ["standard"], marker = "extra == 'services'", specifier = ">=0.115.4" }, @@ -5263,26 +4953,19 @@ requires-dist = [ { name = "httpx", marker = "extra == 'services'", specifier = ">=0.27.2" }, { name = "httpx", marker = "extra == 'switchyard'", specifier = ">=0.28.1,<1.0" }, { name = "httpx-aiohttp", marker = "extra == 'aiohttp'", specifier = ">=0.1.9" }, - { name = "huggingface-hub", marker = "extra == 'all'", specifier = ">=1.0.1,<2.0.0" }, - { name = "huggingface-hub", marker = "extra == 'evaluator-service'", specifier = ">=1.0.1,<2.0.0" }, { name = "huggingface-hub", marker = "extra == 'nmp-common'", specifier = ">=1.0.1,<2.0.0" }, - { name = "huggingface-hub", marker = "extra == 'services'", specifier = ">=1.0.1,<2.0.0" }, { name = "hvac", marker = "extra == 'all'", specifier = ">=2.3.0" }, { name = "hvac", marker = "extra == 'core-service'", specifier = ">=2.3.0" }, { name = "hvac", marker = "extra == 'jobs-service'", specifier = ">=2.3.0" }, { name = "hvac", marker = "extra == 'nmp-common'", specifier = ">=2.3.0" }, { name = "hvac", marker = "extra == 'services'", specifier = ">=2.3.0" }, { name = "jinja2", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=3.1.6" }, - { name = "jsonpath-ng", marker = "extra == 'all'", specifier = ">=1.6.0" }, - { name = "jsonpath-ng", marker = "extra == 'evaluator-service'", specifier = ">=1.6.0" }, { name = "jsonpath-ng", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=1.7.0" }, - { name = "jsonpath-ng", marker = "extra == 'services'", specifier = ">=1.6.0" }, { name = "jsonschema", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=4.23.0" }, { name = "kubernetes", marker = "extra == 'all'", specifier = ">=30.1.0" }, { name = "kubernetes", marker = "extra == 'all'", specifier = ">=31.0.0" }, { name = "kubernetes", marker = "extra == 'core-service'", specifier = ">=30.1.0" }, { name = "kubernetes", marker = "extra == 'core-service'", specifier = ">=31.0.0" }, - { name = "kubernetes", marker = "extra == 'evaluator-service'", specifier = ">=31.0.0" }, { name = "kubernetes", marker = "extra == 'jobs-service'", specifier = ">=30.1.0" }, { name = "kubernetes", marker = "extra == 'models-service'", specifier = ">=31.0.0" }, { name = "kubernetes", marker = "extra == 'nmp-common'", specifier = ">=30.1.0" }, @@ -5292,15 +4975,13 @@ requires-dist = [ { name = "langchain-aws", marker = "extra == 'nemo-agents-plugin'", specifier = "==1.1.0" }, { name = "langchain-aws", marker = "extra == 'plugins'", specifier = "==1.1.0" }, { name = "langchain-aws", marker = "extra == 'services'", specifier = "==1.1.0" }, - { name = "langchain-community", marker = "extra == 'all'", specifier = ">=0.3.31,<0.4" }, - { name = "langchain-community", marker = "extra == 'evaluator-service'", specifier = ">=0.3.31,<0.4" }, - { name = "langchain-community", marker = "extra == 'services'", specifier = ">=0.3.31,<0.4" }, { name = "langchain-nvidia-ai-endpoints", marker = "extra == 'all'", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-nvidia-ai-endpoints", marker = "extra == 'evaluator-service'", specifier = ">=1.0.0,<2.0.0" }, { name = "langchain-nvidia-ai-endpoints", marker = "extra == 'guardrails-service'", specifier = ">=1.0.0,<2.0.0" }, + { name = "langchain-nvidia-ai-endpoints", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=1.0.0,<2.0.0" }, { name = "langchain-nvidia-ai-endpoints", marker = "extra == 'services'", specifier = ">=1.0.0,<2.0.0" }, { name = "langchain-openai", marker = "extra == 'all'", specifier = ">=1.0.0,<2.0.0" }, { name = "langchain-openai", marker = "extra == 'guardrails-service'", specifier = ">=1.0.0,<2.0.0" }, + { name = "langchain-openai", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=1.1.14" }, { name = "langchain-openai", marker = "extra == 'services'", specifier = ">=1.0.0,<2.0.0" }, { name = "lark", marker = "extra == 'all'", specifier = ">=1.1.0" }, { name = "lark", marker = "extra == 'core-service'", specifier = ">=1.1.0" }, @@ -5317,7 +4998,6 @@ requires-dist = [ { name = "nemo-anonymizer", marker = "extra == 'plugins'", specifier = ">=0.2.1" }, { name = "nemo-anonymizer", marker = "extra == 'services'", specifier = ">=0.2.1" }, { name = "nemo-evaluator-sdk", marker = "extra == 'all'", editable = "packages/nemo_evaluator_sdk" }, - { name = "nemo-evaluator-sdk", marker = "extra == 'evaluator-service'", editable = "packages/nemo_evaluator_sdk" }, { name = "nemo-evaluator-sdk", marker = "extra == 'nemo-evaluator-plugin'", editable = "packages/nemo_evaluator_sdk" }, { name = "nemo-evaluator-sdk", marker = "extra == 'plugins'", editable = "packages/nemo_evaluator_sdk" }, { name = "nemo-evaluator-sdk", marker = "extra == 'services'", editable = "packages/nemo_evaluator_sdk" }, @@ -5370,7 +5050,6 @@ requires-dist = [ { name = "nmp-common", marker = "extra == 'auth-service'", editable = "packages/nmp_common" }, { name = "nmp-common", marker = "extra == 'core-service'", editable = "packages/nmp_common" }, { name = "nmp-common", marker = "extra == 'entities-service'", editable = "packages/nmp_common" }, - { name = "nmp-common", marker = "extra == 'evaluator-service'", editable = "packages/nmp_common" }, { name = "nmp-common", marker = "extra == 'files-service'", editable = "packages/nmp_common" }, { name = "nmp-common", marker = "extra == 'guardrails-service'", editable = "packages/nmp_common" }, { name = "nmp-common", marker = "extra == 'hello-world-service'", editable = "packages/nmp_common" }, @@ -5401,7 +5080,6 @@ requires-dist = [ { name = "nvidia-nat-langchain", marker = "extra == 'plugins'", specifier = ">=1.7.0,<1.8" }, { name = "nvidia-nat-langchain", marker = "extra == 'services'", specifier = ">=1.7.0,<1.8" }, { name = "openai", marker = "extra == 'all'", specifier = ">=1.61.0" }, - { name = "openai", marker = "extra == 'evaluator-service'", specifier = ">=1.61.0" }, { name = "openai", marker = "extra == 'guardrails-service'", specifier = ">=1.61.0" }, { name = "openai", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=1.61.0" }, { name = "openai", marker = "extra == 'nemo-platform-plugin'", specifier = ">=1.109.1" }, @@ -5409,17 +5087,11 @@ requires-dist = [ { name = "openai", marker = "extra == 'services'", specifier = ">=1.61.0" }, { name = "openai", marker = "extra == 'switchyard'", specifier = ">=2.34.0,<3.0" }, { name = "opentelemetry-distro", marker = "extra == 'all'", specifier = ">=0.41b0" }, - { name = "opentelemetry-distro", marker = "extra == 'all'", specifier = ">=0.48b0,<1.0" }, - { name = "opentelemetry-distro", marker = "extra == 'evaluator-service'", specifier = ">=0.48b0,<1.0" }, { name = "opentelemetry-distro", marker = "extra == 'guardrails-service'", specifier = ">=0.41b0" }, { name = "opentelemetry-distro", marker = "extra == 'services'", specifier = ">=0.41b0" }, - { name = "opentelemetry-distro", marker = "extra == 'services'", specifier = ">=0.48b0,<1.0" }, { name = "opentelemetry-exporter-otlp", marker = "extra == 'all'", specifier = ">=1.22.0" }, - { name = "opentelemetry-exporter-otlp", marker = "extra == 'all'", specifier = ">=1.27.0" }, - { name = "opentelemetry-exporter-otlp", marker = "extra == 'evaluator-service'", specifier = ">=1.27.0" }, { name = "opentelemetry-exporter-otlp", marker = "extra == 'guardrails-service'", specifier = ">=1.22.0" }, { name = "opentelemetry-exporter-otlp", marker = "extra == 'services'", specifier = ">=1.22.0" }, - { name = "opentelemetry-exporter-otlp", marker = "extra == 'services'", specifier = ">=1.27.0" }, { name = "opentelemetry-exporter-otlp-proto-grpc", marker = "extra == 'nmp-common'", specifier = ">=1.38.0" }, { name = "opentelemetry-exporter-otlp-proto-http", marker = "extra == 'nmp-common'", specifier = ">=1.38.0" }, { name = "opentelemetry-exporter-prometheus", marker = "extra == 'nmp-common'", specifier = ">=0.59b0" }, @@ -5463,12 +5135,9 @@ requires-dist = [ { name = "prometheus-fastapi-instrumentator", marker = "extra == 'nmp-common'", specifier = ">=7.1.0" }, { name = "prompt-toolkit", marker = "extra == 'nemo-platform-sdk'", specifier = ">=3.0.0" }, { name = "psutil", marker = "extra == 'nemo-platform-sdk'", specifier = ">=5.9.0" }, - { name = "psycopg2-binary", marker = "extra == 'all'", specifier = ">=2.9.9,<3.0.0" }, { name = "psycopg2-binary", marker = "extra == 'all'", specifier = ">=2.9.10" }, { name = "psycopg2-binary", marker = "extra == 'core-service'", specifier = ">=2.9.10" }, { name = "psycopg2-binary", marker = "extra == 'entities-service'", specifier = ">=2.9.10" }, - { name = "psycopg2-binary", marker = "extra == 'evaluator-service'", specifier = ">=2.9.9,<3.0.0" }, - { name = "psycopg2-binary", marker = "extra == 'services'", specifier = ">=2.9.9,<3.0.0" }, { name = "psycopg2-binary", marker = "extra == 'services'", specifier = ">=2.9.10" }, { name = "pyarrow", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=19.0.1" }, { name = "pydantic", marker = "extra == 'all'", specifier = ">=2.0.0" }, @@ -5481,7 +5150,6 @@ requires-dist = [ { name = "pydantic", marker = "extra == 'core-service'", specifier = ">=2.10.6" }, { name = "pydantic", marker = "extra == 'data-designer-nemo'", specifier = ">=2" }, { name = "pydantic", marker = "extra == 'entities-service'", specifier = ">=2.0.0" }, - { name = "pydantic", marker = "extra == 'evaluator-service'", specifier = ">=2.10.3" }, { name = "pydantic", marker = "extra == 'files-service'", specifier = ">=2.10.6" }, { name = "pydantic", marker = "extra == 'inference-gateway-service'", specifier = ">=2.10.6" }, { name = "pydantic", marker = "extra == 'intake-service'", specifier = ">=2.9.2,<3.0.0" }, @@ -5513,7 +5181,6 @@ requires-dist = [ { name = "pydantic-settings", marker = "extra == 'core-service'", specifier = ">=2.6.1" }, { name = "pydantic-settings", marker = "extra == 'core-service'", specifier = ">=2.8.1" }, { name = "pydantic-settings", marker = "extra == 'entities-service'", specifier = ">=2.0.0" }, - { name = "pydantic-settings", marker = "extra == 'evaluator-service'", specifier = ">=2.6.1" }, { name = "pydantic-settings", marker = "extra == 'files-service'", specifier = ">=2.8.1" }, { name = "pydantic-settings", marker = "extra == 'guardrails-service'", specifier = ">=2.2.1" }, { name = "pydantic-settings", marker = "extra == 'inference-gateway-service'", specifier = ">=2.8.1" }, @@ -5532,12 +5199,6 @@ requires-dist = [ { name = "pyjwt", extras = ["crypto"], marker = "extra == 'nmp-common'", specifier = ">=2.12.0" }, { name = "pyleak", marker = "extra == 'all'", specifier = ">=0.1.0" }, { name = "pyleak", marker = "extra == 'services'", specifier = ">=0.1.0" }, - { name = "pymilvus", marker = "extra == 'all'", specifier = "==2.6.9" }, - { name = "pymilvus", marker = "extra == 'evaluator-service'", specifier = "==2.6.9" }, - { name = "pymilvus", marker = "extra == 'services'", specifier = "==2.6.9" }, - { name = "python-box", marker = "extra == 'all'", specifier = ">=7.3.2" }, - { name = "python-box", marker = "extra == 'evaluator-service'", specifier = ">=7.3.2" }, - { name = "python-box", marker = "extra == 'services'", specifier = ">=7.3.2" }, { name = "python-multipart", marker = "extra == 'all'", specifier = "~=0.0.9" }, { name = "python-multipart", marker = "extra == 'guardrails-service'", specifier = "~=0.0.9" }, { name = "python-multipart", marker = "extra == 'nemo-safe-synthesizer-plugin'", specifier = "~=0.0.9" }, @@ -5563,19 +5224,14 @@ requires-dist = [ { name = "pyyaml", marker = "extra == 'plugins'", specifier = ">=6.0.2" }, { name = "pyyaml", marker = "extra == 'services'", specifier = ">=6.0.0" }, { name = "pyyaml", marker = "extra == 'services'", specifier = ">=6.0.2" }, - { name = "ragas", marker = "extra == 'all'", specifier = "==0.3.5" }, - { name = "ragas", marker = "extra == 'evaluator-service'", specifier = "==0.3.5" }, - { name = "ragas", marker = "extra == 'services'", specifier = "==0.3.5" }, + { name = "ragas", marker = "extra == 'nemo-evaluator-sdk'", specifier = "==0.3.5" }, { name = "requests", marker = "extra == 'all'", specifier = ">=2.31.0" }, - { name = "requests", marker = "extra == 'all'", specifier = ">=2.31.0,<3.0.0" }, { name = "requests", marker = "extra == 'auditor-service'", specifier = ">=2.32.3,<3.0.0" }, - { name = "requests", marker = "extra == 'evaluator-service'", specifier = ">=2.31.0,<3.0.0" }, { name = "requests", marker = "extra == 'guardrails-service'", specifier = ">=2.31.0" }, { name = "requests", marker = "extra == 'nemo-platform-sdk'", specifier = ">=2.31.0" }, { name = "requests", marker = "extra == 'nemo-safe-synthesizer-plugin'", specifier = ">=2.31.0" }, { name = "requests", marker = "extra == 'plugins'", specifier = ">=2.31.0" }, { name = "requests", marker = "extra == 'services'", specifier = ">=2.31.0" }, - { name = "requests", marker = "extra == 'services'", specifier = ">=2.31.0,<3.0.0" }, { name = "rich", marker = "extra == 'all'", specifier = ">=13.7.1" }, { name = "rich", marker = "extra == 'all'", specifier = ">=14.1.0" }, { name = "rich", marker = "extra == 'nemo-agents-plugin'", specifier = ">=13.7.1" }, @@ -5591,17 +5247,11 @@ requires-dist = [ { name = "sqlalchemy", marker = "extra == 'entities-service'", specifier = ">=2.0.0" }, { name = "sqlalchemy", marker = "extra == 'nmp-common'", specifier = ">=2.0.0" }, { name = "sqlalchemy", marker = "extra == 'services'", specifier = ">=2.0.0" }, - { name = "sqlmodel", marker = "extra == 'all'", specifier = ">=0.0.14,<1.0.0" }, { name = "sqlmodel", marker = "extra == 'all'", specifier = ">=0.0.22" }, { name = "sqlmodel", marker = "extra == 'core-service'", specifier = ">=0.0.22" }, - { name = "sqlmodel", marker = "extra == 'evaluator-service'", specifier = ">=0.0.14,<1.0.0" }, { name = "sqlmodel", marker = "extra == 'jobs-service'", specifier = ">=0.0.22" }, { name = "sqlmodel", marker = "extra == 'models-service'", specifier = ">=0.0.22" }, - { name = "sqlmodel", marker = "extra == 'services'", specifier = ">=0.0.14,<1.0.0" }, { name = "sqlmodel", marker = "extra == 'services'", specifier = ">=0.0.22" }, - { name = "starlette", marker = "extra == 'all'", specifier = ">=0.52.1,<1.0.0" }, - { name = "starlette", marker = "extra == 'evaluator-service'", specifier = ">=0.52.1,<1.0.0" }, - { name = "starlette", marker = "extra == 'services'", specifier = ">=0.52.1,<1.0.0" }, { name = "streaming-form-data", marker = "extra == 'all'", specifier = ">=1.19.1" }, { name = "streaming-form-data", marker = "extra == 'core-service'", specifier = ">=1.19.1" }, { name = "streaming-form-data", marker = "extra == 'files-service'", specifier = ">=1.19.1" }, @@ -5636,11 +5286,9 @@ requires-dist = [ { name = "urllib3", marker = "extra == 'models-service'", specifier = ">=2.7.0" }, { name = "urllib3", marker = "extra == 'services'", specifier = ">=2.7.0" }, { name = "uvicorn", marker = "extra == 'all'", specifier = ">=0.22.0,<1.0.0" }, - { name = "uvicorn", marker = "extra == 'all'", specifier = ">=0.24.0.post0,<1.0.0.0" }, { name = "uvicorn", marker = "extra == 'all'", specifier = ">=0.32.1" }, { name = "uvicorn", marker = "extra == 'all'", specifier = ">=0.34.0" }, { name = "uvicorn", marker = "extra == 'core-service'", specifier = ">=0.34.0" }, - { name = "uvicorn", marker = "extra == 'evaluator-service'", specifier = ">=0.24.0.post0,<1.0.0.0" }, { name = "uvicorn", marker = "extra == 'files-service'", specifier = ">=0.34.0" }, { name = "uvicorn", marker = "extra == 'guardrails-service'", specifier = ">=0.32.1" }, { name = "uvicorn", marker = "extra == 'inference-gateway-service'", specifier = ">=0.34.0" }, @@ -5651,7 +5299,6 @@ requires-dist = [ { name = "uvicorn", marker = "extra == 'plugins'", specifier = ">=0.32.1" }, { name = "uvicorn", marker = "extra == 'secrets-service'", specifier = ">=0.34.0" }, { name = "uvicorn", marker = "extra == 'services'", specifier = ">=0.22.0,<1.0.0" }, - { name = "uvicorn", marker = "extra == 'services'", specifier = ">=0.24.0.post0,<1.0.0.0" }, { name = "uvicorn", marker = "extra == 'services'", specifier = ">=0.32.1" }, { name = "uvicorn", marker = "extra == 'services'", specifier = ">=0.34.0" }, { name = "uvicorn", extras = ["standard"], marker = "extra == 'all'", specifier = ">=0.12.0" }, @@ -5673,7 +5320,7 @@ requires-dist = [ { name = "yara-python", marker = "extra == 'guardrails-service'", specifier = "==4.5.1" }, { name = "yara-python", marker = "extra == 'services'", specifier = "==4.5.1" }, ] -provides-extras = ["aiohttp", "all", "auditor-service", "auth-service", "core-service", "data-designer-nemo", "entities-service", "evaluator-service", "files-service", "guardrails-service", "hello-world-service", "inference-gateway-service", "intake-service", "jobs-service", "models-service", "nemo-agents-example-calculator", "nemo-agents-plugin", "nemo-anonymizer-plugin", "nemo-auditor-plugin", "nemo-data-designer-plugin", "nemo-evaluator-plugin", "nemo-evaluator-sdk", "nemo-guardrails-plugin", "nemo-platform-plugin", "nemo-platform-sdk", "nemo-safe-synthesizer-plugin", "nemo-switchyard", "nmp-common", "platform-seed-service", "plugins", "secrets-service", "services", "studio-service", "switchyard"] +provides-extras = ["aiohttp", "all", "auditor-service", "auth-service", "core-service", "data-designer-nemo", "entities-service", "files-service", "guardrails-service", "hello-world-service", "inference-gateway-service", "intake-service", "jobs-service", "models-service", "nemo-agents-example-calculator", "nemo-agents-plugin", "nemo-anonymizer-plugin", "nemo-auditor-plugin", "nemo-data-designer-plugin", "nemo-evaluator-plugin", "nemo-evaluator-sdk", "nemo-guardrails-plugin", "nemo-platform-plugin", "nemo-platform-sdk", "nemo-safe-synthesizer-plugin", "nemo-switchyard", "nmp-common", "platform-seed-service", "plugins", "secrets-service", "services", "studio-service", "switchyard"] [[package]] name = "nemo-platform-ext" @@ -5830,10 +5477,13 @@ nemo-evaluator-sdk = [ { name = "jinja2", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jsonpath-ng", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jsonschema", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "langchain-nvidia-ai-endpoints", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "langchain-openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pandas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyarrow", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "ragas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rouge-score", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sacrebleu", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] @@ -5868,6 +5518,8 @@ requires-dist = [ { name = "jinja2", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=3.1.6" }, { name = "jsonpath-ng", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=1.7.0" }, { name = "jsonschema", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=4.23.0" }, + { name = "langchain-nvidia-ai-endpoints", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=1.0.0,<2.0.0" }, + { name = "langchain-openai", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=1.1.14" }, { name = "nemo-platform-plugin", editable = "packages/nemo_platform_plugin" }, { name = "ngcsdk", specifier = ">=4.8.2" }, { name = "nvidia-ml-py", specifier = ">=13.0.0" }, @@ -5880,6 +5532,7 @@ requires-dist = [ { name = "pydantic", specifier = ">=2.0.0,<3" }, { name = "pydantic", marker = "extra == 'nemo-evaluator-sdk'", specifier = ">=2.10.6" }, { name = "pyyaml", specifier = ">=6.0.0" }, + { name = "ragas", marker = "extra == 'nemo-evaluator-sdk'", specifier = "==0.3.5" }, { name = "requests", specifier = ">=2.31.0" }, { name = "rich", specifier = ">=13.7.1" }, { name = "rouge-score", marker = "extra == 'nemo-evaluator-sdk'", specifier = "==0.1.2" }, @@ -5992,6 +5645,7 @@ name = "nemo-safe-synthesizer-plugin" version = "0.1.0" source = { editable = "plugins/nemo-safe-synthesizer" } dependencies = [ + { name = "datasets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fastapi", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fsspec", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "gunicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -6028,6 +5682,7 @@ test = [ [package.metadata] requires-dist = [ { name = "anthropic", marker = "extra == 'nemo-platform-plugin'", specifier = ">=0.88.0" }, + { name = "datasets", specifier = ">=3.3.1,<=4.3.0" }, { name = "fastapi", specifier = ">=0.115.8" }, { name = "fastapi", marker = "extra == 'nemo-platform-plugin'", specifier = ">=0.115.4" }, { name = "fastapi", marker = "extra == 'test'", specifier = ">=0.115" }, @@ -6174,7 +5829,6 @@ dependencies = [ { name = "nmp-common", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-core-mcp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-entities", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nmp-evaluator", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-files", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-guardrails", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-hello-world", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -6229,7 +5883,6 @@ cpu-tasks = [ { name = "nemo-platform", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nemo-platform-plugin", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-common", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nmp-evaluator", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-hello-world", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-platform", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] @@ -6261,7 +5914,6 @@ dev = [ { name = "nmp-common", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-core-mcp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-dev-mcp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nmp-evaluator", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-guardrails", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-hello-world", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-intake", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -6325,7 +5977,6 @@ functional-services = [ { name = "nmp-auth", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-common", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-entities", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nmp-evaluator", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-files", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-guardrails", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "nmp-hello-world", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -6374,7 +6025,6 @@ requires-dist = [ { name = "nmp-common", editable = "packages/nmp_common" }, { name = "nmp-core-mcp", editable = "services/core/mcp" }, { name = "nmp-entities", editable = "services/core/entities" }, - { name = "nmp-evaluator", editable = "services/evaluator" }, { name = "nmp-files", editable = "services/core/files" }, { name = "nmp-guardrails", editable = "services/guardrails" }, { name = "nmp-hello-world", editable = "services/hello-world" }, @@ -6430,7 +6080,6 @@ cpu-tasks = [ { name = "nemo-platform", editable = "packages/nemo_platform" }, { name = "nemo-platform-plugin", editable = "packages/nemo_platform_plugin" }, { name = "nmp-common", editable = "packages/nmp_common" }, - { name = "nmp-evaluator", editable = "services/evaluator" }, { name = "nmp-hello-world", editable = "services/hello-world" }, { name = "nmp-platform", editable = "packages/nmp_platform" }, ] @@ -6462,7 +6111,6 @@ dev = [ { name = "nmp-common", editable = "packages/nmp_common" }, { name = "nmp-core-mcp", editable = "services/core/mcp" }, { name = "nmp-dev-mcp", editable = "tools/mcp-dev-tools" }, - { name = "nmp-evaluator", editable = "services/evaluator" }, { name = "nmp-guardrails", editable = "services/guardrails" }, { name = "nmp-hello-world", editable = "services/hello-world" }, { name = "nmp-intake", editable = "services/intake" }, @@ -6529,7 +6177,6 @@ functional-services = [ { name = "nmp-auth", editable = "services/core/auth" }, { name = "nmp-common", editable = "packages/nmp_common" }, { name = "nmp-entities", editable = "services/core/entities" }, - { name = "nmp-evaluator", editable = "services/evaluator" }, { name = "nmp-files", editable = "services/core/files" }, { name = "nmp-guardrails", editable = "services/guardrails" }, { name = "nmp-hello-world", editable = "services/hello-world" }, @@ -6587,7 +6234,7 @@ wheels = [ [[package]] name = "ngcsdk" -version = "4.19.1" +version = "4.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiofiles", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -6611,7 +6258,7 @@ dependencies = [ { name = "validators", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/02/07/413ee98909fb863b8209965c42d9707d26cefb7f309b82922946e7cc6e0e/ngcsdk-4.19.1-py3-none-any.whl", hash = "sha256:945455d06f9a215772660472d2ff4432c67a53986f86a384a98fbee62b01e434", size = 3137086, upload-time = "2026-06-01T20:03:24.666Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c1/1f4195a83c2a41f3c130096f05ae22d8291afa72d00ef01ae9dbe91da69c/ngcsdk-4.16.0-py3-none-any.whl", hash = "sha256:3fe7267fab02b5e4c63521ade365a708238113a1b19802e53fa699b548e13fce", size = 3081403, upload-time = "2026-04-01T20:43:27.362Z" }, ] [[package]] @@ -6905,105 +6552,6 @@ dev = [ { name = "ruff", specifier = ">=0.0.285" }, ] -[[package]] -name = "nmp-evaluator" -version = "0.0.1" -source = { editable = "services/evaluator" } -dependencies = [ - { name = "aiofiles", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "aiohttp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "alembic", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "base58", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "datasets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "fastapi", extra = ["standard"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "jsonpath-ng", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "kubernetes", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "langchain-community", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "langchain-nvidia-ai-endpoints", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nemo-evaluator-sdk", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nmp-common", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "openai", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "opentelemetry-distro", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "opentelemetry-exporter-otlp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "psycopg2-binary", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pydantic-settings", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pymilvus", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "python-box", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "ragas", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sqlmodel", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "starlette", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "uvicorn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] - -[package.dev-dependencies] -dev = [ - { name = "aioresponses", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "flake8", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "ipdb", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "ipython", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nmp-testing", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pre-commit", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pytest", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pytest-asyncio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pytest-cov", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pytest-httpserver", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pytest-mock", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pytest-subtests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "responses", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] - -[package.metadata] -requires-dist = [ - { name = "aiofiles", specifier = ">=25.1.0" }, - { name = "aiohttp", specifier = ">=3.13.4" }, - { name = "alembic", specifier = ">=1.13.1,<2.0.0" }, - { name = "base58", specifier = ">=2.1.1,<3.0.0" }, - { name = "datasets", specifier = ">=3.3.1" }, - { name = "fastapi", extras = ["standard"], specifier = ">=0.115.4" }, - { name = "huggingface-hub", specifier = ">=1.0.1,<2.0.0" }, - { name = "jsonpath-ng", specifier = ">=1.6.0" }, - { name = "kubernetes", specifier = ">=31.0.0" }, - { name = "langchain-community", specifier = ">=0.3.31,<0.4" }, - { name = "langchain-nvidia-ai-endpoints", specifier = ">=1.0.0,<2.0.0" }, - { name = "nemo-evaluator-sdk", editable = "packages/nemo_evaluator_sdk" }, - { name = "nmp-common", editable = "packages/nmp_common" }, - { name = "openai", specifier = ">=1.61.0" }, - { name = "opentelemetry-distro", specifier = ">=0.48b0,<1.0" }, - { name = "opentelemetry-exporter-otlp", specifier = ">=1.27.0" }, - { name = "psycopg2-binary", specifier = ">=2.9.9,<3.0.0" }, - { name = "pydantic", specifier = ">=2.10.3" }, - { name = "pydantic-settings", specifier = ">=2.6.1" }, - { name = "pymilvus", specifier = "==2.6.9" }, - { name = "python-box", specifier = ">=7.3.2" }, - { name = "ragas", specifier = "==0.3.5" }, - { name = "requests", specifier = ">=2.31.0,<3.0.0" }, - { name = "sqlmodel", specifier = ">=0.0.14,<1.0.0" }, - { name = "starlette", specifier = ">=0.52.1,<1.0.0" }, - { name = "uvicorn", specifier = ">=0.24.0.post0,<1.0.0.0" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "aioresponses", specifier = ">=0.7.8" }, - { name = "flake8", specifier = ">=6.1.0,<7.0.0" }, - { name = "httpx", specifier = ">=0.26.0,<1.0.0" }, - { name = "ipdb", specifier = ">=0.13.13,<1.0.0" }, - { name = "ipython", specifier = ">=8.17.2,<9.0.0" }, - { name = "nmp-testing", editable = "packages/nmp_testing" }, - { name = "pre-commit", specifier = ">=3.5.0,<4.0.0" }, - { name = "pytest", specifier = ">=9.0.3,<10.0.0" }, - { name = "pytest-asyncio", specifier = ">=0.24.0" }, - { name = "pytest-cov", specifier = ">=6.0.0" }, - { name = "pytest-httpserver" }, - { name = "pytest-mock", specifier = ">=3.14.0,<4.0.0" }, - { name = "pytest-subtests", specifier = ">=0.13.1" }, - { name = "responses", specifier = ">=0.24.1,<1.0.0" }, -] - [[package]] name = "nmp-files" version = "0.1.0" @@ -7678,7 +7226,7 @@ wheels = [ [[package]] name = "notebook" -version = "7.5.7" +version = "7.5.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-server", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -7687,9 +7235,9 @@ dependencies = [ { name = "notebook-shim", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tornado", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/c4/f71f8716f2903e9e817a47f534b9fd84831e155e2acb32c26691c8e06243/notebook-7.5.7.tar.gz", hash = "sha256:d6d59288a25303b25e1dcb71e9b017ec3a785f7d92f38b9bc288ca1970d5b0a8", size = 14171612, upload-time = "2026-06-04T18:33:45.224Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/c2/cf59bd2e6f2c8b976b52477e3e53bf6f97bc714ed046a51821afb428eaee/notebook-7.5.6.tar.gz", hash = "sha256:621174aade80108f0020b0f00738000b215f75fa3cd90771ad7aa0f24536a4e1", size = 14170814, upload-time = "2026-04-30T11:46:26.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/4d/b3347f7073a377273531efe4ffc738fc910e93718fd2838c7ebf6736c6af/notebook-7.5.7-py3-none-any.whl", hash = "sha256:1f95f79d117e47d20b5555b5c85a397d2cfecf136978aaab767cf0314b09165b", size = 14583767, upload-time = "2026-06-04T18:33:40.987Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d6/1fd0646b9bbd9efbb0b8ae21b2325fbef515769a5621c03e31d8eb8da587/notebook-7.5.6-py3-none-any.whl", hash = "sha256:4dde3f8fb55fa8fb7946d58c6e869ce9baf46d00fc070664f62604569d0faca0", size = 14581730, upload-time = "2026-04-30T11:46:22.342Z" }, ] [[package]] @@ -7706,7 +7254,7 @@ wheels = [ [[package]] name = "nox" -version = "2026.4.10" +version = "2026.2.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "argcomplete", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -7717,170 +7265,156 @@ dependencies = [ { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "virtualenv", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/e672c862a43cfca704d32359221fa3780226daa1e5db5dfc401bcc8be9c9/nox-2026.4.10.tar.gz", hash = "sha256:2d0af5374f3f37a295428c927d1b04a8182aa01762897d172446dda2f1ce9692", size = 4034839, upload-time = "2026-04-10T17:42:42.209Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/8e/55a9679b31f1efc48facedd2448eb53c7f1e647fb592aa1403c9dd7a4590/nox-2026.2.9.tar.gz", hash = "sha256:1bc8a202ee8cd69be7aaada63b2a7019126899a06fc930a7aee75585bf8ee41b", size = 4031165, upload-time = "2026-02-10T04:38:58.878Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/95/4df134a100b5a9a12378d5301b934366686ef6fbdaffcd21211d5654970e/nox-2026.4.10-py3-none-any.whl", hash = "sha256:082c117627590d9b90aa21f86df89b310b07c5842539524203bcb3c719f116c1", size = 75536, upload-time = "2026-04-10T17:42:40.664Z" }, + { url = "https://files.pythonhosted.org/packages/8d/58/0d5e5a044f1868bdc45f38afdc2d90ff9867ce398b4e8fa9e666bfc9bfba/nox-2026.2.9-py3-none-any.whl", hash = "sha256:1b7143bc8ecdf25f2353201326152c5303ae4ae56ca097b1fb6179ad75164c47", size = 74615, upload-time = "2026-02-10T04:38:57.266Z" }, ] [[package]] name = "numpy" -version = "2.4.6" +version = "2.4.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, - { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, - { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, - { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, - { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, - { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, - { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, - { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, - { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, - { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, - { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, - { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, - { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, - { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, - { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, - { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, - { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, - { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, - { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, - { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, - { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, - { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, - { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, - { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, - { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, + { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, + { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, + { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, + { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, ] [[package]] -name = "nvidia-cublas" -version = "13.1.1.3" +name = "nvidia-cublas-cu12" +version = "12.8.4.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/a1/0bd24ee8c8d03adac032fd2909426a00c88f8c57961b1277ded97f91119f/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b7a210458267ac818974c53038fbec2e969d5c99f305ab15c72522fa9f001dd5", size = 542848918, upload-time = "2026-04-08T18:46:22.985Z" }, - { url = "https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:37936a16db8fe4ac1f065c2139360608a543a09275cb1a1af612e08cfa065436", size = 423138758, upload-time = "2026-04-08T18:46:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" }, ] [[package]] -name = "nvidia-cuda-cupti" -version = "13.0.85" +name = "nvidia-cuda-cupti-cu12" +version = "12.8.90" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" }, - { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" }, + { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" }, ] [[package]] -name = "nvidia-cuda-nvrtc" -version = "13.0.88" +name = "nvidia-cuda-nvrtc-cu12" +version = "12.8.93" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" }, - { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" }, ] [[package]] -name = "nvidia-cuda-runtime" -version = "13.0.96" +name = "nvidia-cuda-runtime-cu12" +version = "12.8.90" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" }, - { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" }, ] [[package]] -name = "nvidia-cudnn-cu13" -version = "9.20.0.48" +name = "nvidia-cudnn-cu12" +version = "9.10.2.21" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/56/c5/83384d846b2fd17c44bd499b36c75a45ed4f095fbbb2252294e89cea5c5c/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:e31454ae00094b0c55319d9d15b6fa2fc50a9e1c0f5c8c80fb75258234e731e1", size = 444574296, upload-time = "2026-03-09T19:28:27.751Z" }, - { url = "https://files.pythonhosted.org/packages/6e/5e/edb9c0ae051602c3ccaffe424256463636d639e27d7f302dde9975ef9e7a/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0c45dd8eeb50b603f07995b1b300c62ffe6a1980482b82b3bcf94a4ca9d49304", size = 366173588, upload-time = "2026-03-09T19:29:34.474Z" }, + { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" }, ] [[package]] -name = "nvidia-cufft" -version = "12.0.0.61" +name = "nvidia-cufft-cu12" +version = "11.3.3.83" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" }, + { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" }, ] [[package]] -name = "nvidia-cufile" -version = "1.15.1.6" +name = "nvidia-cufile-cu12" +version = "1.13.1.3" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" }, - { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" }, + { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" }, ] [[package]] -name = "nvidia-curand" -version = "10.4.0.35" +name = "nvidia-curand-cu12" +version = "10.3.9.90" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" }, - { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" }, + { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" }, ] [[package]] -name = "nvidia-cusolver" -version = "12.0.4.66" +name = "nvidia-cusolver-cu12" +version = "11.7.3.90" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, - { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" }, + { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" }, ] [[package]] -name = "nvidia-cusparse" -version = "12.6.3.3" +name = "nvidia-cusparse-cu12" +version = "12.5.8.93" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, - { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" }, ] [[package]] -name = "nvidia-cusparselt-cu13" -version = "0.8.1" +name = "nvidia-cusparselt-cu12" +version = "0.7.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/e1/cdc1797eadf82d3a9a575a19b33fdc871a97edbec42c00b5b5e914f4aff4/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4dca476c50bf4780d46cd0bfbd82e2bc10a08e4fef7950917ce8d7578d22a23f", size = 221051344, upload-time = "2025-09-05T18:49:51.289Z" }, - { url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" }, ] [[package]] name = "nvidia-ml-py" -version = "13.610.43" +version = "13.595.45" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/b5/a8fbc356f768fa5c9cfd646668fd7d34bf55bdd1c6e20754642a64d930d4/nvidia_ml_py-13.610.43.tar.gz", hash = "sha256:65437eb73d68d0c62c931ca4d45038472faff03bd0b8729abba4b899f70d60f2", size = 52109, upload-time = "2026-06-01T18:54:08.829Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/49/c29f6e30d8662d2e94fef17739ea7309cc76aba269922ae999e4cc07f268/nvidia_ml_py-13.595.45.tar.gz", hash = "sha256:c9f34897fe0441ff35bc8f35baf80f830a20b0f4e6ce71e0a325bc0e66acf079", size = 50780, upload-time = "2026-03-19T16:59:44.956Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/45/caa600acfab94560807a20a64b5830d2cd3c3202b7f1328644d70b7d6bd8/nvidia_ml_py-13.610.43-py3-none-any.whl", hash = "sha256:f13c72698edef492f985cc225f14faafe68ae065a2e407f45bdf6f4b9b43fde8", size = 53163, upload-time = "2026-06-01T18:54:07.704Z" }, + { url = "https://files.pythonhosted.org/packages/8a/24/fc256107d23597fa33d319505ce77160fa1a2349c096d01901ffc7cb7fc4/nvidia_ml_py-13.595.45-py3-none-any.whl", hash = "sha256:b65a7977f503d56154b14d683710125ef93594adb63fbf7e559336e3318f1376", size = 51776, upload-time = "2026-03-19T16:59:43.603Z" }, ] [[package]] @@ -8009,39 +7543,35 @@ wheels = [ ] [[package]] -name = "nvidia-nccl-cu13" -version = "2.29.7" +name = "nvidia-nccl-cu12" +version = "2.27.5" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/0d/daf50d44177ee0cbc7ff0a0c91eb5ff676c82be42f9a970bc7597f440c3a/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:674a12383e3c38a1bcccae7d4f3633b37852230b6047883cb2f4c2d1b36d9bf5", size = 206014712, upload-time = "2026-03-03T05:34:20.843Z" }, - { url = "https://files.pythonhosted.org/packages/67/f4/58e4e91b6919367c7aafb8e36fce9aad1a3047e536bf7e2fd560927d3a4c/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:edd81538446786ec3b73972543e53bb43bcaf0bfc8ef76cb679fcc390ffe136d", size = 205976000, upload-time = "2026-03-03T05:36:24.472Z" }, + { url = "https://files.pythonhosted.org/packages/6e/89/f7a07dc961b60645dbbf42e80f2bc85ade7feb9a491b11a1e973aa00071f/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457", size = 322348229, upload-time = "2025-06-26T04:11:28.385Z" }, ] [[package]] -name = "nvidia-nvjitlink" -version = "13.0.88" +name = "nvidia-nvjitlink-cu12" +version = "12.8.93" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/7a/123e033aaff487c77107195fa5a2b8686795ca537935a24efae476c41f05/nvidia_nvjitlink-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:13a74f429e23b921c1109976abefacc69835f2f433ebd323d3946e11d804e47b", size = 40713933, upload-time = "2025-09-04T08:35:43.553Z" }, - { url = "https://files.pythonhosted.org/packages/ab/2c/93c5250e64df4f894f1cbb397c6fd71f79813f9fd79d7cd61de3f97b3c2d/nvidia_nvjitlink-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e931536ccc7d467a98ba1d8b89ff7fa7f1fa3b13f2b0069118cd7f47bff07d0c", size = 38768748, upload-time = "2025-09-04T08:35:20.008Z" }, + { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" }, ] [[package]] -name = "nvidia-nvshmem-cu13" +name = "nvidia-nvshmem-cu12" version = "3.4.5" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" }, - { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/6ea3ea725f82e1e76684f0708bbedd871fc96da89945adeba65c3835a64c/nvidia_nvshmem_cu12-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:042f2500f24c021db8a06c5eec2539027d57460e1c1a762055a6554f72c369bd", size = 139103095, upload-time = "2025-09-06T00:32:31.266Z" }, ] [[package]] -name = "nvidia-nvtx" -version = "13.0.85" +name = "nvidia-nvtx-cu12" +version = "12.8.90" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" }, - { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" }, + { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" }, ] [[package]] @@ -8055,21 +7585,20 @@ wheels = [ [[package]] name = "oci" -version = "2.178.0" +version = "2.174.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "circuitbreaker", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "crc32c", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "cryptography", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pyopenssl", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "python-dateutil", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pytz", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "urllib3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d0/c8/25eb226edcd2ede3fb5bedf5bfa5054cde98006414b3cd76b82111ec8126/oci-2.178.0.tar.gz", hash = "sha256:d3a19859d80aa5c4988905e1a30b46dcc2af146c76f3d8c813129d71247d1a94", size = 17465409, upload-time = "2026-06-09T13:56:14.586Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/45/5edb442e8197860b4fc26fd82305abf3df356827862ee11febfd8bf6ebbe/oci-2.174.0.tar.gz", hash = "sha256:f960e413a7f0e59ca5523b57349165f992812bd2738abc34bd9fecbce4722733", size = 17352965, upload-time = "2026-05-12T00:52:26.527Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/21/0f8f654086cbd878da1263a0ca5a81b0f4584fb98d56c6f262c25d2cb949/oci-2.178.0-py3-none-any.whl", hash = "sha256:830cb97cbcac818f8eb8d05d4abbc00192f4bcef10260b14d0978f649799a26e", size = 35670909, upload-time = "2026-06-09T13:56:04.592Z" }, + { url = "https://files.pythonhosted.org/packages/7d/37/37a7d97a32e897b066f367448851471f52fcf8d46a16255a4532b2684821/oci-2.174.0-py3-none-any.whl", hash = "sha256:36c377fb59452b607686d73c1ae1604f2c19e3cabd7d12abe43a4404b10a17c5", size = 35404400, upload-time = "2026-05-12T00:52:17.116Z" }, ] [[package]] @@ -8089,31 +7618,32 @@ wheels = [ [[package]] name = "onnxruntime" -version = "1.26.0" +version = "1.24.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "flatbuffers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "protobuf", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sympy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/81/29a9eb470994a75eb7b3ccf32be314d7c66675a00ac7b50294816cc2db27/onnxruntime-1.26.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ee1109ef4ef27cad90e823399e61e03b3c6c7bfe0fb820b4baf3678c15be8b3c", size = 18005108, upload-time = "2026-05-08T19:08:11.728Z" }, - { url = "https://files.pythonhosted.org/packages/66/c7/73efa6c8a4000c38fcc14947d84f234a17e5d66f203b37b7f1ad4a7b46eb/onnxruntime-1.26.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35c7c7b0ac2e02001d28fab6c9fc24e9abc5e6faa35e6e19c63cecf1406ba89f", size = 16043752, upload-time = "2026-05-08T19:07:10.707Z" }, - { url = "https://files.pythonhosted.org/packages/b6/3f/8de630f595daf6ce884d4dd95afd2a60e70ec6572e52bfee3aa2229befab/onnxruntime-1.26.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11a8df4dcfe9ad5ff0bd71a7571dbed019fabc7594676c89fe8b86ea029c246f", size = 18176043, upload-time = "2026-05-08T19:07:33.735Z" }, - { url = "https://files.pythonhosted.org/packages/81/b1/d111b1df656761f980d9e298a60039a9cb66036b1d039e777537743d0ac3/onnxruntime-1.26.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05b028781b322ad74b57ce5b50aa5280bb1fe96ceec334628ade681e0b24c1ac", size = 18016624, upload-time = "2026-05-12T00:41:01.735Z" }, - { url = "https://files.pythonhosted.org/packages/f6/a0/3f9d896a0385a36bd04345d6d0b802821a5782adde562e7e135f6bb71c73/onnxruntime-1.26.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91f2bb870a4b9224eba0a6728c1fa7a9e552b8e59e1083c51fbbc3d013f2b5c0", size = 16052692, upload-time = "2026-05-08T19:07:13.829Z" }, - { url = "https://files.pythonhosted.org/packages/7c/43/2a4e04f8dbeffad19bbcced4bcd4289bf478921518437404d6b92bdf213b/onnxruntime-1.26.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b6dd70599005bd1bf29779f04a91978b92b5e719c11a20068a8f8e535f725b6", size = 18185439, upload-time = "2026-05-08T19:07:36.299Z" }, - { url = "https://files.pythonhosted.org/packages/cf/a2/c801242685e0ce48a4ca51dfafbb588765e0446397e123be53ba5598f3f5/onnxruntime-1.26.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccce19c5f771b8268902f77d9fed9e88f9499465d6780808faa6611a789d33f0", size = 18016563, upload-time = "2026-05-08T19:07:28.081Z" }, - { url = "https://files.pythonhosted.org/packages/e2/64/0492c0b1db04e29b2630c87cfa36f9d6872b1ca8614b90c5cad58fac7d76/onnxruntime-1.26.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdbed8cf3b672b66acb032f33a253bc27f42bce6ece48ae3fab4fa483a5e96e0", size = 16052634, upload-time = "2026-05-08T19:07:16.885Z" }, - { url = "https://files.pythonhosted.org/packages/3d/26/4d09ddc755a84fc8d5e192991626b0e0680e8f6c5d58f4f1d05c42bc48cf/onnxruntime-1.26.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c07af6fc6d5557835f2b6ee7a96d8b3235d0c57a8e230efdedaee106a8a3cbc6", size = 18185632, upload-time = "2026-05-08T19:07:38.756Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f5/47b0676408abec652c14b84d7173e389837832d850c24f87184277313e8d/onnxruntime-1.26.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e016edc15d3c19f36807e1c6b10be5b27807688c32720f91b5ae480a95215d0", size = 16057265, upload-time = "2026-05-08T19:07:19.603Z" }, - { url = "https://files.pythonhosted.org/packages/3b/45/33ab6deeef010ca844c877dd618cebc079590bbe52d2a3678e7223b1b908/onnxruntime-1.26.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5fc48a91a046a6a5c9b147f83fb41d65d24d24923373b222cdd248f0f4f4aac", size = 18197590, upload-time = "2026-05-08T19:07:41.422Z" }, + { url = "https://files.pythonhosted.org/packages/60/69/6c40720201012c6af9aa7d4ecdd620e521bd806dc6269d636fdd5c5aeebe/onnxruntime-1.24.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0bdfce8e9a6497cec584aab407b71bf697dac5e1b7b7974adc50bf7533bdb3a2", size = 17332131, upload-time = "2026-03-17T22:05:49.005Z" }, + { url = "https://files.pythonhosted.org/packages/38/e9/8c901c150ce0c368da38638f44152fb411059c0c7364b497c9e5c957321a/onnxruntime-1.24.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:046ff290045a387676941a02a8ae5c3ebec6b4f551ae228711968c4a69d8f6b7", size = 15152472, upload-time = "2026-03-17T22:03:26.176Z" }, + { url = "https://files.pythonhosted.org/packages/d5/b6/7a4df417cdd01e8f067a509e123ac8b31af450a719fa7ed81787dd6057ec/onnxruntime-1.24.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e54ad52e61d2d4618dcff8fa1480ac66b24ee2eab73331322db1049f11ccf330", size = 17222993, upload-time = "2026-03-17T22:04:34.485Z" }, + { url = "https://files.pythonhosted.org/packages/d7/38/31db1b232b4ba960065a90c1506ad7a56995cd8482033184e97fadca17cc/onnxruntime-1.24.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cad1c2b3f455c55678ab2a8caa51fb420c25e6e3cf10f4c23653cdabedc8de78", size = 17341875, upload-time = "2026-03-17T22:05:51.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/60/c4d1c8043eb42f8a9aa9e931c8c293d289c48ff463267130eca97d13357f/onnxruntime-1.24.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a5c5a544b22f90859c88617ecb30e161ee3349fcc73878854f43d77f00558b5", size = 15172485, upload-time = "2026-03-17T22:03:32.182Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ab/5b68110e0460d73fad814d5bd11c7b1ddcce5c37b10177eb264d6a36e331/onnxruntime-1.24.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d640eb9f3782689b55cfa715094474cd5662f2f137be6a6f847a594b6e9705c", size = 17244912, upload-time = "2026-03-17T22:04:37.251Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f0/8a21ec0a97e40abb7d8da1e8b20fb9e1af509cc6d191f6faa75f73622fb2/onnxruntime-1.24.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e99a48078baaefa2b50fe5836c319499f71f13f76ed32d0211f39109147a49e0", size = 17341922, upload-time = "2026-03-17T22:03:56.364Z" }, + { url = "https://files.pythonhosted.org/packages/8b/25/d7908de8e08cee9abfa15b8aa82349b79733ae5865162a3609c11598805d/onnxruntime-1.24.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4aaed1e5e1aaacf2343c838a30a7c3ade78f13eeb16817411f929d04040a13", size = 15172290, upload-time = "2026-03-17T22:03:37.124Z" }, + { url = "https://files.pythonhosted.org/packages/7f/72/105ec27a78c5aa0154a7c0cd8c41c19a97799c3b12fc30392928997e3be3/onnxruntime-1.24.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e30c972bc02e072911aabb6891453ec73795386c0af2b761b65444b8a4c4745f", size = 17244738, upload-time = "2026-03-17T22:04:40.625Z" }, + { url = "https://files.pythonhosted.org/packages/b4/af/a479a536c4398ffaf49fbbe755f45d5b8726bdb4335ab31b537f3d7149b8/onnxruntime-1.24.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1700f559c8086d06b2a4d5de51e62cb4ff5e2631822f71a36db8c72383db71ee", size = 15176861, upload-time = "2026-03-17T22:03:40.143Z" }, + { url = "https://files.pythonhosted.org/packages/be/13/19f5da70c346a76037da2c2851ecbf1266e61d7f0dcdb887c667210d4608/onnxruntime-1.24.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c74e268dc808e61e63784d43f9ddcdaf50a776c2819e8bd1d1b11ef64bf7e36", size = 17247454, upload-time = "2026-03-17T22:04:46.643Z" }, ] [[package]] name = "openai" -version = "2.41.0" +version = "2.35.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8125,9 +7655,9 @@ dependencies = [ { name = "tqdm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/a6/5815fe2e2aca74b36c650d1bd43b69827cee568073d0d2d9b6fc5aaac80c/openai-2.41.0.tar.gz", hash = "sha256:db5c362acd6604b84f076abbefa66826ea4b46ecba2954ed866e6a149a1352c0", size = 783525, upload-time = "2026-06-03T22:39:40.719Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/4c/35a5216fe5f1cd4d7002b037ba47cff10b71cbd4bddcb601262c664d08de/openai-2.35.0.tar.gz", hash = "sha256:607f62257d6be167240c6b82db052fabf940e3c4d9ad3e8629364e837a601395", size = 751972, upload-time = "2026-05-06T16:36:55.166Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/51/d82bb424e8aa372190c5233253a2ceb399a778747d18b42cff487411e663/openai-2.41.0-py3-none-any.whl", hash = "sha256:20cc7952e8501c7e5773dd2ef7be437bae9cb549044902e1041a83a54516e375", size = 1353378, upload-time = "2026-06-03T22:39:38.964Z" }, + { url = "https://files.pythonhosted.org/packages/58/b7/c43595f7f441cbc62ac3144a080d71952566b213f7a21bca0564d69e39fd/openai-2.35.0-py3-none-any.whl", hash = "sha256:164fd0477d001e784369f7cd81ccadb8db3c22f16b33973d8f95e3095c7f71d8", size = 1300139, upload-time = "2026-05-06T16:36:53.108Z" }, ] [[package]] @@ -8142,6 +7672,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" }, ] +[[package]] +name = "opencv-python" +version = "4.13.0.92" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/6f/5a28fef4c4a382be06afe3938c64cc168223016fa520c5abaf37e8862aa5/opencv_python-4.13.0.92-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:caf60c071ec391ba51ed00a4a920f996d0b64e3e46068aac1f646b5de0326a19", size = 46247052, upload-time = "2026-02-05T07:01:25.046Z" }, +] + [[package]] name = "openevals" version = "0.2.0" @@ -8159,67 +7700,68 @@ wheels = [ [[package]] name = "openinference-semantic-conventions" -version = "0.1.30" +version = "0.1.29" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2c/51/8ba1182ee86fc79793d5ff2d11e7fdcda10ded2d01f3e46ca6fcf0568213/openinference_semantic_conventions-0.1.30.tar.gz", hash = "sha256:81fece76e09c83789e35c393b8b30523481eeabf1008745b955631a53e3221d9", size = 13391, upload-time = "2026-05-22T21:10:44.065Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/6b/9ed67f9ce8c92436b297207abde730800b00bdec7e114f71b8dfe91cd26b/openinference_semantic_conventions-0.1.29.tar.gz", hash = "sha256:bbeb6472777a45a574169894bb9c4d80c6832a8befd32ab238cb875438ce1044", size = 12959, upload-time = "2026-04-22T00:39:27.916Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/76/5b7e78cf0de38589b821bbe8e9c29c59a6e76edfb980488d0854cbb90f7c/openinference_semantic_conventions-0.1.30-py3-none-any.whl", hash = "sha256:36d946d3f95f699b7c4b12324ae9c1f02d6c7750df11eece56aa159cff430b3d", size = 10911, upload-time = "2026-05-22T21:10:43.04Z" }, + { url = "https://files.pythonhosted.org/packages/be/7b/45ad1b95315b5563baa7338c8e8088bb1af66905c46e1bd1fe6ecbe30ea8/openinference_semantic_conventions-0.1.29-py3-none-any.whl", hash = "sha256:f45e0b1cf79fe407af4722bcf391a01565f0878c95be3ebcc9382245d0367cc5", size = 10582, upload-time = "2026-04-22T00:39:27.066Z" }, ] [[package]] name = "opentelemetry-api" -version = "1.42.1" +version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "importlib-metadata", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/1c/125e1c936c0873796771b7f04f6c93b9f1bf5d424cea90fda94a99f61da8/opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716", size = 72296, upload-time = "2026-05-21T16:32:49.335Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/1d/4049a9e8698361cc1a1aa03a6c59e4fa4c71e0c0f94a30f988a6876a2ae6/opentelemetry_api-1.40.0.tar.gz", hash = "sha256:159be641c0b04d11e9ecd576906462773eb97ae1b657730f0ecf64d32071569f", size = 70851, upload-time = "2026-03-04T14:17:21.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/ca/9520cc1f3dfbbd03ac5903bbf55833e257bc64b1cf30fa8b0d6df374d821/opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714", size = 61311, upload-time = "2026-05-21T16:32:28.822Z" }, + { url = "https://files.pythonhosted.org/packages/5f/bf/93795954016c522008da367da292adceed71cca6ee1717e1d64c83089099/opentelemetry_api-1.40.0-py3-none-any.whl", hash = "sha256:82dd69331ae74b06f6a874704be0cfaa49a1650e1537d4a813b86ecef7d0ecf9", size = 68676, upload-time = "2026-03-04T14:17:01.24Z" }, ] [[package]] name = "opentelemetry-distro" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-instrumentation", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-sdk", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/97/87080029d9309841dd97db34130f9410cda77162843f81d09ad257dce1ef/opentelemetry_distro-0.63b1.tar.gz", hash = "sha256:f435098abc7953f58226e8bf79e4c90bc6b32e50aa75d6fa074201db8243b577", size = 2333, upload-time = "2026-05-21T16:36:11.285Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/00/1f8acc51326956a596fefaf67751380001af36029132a7a07d4debce3c06/opentelemetry_distro-0.61b0.tar.gz", hash = "sha256:975b845f50181ad53753becf4fd4b123b54fa04df5a9d78812264436d6518981", size = 2590, upload-time = "2026-03-04T14:20:12.453Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/97/16619e2e0e5192f2d1b8da2aaaefface05463cc1cfca6b81d3a3108ccedd/opentelemetry_distro-0.63b1-py3-none-any.whl", hash = "sha256:b405b04ad70e430390265eb38e82e067a84ca1f49a21429eaadb930c13330d66", size = 2777, upload-time = "2026-05-21T16:34:51.441Z" }, + { url = "https://files.pythonhosted.org/packages/56/2c/efcc995cd7484e6e55b1d26bd7fa6c55ca96bd415ff94310b52c19f330b0/opentelemetry_distro-0.61b0-py3-none-any.whl", hash = "sha256:f21d1ac0627549795d75e332006dd068877f00e461b1b2e8fe4568d6eb7b9590", size = 3349, upload-time = "2026-03-04T14:18:57.788Z" }, ] [[package]] name = "opentelemetry-exporter-otlp" -version = "1.42.1" +version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-exporter-otlp-proto-grpc", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-exporter-otlp-proto-http", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/94/8637919a5d01f81dacf510234bc0110b944f4687a6e96b0a02adf2f6bdce/opentelemetry_exporter_otlp-1.42.1.tar.gz", hash = "sha256:2d9ebaed714377a67d224d46795ddcc11d2c877fa5de35fda70b6f3b010729a9", size = 6086, upload-time = "2026-05-21T16:32:51.963Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/37/b6708e0eff5c5fb9aba2e0ea09f7f3bcbfd12a592d2a780241b5f6014df7/opentelemetry_exporter_otlp-1.40.0.tar.gz", hash = "sha256:7caa0870b95e2fcb59d64e16e2b639ecffb07771b6cd0000b5d12e5e4fef765a", size = 6152, upload-time = "2026-03-04T14:17:23.235Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/4d/c26080295a36fd22e201fefd7cb9c22cd203189b1af8cd73b158382b7ad8/opentelemetry_exporter_otlp-1.42.1-py3-none-any.whl", hash = "sha256:aedd54545bb0587cd45210abdc8be545af9c01413f3307786e276df1e3c83bee", size = 6733, upload-time = "2026-05-21T16:32:31.261Z" }, + { url = "https://files.pythonhosted.org/packages/2d/fc/aea77c28d9f3ffef2fdafdc3f4a235aee4091d262ddabd25882f47ce5c5f/opentelemetry_exporter_otlp-1.40.0-py3-none-any.whl", hash = "sha256:48c87e539ec9afb30dc443775a1334cc5487de2f72a770a4c00b1610bf6c697d", size = 7023, upload-time = "2026-03-04T14:17:03.612Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.42.1" +version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0e/9c/216acfeaedadf2e1937f4373929b20f73197c5c4a2546d4f584b7fa63813/opentelemetry_exporter_otlp_proto_common-1.42.1.tar.gz", hash = "sha256:04f1f01fb597c4249dfcd7f8b861c902c2102369d376d9d346ff38de4469a2ee", size = 21433, upload-time = "2026-05-21T16:32:55.526Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/bc/1559d46557fe6eca0b46c88d4c2676285f1f3be2e8d06bb5d15fbffc814a/opentelemetry_exporter_otlp_proto_common-1.40.0.tar.gz", hash = "sha256:1cbee86a4064790b362a86601ee7934f368b81cd4cc2f2e163902a6e7818a0fa", size = 20416, upload-time = "2026-03-04T14:17:23.801Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/43/2375e7612e1121a4518c17603b6e0b03ad94f565aafad53f464dc5be2bf6/opentelemetry_exporter_otlp_proto_common-1.42.1-py3-none-any.whl", hash = "sha256:f48d395ab815b444da118868977e9798ea354c25737d5cf39578ae894011c140", size = 17327, upload-time = "2026-05-21T16:32:33.387Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ca/8f122055c97a932311a3f640273f084e738008933503d0c2563cd5d591fc/opentelemetry_exporter_otlp_proto_common-1.40.0-py3-none-any.whl", hash = "sha256:7081ff453835a82417bf38dccf122c827c3cbc94f2079b03bba02a3165f25149", size = 18369, upload-time = "2026-03-04T14:17:04.796Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.42.1" +version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8230,14 +7772,14 @@ dependencies = [ { name = "opentelemetry-sdk", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/87/ca7fc790dfdbcf4f9e9aab14a39ef1b7508ead13707e283de0b3131478d2/opentelemetry_exporter_otlp_proto_grpc-1.42.1.tar.gz", hash = "sha256:975c4461f167dd8ed8857d68d3b6b25f3d272eab896f6a9470d0f5b90e2faf15", size = 27140, upload-time = "2026-05-21T16:32:56.162Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/7f/b9e60435cfcc7590fa87436edad6822240dddbc184643a2a005301cc31f4/opentelemetry_exporter_otlp_proto_grpc-1.40.0.tar.gz", hash = "sha256:bd4015183e40b635b3dab8da528b27161ba83bf4ef545776b196f0fb4ec47740", size = 25759, upload-time = "2026-03-04T14:17:24.4Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/2b/28ba5b128f47fe8c3bab541000d6feb4b5a9bd26623ca013406f01c0fb60/opentelemetry_exporter_otlp_proto_grpc-1.42.1-py3-none-any.whl", hash = "sha256:0ae1177e2038b18a929b3098215243631ef91136cba26b7e2b12790ceb7e87cc", size = 19617, upload-time = "2026-05-21T16:32:34.278Z" }, + { url = "https://files.pythonhosted.org/packages/96/6f/7ee0980afcbdcd2d40362da16f7f9796bd083bf7f0b8e038abfbc0300f5d/opentelemetry_exporter_otlp_proto_grpc-1.40.0-py3-none-any.whl", hash = "sha256:2aa0ca53483fe0cf6405087a7491472b70335bc5c7944378a0a8e72e86995c52", size = 20304, upload-time = "2026-03-04T14:17:05.942Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.42.1" +version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8248,28 +7790,28 @@ dependencies = [ { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/32/826bfa1d80ecea24f47808de03cd4a0d13c17ecc07712f45123f0f61e4ac/opentelemetry_exporter_otlp_proto_http-1.42.1.tar.gz", hash = "sha256:bf142a21035d7571ac3a09cb2e5639f49886f243972883cfe777ed3bf02b734d", size = 25406, upload-time = "2026-05-21T16:32:56.807Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/fa/73d50e2c15c56be4d000c98e24221d494674b0cc95524e2a8cb3856d95a4/opentelemetry_exporter_otlp_proto_http-1.40.0.tar.gz", hash = "sha256:db48f5e0f33217588bbc00274a31517ba830da576e59503507c839b38fa0869c", size = 17772, upload-time = "2026-03-04T14:17:25.324Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/96/82cb223a1502f0787d4bbff12907f5f8d870a50731febcd5818d93ef9555/opentelemetry_exporter_otlp_proto_http-1.42.1-py3-none-any.whl", hash = "sha256:00a16da1b312a1d6c7233d600d557c91df71125af73020f3b9a7765bd699d59d", size = 21793, upload-time = "2026-05-21T16:32:35.277Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3a/8865d6754e61c9fb170cdd530a124a53769ee5f740236064816eb0ca7301/opentelemetry_exporter_otlp_proto_http-1.40.0-py3-none-any.whl", hash = "sha256:a8d1dab28f504c5d96577d6509f80a8150e44e8f45f82cdbe0e34c99ab040069", size = 19960, upload-time = "2026-03-04T14:17:07.153Z" }, ] [[package]] name = "opentelemetry-exporter-prometheus" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-sdk", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "prometheus-client", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/2a/dfeddff262b12eff0c72f4ad9e258aab8889f48c4dc1417a0377a13bc427/opentelemetry_exporter_prometheus-0.63b1.tar.gz", hash = "sha256:31902e22c89431058a95b6dcdb644f9309f226aa4872cc755f0a780d2895e97f", size = 15234, upload-time = "2026-05-21T16:32:57.797Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/20/9e818fd364d12e8d0cfdce4a3b2d82e24d98c4ceebb315de6b6770b5f214/opentelemetry_exporter_prometheus-0.61b0.tar.gz", hash = "sha256:7c4919bd8e79abd62b610767e80f42c9c3a06c5183f4dd9141eedeb57aea284b", size = 15136, upload-time = "2026-03-04T14:17:26.275Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/ec/d7c7435e9000fb69837cf7753b7cbbbdeb5d0585203daf1b6ebf8fa93e02/opentelemetry_exporter_prometheus-0.63b1-py3-none-any.whl", hash = "sha256:0efd00aa6b1939345ddcc6de141b83ebffa2b4401a37a68f880e54217602701d", size = 12466, upload-time = "2026-05-21T16:32:36.622Z" }, + { url = "https://files.pythonhosted.org/packages/02/4a/b65d40e94d1d930aee73a1a2857211ee6ab10ce3686cbdae5eea78cd9d34/opentelemetry_exporter_prometheus-0.61b0-py3-none-any.whl", hash = "sha256:3013b41f4370143d48d219a2351473761423e5882fa4c213811eaefacba39cb7", size = 13149, upload-time = "2026-03-04T14:17:08.983Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8277,14 +7819,14 @@ dependencies = [ { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "wrapt", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/6d/4de72d97ff54db1ed270c7a59c9b904b917c0ac7af429c086c388b824ddb/opentelemetry_instrumentation-0.63b1.tar.gz", hash = "sha256:32368d6ae52c8de20aa790a6ad86b10a76f09956092337ae37d675773990e541", size = 41081, upload-time = "2026-05-21T16:36:14.206Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/37/6bf8e66bfcee5d3c6515b79cb2ee9ad05fe573c20f7ceb288d0e7eeec28c/opentelemetry_instrumentation-0.61b0.tar.gz", hash = "sha256:cb21b48db738c9de196eba6b805b4ff9de3b7f187e4bbf9a466fa170514f1fc7", size = 32606, upload-time = "2026-03-04T14:20:16.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/a1/9314e621c143e4d82a5bf7a43c2ff7a745d31023506336857607c8c543cc/opentelemetry_instrumentation-0.63b1-py3-none-any.whl", hash = "sha256:f1986716d52cc316ea5f60189098726a9071d8ecc0eee96c9ed110be08bade9c", size = 35577, upload-time = "2026-05-21T16:34:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/d8/3e/f6f10f178b6316de67f0dfdbbb699a24fbe8917cf1743c1595fb9dcdd461/opentelemetry_instrumentation-0.61b0-py3-none-any.whl", hash = "sha256:92a93a280e69788e8f88391247cc530fd81f16f2b011979d4d6398f805cfbc63", size = 33448, upload-time = "2026-03-04T14:19:02.447Z" }, ] [[package]] name = "opentelemetry-instrumentation-asgi" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8293,14 +7835,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-util-http", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a0/b5/7ea3a9fd1b80e89786c14250bfaecf32a753c3fd08232690f4da8dc16e29/opentelemetry_instrumentation_asgi-0.63b1.tar.gz", hash = "sha256:267b422416d768f3c7f4054883b41d9c3a7c943d86d20032b738c99a3dbb5862", size = 26151, upload-time = "2026-05-21T16:36:18.368Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/3e/143cf5c034e58037307e6a24f06e0dd64b2c49ae60a965fc580027581931/opentelemetry_instrumentation_asgi-0.61b0.tar.gz", hash = "sha256:9d08e127244361dc33976d39dd4ca8f128b5aa5a7ae425208400a80a095019b5", size = 26691, upload-time = "2026-03-04T14:20:21.038Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/7e/83986f27b421de04fab1e1a84e892621dac42e6432a9c66779505f4d1381/opentelemetry_instrumentation_asgi-0.63b1-py3-none-any.whl", hash = "sha256:1a22453dfa965f14799b10a674b8acbcb897a8a75c79136060af54214cc7886e", size = 15906, upload-time = "2026-05-21T16:35:04.162Z" }, + { url = "https://files.pythonhosted.org/packages/19/78/154470cf9d741a7487fbb5067357b87386475bbb77948a6707cae982e158/opentelemetry_instrumentation_asgi-0.61b0-py3-none-any.whl", hash = "sha256:e4b3ce6b66074e525e717efff20745434e5efd5d9df6557710856fba356da7a4", size = 16980, upload-time = "2026-03-04T14:19:10.894Z" }, ] [[package]] name = "opentelemetry-instrumentation-fastapi" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8309,14 +7851,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-util-http", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/d6/0c128fac2e34b7d526a8d3c6edc45b875a97f8a987861b00511151b6337d/opentelemetry_instrumentation_fastapi-0.63b1.tar.gz", hash = "sha256:cc42dff56c96d0a2921510c4abab2a4c2e27fe64b26dc1254727fb550df100ba", size = 25387, upload-time = "2026-05-21T16:36:32.071Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/35/aa727bb6e6ef930dcdc96a617b83748fece57b43c47d83ba8d83fbeca657/opentelemetry_instrumentation_fastapi-0.61b0.tar.gz", hash = "sha256:3a24f35b07c557ae1bbc483bf8412221f25d79a405f8b047de8b670722e2fa9f", size = 24800, upload-time = "2026-03-04T14:20:32.759Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/3d/2eae63f13f36d7a8ab5bf03d06ecaf169c2069b524547f24947be6d92094/opentelemetry_instrumentation_fastapi-0.63b1-py3-none-any.whl", hash = "sha256:52ee2cde9a2ac094bdd45d79f85860e03a972928a2553006071fe61d94cf7281", size = 12795, upload-time = "2026-05-21T16:35:28.68Z" }, + { url = "https://files.pythonhosted.org/packages/91/05/acfeb2cccd434242a0a7d0ea29afaf077e04b42b35b485d89aee4e0d9340/opentelemetry_instrumentation_fastapi-0.61b0-py3-none-any.whl", hash = "sha256:a1a844d846540d687d377516b2ff698b51d87c781b59f47c214359c4a241047c", size = 13485, upload-time = "2026-03-04T14:19:30.351Z" }, ] [[package]] name = "opentelemetry-instrumentation-httpx" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8325,14 +7867,14 @@ dependencies = [ { name = "opentelemetry-util-http", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "wrapt", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/27/c2b4335bca030e893acbe5ff2b4f434868773bf94508be7e6bf5af981b24/opentelemetry_instrumentation_httpx-0.63b1.tar.gz", hash = "sha256:f41ec82f25c3abcdada621052db3e5fd648e3b43d55eec4b9c0c5d3ecb7b4ff4", size = 23557, upload-time = "2026-05-21T16:36:34.583Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/2a/e2becd55e33c29d1d9ef76e2579040ed1951cb33bacba259f6aff2fdd2a6/opentelemetry_instrumentation_httpx-0.61b0.tar.gz", hash = "sha256:6569ec097946c5551c2a4252f74c98666addd1bf047c1dde6b4ef426719ff8dd", size = 24104, upload-time = "2026-03-04T14:20:34.752Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/b8/f536780996195c3b9f2354998554671e05a7a262df8c043f63fe9e5a6f0b/opentelemetry_instrumentation_httpx-0.63b1-py3-none-any.whl", hash = "sha256:14df6e99d81be9a8cd238f6639b6fa52404c4d3ce219058fcb5dc8c0f2211f86", size = 16336, upload-time = "2026-05-21T16:35:32.221Z" }, + { url = "https://files.pythonhosted.org/packages/af/88/dde310dce56e2d85cf1a09507f5888544955309edc4b8d22971d6d3d1417/opentelemetry_instrumentation_httpx-0.61b0-py3-none-any.whl", hash = "sha256:dee05c93a6593a5dc3ae5d9d5c01df8b4e2c5d02e49275e5558534ee46343d5e", size = 17198, upload-time = "2026-03-04T14:19:33.585Z" }, ] [[package]] name = "opentelemetry-instrumentation-requests" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8340,14 +7882,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-util-http", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7b/39/7b14ef15c7c74b0da7d32b449732795a5cf7495897b72fc0b48280b96f50/opentelemetry_instrumentation_requests-0.63b1.tar.gz", hash = "sha256:513fcaa3d93debbdb359c00ce1a137a34a89ee908c51ac43beb7e8c18ac2b3cd", size = 18098, upload-time = "2026-05-21T16:36:46.02Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/c7/7a47cb85c7aa93a9c820552e414889185bcf91245271d12e5d443e5f834d/opentelemetry_instrumentation_requests-0.61b0.tar.gz", hash = "sha256:15f879ce8fb206bd7e6fdc61663ea63481040a845218c0cf42902ce70bd7e9d9", size = 18379, upload-time = "2026-03-04T14:20:46.959Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/18/a5e35fe8c9ad8041b71dd712658589de5d692aaa17d7cbce7f87a5cb0d0f/opentelemetry_instrumentation_requests-0.63b1-py3-none-any.whl", hash = "sha256:935c980a11e33bfd7ed969c741e4bd7c84077045651469f10e163534368d87f7", size = 13378, upload-time = "2026-05-21T16:35:52.166Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a1/a7a133b273d1f53950f16a370fc94367eff472c9c2576e8e9e28c62dcc9f/opentelemetry_instrumentation_requests-0.61b0-py3-none-any.whl", hash = "sha256:cce19b379949fe637eb73ba39b02c57d2d0805447ca6d86534aa33fcb141f683", size = 14207, upload-time = "2026-03-04T14:19:51.765Z" }, ] [[package]] name = "opentelemetry-instrumentation-sqlalchemy" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -8356,86 +7898,85 @@ dependencies = [ { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "wrapt", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cb/97/e5cb3ad027aebf7128faadeefe4d4cb0fc07ed32ef95e8fc9d828a077a85/opentelemetry_instrumentation_sqlalchemy-0.63b1.tar.gz", hash = "sha256:621f9eb800ea24a98b4eda968373e3909bfede0ff47f77b96f8b8a18bc2a2a1a", size = 18006, upload-time = "2026-05-21T16:36:46.855Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/4f/3a325b180944610697a0a926d49d782b41a86120050d44fefb2715b630ac/opentelemetry_instrumentation_sqlalchemy-0.61b0.tar.gz", hash = "sha256:13a3a159a2043a52f0180b3757fbaa26741b0e08abb50deddce4394c118956e6", size = 15343, upload-time = "2026-03-04T14:20:47.648Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/bc/c0984c4c51da64cc2c37ce031b4fb7fab61d223f2188a6bc6b5f18035ae3/opentelemetry_instrumentation_sqlalchemy-0.63b1-py3-none-any.whl", hash = "sha256:d417414f6517963e9c1ee91ec971b94938b46904499114d035a43937bd62b6a1", size = 14410, upload-time = "2026-05-21T16:35:53.342Z" }, + { url = "https://files.pythonhosted.org/packages/1f/97/b906a930c6a1a20c53ecc8b58cabc2cdd0ce560a2b5d44259084ffe4333e/opentelemetry_instrumentation_sqlalchemy-0.61b0-py3-none-any.whl", hash = "sha256:f115e0be54116ba4c327b8d7b68db4045ee18d44439d888ab8130a549c50d1c1", size = 14547, upload-time = "2026-03-04T14:19:53.088Z" }, ] [[package]] name = "opentelemetry-instrumentation-system-metrics" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-instrumentation", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "opentelemetry-semantic-conventions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "psutil", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/a4/c91a0e085808724ad4cb3bdd76bf9dac872c8a8910b24767cf95ffde67a5/opentelemetry_instrumentation_system_metrics-0.63b1.tar.gz", hash = "sha256:d6d4d7a1a854be4165143cf6420ee5894188762eb367d7bf9da5be4a83a4b632", size = 17412, upload-time = "2026-05-21T16:36:49.276Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/68/a403ade03a7ccba3d113a02c041942ab8feb4471101eb3a02da6403e9258/opentelemetry_instrumentation_system_metrics-0.61b0.tar.gz", hash = "sha256:3eb55f9a058797cf915946cbb7445e00b31316ac3e55050475792edf3367c321", size = 17637, upload-time = "2026-03-04T14:20:49.591Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/37/b8bddfab16c0a36af1941ec041b5bc8fe3c3d802997b4e819037908a90d5/opentelemetry_instrumentation_system_metrics-0.63b1-py3-none-any.whl", hash = "sha256:995051f47876d79461aed8b7aa205d4584d90794ef864342cc748929c389bb42", size = 14006, upload-time = "2026-05-21T16:35:56.979Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2b/3142c6e0f3c9a5be3e5187933bc28b0c8b7e77c04937aec317eee96e8fdb/opentelemetry_instrumentation_system_metrics-0.61b0-py3-none-any.whl", hash = "sha256:7d4fe3e0ce14e0e6eb18f5826100d6cc1af662e5a8ebc74e9b91fe23f192f3e8", size = 14909, upload-time = "2026-03-04T14:19:56.306Z" }, ] [[package]] name = "opentelemetry-processor-baggage" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-sdk", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "wrapt", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7b/43/69a8dcb2a540809c02bfc31d01b2e8228b4dd28c363d6d59577bcf9f1361/opentelemetry_processor_baggage-0.63b1.tar.gz", hash = "sha256:334b77963ea5807efd6f05664a6064aa92fc6c03571edbf1f749b9dee370d567", size = 8834, upload-time = "2026-05-21T16:36:54.591Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/0d/4afee20490ef53a449b1781b0671d84858742a2ccfb01c08de398a5d1ccd/opentelemetry_processor_baggage-0.61b0.tar.gz", hash = "sha256:4d1d2a624e3aa9a8b6c6d1f560ba2951f97acf875f57502a274c5078043a69d5", size = 7573, upload-time = "2026-03-04T14:20:54.941Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/44/3179fc05c69ca82657565d3223feb14d5208ede33e6838e42e7fe2dc01b8/opentelemetry_processor_baggage-0.63b1-py3-none-any.whl", hash = "sha256:b205c343720ce4d5e420204e09862a043917ee433b2304d87bb6f388084f3c15", size = 9488, upload-time = "2026-05-21T16:36:06.756Z" }, + { url = "https://files.pythonhosted.org/packages/ac/24/0ef2cf49e6ac9b2b422400abbf528230a409c9e174572f2d13e2dff7ec7c/opentelemetry_processor_baggage-0.61b0-py3-none-any.whl", hash = "sha256:f6b5937e93bda8f380d8f5f667355c7d127e9296b38dfacf39fd328ab410262c", size = 8881, upload-time = "2026-03-04T14:20:05.25Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.42.1" +version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/55/63eac3e1089b768ba014091fdd2ae8a9a440c821ef5e2b786909c94c8836/opentelemetry_proto-1.42.1.tar.gz", hash = "sha256:c6a51e6b4f05ae63565f3a113217f3d2bfaec68f78c02d7a6c85f9010d1cfca6", size = 45839, upload-time = "2026-05-21T16:33:03.937Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/77/dd38991db037fdfce45849491cb61de5ab000f49824a00230afb112a4392/opentelemetry_proto-1.40.0.tar.gz", hash = "sha256:03f639ca129ba513f5819810f5b1f42bcb371391405d99c168fe6937c62febcd", size = 45667, upload-time = "2026-03-04T14:17:31.194Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/9d/171c02c84a76940b7e601805b3bb536985aded9168fbcc9ba52f0a730fa2/opentelemetry_proto-1.42.1-py3-none-any.whl", hash = "sha256:dedb74cba2886c59c7789b227a7a670613025a07489040050aedff6e5c0fb43c", size = 71782, upload-time = "2026-05-21T16:32:44.867Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b2/189b2577dde745b15625b3214302605b1353436219d42b7912e77fa8dc24/opentelemetry_proto-1.40.0-py3-none-any.whl", hash = "sha256:266c4385d88923a23d63e353e9761af0f47a6ed0d486979777fe4de59dc9b25f", size = 72073, upload-time = "2026-03-04T14:17:16.673Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.42.1" +version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "opentelemetry-semantic-conventions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/f7/b390bd9bfd703bf98a68fea1f27786c6872331fd617164a54b8a59bdc008/opentelemetry_sdk-1.42.1.tar.gz", hash = "sha256:8c834e8f8c9ba4171d4ec843d0cb8a67e4c7394d3f9e9297e582cbd9456ddbf7", size = 239262, upload-time = "2026-05-21T16:33:04.641Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/fd/3c3125b20ba18ce2155ba9ea74acb0ae5d25f8cd39cfd37455601b7955cc/opentelemetry_sdk-1.40.0.tar.gz", hash = "sha256:18e9f5ec20d859d268c7cb3c5198c8d105d073714db3de50b593b8c1345a48f2", size = 184252, upload-time = "2026-03-04T14:17:31.87Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/6b/4287766cfbde577ae2272e8884abac325aeaac0d64f41c61d5b8cc595105/opentelemetry_sdk-1.42.1-py3-none-any.whl", hash = "sha256:083cd4bbfaa5aa7b5a9e552430d9951219967cfb27aa61feb13a77aba1fc839d", size = 170907, upload-time = "2026-05-21T16:32:45.894Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c5/6a852903d8bfac758c6dc6e9a68b015d3c33f2f1be5e9591e0f4b69c7e0a/opentelemetry_sdk-1.40.0-py3-none-any.whl", hash = "sha256:787d2154a71f4b3d81f20524a8ce061b7db667d24e46753f32a7bc48f1c1f3f1", size = 141951, upload-time = "2026-03-04T14:17:17.961Z" }, ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/99/4d7dd6df64795951413ce6e815f8cf1eb191daf7196ae86574589643d5f3/opentelemetry_semantic_conventions-0.63b1.tar.gz", hash = "sha256:3daf963611334b365e98a57438183eb012d3bfb40b2d931a9af613476b8701a9", size = 148340, upload-time = "2026-05-21T16:33:05.455Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/c0/4ae7973f3c2cfd2b6e321f1675626f0dab0a97027cc7a297474c9c8f3d04/opentelemetry_semantic_conventions-0.61b0.tar.gz", hash = "sha256:072f65473c5d7c6dc0355b27d6c9d1a679d63b6d4b4b16a9773062cb7e31192a", size = 145755, upload-time = "2026-03-04T14:17:32.664Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/7a/7fe66f5f3682b1dd47d88cc4e11f1c6c0966b737de2d16671146e23c39a5/opentelemetry_semantic_conventions-0.63b1-py3-none-any.whl", hash = "sha256:dfe5ef4dee82586b746f522b818ceb298d00b3d59f660042bd79404bff8d0682", size = 203713, upload-time = "2026-05-21T16:32:47.016Z" }, + { url = "https://files.pythonhosted.org/packages/b2/37/cc6a55e448deaa9b27377d087da8615a3416d8ad523d5960b78dbeadd02a/opentelemetry_semantic_conventions-0.61b0-py3-none-any.whl", hash = "sha256:fa530a96be229795f8cef353739b618148b0fe2b4b3f005e60e262926c4d38e2", size = 231621, upload-time = "2026-03-04T14:17:19.33Z" }, ] [[package]] name = "opentelemetry-util-http" -version = "0.63b1" +version = "0.61b0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/d8/7bf5e4cec0578ac3c28c18eb7b88f34279139cbc8c568d6aa02b9c5ae53e/opentelemetry_util_http-0.63b1.tar.gz", hash = "sha256:ba1268f00922ee522dba2ae38458060f99486e7385a8056985901ca9685adfff", size = 11102, upload-time = "2026-05-21T16:36:56.675Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/3c/f0196223efc5c4ca19f8fad3d5462b171ac6333013335ce540c01af419e9/opentelemetry_util_http-0.61b0.tar.gz", hash = "sha256:1039cb891334ad2731affdf034d8fb8b48c239af9b6dd295e5fabd07f1c95572", size = 11361, upload-time = "2026-03-04T14:20:57.01Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/f1/34e047e8f6a3c67e5220acf1af7b9f62868c25d77791bca74457bd2180a6/opentelemetry_util_http-0.63b1-py3-none-any.whl", hash = "sha256:6284194028c59cd439f8acfe388145069a6127f11dc077e1344a2094adacc3f8", size = 8205, upload-time = "2026-05-21T16:36:09.736Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e5/c08aaaf2f64288d2b6ef65741d2de5454e64af3e050f34285fb1907492fe/opentelemetry_util_http-0.61b0-py3-none-any.whl", hash = "sha256:8e715e848233e9527ea47e275659ea60a57a75edf5206a3b937e236a6da5fc33", size = 9281, upload-time = "2026-03-04T14:20:08.364Z" }, ] [[package]] @@ -8458,40 +7999,28 @@ wheels = [ [[package]] name = "orjson" -version = "3.11.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163, upload-time = "2026-05-06T15:11:08.309Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/51/3fb9e65ae76ee97bd611869a503fa3fc0a6e81dd8b737cf3003f682df7ff/orjson-3.11.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f01c4818b3fc9b0da8e096722a84318071eaa118df35f6ed2344da0e73a5444f", size = 228522, upload-time = "2026-05-06T15:09:35.362Z" }, - { url = "https://files.pythonhosted.org/packages/16/fa/9d54b07cb3f3b0bfd57841478e42d7a0ece4a9f49f9907eecf5a45461687/orjson-3.11.9-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:3ebca4179031ee716ed076ffadc29428e900512f6fccee8614c9983157fcf19c", size = 128463, upload-time = "2026-05-06T15:09:37.063Z" }, - { url = "https://files.pythonhosted.org/packages/88/b1/6ceafc2eefd0a553e3be77ce6c49d107e772485d9568629376171c50e634/orjson-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48ee05097750de0ff69ed5b7bbcf0732182fd57a24043dcc2a1da780a5ead3a5", size = 132306, upload-time = "2026-05-06T15:09:38.299Z" }, - { url = "https://files.pythonhosted.org/packages/ea/76/f11311285324a40aab1e3031385c50b635a7cd0734fdaf60c7e89a696f60/orjson-3.11.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6082706765a95a6680d812e1daf1c0cfe8adec7831b3ff3b625693f3b461b1c", size = 127988, upload-time = "2026-05-06T15:09:39.597Z" }, - { url = "https://files.pythonhosted.org/packages/05/94/b0d27090ea8a2095db3c2bd1b1c96f96f19bbb494d7fef33130e846e613d/orjson-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03db380e3780fa0015ed776a90f20e8e20bb11dde13b216ce19e5718e3dfba62", size = 145937, upload-time = "2026-05-06T15:09:42.249Z" }, - { url = "https://files.pythonhosted.org/packages/09/eb/75d50c29c05b8054013e221e598820a365c8e64065312e75e202ed880709/orjson-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33d7d766701847dc6729846362dc27895d2f2d2251264f9d10e7cb9878194877", size = 132758, upload-time = "2026-05-06T15:09:43.945Z" }, - { url = "https://files.pythonhosted.org/packages/49/bd/360686f39348aa88827cb6fbf7dc606fd41c831a35235e1abf1db8e3a9e6/orjson-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147302878da387104b66bb4a8b0227d1d487e976ce41a8501916161072ed87b1", size = 133971, upload-time = "2026-05-06T15:09:45.239Z" }, - { url = "https://files.pythonhosted.org/packages/0e/30/3178eb16f3221aeef068b6f1f1ebe05f656ea5c6dffe9f6c917329fe17a3/orjson-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3513550321f8c8c811a7c3297b8a630e82dc08e4c10216d07703c997776236cd", size = 141685, upload-time = "2026-05-06T15:09:46.858Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f1/ff2f19ed0225f9680fafa42febca3570dd59444ebf190980738d376214c2/orjson-3.11.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c5d001196b89fa9cf0a4ab79766cd835b991a166e4b621ba95089edc50c429ff", size = 415167, upload-time = "2026-05-06T15:09:48.312Z" }, - { url = "https://files.pythonhosted.org/packages/b6/8a/4081492586d75b073d60c5271a8d0f05a0955cabf1e34c8473f6fcd84235/orjson-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63e0efbc991250c0b3143488fa57d95affcabbfc63c99c48d625dd37779aafe2", size = 136959, upload-time = "2026-05-06T15:09:51.311Z" }, - { url = "https://files.pythonhosted.org/packages/16/6d/11867a3ffa3a3608d84a4de51ef4dd0896d6b5cc9132fbe1daf593e677bc/orjson-3.11.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9ef6fe90aadef185c7b128859f40beb24720b4ecea95379fc9000931179c3a49", size = 228515, upload-time = "2026-05-06T15:09:57.265Z" }, - { url = "https://files.pythonhosted.org/packages/24/75/05912954c8b288f34fcf5cd4b9b071cb4f6e77b9961e175e56ebb258089f/orjson-3.11.9-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e5c9b8f28e726e97d97696c826bc7bea5d71cecd63576dba92924a32c1961291", size = 128409, upload-time = "2026-05-06T15:09:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/ab/86/1c3a47df3bc8191ea9ac51603bbb872a95167a364320c269f2557911f406/orjson-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a473dbb4162108b27901492546f83c76fdcea3d0eadff00ae7a07e18dcce09", size = 132106, upload-time = "2026-05-06T15:10:00.798Z" }, - { url = "https://files.pythonhosted.org/packages/d7/cf/b33b5f3e695ae7d63feef9d915c37cc3b8f465493dcd4f8e0b4c697a2366/orjson-3.11.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:011382e2a60fda9d46f1cdee31068cfc52ffe952b587d683ec0463002802a0f4", size = 127864, upload-time = "2026-05-06T15:10:02.15Z" }, - { url = "https://files.pythonhosted.org/packages/e8/f8/0b1bd3e8f2efcdd376af5c8cfd79eaf13f018080c0089c80ebd724e3c7fb/orjson-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8ea516b3726d190e1b4297e6f4e7a8650347ae053868a18163b4dd3641d1fff", size = 145994, upload-time = "2026-05-06T15:10:05.083Z" }, - { url = "https://files.pythonhosted.org/packages/f3/59/dab79f61044c529d2c81aecdc589b1f833a1c8dec11ba3b1c2498a02ca7e/orjson-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380cdce7ba24989af81d0a7013d0aaec5d0e2a21734c0e2681b1bc4f141957fe", size = 132744, upload-time = "2026-05-06T15:10:06.853Z" }, - { url = "https://files.pythonhosted.org/packages/0e/a4/82b7a2fe5d8a67a59ed831b24d59a3d46ea7d207b66e1602d376541d94a6/orjson-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4fa4f0af7fa18951f7ab3fc2148e223af211bf03f59e1c6034ec3f97f21d61", size = 134014, upload-time = "2026-05-06T15:10:08.213Z" }, - { url = "https://files.pythonhosted.org/packages/50/c7/375e83a76851b73b2e39f3bcf0e5a19e2b89bad13e5bca97d0b293d27f24/orjson-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a8f5f8bc7ce7d59f08d9f99fa510c06496164a24cb5f3d34537dbd9ca30132e2", size = 141509, upload-time = "2026-05-06T15:10:09.595Z" }, - { url = "https://files.pythonhosted.org/packages/7f/7c/49d5d82a3d3097f641f094f552131f1e2723b0b8cb0fa2874ab65ecfffa6/orjson-3.11.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4d7fde5501b944f83b3e665e1b31343ff6e154b15560a16b7130ea1e594a4206", size = 415127, upload-time = "2026-05-06T15:10:11.049Z" }, - { url = "https://files.pythonhosted.org/packages/df/e5/4d2d8af06f788329b4f78f8cc3679bb395392fcaa1e4d8d3c33e85308fa4/orjson-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e63adb0e1f1ed5d9e168f50a91ceb93ae6420731d222dc7da5c69409aa47aa", size = 136943, upload-time = "2026-05-06T15:10:14.405Z" }, - { url = "https://files.pythonhosted.org/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458, upload-time = "2026-05-06T15:10:20.079Z" }, - { url = "https://files.pythonhosted.org/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368, upload-time = "2026-05-06T15:10:21.549Z" }, - { url = "https://files.pythonhosted.org/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070, upload-time = "2026-05-06T15:10:23.371Z" }, - { url = "https://files.pythonhosted.org/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892, upload-time = "2026-05-06T15:10:24.714Z" }, - { url = "https://files.pythonhosted.org/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980, upload-time = "2026-05-06T15:10:28.062Z" }, - { url = "https://files.pythonhosted.org/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738, upload-time = "2026-05-06T15:10:29.727Z" }, - { url = "https://files.pythonhosted.org/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033, upload-time = "2026-05-06T15:10:31.152Z" }, - { url = "https://files.pythonhosted.org/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492, upload-time = "2026-05-06T15:10:32.641Z" }, - { url = "https://files.pythonhosted.org/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087, upload-time = "2026-05-06T15:10:34.438Z" }, - { url = "https://files.pythonhosted.org/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915, upload-time = "2026-05-06T15:10:38.013Z" }, +version = "3.11.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/1b/2024d06792d0779f9dbc51531b61c24f76c75b9f4ce05e6f3377a1814cea/orjson-3.11.8.tar.gz", hash = "sha256:96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e", size = 5603832, upload-time = "2026-03-31T16:16:27.878Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/41/5aa7fa3b0f4dc6b47dcafc3cea909299c37e40e9972feabc8b6a74e2730d/orjson-3.11.8-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:003646067cc48b7fcab2ae0c562491c9b5d2cbd43f1e5f16d98fd118c5522d34", size = 229229, upload-time = "2026-03-31T16:14:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d7/57e7f2458e0a2c41694f39fc830030a13053a84f837a5b73423dca1f0938/orjson-3.11.8-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ed193ce51d77a3830cad399a529cd4ef029968761f43ddc549e1bc62b40d88f8", size = 128871, upload-time = "2026-03-31T16:14:51.888Z" }, + { url = "https://files.pythonhosted.org/packages/53/4a/e0fdb9430983e6c46e0299559275025075568aad5d21dd606faee3703924/orjson-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30491bc4f862aa15744b9738517454f1e46e56c972a2be87d70d727d5b2a8f8", size = 132104, upload-time = "2026-03-31T16:14:53.142Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fc/55e667ec9c85694038fcff00573d221b085d50777368ee3d77f38668bf3c/orjson-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8952d6d2505c003e8f0224ff7858d341fa4e33fef82b91c4ff0ef070f2393c", size = 133580, upload-time = "2026-03-31T16:15:00.519Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a6/c08c589a9aad0cb46c4831d17de212a2b6901f9d976814321ff8e69e8785/orjson-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0022bb50f90da04b009ce32c512dc1885910daa7cb10b7b0cba4505b16db82a8", size = 142042, upload-time = "2026-03-31T16:15:01.906Z" }, + { url = "https://files.pythonhosted.org/packages/90/6c/0fb6e8a24e682e0958d71711ae6f39110e4b9cd8cab1357e2a89cb8e1951/orjson-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5c370674ebabe16c6ccac33ff80c62bf8a6e59439f5e9d40c1f5ab8fd2215b7", size = 136425, upload-time = "2026-03-31T16:15:07.052Z" }, + { url = "https://files.pythonhosted.org/packages/01/f6/8d58b32ab32d9215973a1688aebd098252ee8af1766c0e4e36e7831f0295/orjson-3.11.8-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1cd0b77e77c95758f8e1100139844e99f3ccc87e71e6fc8e1c027e55807c549f", size = 229233, upload-time = "2026-03-31T16:15:12.762Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8b/2ffe35e71f6b92622e8ea4607bf33ecf7dfb51b3619dcfabfd36cbe2d0a5/orjson-3.11.8-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:6a3d159d5ffa0e3961f353c4b036540996bf8b9697ccc38261c0eac1fd3347a6", size = 128772, upload-time = "2026-03-31T16:15:14.237Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/1f8682ae50d5c6897a563cb96bc106da8c9cb5b7b6e81a52e4cc086679b9/orjson-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76070a76e9c5ae661e2d9848f216980d8d533e0f8143e6ed462807b242e3c5e8", size = 131946, upload-time = "2026-03-31T16:15:15.607Z" }, + { url = "https://files.pythonhosted.org/packages/37/87/5ddeb7fc1fbd9004aeccab08426f34c81a5b4c25c7061281862b015fce2b/orjson-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a0f57e59a530d18a142f4d4ba6dfc708dc5fdedce45e98ff06b44930a2a48f", size = 133624, upload-time = "2026-03-31T16:15:22.641Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/90048793db94ee4b2fcec4ac8e5ddb077367637d6650be896b3494b79bb7/orjson-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b48e274f8824567d74e2158199e269597edf00823a1b12b63d48462bbf5123e", size = 141904, upload-time = "2026-03-31T16:15:24.435Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6d/37c2589ba864e582ffe7611643314785c6afb1f83c701654ef05daa8fcc7/orjson-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:093d489fa039ddade2db541097dbb484999fcc65fc2b0ff9819141e2ab364f25", size = 136485, upload-time = "2026-03-31T16:15:29.749Z" }, + { url = "https://files.pythonhosted.org/packages/66/7f/95fba509bb2305fab0073558f1e8c3a2ec4b2afe58ed9fcb7d3b8beafe94/orjson-3.11.8-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3f23426851d98478c8970da5991f84784a76682213cd50eb73a1da56b95239dc", size = 229180, upload-time = "2026-03-31T16:15:36.426Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9d/b237215c743ca073697d759b5503abd2cb8a0d7b9c9e21f524bcf176ab66/orjson-3.11.8-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ebaed4cef74a045b83e23537b52ef19a367c7e3f536751e355a2a394f8648559", size = 128754, upload-time = "2026-03-31T16:15:38.049Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/27d65b6d11e63f133781425f132807aef793ed25075fec686fc8e46dd528/orjson-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97c8f5d3b62380b70c36ffacb2a356b7c6becec86099b177f73851ba095ef623", size = 131877, upload-time = "2026-03-31T16:15:39.484Z" }, + { url = "https://files.pythonhosted.org/packages/23/91/7e722f352ad67ca573cee44de2a58fb810d0f4eb4e33276c6a557979fd8a/orjson-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b895b781b3e395c067129d8551655642dfe9437273211d5404e87ac752b53", size = 133637, upload-time = "2026-03-31T16:15:48.123Z" }, + { url = "https://files.pythonhosted.org/packages/af/04/32845ce13ac5bd1046ddb02ac9432ba856cc35f6d74dde95864fe0ad5523/orjson-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:88006eda83858a9fdf73985ce3804e885c2befb2f506c9a3723cdeb5a2880e3e", size = 141906, upload-time = "2026-03-31T16:15:49.626Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/0dce10b9f6643fdc59d99333871a38fa5a769d8e2fc34a18e5d2bfdee900/orjson-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:708c95f925a43ab9f34625e45dcdadf09ec8a6e7b664a938f2f8d5650f6c090b", size = 136460, upload-time = "2026-03-31T16:15:54.431Z" }, ] [[package]] @@ -8502,24 +8031,18 @@ sdist = { url = "https://files.pythonhosted.org/packages/12/0c/f1761e21486942ab9 wheels = [ { url = "https://files.pythonhosted.org/packages/4b/08/8b68f24b18e69d92238aa8f258218e6dfeacf4381d9d07ab8df303f524a9/ormsgpack-1.12.2-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bd5f4bf04c37888e864f08e740c5a573c4017f6fd6e99fa944c5c935fabf2dd9", size = 378266, upload-time = "2026-01-18T20:55:59.876Z" }, { url = "https://files.pythonhosted.org/packages/0d/24/29fc13044ecb7c153523ae0a1972269fcd613650d1fa1a9cec1044c6b666/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d5b28b3570e9fed9a5a76528fc7230c3c76333bc214798958e58e9b79cc18a", size = 203035, upload-time = "2026-01-18T20:55:30.59Z" }, - { url = "https://files.pythonhosted.org/packages/ad/c2/00169fb25dd8f9213f5e8a549dfb73e4d592009ebc85fbbcd3e1dcac575b/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3708693412c28f3538fb5a65da93787b6bbab3484f6bc6e935bfb77a62400ae5", size = 210539, upload-time = "2026-01-18T20:55:48.569Z" }, { url = "https://files.pythonhosted.org/packages/1b/33/543627f323ff3c73091f51d6a20db28a1a33531af30873ea90c5ac95a9b5/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43013a3f3e2e902e1d05e72c0f1aeb5bedbb8e09240b51e26792a3c89267e181", size = 212401, upload-time = "2026-01-18T20:56:10.101Z" }, { url = "https://files.pythonhosted.org/packages/e8/5d/f70e2c3da414f46186659d24745483757bcc9adccb481a6eb93e2b729301/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7c8b1667a72cbba74f0ae7ecf3105a5e01304620ed14528b2cb4320679d2869b", size = 387082, upload-time = "2026-01-18T20:56:12.047Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d6/06e8dc920c7903e051f30934d874d4afccc9bb1c09dcaf0bc03a7de4b343/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:df6961442140193e517303d0b5d7bc2e20e69a879c2d774316125350c4a76b92", size = 482346, upload-time = "2026-01-18T20:56:05.152Z" }, { url = "https://files.pythonhosted.org/packages/66/c4/f337ac0905eed9c393ef990c54565cd33644918e0a8031fe48c098c71dbf/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6a4c34ddef109647c769d69be65fa1de7a6022b02ad45546a69b3216573eb4a", size = 425181, upload-time = "2026-01-18T20:55:37.83Z" }, { url = "https://files.pythonhosted.org/packages/4c/36/16c4b1921c308a92cef3bf6663226ae283395aa0ff6e154f925c32e91ff5/ormsgpack-1.12.2-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7a29d09b64b9694b588ff2f80e9826bdceb3a2b91523c5beae1fab27d5c940e7", size = 378618, upload-time = "2026-01-18T20:55:50.835Z" }, { url = "https://files.pythonhosted.org/packages/c0/68/468de634079615abf66ed13bb5c34ff71da237213f29294363beeeca5306/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b39e629fd2e1c5b2f46f99778450b59454d1f901bc507963168985e79f09c5d", size = 203186, upload-time = "2026-01-18T20:56:11.163Z" }, - { url = "https://files.pythonhosted.org/packages/73/a9/d756e01961442688b7939bacd87ce13bfad7d26ce24f910f6028178b2cc8/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:958dcb270d30a7cb633a45ee62b9444433fa571a752d2ca484efdac07480876e", size = 210738, upload-time = "2026-01-18T20:56:09.181Z" }, { url = "https://files.pythonhosted.org/packages/7b/ba/795b1036888542c9113269a3f5690ab53dd2258c6fb17676ac4bd44fcf94/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d379d72b6c5e964851c77cfedfb386e474adee4fd39791c2c5d9efb53505cc", size = 212569, upload-time = "2026-01-18T20:56:06.135Z" }, { url = "https://files.pythonhosted.org/packages/6c/aa/bff73c57497b9e0cba8837c7e4bcab584b1a6dbc91a5dd5526784a5030c8/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8463a3fc5f09832e67bdb0e2fda6d518dc4281b133166146a67f54c08496442e", size = 387166, upload-time = "2026-01-18T20:55:36.738Z" }, - { url = "https://files.pythonhosted.org/packages/d3/cf/f8283cba44bcb7b14f97b6274d449db276b3a86589bdb363169b51bc12de/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:eddffb77eff0bad4e67547d67a130604e7e2dfbb7b0cde0796045be4090f35c6", size = 482498, upload-time = "2026-01-18T20:55:29.626Z" }, { url = "https://files.pythonhosted.org/packages/05/be/71e37b852d723dfcbe952ad04178c030df60d6b78eba26bfd14c9a40575e/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcd55e5f6ba0dbce624942adf9f152062135f991a0126064889f68eb850de0dd", size = 425518, upload-time = "2026-01-18T20:55:49.556Z" }, { url = "https://files.pythonhosted.org/packages/eb/29/bb0eba3288c0449efbb013e9c6f58aea79cf5cb9ee1921f8865f04c1a9d7/ormsgpack-1.12.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5ea60cb5f210b1cfbad8c002948d73447508e629ec375acb82910e3efa8ff355", size = 378661, upload-time = "2026-01-18T20:55:57.765Z" }, { url = "https://files.pythonhosted.org/packages/6e/31/5efa31346affdac489acade2926989e019e8ca98129658a183e3add7af5e/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3601f19afdbea273ed70b06495e5794606a8b690a568d6c996a90d7255e51c1", size = 203194, upload-time = "2026-01-18T20:56:08.252Z" }, - { url = "https://files.pythonhosted.org/packages/eb/56/d0087278beef833187e0167f8527235ebe6f6ffc2a143e9de12a98b1ce87/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29a9f17a3dac6054c0dce7925e0f4995c727f7c41859adf9b5572180f640d172", size = 210778, upload-time = "2026-01-18T20:55:17.694Z" }, { url = "https://files.pythonhosted.org/packages/1c/a2/072343e1413d9443e5a252a8eb591c2d5b1bffbe5e7bfc78c069361b92eb/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39c1bd2092880e413902910388be8715f70b9f15f20779d44e673033a6146f2d", size = 212592, upload-time = "2026-01-18T20:55:32.747Z" }, { url = "https://files.pythonhosted.org/packages/a2/8b/a0da3b98a91d41187a63b02dda14267eefc2a74fcb43cc2701066cf1510e/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50b7249244382209877deedeee838aef1542f3d0fc28b8fe71ca9d7e1896a0d7", size = 387164, upload-time = "2026-01-18T20:55:40.853Z" }, - { url = "https://files.pythonhosted.org/packages/19/bb/6d226bc4cf9fc20d8eb1d976d027a3f7c3491e8f08289a2e76abe96a65f3/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5af04800d844451cf102a59c74a841324868d3f1625c296a06cc655c542a6685", size = 482516, upload-time = "2026-01-18T20:55:42.033Z" }, { url = "https://files.pythonhosted.org/packages/fb/f1/bb2c7223398543dedb3dbf8bb93aaa737b387de61c5feaad6f908841b782/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cec70477d4371cd524534cd16472d8b9cc187e0e3043a8790545a9a9b296c258", size = 425539, upload-time = "2026-01-18T20:55:24.727Z" }, ] @@ -8534,11 +8057,11 @@ wheels = [ [[package]] name = "packaging" -version = "26.2" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] @@ -8606,29 +8129,29 @@ wheels = [ [[package]] name = "parso" -version = "0.8.7" +version = "0.8.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, + { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, ] [[package]] name = "pathable" -version = "0.6.0" +version = "0.4.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/f3/5a20387de9bcd0607871bfc2198ee0e15836da7baa4592ccd7f24c27c986/pathable-0.6.0.tar.gz", hash = "sha256:6404b8b82aef5ff0fd478934137128b99b12212ba35afdde5525ca4f8388ea58", size = 18970, upload-time = "2026-05-19T18:15:11.911Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/93/8f2c2075b180c12c1e9f6a09d1a985bc2036906b13dff1d8917e395f2048/pathable-0.4.4.tar.gz", hash = "sha256:6905a3cd17804edfac7875b5f6c9142a218c7caef78693c2dbbbfbac186d88b2", size = 8124, upload-time = "2025-01-10T18:43:13.247Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/e8/6d75ffd9784bce2e93d1ae4415649427e39a53bb172d4672b2b59c6f0a7b/pathable-0.6.0-py3-none-any.whl", hash = "sha256:82c4ca6c98c502ad12e0d4e9779b6210afee93c38990988c8c5d1b49bdcdf566", size = 18983, upload-time = "2026-05-19T18:15:10.728Z" }, + { url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592, upload-time = "2025-01-10T18:43:11.88Z" }, ] [[package]] name = "pathspec" -version = "1.1.1" +version = "1.0.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] [[package]] @@ -8710,11 +8233,11 @@ wheels = [ [[package]] name = "pip" -version = "26.1.2" +version = "26.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/91/47e7d486260f618783899587af63ccf7980fb60245c3e63dd4571c6b57ad/pip-26.1.2.tar.gz", hash = "sha256:f49cd134c61cf2fd75e0ce2676db03e4054504a5a4986d00f8299ae632dc4605", size = 1840799, upload-time = "2026-05-31T17:33:58.56Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/48/cb9b7a682f6fe01a4221e1728941dd4ac3cd9090a17db3779d6ff490b602/pip-26.1.1.tar.gz", hash = "sha256:d36762751d156a4ee895de8af39aa0abeeeb577f93a2eca6ab62467bbf0f8a78", size = 1840400, upload-time = "2026-05-04T19:02:21.248Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/95/6b5cb3461ea5673ba0995989746db58eb18b91b54dbf331e72f569540946/pip-26.1.2-py3-none-any.whl", hash = "sha256:382ff9f685ee3bc25864f820aa50505825f10f5458ffff07e30a6d96e5715cab", size = 1813144, upload-time = "2026-05-31T17:33:56.772Z" }, + { url = "https://files.pythonhosted.org/packages/3a/eb/fea4d1d51c49832120f7f285d07306db3960f423a2612c6057caf3e8196f/pip-26.1.1-py3-none-any.whl", hash = "sha256:99cb1c2899893b075ff56e4ed0af55669a955b49ad7fb8d8603ecdaf4ed653fb", size = 1812777, upload-time = "2026-05-04T19:02:18.9Z" }, ] [[package]] @@ -8737,11 +8260,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.10.0" +version = "4.9.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, + { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, ] [[package]] @@ -8801,11 +8324,11 @@ wheels = [ [[package]] name = "prometheus-client" -version = "0.25.0" +version = "0.24.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/58/a794d23feb6b00fc0c72787d7e87d872a6730dd9ed7c7b3e954637d8f280/prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9", size = 85616, upload-time = "2026-01-14T15:26:26.965Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055", size = 64057, upload-time = "2026-01-14T15:26:24.42Z" }, ] [[package]] @@ -8835,63 +8358,35 @@ wheels = [ [[package]] name = "propcache" -version = "0.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/f1/8a8cc1c2c7e7934ab77e0163414f736fadbc0f5e8dd9673b952355ac175b/propcache-0.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74b70780220e2dd89175ca24b81b68b67c83db499ae611e7f2313cb329801c78", size = 90744, upload-time = "2026-05-08T20:59:45.799Z" }, - { url = "https://files.pythonhosted.org/packages/15/a8/8ede85d6aa1f79fc7dc2f8fd2c8d65920b8272c3892903c8a1affde48cfb/propcache-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6844ba6364fb12f403928a82cfd295ab103a2b315c77c747b2dbe4a41894ea7", size = 52754, upload-time = "2026-05-08T20:59:49.202Z" }, - { url = "https://files.pythonhosted.org/packages/7d/fe/b3551b41bbc2f5b5bb088fc6920567cd43101253e68fbaa261339eb96fe1/propcache-0.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2293949b855ce597f2826452d17c2d545fb5622379c4ea6fdf525e9b8e8a2511", size = 57573, upload-time = "2026-05-08T20:59:50.778Z" }, - { url = "https://files.pythonhosted.org/packages/83/27/ab851ebd1b7172e3e161f5f8d39e315d54a91bea246f01f4d872d3376aef/propcache-0.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0fd59b5af35f74da48d905dcbad55449ba13be91823cb05a9bd590bbf5b61660", size = 60645, upload-time = "2026-05-08T20:59:52.227Z" }, - { url = "https://files.pythonhosted.org/packages/95/7d/466b3d18022e9897cbda9c735c493c5bd747d7a4c6f5ea1480b4cec434b6/propcache-0.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29f9309a2e42b0d273be006fdb4be2d6c39a47f6f57d8fb1cf9f81481df81b66", size = 61563, upload-time = "2026-05-08T20:59:53.866Z" }, - { url = "https://files.pythonhosted.org/packages/27/1b/16ab7f2cf2041da2f60d156ba64c2484eadf9168075b4ff43c3ef60045af/propcache-0.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5aaa2b923c1944ac8febd6609cb373540a5563e7cbcb0fd770f75dace2eb817b", size = 58888, upload-time = "2026-05-08T20:59:55.457Z" }, - { url = "https://files.pythonhosted.org/packages/0a/67/bb777ffd907633563bf35fd859c4ce97b0512c32f4633cf5d1eb7c33512b/propcache-0.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66ea454f095ddf5b6b14f56c064c0941c4788be11e18d2464cf643bf7203ff67", size = 59253, upload-time = "2026-05-08T20:59:57.075Z" }, - { url = "https://files.pythonhosted.org/packages/b9/42/64f8d90b73fd9cdc1499b48057ff6d9cd2a98a25734c9bb62ecf07e87061/propcache-0.5.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:95f1e3f4760d404b13c9976c0229b2b49a3c8e2c62a9ce92efdd2b11ada75e3f", size = 57558, upload-time = "2026-05-08T20:59:58.602Z" }, - { url = "https://files.pythonhosted.org/packages/eb/02/dba5bc03c9041f2092ea55a449caf5dfe68352c6654511b29ba0654ddb69/propcache-0.5.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85341b12b9d55bad0bded24cac341bb34289469e03a11f3f583ea1cc1db0326c", size = 55007, upload-time = "2026-05-08T20:59:59.837Z" }, - { url = "https://files.pythonhosted.org/packages/14/c0/43f649c7aa2a77a3b100d84e9dea3a483120ecb608bfe36ce49eaff517fe/propcache-0.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:26a4dca084132874e639895c3135dfad5eb20bae209f62d1aeb31b03e601c3c0", size = 60355, upload-time = "2026-05-08T21:00:01.144Z" }, - { url = "https://files.pythonhosted.org/packages/83/c0/435dafd27f1cb4a495381dae60e25883ccfe4020bb72818e8184c1678092/propcache-0.5.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3b199b9b2b3d6a7edf3183ba8a9a137a22b97f7df525feb5ae1eccf026d2a9c6", size = 59057, upload-time = "2026-05-08T21:00:02.401Z" }, - { url = "https://files.pythonhosted.org/packages/53/ae/6e292df9135d659944e96cb3389258e4a663e5b2b5f6c217ef0ddc8d2f73/propcache-0.5.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e59bc9e66329185b93dab73f210f1a37f81cb40f321501db8017c9aea15dba27", size = 61938, upload-time = "2026-05-08T21:00:03.638Z" }, - { url = "https://files.pythonhosted.org/packages/0b/42/314ebc50d8159055411fd6b0bda322ff510e4b1f7d2e4927940ad0f6af20/propcache-0.5.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:552ffadf6ad409844bc5919c42a0a83d88314cedddaea0e41e80a8b8fffe881f", size = 59731, upload-time = "2026-05-08T21:00:04.881Z" }, - { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" }, - { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" }, - { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" }, - { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" }, - { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" }, - { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" }, - { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" }, - { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" }, - { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" }, - { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" }, - { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" }, - { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" }, - { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" }, - { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" }, - { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" }, - { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" }, - { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" }, - { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" }, - { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" }, - { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" }, - { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" }, - { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" }, - { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" }, - { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" }, - { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" }, - { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" }, - { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" }, - { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" }, - { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" }, - { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" }, - { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" }, - { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" }, - { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" }, - { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] [[package]] @@ -8902,7 +8397,6 @@ sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a wheels = [ { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, ] @@ -8925,37 +8419,25 @@ wheels = [ [[package]] name = "psycopg2-binary" -version = "2.9.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/60/a3624f79acea344c16fbef3a94d28b89a8042ddfb8f3e4ca83f538671409/psycopg2_binary-2.9.12.tar.gz", hash = "sha256:5ac9444edc768c02a6b6a591f070b8aae28ff3a99be57560ac996001580f294c", size = 379686, upload-time = "2026-04-21T09:40:34.304Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/71/c85409ee0d78890f0660eff262e815e7dd2bb741a17611d82e9e8cd9dc5e/psycopg2_binary-2.9.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4a9eaa6e7f4ff91bec10aa3fb296878e75187bced5cc4bafe17dc40915e1326", size = 3822407, upload-time = "2026-04-20T23:34:05.977Z" }, - { url = "https://files.pythonhosted.org/packages/3c/ed/60486c2c7f0d4d1ede2bfb1ed27e2498477ce646bc7f6b2759906303117e/psycopg2_binary-2.9.12-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c6528cefc8e50fcc6f4a107e27a672058b36cc5736d665476aeb413ba88dbb06", size = 4578425, upload-time = "2026-04-20T23:34:08.246Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b9/656cb03fad9f4f49f2145c334b1126ee75189929ca4e6187d485a2d59951/psycopg2_binary-2.9.12-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e4e184b1fb6072bf05388aa41c697e1b2d01b3473f107e7ec44f186a32cfd0b8", size = 4273709, upload-time = "2026-04-20T23:34:10.974Z" }, - { url = "https://files.pythonhosted.org/packages/99/66/08cf0da0e25cc6fb142c89be45fc8418792858f0c4cbff5e24530ff02cd6/psycopg2_binary-2.9.12-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4766ab678563054d3f1d064a4db19cc4b5f9e3a8d9018592a8285cf200c248f3", size = 5893779, upload-time = "2026-04-20T23:34:13.905Z" }, - { url = "https://files.pythonhosted.org/packages/17/d7/eecd9ce8e146d3721115d82d3836efdbb712187e4590325df549989d18f4/psycopg2_binary-2.9.12-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5a0253224780c978746cb9be55a946bcdaf40fe3519c0f622924cdabdafe2c39", size = 4109308, upload-time = "2026-04-20T23:34:16.761Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2e/b1dc289b362cc8d45697b57eefbd673186f49a4ea0906928988e3affcc98/psycopg2_binary-2.9.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0dc9228d47c46bda253d2ecd6bb93b56a9f2d7ad33b684a1fa3622bf74ffe30c", size = 3654405, upload-time = "2026-04-20T23:34:19.303Z" }, - { url = "https://files.pythonhosted.org/packages/eb/e4/4c4aea6473214dbdbd0fbba11aa4691e76dc01722c55724c5951719865ff/psycopg2_binary-2.9.12-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f921f3cd87035ef7df233383011d7a53ea1d346224752c1385f1edfd790ceb6a", size = 3299187, upload-time = "2026-04-20T23:34:21.206Z" }, - { url = "https://files.pythonhosted.org/packages/ba/5d/b03b99986446a4f57b170ed9a2579fb7ff9783ca0fa5226b19db99737fee/psycopg2_binary-2.9.12-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3d999bd982a723113c1a45b55a7a6a90d64d0ed2278020ed625c490ff7bef96c", size = 3047716, upload-time = "2026-04-20T23:34:23.077Z" }, - { url = "https://files.pythonhosted.org/packages/14/86/382ee4afbd1d97500c9d2862b20c2fdeddf4b7335e984df3fb4309f64108/psycopg2_binary-2.9.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29d4d134bd0ab46ffb04e94aa3c5fa3ef582e9026609165e2f758ff76fc3a3be", size = 3349237, upload-time = "2026-04-20T23:34:25.211Z" }, - { url = "https://files.pythonhosted.org/packages/b5/01/3dd14e46ba48c1e1a6ec58ee599fa1b5efa00c246d5046cd903d0eeb1af1/psycopg2_binary-2.9.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3227a3bc228c10d21011a99245edca923e4e8bf461857e869a507d9a41fe9f6", size = 3822936, upload-time = "2026-04-20T23:34:32.77Z" }, - { url = "https://files.pythonhosted.org/packages/a6/f7/0640e4901119d8a9f7a1784b927f494e2198e213ceb593753d1f2c8b1b30/psycopg2_binary-2.9.12-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:995ce929eede89db6254b50827e2b7fd61e50d11f0b116b29fffe4a2e53c4580", size = 4578676, upload-time = "2026-04-20T23:34:35.18Z" }, - { url = "https://files.pythonhosted.org/packages/b0/55/44df3965b5f297c50cc0b1b594a31c67d6127a9d133045b8a66611b14dfb/psycopg2_binary-2.9.12-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9fe06d93e72f1c048e731a2e3e7854a5bfaa58fc736068df90b352cefe66f03f", size = 4274917, upload-time = "2026-04-20T23:34:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/b0/4b/74535248b1eac0c9336862e8617c765ac94dac76f9e25d7c4a79588c8907/psycopg2_binary-2.9.12-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40e7b28b63aaf737cb3a1edc3a9bbc9a9f4ad3dcb7152e8c1130e4050eddcb7d", size = 5894843, upload-time = "2026-04-20T23:34:40.856Z" }, - { url = "https://files.pythonhosted.org/packages/f2/ba/f1bf8d2ae71868ad800b661099086ee52bc0f8d9f05be1acd8ebb06757cc/psycopg2_binary-2.9.12-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:89d19a9f7899e8eb0656a2b3a08e0da04c720a06db6e0033eab5928aabe60fa9", size = 4110556, upload-time = "2026-04-20T23:34:44.016Z" }, - { url = "https://files.pythonhosted.org/packages/45/46/c15706c338403b7c420bcc0c2905aad116cc064545686d8bf85f1999ea00/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:612b965daee295ae2da8f8218ce1d274645dc76ef3f1abf6a0a94fd57eff876d", size = 3655714, upload-time = "2026-04-20T23:34:46.233Z" }, - { url = "https://files.pythonhosted.org/packages/b3/7c/a2d5dc09b64a4564db242a0fe418fde7d33f6f8259dd2c5b9d7def00fb5a/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b9a339b79d37c1b45f3235265f07cdeb0cb5ad7acd2ac7720a5920989c17c24e", size = 3301154, upload-time = "2026-04-20T23:34:49.528Z" }, - { url = "https://files.pythonhosted.org/packages/c0/e8/cc8c9a4ce71461f9ec548d38cadc41dc184b34c73e6455450775a9334ccd/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3471336e1acfd9c7fe507b8bad5af9317b6a89294f9eb37bd9a030bb7bebcdc6", size = 3048882, upload-time = "2026-04-20T23:34:51.86Z" }, - { url = "https://files.pythonhosted.org/packages/19/6a/31e2296bc0787c5ab75d3d118e40b239db8151b5192b90b77c72bc9256e9/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7af18183109e23502c8b2ae7f6926c0882766f35b5175a4cd737ad825e4d7a1b", size = 3351298, upload-time = "2026-04-20T23:34:54.124Z" }, - { url = "https://files.pythonhosted.org/packages/5e/af/48f76af9d50d61cf390f8cd657b503168b089e2e9298e48465d029fcc713/psycopg2_binary-2.9.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4413d0caef93c5cf50b96863df4c2efe8c269bf2267df353225595e7e15e8df7", size = 3822990, upload-time = "2026-04-20T23:35:00.821Z" }, - { url = "https://files.pythonhosted.org/packages/7a/df/aba0f99397cd811d32e06fc0cc781f1f3ce98bc0e729cb423925085d781a/psycopg2_binary-2.9.12-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4dfcf8e45ebb0c663be34a3442f65e17311f3367089cd4e5e3a3e8e62c978777", size = 4578696, upload-time = "2026-04-20T23:35:03.409Z" }, - { url = "https://files.pythonhosted.org/packages/95/9c/eaa74021ac4e4d5c2f83d82fc6615a63f4fe6c94dc4e94c3990427053f67/psycopg2_binary-2.9.12-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c41321a14dd74aceb6a9a643b9253a334521babfa763fa873e33d89cfa122fb5", size = 4274982, upload-time = "2026-04-20T23:35:05.583Z" }, - { url = "https://files.pythonhosted.org/packages/35/ed/c25deff98bd26187ba48b3b250a3ffc3037c46c5b89362534a15d200e0db/psycopg2_binary-2.9.12-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83946ba43979ebfdc99a3cd0ee775c89f221df026984ba19d46133d8d75d3cd9", size = 5894867, upload-time = "2026-04-20T23:35:07.902Z" }, - { url = "https://files.pythonhosted.org/packages/9a/81/8d0e21ca77373c6c9589e5c4528f6e8f0c08c62cafc76fb0bddb7a2cee22/psycopg2_binary-2.9.12-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:411e85815652d13560fbe731878daa5d92378c4995a22302071890ec3397d019", size = 4110578, upload-time = "2026-04-20T23:35:10.149Z" }, - { url = "https://files.pythonhosted.org/packages/00/fc/f481e2435bd8f742d0123309174aae4165160ad3ef17c1b99c3622c241d2/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c8ad4c08e00f7679559eaed7aff1edfffc60c086b976f93972f686384a95e2c", size = 3655816, upload-time = "2026-04-20T23:35:12.56Z" }, - { url = "https://files.pythonhosted.org/packages/53/79/b9f46466bdbe9f239c96cde8be33c1aace4842f06013b47b730dc9759187/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:00814e40fa23c2b37ef0a1e3c749d89982c73a9cb5046137f0752a22d432e82f", size = 3301307, upload-time = "2026-04-20T23:35:15.029Z" }, - { url = "https://files.pythonhosted.org/packages/3f/19/7dc003b32fe35024df89b658104f7c8538a8b2dcbde7a4e746ce929742e7/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:98062447aebc20ed20add1f547a364fd0ef8933640d5372ff1873f8deb9b61be", size = 3048968, upload-time = "2026-04-20T23:35:16.757Z" }, - { url = "https://files.pythonhosted.org/packages/91/58/2dbd7db5c604d45f4950d988506aae672a14126ec22998ced5021cbb76bb/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:66a7685d7e548f10fb4ce32fb01a7b7f4aa702134de92a292c7bd9e0d3dbd290", size = 3351369, upload-time = "2026-04-20T23:35:18.933Z" }, +version = "2.9.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/6c/8767aaa597ba424643dc87348c6f1754dd9f48e80fdc1b9f7ca5c3a7c213/psycopg2-binary-2.9.11.tar.gz", hash = "sha256:b6aed9e096bf63f9e75edf2581aa9a7e7186d97ab5c177aa6c87797cd591236c", size = 379620, upload-time = "2025-10-10T11:14:48.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/34/aa03d327739c1be70e09d01182619aca8ebab5970cd0cfa50dd8b9cec2ac/psycopg2_binary-2.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:763c93ef1df3da6d1a90f86ea7f3f806dc06b21c198fa87c3c25504abec9404a", size = 3863957, upload-time = "2025-10-10T11:11:16.932Z" }, + { url = "https://files.pythonhosted.org/packages/48/89/3fdb5902bdab8868bbedc1c6e6023a4e08112ceac5db97fc2012060e0c9a/psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e164359396576a3cc701ba8af4751ae68a07235d7a380c631184a611220d9a4", size = 4410955, upload-time = "2025-10-10T11:11:21.21Z" }, + { url = "https://files.pythonhosted.org/packages/91/7e/b8441e831a0f16c159b5381698f9f7f7ed54b77d57bc9c5f99144cc78232/psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2c226ef95eb2250974bf6fa7a842082b31f68385c4f3268370e3f3870e7859ee", size = 4165012, upload-time = "2025-10-10T11:11:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/76/a1/2f5841cae4c635a9459fe7aca8ed771336e9383b6429e05c01267b0774cf/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb415404821b6d1c47353ebe9c8645967a5235e6d88f914147e7fd411419e6f", size = 3650985, upload-time = "2025-10-10T11:11:34.975Z" }, + { url = "https://files.pythonhosted.org/packages/c8/31/36a1d8e702aa35c38fc117c2b8be3f182613faa25d794b8aeaab948d4c03/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cffe9d7697ae7456649617e8bb8d7a45afb71cd13f7ab22af3e5c61f04840908", size = 3345842, upload-time = "2025-10-10T11:11:45.366Z" }, + { url = "https://files.pythonhosted.org/packages/27/fa/cae40e06849b6c9a95eb5c04d419942f00d9eaac8d81626107461e268821/psycopg2_binary-2.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f090b7ddd13ca842ebfe301cd587a76a4cf0913b1e429eb92c1be5dbeb1a19bc", size = 3864509, upload-time = "2025-10-10T11:11:56.452Z" }, + { url = "https://files.pythonhosted.org/packages/2d/75/364847b879eb630b3ac8293798e380e441a957c53657995053c5ec39a316/psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ab8905b5dcb05bf3fb22e0cf90e10f469563486ffb6a96569e51f897c750a76a", size = 4411159, upload-time = "2025-10-10T11:12:00.49Z" }, + { url = "https://files.pythonhosted.org/packages/30/da/4e42788fb811bbbfd7b7f045570c062f49e350e1d1f3df056c3fb5763353/psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa0f693d3c68ae925966f0b14b8edda71696608039f4ed61b1fe9ffa468d16db", size = 4166236, upload-time = "2025-10-10T11:12:11.674Z" }, + { url = "https://files.pythonhosted.org/packages/bd/42/c9a21edf0e3daa7825ed04a4a8588686c6c14904344344a039556d78aa58/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7a6beb4beaa62f88592ccc65df20328029d721db309cb3250b0aae0fa146c3", size = 3652281, upload-time = "2025-10-10T11:12:17.713Z" }, + { url = "https://files.pythonhosted.org/packages/12/9a/0402ded6cbd321da0c0ba7d34dc12b29b14f5764c2fc10750daa38e825fc/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b6d93d7c0b61a1dd6197d208ab613eb7dcfdcca0a49c42ceb082257991de9d", size = 3347940, upload-time = "2025-10-10T11:12:26.529Z" }, + { url = "https://files.pythonhosted.org/packages/62/e1/c2b38d256d0dafd32713e9f31982a5b028f4a3651f446be70785f484f472/psycopg2_binary-2.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:366df99e710a2acd90efed3764bb1e28df6c675d33a7fb40df9b7281694432ee", size = 3864529, upload-time = "2025-10-10T11:12:36.791Z" }, + { url = "https://files.pythonhosted.org/packages/11/32/b2ffe8f3853c181e88f0a157c5fb4e383102238d73c52ac6d93a5c8bffe6/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c55b385daa2f92cb64b12ec4536c66954ac53654c7f15a203578da4e78105c0", size = 4411242, upload-time = "2025-10-10T11:12:42.388Z" }, + { url = "https://files.pythonhosted.org/packages/3c/7e/6a1a38f86412df101435809f225d57c1a021307dd0689f7a5e7fe83588b1/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6ff3335ce08c75afaed19e08699e8aacf95d4a260b495a4a8545244fe2ceb3", size = 4166295, upload-time = "2025-10-10T11:12:52.525Z" }, + { url = "https://files.pythonhosted.org/packages/82/56/993b7104cb8345ad7d4516538ccf8f0d0ac640b1ebd8c754a7b024e76878/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba34475ceb08cccbdd98f6b46916917ae6eeb92b5ae111df10b544c3a4621dc4", size = 3652383, upload-time = "2025-10-10T11:12:56.387Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8e/b7de019a1f562f72ada81081a12823d3c1590bedc48d7d2559410a2763fe/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04195548662fa544626c8ea0f06561eb6203f1984ba5b4562764fbeb4c3d14b1", size = 3347549, upload-time = "2025-10-10T11:13:03.971Z" }, ] [[package]] @@ -8978,15 +8460,15 @@ wheels = [ [[package]] name = "py-key-value-aio" -version = "0.4.5" +version = "0.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beartype", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/e2/d689d922894a7ecde73b6daeaf9b13dab5aae06fe6aaaf7514722644d382/py_key_value_aio-0.4.5.tar.gz", hash = "sha256:c6563a2c6abe5da5e20f4f9e875c2a9b425a2244a54fadbf46cf140a9eea45d7", size = 107547, upload-time = "2026-05-27T16:37:08.107Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/3c/0397c072a38d4bc580994b42e0c90c5f44f679303489e4376289534735e5/py_key_value_aio-0.4.4.tar.gz", hash = "sha256:e3012e6243ed7cc09bb05457bd4d03b1ba5c2b1ca8700096b3927db79ffbbe55", size = 92300, upload-time = "2026-02-16T21:21:43.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/95/b8ba862968712caa12a19666175334fa979e1f198b896a430adb3bacfe87/py_key_value_aio-0.4.5-py3-none-any.whl", hash = "sha256:ab862adbcb8c72547d1c57821f22cbbb71ab86509039c96f36e914e0336c8dd7", size = 170005, upload-time = "2026-05-27T16:37:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/32/69/f1b537ee70b7def42d63124a539ed3026a11a3ffc3086947a1ca6e861868/py_key_value_aio-0.4.4-py3-none-any.whl", hash = "sha256:18e17564ecae61b987f909fc2cd41ee2012c84b4b1dcb8c055cf8b4bc1bf3f5d", size = 152291, upload-time = "2026-02-16T21:21:44.241Z" }, ] [package.optional-dependencies] @@ -9003,37 +8485,28 @@ memory = [ [[package]] name = "py-rust-stemmers" -version = "0.1.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/c1/9763f9fb1cd73f9c317a83feeed6e0d4af320c6bbddab47b4a94f3a47d0c/py_rust_stemmers-0.1.8.tar.gz", hash = "sha256:6b0f6f48bc54d607aed802de872fcd5a71bae969a6760976dc78ce55e8eaf3da", size = 9732, upload-time = "2026-05-22T11:00:24.358Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/0a/c88c9a7b5c94acc1175a33964637aff9cf8fa4c2e595846ab1df04c1f0bf/py_rust_stemmers-0.1.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1686fc009869ff8bcc1d5a305f071eeb8c3b3612a9827bcadd4e61fdb5727179", size = 275775, upload-time = "2026-05-22T10:59:32.979Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e2/e685cd31655a1ac56ebe0d571d221c199b1971eb5a2fdad88c889dc25983/py_rust_stemmers-0.1.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:769f37882905da2311cb720681b112eb70a4e6bd56fb424d473427b5379c8396", size = 314523, upload-time = "2026-05-22T10:59:34.436Z" }, - { url = "https://files.pythonhosted.org/packages/65/93/a6c0f30109c259199ac171cb6a0c69addefdba454ee0a8d51bb94e767c11/py_rust_stemmers-0.1.8-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3007ad4ec51e0c352ae410234a24a9ac75fab0c1e06c585fbac9fcced69385f8", size = 318808, upload-time = "2026-05-22T10:59:35.719Z" }, - { url = "https://files.pythonhosted.org/packages/59/87/ecaffed03e4b78d35ffb44740ca779e57d9f49d7d764f3f56b633b1e1c8c/py_rust_stemmers-0.1.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a1e11d22a240318dc917266eb3c85919455b6ea834445b95997712d9ede6b93", size = 319990, upload-time = "2026-05-22T10:59:36.84Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0d/2976bb288240e25110be687e6be5ecb0623a17f667f186e07033e429985f/py_rust_stemmers-0.1.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:08c258deab6d994551a92e9468ce88e58f97e636e73d9c5763978a57d7675a13", size = 320291, upload-time = "2026-05-22T10:59:38.263Z" }, - { url = "https://files.pythonhosted.org/packages/2e/fb/7b1a93f63600633b2c741714f0f6024b2caff54e5aed77c5f6e0be384947/py_rust_stemmers-0.1.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eee4af7ada2ce9cb3ec59ffe8458148c3933a86507d816bf954ee506a0e45b61", size = 492171, upload-time = "2026-05-22T10:59:39.537Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3b/8e829e709542f928beb0613f4dffca4797a817f740c1be07eabd11bd2db4/py_rust_stemmers-0.1.8-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f16deb1557b8253d8c11693047bec4ed67d6b09ae0f84c8b896ea03ac2fc8925", size = 595398, upload-time = "2026-05-22T10:59:41.016Z" }, - { url = "https://files.pythonhosted.org/packages/27/8b/b3972f0fc14e6bfc602a9260a1747742aaf86737ad57872998b085a2f1aa/py_rust_stemmers-0.1.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:870afb2d1d4731bd2d74b715b34439b29734e4dc94c55342096f07669f7f9fa0", size = 537820, upload-time = "2026-05-22T10:59:42.307Z" }, - { url = "https://files.pythonhosted.org/packages/73/15/ae60b9010924adac465f418822d9c514690aba6846edd67b6e2b5c227745/py_rust_stemmers-0.1.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51d0042d2a92ef0f7048bfc06b6c2a02306af31ea47f09d24b34e4b7e63c4e80", size = 275449, upload-time = "2026-05-22T10:59:45.547Z" }, - { url = "https://files.pythonhosted.org/packages/ec/7c/94be8b932179823d66e0d2be03a94706132a7d16a640d5e5710de1cb1b8f/py_rust_stemmers-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d3d34094b9b6078a8ea6fe1c7044e5fd32f14e76c94818c5008f49ae075f08", size = 316676, upload-time = "2026-05-22T10:59:46.522Z" }, - { url = "https://files.pythonhosted.org/packages/f3/a4/8bd5c9f31207136830457d819e3f98bb21c54c0cdc40d6f1845ce4efdf7c/py_rust_stemmers-0.1.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:40c86be90cee4a709ad84fde4db7f11ca44d65630a56b77ec86fe84c23adfc09", size = 319458, upload-time = "2026-05-22T10:59:47.914Z" }, - { url = "https://files.pythonhosted.org/packages/f9/95/95da2b353b164a3a2b8a1c799866a58060693be4f1dc21065663dc67dc17/py_rust_stemmers-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:515884bcfb47b10335146648f276930d0c1201ae5e8b7b400fb46d8ea05c0ec2", size = 323541, upload-time = "2026-05-22T10:59:48.894Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ce/f34403b68808519dfa3220e1d94a40f26d5025f27e28893e2388ab9cfde5/py_rust_stemmers-0.1.8-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:fa42f5f8feb694aaaa869eedf477fcaf66f67a192cd64d94302d06920c33864a", size = 323873, upload-time = "2026-05-22T10:59:49.872Z" }, - { url = "https://files.pythonhosted.org/packages/57/01/fb8527f6474d576975415405c985a97260e0403829e062103d334230b7d2/py_rust_stemmers-0.1.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2e86ad68fe297a6652f0f0390625ea81858b6f27862fd4c5ee1214bf5af29b9d", size = 494761, upload-time = "2026-05-22T10:59:51.021Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ac/73816237dbec20a7299abf901e2f7b6061d238754e033b48e423603f5336/py_rust_stemmers-0.1.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4b90fc81411943b114e8eb4988a876ba3b12bd2d20741559803eddc4131575dc", size = 596141, upload-time = "2026-05-22T10:59:52.122Z" }, - { url = "https://files.pythonhosted.org/packages/52/0a/dd48debf386a206ee1c6ad75a0827eac89428441291c90d98bc3803fccf1/py_rust_stemmers-0.1.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:56cc2c2df742fa6529285b7d204720f34b7da789ed78eb578442f93c6de97d89", size = 541633, upload-time = "2026-05-22T10:59:53.18Z" }, - { url = "https://files.pythonhosted.org/packages/c9/46/21d784a3f1db6a23051ffd5826d8ee667d26a64587c1cfbda0443ed87fff/py_rust_stemmers-0.1.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6c92733b020534470ca5a0d7fe8b85c85622ff383d4f37fec75a1c677aa84921", size = 275628, upload-time = "2026-05-22T10:59:56.687Z" }, - { url = "https://files.pythonhosted.org/packages/57/d5/701c73a4f6a7fecfd96a6588f0cafe98d6b0acde93adf8a2e45535f3d1d5/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ab605a86c950ba7e8ab1392cf91296c0bec3084babb897a4aecf90a10c82395", size = 316656, upload-time = "2026-05-22T10:59:57.67Z" }, - { url = "https://files.pythonhosted.org/packages/9d/0d/c58fe98153cfdb6abf4dfb6ac335c923000d4af4e736080c3a3045b7aea7/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21ed8055cec1f78d666afad8ffd7a51775ba419d2c615b8a1df7b32ca7f33e2b", size = 319377, upload-time = "2026-05-22T10:59:58.664Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d7/e60d04849e90aa3ad457211cc4999c30401f433341f9a5588c12b81f9877/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae773e1d01e9aa328d175f461475d0cd7074a82bfcc71de6dc5765e51f1cc9f7", size = 323719, upload-time = "2026-05-22T10:59:59.845Z" }, - { url = "https://files.pythonhosted.org/packages/6a/48/c0e4fb955db784cc354e0756354602f7043ff4c10fcbd9d901a2f8fe3239/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5cc8fab9d0f1b274a26935a632362b8278f03e81b65e8b8644d5ca3f62a5a1a4", size = 324110, upload-time = "2026-05-22T11:00:01.26Z" }, - { url = "https://files.pythonhosted.org/packages/48/eb/981b26baff37cf7a26ee206763cc4d2fb3e1db8f0f86ec030074431fae05/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35570098da02eb439afcd7270a12bf850bbe874b85cb912e0fb2d87a6e703920", size = 494645, upload-time = "2026-05-22T11:00:02.737Z" }, - { url = "https://files.pythonhosted.org/packages/6d/af/f16e805b7aefc2257b192b83a89300c8360b0fdffd3dfefa92dee4ec9b15/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0a68745d4b3c7f5abc778ca967e8711df6154873abcfe4e62a6631fa2363cc32", size = 596124, upload-time = "2026-05-22T11:00:04.499Z" }, - { url = "https://files.pythonhosted.org/packages/76/8c/e7a2c940ba00e0792ae346aed5e755d51d37cf6d6853f6b141e5380e285d/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7cc0cc0b8eb45d2158c28ea43e2f338c110aad63052ad3bd00bc7446a595e12f", size = 541771, upload-time = "2026-05-22T11:00:06.081Z" }, - { url = "https://files.pythonhosted.org/packages/76/fe/04436ffe3aa4c02a40500835fc1a80d52375c738aa7ef66ebe0c4ccc2900/py_rust_stemmers-0.1.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:234fdcb58f4d907877ed03c9358668a149b5a66d096abcf43c324a4f5697d36d", size = 276111, upload-time = "2026-05-22T11:00:21.026Z" }, - { url = "https://files.pythonhosted.org/packages/45/24/6b32c86dd4eecdc309bfe6c15529a11e90b1e2c7af015366498c14e925f7/py_rust_stemmers-0.1.8-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dca0ae40715238582d6f1824b61d09ea3982359a061b69798ab5732b3ba0d4c5", size = 314816, upload-time = "2026-05-22T11:00:22.207Z" }, - { url = "https://files.pythonhosted.org/packages/22/78/3bf351dbcc7f51eb03a506c0bcf8aead8b1401cf26aaa1328968471531aa/py_rust_stemmers-0.1.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc185b599e646a0e39d11df3f5e6d15edefb110496601556385d33b55fed5de", size = 320180, upload-time = "2026-05-22T11:00:23.387Z" }, +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/63/4fbc14810c32d2a884e2e94e406a7d5bf8eee53e1103f558433817230342/py_rust_stemmers-0.1.5.tar.gz", hash = "sha256:e9c310cfb5c2470d7c7c8a0484725965e7cab8b1237e106a0863d5741da3e1f7", size = 9388, upload-time = "2025-02-19T13:56:28.708Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/d1/e16b587dc0ebc42916b1caad994bc37fbb19ad2c7e3f5f3a586ba2630c16/py_rust_stemmers-0.1.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:910d87d39ba75da1fe3d65df88b926b4b454ada8d73893cbd36e258a8a648158", size = 272019, upload-time = "2025-02-19T13:55:10.268Z" }, + { url = "https://files.pythonhosted.org/packages/41/66/8777f125720acb896b336e6f8153e3ec39754563bc9b89523cfe06ba63da/py_rust_stemmers-0.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31ff4fb9417cec35907c18a6463e3d5a4941a5aa8401f77fbb4156b3ada69e3f", size = 310547, upload-time = "2025-02-19T13:55:11.521Z" }, + { url = "https://files.pythonhosted.org/packages/62/4c/c05c266ed74c063ae31dc5633ed63c48eb3b78034afcc80fe755d0cb09e7/py_rust_stemmers-0.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:804944eeb5c5559443d81f30c34d6e83c6292d72423f299e42f9d71b9d240941", size = 324420, upload-time = "2025-02-19T13:55:15.292Z" }, + { url = "https://files.pythonhosted.org/packages/7f/65/feb83af28095397466e6e031989ff760cc89b01e7da169e76d4cf16a2252/py_rust_stemmers-0.1.5-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c52c5c326de78c70cfc71813fa56818d1bd4894264820d037d2be0e805b477bd", size = 324791, upload-time = "2025-02-19T13:55:16.45Z" }, + { url = "https://files.pythonhosted.org/packages/20/3e/162be2f9c1c383e66e510218d9d4946c8a84ee92c64f6d836746540e915f/py_rust_stemmers-0.1.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f374c0f26ef35fb87212686add8dff394bcd9a1364f14ce40fe11504e25e30", size = 488014, upload-time = "2025-02-19T13:55:18.486Z" }, + { url = "https://files.pythonhosted.org/packages/7b/31/2a48960a072e54d7cc244204d98854d201078e1bb5c68a7843a3f6d21ced/py_rust_stemmers-0.1.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85944262c248ea30444155638c9e148a3adc61fe51cf9a3705b4055b564ec95d", size = 493269, upload-time = "2025-02-19T13:55:21.532Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/fe1cc3d36a19c1ce39792b1ed151ddff5ee1d74c8801f0e93ff36e65f885/py_rust_stemmers-0.1.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d62410ada44a01e02974b85d45d82f4b4c511aae9121e5f3c1ba1d0bea9126b", size = 272021, upload-time = "2025-02-19T13:55:25.685Z" }, + { url = "https://files.pythonhosted.org/packages/0a/38/b8f94e5e886e7ab181361a0911a14fb923b0d05b414de85f427e773bf445/py_rust_stemmers-0.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b28ef729a4c83c7d9418be3c23c0372493fcccc67e86783ff04596ef8a208cdf", size = 310547, upload-time = "2025-02-19T13:55:26.891Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b9/fc0278432f288d2be4ee4d5cc80fd8013d604506b9b0503e8b8cae4ba1c3/py_rust_stemmers-0.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c3593d895453fa06bf70a7b76d6f00d06def0f91fc253fe4260920650c5e078", size = 324419, upload-time = "2025-02-19T13:55:29.211Z" }, + { url = "https://files.pythonhosted.org/packages/6b/5b/74e96eaf622fe07e83c5c389d101540e305e25f76a6d0d6fb3d9e0506db8/py_rust_stemmers-0.1.5-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:96ccc7fd042ffc3f7f082f2223bb7082ed1423aa6b43d5d89ab23e321936c045", size = 324792, upload-time = "2025-02-19T13:55:30.948Z" }, + { url = "https://files.pythonhosted.org/packages/4f/f7/b76816d7d67166e9313915ad486c21d9e7da0ac02703e14375bb1cb64b5a/py_rust_stemmers-0.1.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef18cfced2c9c676e0d7d172ba61c3fab2aa6969db64cc8f5ca33a7759efbefe", size = 488014, upload-time = "2025-02-19T13:55:32.066Z" }, + { url = "https://files.pythonhosted.org/packages/93/40/eafd1b33688e8e8ae946d1ef25c4dc93f5b685bd104b9c5573405d7e1d30/py_rust_stemmers-0.1.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ffd946a36e9ac17ca96821963663012e04bc0ee94d21e8b5ae034721070b436c", size = 493267, upload-time = "2025-02-19T13:55:35.294Z" }, + { url = "https://files.pythonhosted.org/packages/ed/be/0465dcb3a709ee243d464e89231e3da580017f34279d6304de291d65ccb0/py_rust_stemmers-0.1.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4e308fc7687901f0c73603203869908f3156fa9c17c4ba010a7fcc98a7a1c5f2", size = 272019, upload-time = "2025-02-19T13:55:39.183Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b6/76ca5b1f30cba36835938b5d9abee0c130c81833d51b9006264afdf8df3c/py_rust_stemmers-0.1.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f9efc4da5e734bdd00612e7506de3d0c9b7abc4b89d192742a0569d0d1fe749", size = 310545, upload-time = "2025-02-19T13:55:40.339Z" }, + { url = "https://files.pythonhosted.org/packages/00/02/ea86a316aee0f0a9d1449ad4dbffff38f4cf0a9a31045168ae8b95d8bdf8/py_rust_stemmers-0.1.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a231dc6f0b2a5f12a080dfc7abd9e6a4ea0909290b10fd0a4620e5a0f52c3d17", size = 324419, upload-time = "2025-02-19T13:55:42.693Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/1612c22545dcc0abe2f30fc08f30a2332f2224dd536fa1508444a9ca0e39/py_rust_stemmers-0.1.5-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5845709d48afc8b29e248f42f92431155a3d8df9ba30418301c49c6072b181b0", size = 324794, upload-time = "2025-02-19T13:55:43.896Z" }, + { url = "https://files.pythonhosted.org/packages/66/18/8a547584d7edac9e7ac9c7bdc53228d6f751c0f70a317093a77c386c8ddc/py_rust_stemmers-0.1.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e48bfd5e3ce9d223bfb9e634dc1425cf93ee57eef6f56aa9a7120ada3990d4be", size = 488014, upload-time = "2025-02-19T13:55:45.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/6e/214f1a889142b7df6d716e7f3fea6c41e87bd6c29046aa57e175d452b104/py_rust_stemmers-0.1.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:191ea8bf922c984631ffa20bf02ef0ad7eec0465baeaed3852779e8f97c7e7a3", size = 493269, upload-time = "2025-02-19T13:55:49.057Z" }, ] [[package]] @@ -9105,7 +8578,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.13.4" +version = "2.12.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -9113,9 +8586,9 @@ dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-inspection", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, ] [package.optional-dependencies] @@ -9125,54 +8598,38 @@ email = [ [[package]] name = "pydantic-core" -version = "2.46.4" +version = "2.41.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, - { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, - { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, - { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, - { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, - { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, - { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, - { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, - { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, - { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, - { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, - { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, - { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, - { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, - { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, - { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, - { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, - { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, - { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, - { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, - { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, - { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, - { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, - { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, - { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, - { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, - { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, - { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, - { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, - { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, - { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, - { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, - { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, ] [[package]] @@ -9190,16 +8647,15 @@ wheels = [ [[package]] name = "pydantic-settings" -version = "2.14.1" +version = "2.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "python-dotenv", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "typing-inspection", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550, upload-time = "2025-02-27T10:10:32.338Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, + { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839, upload-time = "2025-02-27T10:10:30.711Z" }, ] [[package]] @@ -9222,11 +8678,11 @@ wheels = [ [[package]] name = "pyjwt" -version = "2.13.0" +version = "2.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, ] [package.optional-dependencies] @@ -9334,15 +8790,15 @@ wheels = [ [[package]] name = "pytest-asyncio" -version = "1.4.0" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(python_full_version < '3.13' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" }, + { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, ] [[package]] @@ -9361,15 +8817,14 @@ wheels = [ [[package]] name = "pytest-env" -version = "1.6.0" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "python-dotenv", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/69/4db1c30625af0621df8dbe73797b38b6d1b04e15d021dd5d26a6d297f78c/pytest_env-1.6.0.tar.gz", hash = "sha256:ac02d6fba16af54d61e311dd70a3c61024a4e966881ea844affc3c8f0bf207d3", size = 16163, upload-time = "2026-03-12T22:39:43.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/12/9c87d0ca45d5992473208bcef2828169fa7d39b8d7fc6e3401f5c08b8bf7/pytest_env-1.2.0.tar.gz", hash = "sha256:475e2ebe8626cee01f491f304a74b12137742397d6c784ea4bc258f069232b80", size = 8973, upload-time = "2025-10-09T19:15:47.42Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/16/ad52f56b96d851a2bcfdc1e754c3531341885bd7177a128c13ff2ca72ab4/pytest_env-1.6.0-py3-none-any.whl", hash = "sha256:1e7f8a62215e5885835daaed694de8657c908505b964ec8097a7ce77b403d9a3", size = 10400, upload-time = "2026-03-12T22:39:41.887Z" }, + { url = "https://files.pythonhosted.org/packages/27/98/822b924a4a3eb58aacba84444c7439fce32680592f394de26af9c76e2569/pytest_env-1.2.0-py3-none-any.whl", hash = "sha256:d7e5b7198f9b83c795377c09feefa45d56083834e60d04767efd64819fc9da00", size = 6251, upload-time = "2025-10-09T19:15:46.077Z" }, ] [[package]] @@ -9398,15 +8853,15 @@ wheels = [ [[package]] name = "pytest-rerunfailures" -version = "16.3" +version = "16.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pytest", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/f0/74f8e685be7ecd1572c1256132f18fce3a665d7e07649a3f23b7eb2d3bec/pytest_rerunfailures-16.3.tar.gz", hash = "sha256:37c9b1231c8083e9f4e724f50f7a21241822f9516c15c700ebbf218d6452355c", size = 34148, upload-time = "2026-05-22T06:51:22.292Z" } +sdist = { url = "https://files.pythonhosted.org/packages/de/04/71e9520551fc8fe2cf5c1a1842e4e600265b0815f2016b7c27ec85688682/pytest_rerunfailures-16.1.tar.gz", hash = "sha256:c38b266db8a808953ebd71ac25c381cb1981a78ff9340a14bcb9f1b9bff1899e", size = 30889, upload-time = "2025-10-10T07:06:01.238Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/98/58a71d68d3126d7f6a6ed1944c37ec207a4ff3dc66cad3bed7b59d38df61/pytest_rerunfailures-16.3-py3-none-any.whl", hash = "sha256:6bdfb8ffb46c46072e6c16bdedee38b6c13eac620d9415ed5b63152cbf283170", size = 15396, upload-time = "2026-05-22T06:51:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/77/54/60eabb34445e3db3d3d874dc1dfa72751bfec3265bd611cb13c8b290adea/pytest_rerunfailures-16.1-py3-none-any.whl", hash = "sha256:5d11b12c0ca9a1665b5054052fcc1084f8deadd9328962745ef6b04e26382e86", size = 14093, upload-time = "2025-10-10T07:06:00.019Z" }, ] [[package]] @@ -9447,21 +8902,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, ] -[[package]] -name = "python-box" -version = "7.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/0f/34e7ee0a72f1464b4c7a2e8bafb389f230477256af586bc82bcfad85295a/python_box-7.4.1.tar.gz", hash = "sha256:e412e36c25fca8223560516d53ef6c7993591c3b0ec8bb4ec582bf7defdd79f0", size = 49859, upload-time = "2026-02-21T16:21:16.008Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/a8/c8bcd3ff0905ec549273ea3485e6b9f2039f57baab419123fb18f964f829/python_box-7.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3f76dad8be9d57d65a3edc792b952f7afe3991515aa6eba616cf5efb2fbb2e0c", size = 1870869, upload-time = "2026-02-21T16:21:34.16Z" }, - { url = "https://files.pythonhosted.org/packages/0f/bc/9382766d388e258363a18a094e251d2624e3c524614c733d1afa989d9770/python_box-7.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c66582f41a94d46cb0896d468b0efebf9bc4c3a5634cd15373d871767c2e741d", size = 4494287, upload-time = "2026-02-21T16:26:03.131Z" }, - { url = "https://files.pythonhosted.org/packages/4d/d9/d05f317b38b42253422d8483f5d7dc16d382c99ddc253e426639a0f2f235/python_box-7.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dfb91effff00d9e23486c4f0db3b19e03d602ebb7c9e20fc6a287c704fad2552", size = 1849441, upload-time = "2026-02-21T16:21:37.314Z" }, - { url = "https://files.pythonhosted.org/packages/ba/a3/383eb3d658f36c6e531c8cf1e348ccb4b5031231df4aeb7742bb159a3166/python_box-7.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f977f00e715b030cee6ffef2322ff8ce100ffbf1dbcc4ef91099c75752d5f8", size = 4485153, upload-time = "2026-02-21T16:26:04.507Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e9/48d1b1eb21efc3f82a31b037b6903c9139018f686d96d251faa4cb0d593a/python_box-7.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:85db37b43094bf6c4884b931fb149a7850db5ce331f6e191edf98b453e6cf2d6", size = 1845195, upload-time = "2026-02-21T16:21:46.235Z" }, - { url = "https://files.pythonhosted.org/packages/da/79/48d38c855f277223caf3aa79518476f95abc07f04386940855b7bd3d95f6/python_box-7.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb204822c7638bd2dbed5c55d6ab264c6903c37d18dee5c45bdbda58b2e1e17a", size = 4468245, upload-time = "2026-02-21T16:26:05.701Z" }, - { url = "https://files.pythonhosted.org/packages/06/a6/5d3f3abf46b37aa44b1f6788d287c8b4f2319b55013191dddf25b9e6d62c/python_box-7.4.1-py3-none-any.whl", hash = "sha256:a3b0d84d003882fb6abe505b1b883b3a5dcbf226b0fe168d24bc5ff75d9826e5", size = 30402, upload-time = "2026-02-21T16:21:14.78Z" }, -] - [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -9476,15 +8916,15 @@ wheels = [ [[package]] name = "python-discovery" -version = "1.4.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "platformdirs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/12/38c1a0b1e64806780c9563e3fc9f6e472251839662587cfbe9bfaf2ae10a/python_discovery-1.4.0.tar.gz", hash = "sha256:eb8bc7daad3c226c147e45bb4e970a1feb1bf4048ee178e6db59e197b8010ce3", size = 68455, upload-time = "2026-05-28T01:15:37.639Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/88/815e53084c5079a59df912825a279f41dd2e0df82281770eadc732f5352c/python_discovery-1.2.1.tar.gz", hash = "sha256:180c4d114bff1c32462537eac5d6a332b768242b76b69c0259c7d14b1b680c9e", size = 58457, upload-time = "2026-03-26T22:30:44.496Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/8d/3d316429f65029532bb1e28ff77b797d86b5ac3915bb44ca4e19aa283d43/python_discovery-1.4.0-py3-none-any.whl", hash = "sha256:26ed78d703e234879a66244c7d4114563fb13ec5cd30a2d1357e5fb4850782da", size = 33217, upload-time = "2026-05-28T01:15:36.573Z" }, + { url = "https://files.pythonhosted.org/packages/67/0f/019d3949a40280f6193b62bc010177d4ce702d0fce424322286488569cd3/python_discovery-1.2.1-py3-none-any.whl", hash = "sha256:b6a957b24c1cd79252484d3566d1b49527581d46e789aaf43181005e56201502", size = 31674, upload-time = "2026-03-26T22:30:43.396Z" }, ] [[package]] @@ -9550,11 +8990,11 @@ wheels = [ [[package]] name = "pytz" -version = "2026.2" +version = "2026.1.post1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, ] [[package]] @@ -9565,19 +9005,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd77 wheels = [ { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, @@ -9591,13 +9028,11 @@ sdist = { url = "https://files.pythonhosted.org/packages/5e/eb/5a0d575de784f9a1f wheels = [ { url = "https://files.pythonhosted.org/packages/ad/c5/a3d2020ce5ccfc6aede0d45bcb870298652ac0cf199f67714d250e0cdf39/pyyaml_ft-8.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30c5f1751625786c19de751e3130fc345ebcba6a86f6bddd6e1285342f4bbb69", size = 176146, upload-time = "2025-06-10T15:31:50.584Z" }, { url = "https://files.pythonhosted.org/packages/e3/bb/23a9739291086ca0d3189eac7cd92b4d00e9fdc77d722ab610c35f9a82ba/pyyaml_ft-8.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fa992481155ddda2e303fcc74c79c05eddcdbc907b888d3d9ce3ff3e2adcfb0", size = 746792, upload-time = "2025-06-10T15:31:52.304Z" }, - { url = "https://files.pythonhosted.org/packages/5f/c2/e8825f4ff725b7e560d62a3609e31d735318068e1079539ebfde397ea03e/pyyaml_ft-8.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cec6c92b4207004b62dfad1f0be321c9f04725e0f271c16247d8b39c3bf3ea42", size = 786772, upload-time = "2025-06-10T15:31:54.712Z" }, { url = "https://files.pythonhosted.org/packages/35/be/58a4dcae8854f2fdca9b28d9495298fd5571a50d8430b1c3033ec95d2d0e/pyyaml_ft-8.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06237267dbcab70d4c0e9436d8f719f04a51123f0ca2694c00dd4b68c338e40b", size = 778723, upload-time = "2025-06-10T15:31:56.093Z" }, { url = "https://files.pythonhosted.org/packages/86/ed/fed0da92b5d5d7340a082e3802d84c6dc9d5fa142954404c41a544c1cb92/pyyaml_ft-8.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8a7f332bc565817644cdb38ffe4739e44c3e18c55793f75dddb87630f03fc254", size = 758478, upload-time = "2025-06-10T15:31:58.314Z" }, { url = "https://files.pythonhosted.org/packages/f0/69/ac02afe286275980ecb2dcdc0156617389b7e0c0a3fcdedf155c67be2b80/pyyaml_ft-8.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7d10175a746be65f6feb86224df5d6bc5c049ebf52b89a88cf1cd78af5a367a8", size = 799159, upload-time = "2025-06-10T15:31:59.675Z" }, { url = "https://files.pythonhosted.org/packages/0f/16/2710c252ee04cbd74d9562ebba709e5a284faeb8ada88fcda548c9191b47/pyyaml_ft-8.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8d445bf6ea16bb93c37b42fdacfb2f94c8e92a79ba9e12768c96ecde867046d1", size = 182879, upload-time = "2025-06-10T15:32:04.466Z" }, { url = "https://files.pythonhosted.org/packages/9a/40/ae8163519d937fa7bfa457b6f78439cc6831a7c2b170e4f612f7eda71815/pyyaml_ft-8.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c56bb46b4fda34cbb92a9446a841da3982cdde6ea13de3fbd80db7eeeab8b49", size = 811277, upload-time = "2025-06-10T15:32:06.214Z" }, - { url = "https://files.pythonhosted.org/packages/f9/66/28d82dbff7f87b96f0eeac79b7d972a96b4980c1e445eb6a857ba91eda00/pyyaml_ft-8.0.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dab0abb46eb1780da486f022dce034b952c8ae40753627b27a626d803926483b", size = 831650, upload-time = "2025-06-10T15:32:08.076Z" }, { url = "https://files.pythonhosted.org/packages/e8/df/161c4566facac7d75a9e182295c223060373d4116dead9cc53a265de60b9/pyyaml_ft-8.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd48d639cab5ca50ad957b6dd632c7dd3ac02a1abe0e8196a3c24a52f5db3f7a", size = 815755, upload-time = "2025-06-10T15:32:09.435Z" }, { url = "https://files.pythonhosted.org/packages/05/10/f42c48fa5153204f42eaa945e8d1fd7c10d6296841dcb2447bf7da1be5c4/pyyaml_ft-8.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:052561b89d5b2a8e1289f326d060e794c21fa068aa11255fe71d65baf18a632e", size = 810403, upload-time = "2025-06-10T15:32:11.051Z" }, { url = "https://files.pythonhosted.org/packages/d5/d2/e369064aa51009eb9245399fd8ad2c562bd0bcd392a00be44b2a824ded7c/pyyaml_ft-8.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3bb4b927929b0cb162fb1605392a321e3333e48ce616cdcfa04a839271373255", size = 835581, upload-time = "2025-06-10T15:32:12.897Z" }, @@ -9664,16 +9099,16 @@ wheels = [ [[package]] name = "referencing" -version = "0.37.0" +version = "0.36.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rpds-py", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(python_full_version < '3.13' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, ] [[package]] @@ -9685,56 +9120,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c2/dc/c1f2df4027e82fc54b5a473e4b250f5139faca49a0fbe29a48668d228f34/regex-2026.5.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ccf5249114cc3e772ecdd88a98a86eca0fd74c61ce32a94743758c083fc05d48", size = 489445, upload-time = "2026-05-09T23:12:06.111Z" }, { url = "https://files.pythonhosted.org/packages/58/b6/14b2c84ff90ddb370c81d27503f4a0fcf071496416f4855f6cc8c5d81c35/regex-2026.5.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef31cbfe458e21c6122ba8150ff060e0c7789ed0d26eb423f25472584920b555", size = 289212, upload-time = "2026-05-09T23:12:09.266Z" }, { url = "https://files.pythonhosted.org/packages/03/d0/4db86529117320de0c84afd90e70bb47434625875e34fcef9d8c127c5b16/regex-2026.5.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:992604d02e6d9c6d786c24a706a71ecffe1020fc1ef264044474cd81fa2c3919", size = 792310, upload-time = "2026-05-09T23:12:11.416Z" }, - { url = "https://files.pythonhosted.org/packages/07/78/fe4800cd322f862ecffd2d553409b20d80650e5ed71b9d178f853d020b82/regex-2026.5.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9411dd64ca95477225734a93dfc8583b51916b8d5942f99d6cac21e09965451", size = 861721, upload-time = "2026-05-09T23:12:13.681Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d0/b3618a895dd8feb897c61bb2954edd265e1767d82a01d53065d5871127a3/regex-2026.5.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4a3ff360dfb836fecdb93a4598f9d6e2ac81e3e397125145c6221bf58cf4c", size = 906460, upload-time = "2026-05-09T23:12:15.443Z" }, { url = "https://files.pythonhosted.org/packages/33/6f/1481597e859ef19508b345eec4afd1416ed6e6b459c75a64026ef193aecf/regex-2026.5.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a661a7d270a61f7cf460caee8b9fa2d5ef9e5c681234bcb9e0fe14f488e7dfc", size = 799843, upload-time = "2026-05-09T23:12:16.892Z" }, - { url = "https://files.pythonhosted.org/packages/73/59/955734c803f59108deccba3597ae440c76b62a652733c0006e6243758420/regex-2026.5.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f079e50a0d3cc3cd5091fa9ff45869a2e6b2cd35895731edafb0327901a8d86d", size = 773610, upload-time = "2026-05-09T23:12:19.127Z" }, { url = "https://files.pythonhosted.org/packages/68/8f/70c04a236d651c81881dac42ef8538bddda6121434509d0a22d9e601503b/regex-2026.5.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ebe8f0b5ec5a5024dc4a4c59f444c4e9afc5f2abdbb8962065b75d27fb971f9", size = 781645, upload-time = "2026-05-09T23:12:20.806Z" }, - { url = "https://files.pythonhosted.org/packages/1d/96/05c7434d88185e5d27fe54aeb74df86bd77cd79f52f0b4eae54faa8fea70/regex-2026.5.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:97cf3bc1b7d7d2306772ec07366c80d9df00ff79e79cea32898883a646d2fae2", size = 854473, upload-time = "2026-05-09T23:12:22.465Z" }, - { url = "https://files.pythonhosted.org/packages/4e/c1/6e3d8202d981f3117004bf341ee74893ba4ba8a9fbaf4b94615846550a08/regex-2026.5.9-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0f9eede6a5cbdc02d4978090186390936e1776a7d1359b21e41014c609880bcf", size = 763311, upload-time = "2026-05-09T23:12:24.351Z" }, - { url = "https://files.pythonhosted.org/packages/93/c7/e7737f1526b3fb32bd4c337fd6c71c3ebb5c8296fc34d11197e0955d2e35/regex-2026.5.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:01f0f5f55f4b64dacec85dc116d3c05fd23ad3ff037bbc73a2085775953c2611", size = 844593, upload-time = "2026-05-09T23:12:26.341Z" }, { url = "https://files.pythonhosted.org/packages/a5/27/0daffb1a535bb39f422c3d200f4ab023c71110ad66a32b366bee708baba0/regex-2026.5.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1268eddd8486dc561d08eee1156e40aa3a8fe10f4bdec8fa653b455fcbffd12c", size = 789167, upload-time = "2026-05-09T23:12:27.975Z" }, { url = "https://files.pythonhosted.org/packages/50/9b/6550044bc44e17c84d312c031c2ec42fbdb6a4ec4e29093be3a172d08772/regex-2026.5.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06", size = 490451, upload-time = "2026-05-09T23:12:34.72Z" }, { url = "https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225", size = 289599, upload-time = "2026-05-09T23:12:38.089Z" }, { url = "https://files.pythonhosted.org/packages/d8/dd/ba103dc19614e25f3880800ca67ce093d6e21b325d72b8383c7bf906e9fa/regex-2026.5.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0", size = 796732, upload-time = "2026-05-09T23:12:40.062Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e7/f035b4fd858b050b0080bf302968dc0f59ba34e391872d54936758e6844e/regex-2026.5.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107", size = 865440, upload-time = "2026-05-09T23:12:42.059Z" }, - { url = "https://files.pythonhosted.org/packages/0a/51/8cd301ecc899aea28124357f729f4272f44de7806fc7ca02490bfbe253e8/regex-2026.5.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309", size = 912329, upload-time = "2026-05-09T23:12:44.373Z" }, { url = "https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8", size = 801239, upload-time = "2026-05-09T23:12:46.268Z" }, - { url = "https://files.pythonhosted.org/packages/17/2f/6f6008682bf2cf98040a0d3153a8e557b6ab728d7713d045cee4ce544ab8/regex-2026.5.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66", size = 777054, upload-time = "2026-05-09T23:12:48.051Z" }, { url = "https://files.pythonhosted.org/packages/19/2b/eee0d20a6842ba04df4b8847a920b57ef56853f14ef85405473e586b605a/regex-2026.5.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026", size = 785098, upload-time = "2026-05-09T23:12:49.851Z" }, - { url = "https://files.pythonhosted.org/packages/4a/98/6fc1e6410feefb92159edaed5041992bfe390e8d26c721865434acbca558/regex-2026.5.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962", size = 860095, upload-time = "2026-05-09T23:12:51.666Z" }, - { url = "https://files.pythonhosted.org/packages/18/a3/bd855e0f2cb1a978ecf6fa6bb69632dd9c3f6ea3b81cde62fde14c9daec7/regex-2026.5.9-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621", size = 765762, upload-time = "2026-05-09T23:12:53.413Z" }, - { url = "https://files.pythonhosted.org/packages/dc/66/0ae8c092e60b14c79d24f8e0b7f0aea5bfbffdcab00b5483d13404d3c3a5/regex-2026.5.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d", size = 852100, upload-time = "2026-05-09T23:12:55.256Z" }, { url = "https://files.pythonhosted.org/packages/21/de/8dfde60fc1b21c946a893ba273403b72617edb261370cb1087099a83f088/regex-2026.5.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce", size = 789479, upload-time = "2026-05-09T23:12:57.573Z" }, { url = "https://files.pythonhosted.org/packages/aa/da/797e91ecec6f84135da778ddce78c20e0af5d2a15c26f87a81bc3eadb6db/regex-2026.5.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d626b84406444b165fc0ba981604edea39f0588ff1f92baa23fe50799ea9afdb", size = 490303, upload-time = "2026-05-09T23:13:04.382Z" }, { url = "https://files.pythonhosted.org/packages/2d/e7/d0eaf5713828417b9e5648cf81fa9bacd4961f6ab98c380c2034f8716e35/regex-2026.5.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a8820737949116ffff55fe18f9fc644530063ba6ebfcb8314239416e78f1347c", size = 289468, upload-time = "2026-05-09T23:13:08.214Z" }, { url = "https://files.pythonhosted.org/packages/d3/9b/b3fdd62b003baa1a9b593cd8c8699c9651c2e80cc21a5c715707983c42d7/regex-2026.5.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0fbdbac82cb3e4450d0ccde7d7a35607f4cb2dd9fba4b8b69bfaf8c9fa6aed", size = 796749, upload-time = "2026-05-09T23:13:10.573Z" }, - { url = "https://files.pythonhosted.org/packages/d4/30/66ab84588765f5b4b271a9ca09ef7ce2b87caa95176ec3d2ad65d7bc4902/regex-2026.5.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57e8915c7986aa33d25e4d3629cef711cd2863f2961b10409f0c04cb8b7d9020", size = 865445, upload-time = "2026-05-09T23:13:12.523Z" }, - { url = "https://files.pythonhosted.org/packages/1a/89/f05169e8588aac365f35ffc7f3bc3184f095ef4cfded7cfaa3c7fd5dbd89/regex-2026.5.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508f56a89ba9cb26e4168cbc37dbd60a28d82430a9e18ad1d25fe0883c314ca2", size = 912322, upload-time = "2026-05-09T23:13:14.281Z" }, { url = "https://files.pythonhosted.org/packages/30/e1/c93444052cf41581f3c884ab3fb5823daf0992f11cd4388d4275ca610558/regex-2026.5.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d189041f15691cfa2b6c4290448ec221244d225b3f5fe9e7771b34ffcdf6e2", size = 801269, upload-time = "2026-05-09T23:13:16.569Z" }, - { url = "https://files.pythonhosted.org/packages/50/fe/0cf96b882f540e62e8b9956599798203d599c44cf4c77917ca27400ff69b/regex-2026.5.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e82db382b44d0111b22601c509c89f64434816c9e0eef9d1989cda8cc6ff1c04", size = 777085, upload-time = "2026-05-09T23:13:18.675Z" }, { url = "https://files.pythonhosted.org/packages/23/5c/d78d4924e7fc875557b9e9b768423925fdfaac5549d06da7810019a9bd26/regex-2026.5.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2acfb48634f64996b57f90f39afa692ff362162722581921fe92239a59960f3c", size = 785153, upload-time = "2026-05-09T23:13:20.525Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e0/5214774090e7b4524dcea3e3c4aa74141d43043f8beb49c1599db1c8b53a/regex-2026.5.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d29eebfc9525db68cad3c97eedd7f754fa265aa5cd0cf4f863b2421e1b48fc9f", size = 860164, upload-time = "2026-05-09T23:13:22.263Z" }, - { url = "https://files.pythonhosted.org/packages/6e/e1/4a57a83350319b1271f0d7a249b8672513ed928b237a741631270de6caea/regex-2026.5.9-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:debb893095e944091c16e641a6e33c1b0f4cb61ab945ec5afbf53ce7068834d8", size = 765731, upload-time = "2026-05-09T23:13:24.277Z" }, - { url = "https://files.pythonhosted.org/packages/12/f4/499e74a20c156fc75836ee04a72a38d1a063978f600937f9760467beb1b0/regex-2026.5.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d659eee77986549c9ea45b861c7567e44d6287c3dc9a4565478853f7b9fe2ff6", size = 852062, upload-time = "2026-05-09T23:13:26.125Z" }, { url = "https://files.pythonhosted.org/packages/5b/92/7eebc0d0a01e78629695f342ba17e0deaff8fb45e79cc0d7b98287da6e3e/regex-2026.5.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2efa205e6d98b24d1f3ab395c11aa15cdf10935bca283d0285e0499c284fba21", size = 789577, upload-time = "2026-05-09T23:13:27.814Z" }, { url = "https://files.pythonhosted.org/packages/e8/e9/d21346f7b60ed58789371358ed66b09d00f832e1bd7c06e55d9da5679882/regex-2026.5.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:01f28d868834624c934b8d2e0aa1c8341337e37831f4a012f18a5afcba4cbaf3", size = 494172, upload-time = "2026-05-09T23:13:35.935Z" }, { url = "https://files.pythonhosted.org/packages/f2/7d/9fbf919768368d3f8a4f6c692cf2aa61e482b2b81ec6a298ace4cbf02480/regex-2026.5.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b96350aa424e79d4fd6b567b344dcbe2b2d6bfc48dfe7717587e1fa6d43da6ff", size = 292314, upload-time = "2026-05-09T23:13:40.353Z" }, { url = "https://files.pythonhosted.org/packages/e2/6c/e41bfeecb589716843e7c4df09ba46ff2a42961457afece19059d85caeef/regex-2026.5.9-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f3af7a4903c5c04a11a196a5aa75cdd7dd3f8508132f9fb3259d9f5908e3b88", size = 811681, upload-time = "2026-05-09T23:13:42.543Z" }, - { url = "https://files.pythonhosted.org/packages/87/83/a5c1c525fba0aa656e88ad0face0b1829788ef4c2fb6b26df58aa1151b84/regex-2026.5.9-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e87577720152d2caae19fe2baaf1f8d5ca12091e9e229f03915c37d1e4b9178", size = 871135, upload-time = "2026-05-09T23:13:44.326Z" }, - { url = "https://files.pythonhosted.org/packages/18/d4/80882e799e440dd878b0979cbebf8fa4d54624a332c83037c7a701649e3f/regex-2026.5.9-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c8b9b9d294cfea3cd19c718ade7cc93492b2c4991abd9a68d0b3477ae6d8e100", size = 917265, upload-time = "2026-05-09T23:13:47.295Z" }, { url = "https://files.pythonhosted.org/packages/ae/ff/8db60211e2286e396aad7dc7725356c502bff0901ea05bd6cdc2e1a042b9/regex-2026.5.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:728d8bfd28a8845c8b6bc5dc7ce010453d206396786c0765c2740cb65f37791e", size = 816311, upload-time = "2026-05-09T23:13:49.885Z" }, - { url = "https://files.pythonhosted.org/packages/4c/47/742ef579c61730f8d268e5cf1f9ce0e37e2ea041ad0f5644724f2378e463/regex-2026.5.9-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e30b874d341fac767d7df5a0870540541c2c054b80cfaac116e8d367a8a7ff2", size = 785498, upload-time = "2026-05-09T23:13:52.25Z" }, { url = "https://files.pythonhosted.org/packages/7f/ab/cb0999802dcb0fb95b1ab005e8d4163d8afdd67efc2cb6b6630ac13f8cb1/regex-2026.5.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fd190e88a895a8901325fad284a3f74ea52b1da8525b76cc811fa9b1edf0ce2b", size = 801348, upload-time = "2026-05-09T23:13:54.127Z" }, - { url = "https://files.pythonhosted.org/packages/7d/62/8ca59a24c55bc34d166eefaf3717bd77772f329fdbf984d86581e0a3571c/regex-2026.5.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:8e76e8161ad00694cfce6767d5dea860c6391ac5b83e5c3a39661e696f11fc7e", size = 866493, upload-time = "2026-05-09T23:13:56.067Z" }, - { url = "https://files.pythonhosted.org/packages/8d/3d/30f2ae62cef3278bb5bb821f467277a55fb73f01032cf85997e15e8289a8/regex-2026.5.9-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ddda5340e6c01a293027dd46232fa79eaff1b48058ce7a98f572b6445b088041", size = 772811, upload-time = "2026-05-09T23:13:57.867Z" }, - { url = "https://files.pythonhosted.org/packages/d8/ae/7d2089bcd78ad0c0161bc684339df50032acb438a7bd3305e7ddb1193cec/regex-2026.5.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:205109e96b3cf5adf8f4cd62bedde9487feb282b9497a3535451e5a24cd706a0", size = 856584, upload-time = "2026-05-09T23:13:59.679Z" }, { url = "https://files.pythonhosted.org/packages/a9/29/92ff47f75990131ea4f24ba17819e5a9d141e10819807e09addd73409af6/regex-2026.5.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbe4579b9f08036aa7d101d1835437a20783574ac66327e6b29b4018a138081", size = 803453, upload-time = "2026-05-09T23:14:01.978Z" }, ] [[package]] name = "requests" -version = "2.34.2" +version = "2.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -9742,9 +9153,9 @@ dependencies = [ { name = "idna", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "urllib3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, ] [[package]] @@ -9772,30 +9183,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, ] -[[package]] -name = "responses" -version = "0.26.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "urllib3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/58/1fb6de3503428196df78638f991ec8095274f1ee9723e272ee4d9ff0092b/responses-0.26.1.tar.gz", hash = "sha256:2eb3218553cc8f79b57d257bac23af5e1bf381f5b9390b1767816f0843e01dc2", size = 83088, upload-time = "2026-05-21T19:56:39.747Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/31/6a620b4427d546b9e7cca8b3b8c5f0559d9cef2bb9eedcda7f73c1473c19/responses-0.26.1-py3-none-any.whl", hash = "sha256:8aacc4586eb08fb2208ef64a9eb4258d9b0c6e6f4260845f2f018ab847495345", size = 35502, upload-time = "2026-05-21T19:56:38.046Z" }, -] - [[package]] name = "respx" -version = "0.23.1" +version = "0.22.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/98/4e55c9c486404ec12373708d015ebce157966965a5ebe7f28ff2c784d41b/respx-0.23.1.tar.gz", hash = "sha256:242dcc6ce6b5b9bf621f5870c82a63997e8e82bc7c947f9ffe272b8f3dd5a780", size = 29243, upload-time = "2026-04-08T14:37:16.008Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/7c/96bd0bc759cf009675ad1ee1f96535edcb11e9666b985717eb8c87192a95/respx-0.22.0.tar.gz", hash = "sha256:3c8924caa2a50bd71aefc07aa812f2466ff489f1848c96e954a5362d17095d91", size = 28439, upload-time = "2024-12-19T22:33:59.374Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/4a/221da6ca167db45693d8d26c7dc79ccfc978a440251bf6721c9aaf251ac0/respx-0.23.1-py2.py3-none-any.whl", hash = "sha256:b18004b029935384bccfa6d7d9d74b4ec9af73a081cc28600fffc0447f4b8c1a", size = 25557, upload-time = "2026-04-08T14:37:14.613Z" }, + { url = "https://files.pythonhosted.org/packages/8e/67/afbb0978d5399bc9ea200f1d4489a23c9a1dad4eee6376242b8182389c79/respx-0.22.0-py2.py3-none-any.whl", hash = "sha256:631128d4c9aba15e56903fb5f66fb1eff412ce28dd387ca3a81339e52dbd3ad0", size = 25127, upload-time = "2024-12-19T22:33:57.837Z" }, ] [[package]] @@ -9819,68 +9216,56 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, ] -[[package]] -name = "rfc3987-syntax" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lark", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, -] - [[package]] name = "rich" -version = "14.3.4" +version = "14.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pygments", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/67/cae617f1351490c25a4b8ac3b8b63a4dda609295d8222bad12242dfdc629/rich-14.3.4.tar.gz", hash = "sha256:817e02727f2b25b40ef56f5aa2217f400c8489f79ca8f46ea2b70dd5e14558a9", size = 230524, upload-time = "2026-04-11T02:57:45.419Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/76/6d163cfac87b632216f71879e6b2cf17163f773ff59c00b5ff4900a80fa3/rich-14.3.4-py3-none-any.whl", hash = "sha256:07e7adb4690f68864777b1450859253bed81a99a31ac321ac1817b2313558952", size = 310480, upload-time = "2026-04-11T02:57:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, ] [[package]] name = "rich-argparse" -version = "1.8.0" +version = "1.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/e5/1064c43203a357d668cd42435f7a15fe6af51512d85b2104fecb937aa861/rich_argparse-1.8.0.tar.gz", hash = "sha256:679df3d832fa94ad6e4bdb07ded088cd7ea2dddc58ae9b2b46346a40b06cbc0c", size = 38940, upload-time = "2026-05-01T15:18:43.604Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/f7/1c65e0245d4c7009a87ac92908294a66e7e7635eccf76a68550f40c6df80/rich_argparse-1.7.2.tar.gz", hash = "sha256:64fd2e948fc96e8a1a06e0e72c111c2ce7f3af74126d75c0f5f63926e7289cd1", size = 38500, upload-time = "2025-11-01T10:35:44.232Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/35/1cceccc5fcb50fa2ed53e2aa278cd032f3902682a73e763fb1ac3be8e6fa/rich_argparse-1.8.0-py3-none-any.whl", hash = "sha256:d2a3ce7854654e2253c578763ab0a32f05016f23a55fadba7b9a91b6c0e92142", size = 25616, upload-time = "2026-05-01T15:18:42.395Z" }, + { url = "https://files.pythonhosted.org/packages/04/80/97b6f357ac458d9ad9872cc3183ca09ef7439ac89e030ea43053ba1294b6/rich_argparse-1.7.2-py3-none-any.whl", hash = "sha256:0559b1f47a19bbeb82bf15f95a057f99bcbbc98385532f57937f9fc57acc501a", size = 25476, upload-time = "2025-11-01T10:35:42.681Z" }, ] [[package]] name = "rich-rst" -version = "2.0.1" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pygments", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "docutils", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/56/3191bae66b08ccc637ea8120426068bcb361cc323c96404c310886937067/rich_rst-2.0.1.tar.gz", hash = "sha256:cbe236ed0901d1ec8427cc6a50bf0a34353ba28ad014dc24def68bfe7f3b9e68", size = 300570, upload-time = "2026-05-16T00:47:57.362Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/6d/a506aaa4a9eaa945ed8ab2b7347859f53593864289853c5d6d62b77246e0/rich_rst-1.3.2.tar.gz", hash = "sha256:a1196fdddf1e364b02ec68a05e8ff8f6914fee10fbca2e6b6735f166bb0da8d4", size = 14936, upload-time = "2025-10-14T16:49:45.332Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/3d/55c17d3ebdf3cd81356002afe5bef9bb8af631db2819785b6eac845b925b/rich_rst-2.0.1-py3-none-any.whl", hash = "sha256:7ee15f345ce25fa02b582c272a6cdbaf0c21243e38061cea273cff659bf3ef61", size = 272922, upload-time = "2026-05-16T00:47:55.508Z" }, + { url = "https://files.pythonhosted.org/packages/13/2f/b4530fbf948867702d0a3f27de4a6aab1d156f406d72852ab902c4d04de9/rich_rst-1.3.2-py3-none-any.whl", hash = "sha256:a99b4907cbe118cf9d18b0b44de272efa61f15117c61e39ebdc431baf5df722a", size = 12567, upload-time = "2025-10-14T16:49:42.953Z" }, ] [[package]] name = "rich-toolkit" -version = "0.20.1" +version = "0.19.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/29/63/3e427c62f1992945c997d4ec31e2fcb37d26aadbe5aa44ae5b29f7f64d26/rich_toolkit-0.20.1.tar.gz", hash = "sha256:c7336ae281f435c785acecaedc4b71d4b663dc73d9c8079fea96372527e822a4", size = 203473, upload-time = "2026-06-05T08:56:57.679Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/ba/dae9e3096651042754da419a4042bc1c75e07d615f9b15066d738838e4df/rich_toolkit-0.19.7.tar.gz", hash = "sha256:133c0915872da91d4c25d85342d5ec1dfacc69b63448af1a08a0d4b4f23ef46e", size = 195877, upload-time = "2026-02-24T16:06:20.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/88/309f07d08155da2ba1d5ceb42d270fb42fbe34a807684543e3ffc10fe713/rich_toolkit-0.20.1-py3-none-any.whl", hash = "sha256:2a6d5f8e15759b9eba5a9ee63da10b275359ead20e5a0fc92bd5b4dbae8ce4bf", size = 35525, upload-time = "2026-06-05T08:56:58.586Z" }, + { url = "https://files.pythonhosted.org/packages/fb/3c/c923619f6d2f5fafcc96fec0aaf9550a46cd5b6481f06e0c6b66a2a4fed0/rich_toolkit-0.19.7-py3-none-any.whl", hash = "sha256:0288e9203728c47c5a4eb60fd2f0692d9df7455a65901ab6f898437a2ba5989d", size = 32963, upload-time = "2026-02-24T16:06:22.066Z" }, ] [[package]] @@ -9891,39 +9276,23 @@ sdist = { url = "https://files.pythonhosted.org/packages/e5/f5/8bed2310abe4ae04b wheels = [ { url = "https://files.pythonhosted.org/packages/52/66/ba7f561b6062402022887706a7f2b2c2e2e2a28f1e3839202b0a2f77e36d/rignore-0.7.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182f4e5e4064d947c756819446a7d4cdede8e756b8c81cf9e509683fe38778d7", size = 823882, upload-time = "2025-11-05T20:42:23.488Z" }, { url = "https://files.pythonhosted.org/packages/f5/81/4087453df35a90b07370647b19017029324950c1b9137d54bf1f33843f17/rignore-0.7.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16b63047648a916a87be1e51bb5c009063f1b8b6f5afe4f04f875525507e63dc", size = 899362, upload-time = "2025-11-05T20:40:51.111Z" }, - { url = "https://files.pythonhosted.org/packages/fb/c9/390a8fdfabb76d71416be773bd9f162977bd483084f68daf19da1dec88a6/rignore-0.7.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba5524f5178deca4d7695e936604ebc742acb8958f9395776e1fcb8133f8257a", size = 873633, upload-time = "2025-11-05T20:41:06.193Z" }, - { url = "https://files.pythonhosted.org/packages/df/c9/79404fcb0faa76edfbc9df0901f8ef18568d1104919ebbbad6d608c888d1/rignore-0.7.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62020dbb89a1dd4b84ab3d60547b3b2eb2723641d5fb198463643f71eaaed57d", size = 1167633, upload-time = "2025-11-05T20:41:22.491Z" }, - { url = "https://files.pythonhosted.org/packages/6e/8d/b3466d32d445d158a0aceb80919085baaae495b1f540fb942f91d93b5e5b/rignore-0.7.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b34acd532769d5a6f153a52a98dcb81615c949ab11697ce26b2eb776af2e174d", size = 941434, upload-time = "2025-11-05T20:41:38.151Z" }, { url = "https://files.pythonhosted.org/packages/e8/40/9cd949761a7af5bc27022a939c91ff622d29c7a0b66d0c13a863097dde2d/rignore-0.7.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c5e53b752f9de44dff7b3be3c98455ce3bf88e69d6dc0cf4f213346c5e3416c", size = 959461, upload-time = "2025-11-05T20:42:08.476Z" }, { url = "https://files.pythonhosted.org/packages/6c/31/1ecff992fc3f59c4fcdcb6c07d5f6c1e6dfb55ccda19c083aca9d86fa1c6/rignore-0.7.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e01cad2b0b92f6b1993f29fc01f23f2d78caf4bf93b11096d28e9d578eb08ce", size = 1079173, upload-time = "2025-11-05T21:40:12.007Z" }, - { url = "https://files.pythonhosted.org/packages/17/18/162eedadb4c2282fa4c521700dbf93c9b14b8842e8354f7d72b445b8d593/rignore-0.7.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5991e46ab9b4868334c9e372ab0892b0150f3f586ff2b1e314272caeb38aaedb", size = 1139012, upload-time = "2025-11-05T21:40:29.399Z" }, { url = "https://files.pythonhosted.org/packages/9f/22/1c1a65047df864def9a047dbb40bc0b580b8289a4280e62779cd61ae21f2/rignore-0.7.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aaf938530dcc0b47c4cfa52807aa2e5bfd5ca6d57a621125fe293098692f6345", size = 1128182, upload-time = "2025-11-05T21:41:04.239Z" }, { url = "https://files.pythonhosted.org/packages/93/b0/d4f1f3fe9eb3f8e382d45ce5b0547ea01c4b7e0b4b4eb87bcd66a1d2b888/rignore-0.7.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9e624f6be6116ea682e76c5feb71ea91255c67c86cb75befe774365b2931961", size = 820411, upload-time = "2025-11-05T20:42:24.782Z" }, { url = "https://files.pythonhosted.org/packages/4a/c8/dea564b36dedac8de21c18e1851789545bc52a0c22ece9843444d5608a6a/rignore-0.7.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bda49950d405aa8d0ebe26af807c4e662dd281d926530f03f29690a2e07d649a", size = 897821, upload-time = "2025-11-05T20:40:52.613Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2b/ee96db17ac1835e024c5d0742eefb7e46de60020385ac883dd3d1cde2c1f/rignore-0.7.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5fd5ab3840b8c16851d327ed06e9b8be6459702a53e5ab1fc4073b684b3789e", size = 873963, upload-time = "2025-11-05T20:41:07.49Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8c/ad5a57bbb9d14d5c7e5960f712a8a0b902472ea3f4a2138cbf70d1777b75/rignore-0.7.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ced2a248352636a5c77504cb755dc02c2eef9a820a44d3f33061ce1bb8a7f2d2", size = 1169216, upload-time = "2025-11-05T20:41:23.73Z" }, - { url = "https://files.pythonhosted.org/packages/80/e6/5b00bc2a6bc1701e6878fca798cf5d9125eb3113193e33078b6fc0d99123/rignore-0.7.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a04a3b73b75ddc12c9c9b21efcdaab33ca3832941d6f1d67bffd860941cd448a", size = 942942, upload-time = "2025-11-05T20:41:39.393Z" }, { url = "https://files.pythonhosted.org/packages/85/e5/7f99bd0cc9818a91d0e8b9acc65b792e35750e3bdccd15a7ee75e64efca4/rignore-0.7.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24321efac92140b7ec910ac7c53ab0f0c86a41133d2bb4b0e6a7c94967f44dd", size = 959787, upload-time = "2025-11-05T20:42:09.765Z" }, { url = "https://files.pythonhosted.org/packages/41/f7/e80f55dfe0f35787fa482aa18689b9c8251e045076c35477deb0007b3277/rignore-0.7.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1734dc49d1e9501b07852ef44421f84d9f378da9fbeda729e77db71f49cac28b", size = 1078647, upload-time = "2025-11-05T21:40:13.463Z" }, - { url = "https://files.pythonhosted.org/packages/d4/cf/2c64f0b6725149f7c6e7e5a909d14354889b4beaadddaa5fff023ec71084/rignore-0.7.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5719ea14ea2b652c0c0894be5dfde954e1853a80dea27dd2fbaa749618d837f5", size = 1139186, upload-time = "2025-11-05T21:40:31.27Z" }, { url = "https://files.pythonhosted.org/packages/7f/5e/13b249613fd5d18d58662490ab910a9f0be758981d1797789913adb4e918/rignore-0.7.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3efdcf1dd84d45f3e2bd2f93303d9be103888f56dfa7c3349b5bf4f0657ec696", size = 1127725, upload-time = "2025-11-05T21:41:05.804Z" }, { url = "https://files.pythonhosted.org/packages/f9/8f/f8daacd177db4bf7c2223bab41e630c52711f8af9ed279be2058d2fe4982/rignore-0.7.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:90f0a00ce0c866c275bf888271f1dc0d2140f29b82fcf33cdbda1e1a6af01010", size = 820150, upload-time = "2025-11-05T20:42:26.545Z" }, { url = "https://files.pythonhosted.org/packages/36/31/b65b837e39c3f7064c426754714ac633b66b8c2290978af9d7f513e14aa9/rignore-0.7.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1ad295537041dc2ed4b540fb1a3906bd9ede6ccdad3fe79770cd89e04e3c73c", size = 897406, upload-time = "2025-11-05T20:40:53.854Z" }, - { url = "https://files.pythonhosted.org/packages/ca/58/1970ce006c427e202ac7c081435719a076c478f07b3a23f469227788dc23/rignore-0.7.6-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f782dbd3a65a5ac85adfff69e5c6b101285ef3f845c3a3cae56a54bebf9fe116", size = 874050, upload-time = "2025-11-05T20:41:08.922Z" }, - { url = "https://files.pythonhosted.org/packages/d4/00/eb45db9f90137329072a732273be0d383cb7d7f50ddc8e0bceea34c1dfdf/rignore-0.7.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65cece3b36e5b0826d946494734c0e6aaf5a0337e18ff55b071438efe13d559e", size = 1167835, upload-time = "2025-11-05T20:41:24.997Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f1/6f1d72ddca41a64eed569680587a1236633587cc9f78136477ae69e2c88a/rignore-0.7.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d7e4bb66c13cd7602dc8931822c02dfbbd5252015c750ac5d6152b186f0a8be0", size = 941945, upload-time = "2025-11-05T20:41:40.628Z" }, { url = "https://files.pythonhosted.org/packages/48/6f/2f178af1c1a276a065f563ec1e11e7a9e23d4996fd0465516afce4b5c636/rignore-0.7.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297e500c15766e196f68aaaa70e8b6db85fa23fdc075b880d8231fdfba738cd7", size = 959067, upload-time = "2025-11-05T20:42:11.09Z" }, { url = "https://files.pythonhosted.org/packages/31/eb/c4f92cc3f2825d501d3c46a244a671eb737fc1bcf7b05a3ecd34abb3e0d7/rignore-0.7.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:181eb2a975a22256a1441a9d2f15eb1292839ea3f05606620bd9e1938302cf79", size = 1078365, upload-time = "2025-11-05T21:40:15.148Z" }, - { url = "https://files.pythonhosted.org/packages/26/09/99442f02794bd7441bfc8ed1c7319e890449b816a7493b2db0e30af39095/rignore-0.7.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:7bbcdc52b5bf9f054b34ce4af5269df5d863d9c2456243338bc193c28022bd7b", size = 1139066, upload-time = "2025-11-05T21:40:32.771Z" }, { url = "https://files.pythonhosted.org/packages/e2/25/d37215e4562cda5c13312636393aea0bafe38d54d4e0517520a4cc0753ec/rignore-0.7.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee4a18b82cbbc648e4aac1510066682fe62beb5dc88e2c67c53a83954e541360", size = 1127550, upload-time = "2025-11-05T21:41:07.648Z" }, { url = "https://files.pythonhosted.org/packages/35/af/c69c0c51b8f9f7914d95c4ea91c29a2ac067572048cae95dd6d2efdbe05d/rignore-0.7.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:392dcabfecbe176c9ebbcb40d85a5e86a5989559c4f988c2741da7daf1b5be25", size = 825976, upload-time = "2025-11-05T20:42:35.118Z" }, { url = "https://files.pythonhosted.org/packages/f1/d2/1b264f56132264ea609d3213ab603d6a27016b19559a1a1ede1a66a03dcd/rignore-0.7.6-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22baa462abdc36fdd5a5e2dae423107723351b85ff093762f9261148b9d0a04a", size = 899739, upload-time = "2025-11-05T20:41:01.518Z" }, - { url = "https://files.pythonhosted.org/packages/55/e4/b3c5dfdd8d8a10741dfe7199ef45d19a0e42d0c13aa377c83bd6caf65d90/rignore-0.7.6-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53fb28882d2538cb2d231972146c4927a9d9455e62b209f85d634408c4103538", size = 874843, upload-time = "2025-11-05T20:41:17.687Z" }, - { url = "https://files.pythonhosted.org/packages/cc/10/d6f3750233881a2a154cefc9a6a0a9b19da526b19f7f08221b552c6f827d/rignore-0.7.6-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87409f7eeb1103d6b77f3472a3a0d9a5953e3ae804a55080bdcb0120ee43995b", size = 1170348, upload-time = "2025-11-05T20:41:34.21Z" }, - { url = "https://files.pythonhosted.org/packages/6e/10/ad98ca05c9771c15af734cee18114a3c280914b6e34fde9ffea2e61e88aa/rignore-0.7.6-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:684014e42e4341ab3ea23a203551857fcc03a7f8ae96ca3aefb824663f55db32", size = 942315, upload-time = "2025-11-05T20:41:48.508Z" }, { url = "https://files.pythonhosted.org/packages/de/00/ab5c0f872acb60d534e687e629c17e0896c62da9b389c66d3aa16b817aa8/rignore-0.7.6-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77356ebb01ba13f8a425c3d30fcad40e57719c0e37670d022d560884a30e4767", size = 961047, upload-time = "2025-11-05T20:42:19.403Z" }, { url = "https://files.pythonhosted.org/packages/33/b8/133aa4002cee0ebbb39362f94e4898eec7fbd09cec9fcbce1cd65b355b7f/rignore-0.7.6-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2673225dcec7f90497e79438c35e34638d0d0391ccea3cbb79bfb9adc0dc5bd7", size = 1079656, upload-time = "2025-11-05T21:40:24.89Z" }, - { url = "https://files.pythonhosted.org/packages/67/56/36d5d34210e5e7dfcd134eed8335b19e80ae940ee758f493e4f2b344dd70/rignore-0.7.6-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:c081f17290d8a2b96052b79207622aa635686ea39d502b976836384ede3d303c", size = 1139789, upload-time = "2025-11-05T21:40:42.119Z" }, { url = "https://files.pythonhosted.org/packages/ce/8b/a1299085b28a2f6135e30370b126e3c5055b61908622f2488ade67641479/rignore-0.7.6-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d8955b57e42f2a5434670d5aa7b75eaf6e74602ccd8955dddf7045379cd762fb", size = 1129444, upload-time = "2025-11-05T21:41:17.906Z" }, ] @@ -9950,55 +9319,35 @@ sdist = { url = "https://files.pythonhosted.org/packages/e2/c5/9136736c37022a6ad [[package]] name = "rpds-py" -version = "2026.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", hash = "sha256:07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256", size = 64459, upload-time = "2026-05-28T12:02:13.232Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/95/f8203fd997484b1690a6869cd0e503b6c3c6be55b0ecc36d1a491fe742f0/rpds_py-2026.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:99ab6ba7bfa2cb0f96a04e3652355bf04e3f51aceb1e943b8541dab7ba4828cc", size = 348460, upload-time = "2026-05-28T11:58:52.374Z" }, - { url = "https://files.pythonhosted.org/packages/33/8c/b47326ad2f0be545a5e5c1a55937a12afaea7d392ba2837bb9680f57e6c9/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0efbe45632665e53e3db8fe1e5692db58fc5cb9bab4459d570b83efefe11164", size = 381031, upload-time = "2026-05-28T11:58:53.775Z" }, - { url = "https://files.pythonhosted.org/packages/22/0b/e83bbd97ffac6f6389b605cd4e1c8ac5761dc7e977769c9255d8c5adb7bd/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:01d17b29c0c23d82b1f4751147ec49cf451f1fc2554eb9ef5f957e55d2656ead", size = 387121, upload-time = "2026-05-28T11:58:55.243Z" }, - { url = "https://files.pythonhosted.org/packages/fd/0e/d285d1bc8864245919c61e1ca82263e4a66d337759c3a4cef72766ff9afc/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7559f72b94ae52659086c595dfa017cde03155f7832071d30959049052cb3ece", size = 501026, upload-time = "2026-05-28T11:58:56.788Z" }, - { url = "https://files.pythonhosted.org/packages/86/06/ccb2109a1e543437b5e43816f2b43b9554cc6783145528a4e3711e05c011/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e25b7088f9ccbfc0dfcaa52bf969300ca229e10ecf758974ebcbb080a4b37bb", size = 391865, upload-time = "2026-05-28T11:58:58.298Z" }, - { url = "https://files.pythonhosted.org/packages/3d/33/237173db1cfef10105b3839a24de00eb8d2a523711add4632447cdf0aedd/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613fc4ee9eaef26dc5840666214dd6fbcebcf32f46e76f4abc473059f4e13dda", size = 378012, upload-time = "2026-05-28T11:58:59.589Z" }, - { url = "https://files.pythonhosted.org/packages/97/64/1eae54e34d5161f9969295e80bd6b62a55f2b6ac5f2a5b60d02c2140e758/rpds_py-2026.5.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:85264a90ff4c05c1568dd65f5921c837614b67c60358fb4c17df3b7f2e90690a", size = 391111, upload-time = "2026-05-28T11:59:01.104Z" }, - { url = "https://files.pythonhosted.org/packages/16/0f/007ec21283b5b040b4ec3bd95e0402591e22bfa7d5c93dfe01c465c2d2d7/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05fa4f41f37ec97c9c260441a940450a192f78d774d2b097eee1379f1e1246a", size = 556487, upload-time = "2026-05-28T11:59:04.012Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d5/9937dce4d6bda74157b954e7d1460db05a22f5929dccfeeba1ed27a93df0/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8895840ac4809e5f60c88fd07617cd71326e73d6e5a8aa783c5c0f7c24985de2", size = 584053, upload-time = "2026-05-28T11:59:06.837Z" }, - { url = "https://files.pythonhosted.org/packages/a3/43/35e3f136343aef451e545ce8c38d36c2f93c0ed88703db8b64ba2b205c68/rpds_py-2026.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b1d94308ddf0b1982f61f2eb54bf92997c9ece8a8093ef014250f4a517906c", size = 345775, upload-time = "2026-05-28T11:59:13.827Z" }, - { url = "https://files.pythonhosted.org/packages/20/e1/0f2160c5982d3157734d5cb3ed63d8b2d583a73c9864f77b666449f32cf8/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa92420128dadce7f54bd73ba1825a273e9268fe9e35dbf7e6362890efa4e08", size = 376329, upload-time = "2026-05-28T11:59:15.271Z" }, - { url = "https://files.pythonhosted.org/packages/d0/11/ee0ba42aff83bf4effdbc576673c6be64c5e173978c3f6d537e94482f77d/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca653c6546386227cd9800d1bef6a348099acf8db4250341da6d90f663d6dfcb", size = 383539, upload-time = "2026-05-28T11:59:16.665Z" }, - { url = "https://files.pythonhosted.org/packages/11/df/d94aa6a499d4ac40afe2d7620f2c597fd3c0f182e854ad7cf3f596a81cb6/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66c93681c4729e4e3ecba31b8179fae083ff3118841672835140338b4b9867c1", size = 494674, upload-time = "2026-05-28T11:59:17.991Z" }, - { url = "https://files.pythonhosted.org/packages/1f/75/33d30f43bb2f458de11979486a591b1bf6e5651765ed1704c6197c2dc773/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ff257542e04796880e011e15cd4dc21c2599975df2aaa8f2c8495ca574e1a5", size = 389268, upload-time = "2026-05-28T11:59:19.434Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1e/2c9096fc19d5fd084b0184ca2b651e659aa0a37e6fdbecf6ece47f147fe1/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6825cc329b290e93c5f6a9be2393118a763f6ccf6abd83704e0c102ca583644", size = 376280, upload-time = "2026-05-28T11:59:21Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e5/61ec9f8be8211ea7f48448195549e4aaf02004083475493b0e137702ecb2/rpds_py-2026.5.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:de42116e69cb53b911cc34aee5ab98f36c597b822545045d49e938818b99e5e4", size = 387233, upload-time = "2026-05-28T11:59:22.454Z" }, - { url = "https://files.pythonhosted.org/packages/72/e6/4d5718c5cf26c522dc7c9999e238da1e77380b81d0c5d1df11e271ddfeb1/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0408a24e44feb919423dc6d9da677cb5cddb894d2ca9e763967d156d9c60fab4", size = 553113, upload-time = "2026-05-28T11:59:25.184Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c1/7d4c26f167f8c41501cc073d30ee22082b16ce358cf5b00ec97cbc7804ea/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4be8b1d2a705cc37d08256004e1d07de143fa0075c8e85a3df020b776f62b732", size = 582436, upload-time = "2026-05-28T11:59:28.11Z" }, - { url = "https://files.pythonhosted.org/packages/ca/bb/d1b85117967c11191441a7274ae616c65d93901d082c588f89a50a8da5ae/rpds_py-2026.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c39f5b67a8a2e67179ada2a954227d670fe65fa9098457f698f56ddf248709b3", size = 345179, upload-time = "2026-05-28T11:59:35Z" }, - { url = "https://files.pythonhosted.org/packages/7c/46/d84105f062e626a1b233f863907288a4708c2d833b8b4c6fb2764bc080c0/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5c30f3f04eef4fbd362226a6f31d7c8895ca4fbb6e0b790f6890a98d8da8559", size = 376173, upload-time = "2026-05-28T11:59:36.43Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ae/469d7959ce5b1201e1de135dc735b86db3b35dd0d1734f6a44246d5f061c/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:277f6c82f0580848796c7ecc8a7173aa3bfb928e4ff831261c2f60a81dc270db", size = 383162, upload-time = "2026-05-28T11:59:37.995Z" }, - { url = "https://files.pythonhosted.org/packages/dc/a2/57853d31a1116a561aa072794602ad3f6341e18d70a8523f1bd5b9fc1e5a/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63c2c4c213f1a4e3f3de28ecab029dbdee976324e729c0d7a55211be72576b02", size = 495093, upload-time = "2026-05-28T11:59:39.453Z" }, - { url = "https://files.pythonhosted.org/packages/99/63/3a8eabcad9314b7daf5c65f451d2c33d989235cd8a5762186cf2c3f5a4f8/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3350ec808fb538fe71a1f94dfaa0e29c598dfad805ce49f0caec5ae3183c652b", size = 389829, upload-time = "2026-05-28T11:59:40.896Z" }, - { url = "https://files.pythonhosted.org/packages/4b/25/05678d97fc25e2622df14dc530fb82023174ecfff6733991ed0d78f167bd/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b964e3ab599e718dc46c018d104b1ebc007cbc6567d827c94a687fca56d77e", size = 374786, upload-time = "2026-05-28T11:59:42.626Z" }, - { url = "https://files.pythonhosted.org/packages/88/d1/8c90b6431e80a3b91b284a5c7c8c0c4f9c006444d90477a740d6e0f9c694/rpds_py-2026.5.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:19cb09fab7b7fc96b2a6e28f2e34b72a3705ff27b37edb77455316e5d3f3dc9b", size = 386920, upload-time = "2026-05-28T11:59:44.124Z" }, - { url = "https://files.pythonhosted.org/packages/66/3f/3546524b6eb4cc2e1f363a3d638fa52f6c24faae3500c25fb488b02f1740/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bff7073db3899158fff55ebf57b113a67030af26f80a18978f9f0aa60250ddf", size = 553030, upload-time = "2026-05-28T11:59:48.603Z" }, - { url = "https://files.pythonhosted.org/packages/61/1e/a3cb07f2795075d1d88efddae2f541359fde5f08c81ee114c29c2949c90a/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4860b603ddda0475a8885499b3729e90229d480105b42651962a5397d995fa89", size = 581178, upload-time = "2026-05-28T11:59:51.673Z" }, - { url = "https://files.pythonhosted.org/packages/8d/58/5c4a43436843c90d0f6d19f82c200c80e3843ca9fa07b237623327f6d384/rpds_py-2026.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cacedb7a6e167680acba45ad5716e89067d225dc80da0d7040cae8c81d4572fa", size = 347033, upload-time = "2026-05-28T11:59:58.881Z" }, - { url = "https://files.pythonhosted.org/packages/fb/c2/1a71acdacaf4e259b10278fb87b039ded3cf80041bcd89dd8a3ea702ded6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68700371c5d7ae1412862ddfa719090925c93ecf351c566d66f09d04b136ea00", size = 376891, upload-time = "2026-05-28T12:00:00.516Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c8/535f3d9b65addd8e28aa87b83c6e526799c3717a88273db8ea795beeef7a/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:296c799becfa849c779c8725494fe9ed94959ed886787df4364b058465bad7f0", size = 385646, upload-time = "2026-05-28T12:00:02.394Z" }, - { url = "https://files.pythonhosted.org/packages/1c/91/dc033f313345c354ade914dbe73cdb90b615a4409ea02430d5356794f3d8/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3858b908218ee108d0bbfb2095ccc237648053c9bf98affad7cb079acaf1d97", size = 498830, upload-time = "2026-05-28T12:00:04.189Z" }, - { url = "https://files.pythonhosted.org/packages/27/fc/90fcbea459dbb8ddc18a2e0fd1de9412b48bc84ffff2db771cf714bacfd6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4fb8d2e7cb2f850b169806d61d1b991738acec96500a75c30f49caf064ce7cef", size = 392830, upload-time = "2026-05-28T12:00:05.797Z" }, - { url = "https://files.pythonhosted.org/packages/b2/1d/46cd11a228c9750684a798d98f878be6f614aa762438da7378f035e79e35/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b74c10ed6a8f190f4287f53bcfea348b92a84a9c9f70d30183d1e6172d580d", size = 379613, upload-time = "2026-05-28T12:00:07.433Z" }, - { url = "https://files.pythonhosted.org/packages/24/4a/d9b0c6af3a1de03eb93741bbe8be2bdce84d8fda8224f3005451d86df389/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b9a6528956191c48c52294a592dbd4a8386d7048bdb25c0efcb6b966466c6d83", size = 388183, upload-time = "2026-05-28T12:00:09.227Z" }, - { url = "https://files.pythonhosted.org/packages/08/d6/070f6a41cbb343e2ac4171859bf3f3623e0ab002f72619d6d505313ec2de/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fea6e836d10abbe191d557d33bd58bd5987725fe63aa1eefe557d230209855bd", size = 553573, upload-time = "2026-05-28T12:00:12.443Z" }, - { url = "https://files.pythonhosted.org/packages/8a/22/9bf80a56069c0c443fcfefac639a86a744550a2898817a6dfd3e26654924/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e0b360f316d966b048b085857630b3cc51f3db2f07b06f440eac8f695374d1e3", size = 585633, upload-time = "2026-05-28T12:00:15.66Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f2/3eb9ccdb9f143b8c9b003978898cb497f942a324c077401e6b8834238e63/rpds_py-2026.5.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad3773236e95f7f33991eb125224b7da66f206504d032a253a02da7e134519fb", size = 350195, upload-time = "2026-05-28T12:01:54.901Z" }, - { url = "https://files.pythonhosted.org/packages/a7/24/dbda232bc4f3ed732120692ab0d2c8402cb020516556d8bee622dcef2413/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04df86b3f0fade39ec8fd0e0aab089b1da9fbd2b48df778a57ef96f5e7d38df", size = 381850, upload-time = "2026-05-28T12:01:56.601Z" }, - { url = "https://files.pythonhosted.org/packages/40/30/32e769839a358f78810c234f160f2cc21d1e4e47e1c0e0e0d535be5a0219/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6142dbd80c4df62a5d899f0d616d417f84e0bc8d32526c8e5589019d75d028a7", size = 387899, upload-time = "2026-05-28T12:01:58.212Z" }, - { url = "https://files.pythonhosted.org/packages/ab/86/ec84d243aadb3b34b71dd26a010d0930b2d284ff5fc9a69fec53810ee6fd/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b35217adefe87f2fe4db7e9766cabe84744bfe9616d9667be18988928c7f2dc", size = 501618, upload-time = "2026-05-28T12:01:59.888Z" }, - { url = "https://files.pythonhosted.org/packages/74/25/b60e52686bbff777a64f9e4f4d3dd57980dc846913777177a2c92e4937aa/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b95d5e11fc712b752081183a55a244c03cd00570489edd7014d8899f8ceb8162", size = 394003, upload-time = "2026-05-28T12:02:01.482Z" }, - { url = "https://files.pythonhosted.org/packages/9b/c7/b3a6a588cc2219510ef3f42e207483a93950bedd1e3a0fd4015c95cff9e5/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141c9498daf2ace9eda35d2b0e376f9ea8b058d84f2aef4f96fccfd449a2f251", size = 379778, upload-time = "2026-05-28T12:02:03.197Z" }, - { url = "https://files.pythonhosted.org/packages/31/00/c7dba3fc8a3da8cb3f6db1eb3386be4d79c2e97c6890d20eb9ac66ae8c43/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:6f249f8b860a200ad35193af961183ebe9132710484e6f6ce0cf89fd83c63a9a", size = 392359, upload-time = "2026-05-28T12:02:04.817Z" }, - { url = "https://files.pythonhosted.org/packages/1d/6f/93831a3bfe789542ed0c1d0d74b78b440f055d6dc3ea4640eba2d95e6e23/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c74005a7bb87752acf351c93897ec63ad77a07a0da7ecad9c050e32e7286ba34", size = 557243, upload-time = "2026-05-28T12:02:08.013Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ea/e7b0251441da9adfeaebcf29601d10f2a1455fcf0772fae9e7e19032bd96/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8c43a8a973270fd173bf48cdf80bbe66312421cba68d40845034f174f2389049", size = 586326, upload-time = "2026-05-28T12:02:11.47Z" }, +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, ] [[package]] @@ -10016,16 +9365,10 @@ version = "0.15.7" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" }, { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" }, { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" }, - { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" }, - { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" }, { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" }, - { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" }, { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" }, - { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" }, { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" }, ] @@ -10066,16 +9409,35 @@ sdist = { url = "https://files.pythonhosted.org/packages/45/06/f955dbbb1859e3bd2 wheels = [ { url = "https://files.pythonhosted.org/packages/f5/b1/fa7c600e7dceae12e9606c7578cbc9ff1e1ed55844883ee5c92205e86226/safetensors-0.8.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c80201d22cbf405b80647a60ada77bba06c8fba2da2743ba1e89cdcc39a81f25", size = 484562, upload-time = "2026-06-09T07:52:17.518Z" }, { url = "https://files.pythonhosted.org/packages/09/7d/65a7de0af421317bb36a067241e4235fff194eed60b961ed6d3f59a3fc60/safetensors-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a46e5ff292c356d6991e60942ba7f79817682d3a2cef0702136448cb9c4d235", size = 502844, upload-time = "2026-06-09T07:52:07.624Z" }, - { url = "https://files.pythonhosted.org/packages/91/4f/3175c9d75634e0e0dda0082794193521035edd7c70a6f212bf33ca06ddf4/safetensors-0.8.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4124502b78f03534117c848f87a39b8f31e577b15eff423bf8bfb95f2a8c30d0", size = 511823, upload-time = "2026-06-09T07:52:09.565Z" }, - { url = "https://files.pythonhosted.org/packages/20/87/846c289e7aa2299eff406335717cf43ce8777194ece8aad75772e0411615/safetensors-0.8.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bc0a787ba8a35be368ee3574edfa2b1ad389eebd0a72e482ae275490e3f6c98", size = 633461, upload-time = "2026-06-09T07:52:11.128Z" }, - { url = "https://files.pythonhosted.org/packages/76/22/8d64d9df2c45d5ded401df889d0ad90882804ca172d79ec4f0df8f727fe0/safetensors-0.8.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040070828e36dc8e122178bbbd5830ff9e97920affb84cbe0f46442497bed358", size = 545148, upload-time = "2026-06-09T07:52:13.603Z" }, { url = "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774", size = 516040, upload-time = "2026-06-09T07:52:16.29Z" }, - { url = "https://files.pythonhosted.org/packages/46/fb/cdaed17ceb2948784fd9c36b6fd3e951b608547cea81a48e8ee6f8cfdfcb/safetensors-0.8.0-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:fcdd41ec4628fee5799f807c73c353629130fbd942aa23d83c623dd6c9d52d78", size = 513832, upload-time = "2026-06-09T07:52:12.37Z" }, { url = "https://files.pythonhosted.org/packages/2a/43/bf38443278eab4b1be1fce2931e2b012ad9cb7df52ada751d0aab8f7659a/safetensors-0.8.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:87eec7ffed2b809f05a398a8becb7d013f19f7837cd15d9748580d6cf30dbaf4", size = 678670, upload-time = "2026-06-09T07:52:20.032Z" }, - { url = "https://files.pythonhosted.org/packages/72/e3/68cd3fa5b48488e84add63e04cb12f3bc28ae4638c06d4508c6e88823d0e/safetensors-0.8.0-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:4a95ae2b05d7726d751da4ebf626a2ca782b706e101bd894c95bc2450b1cffcc", size = 786679, upload-time = "2026-06-09T07:52:21.322Z" }, { url = "https://files.pythonhosted.org/packages/27/43/41c1621732edd934d868a00d1b891584c892a7b62a9aab82ea5a0a5623ee/safetensors-0.8.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8e080062fcde23be189565e1c3305d16751a218ecf9412c8601e64204eb6f846", size = 722361, upload-time = "2026-06-09T07:52:23.924Z" }, ] +[[package]] +name = "scikit-learn" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "narwhals", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "scipy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "threadpoolctl", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/6f/37092bdb25f712817231799fc5674d8e704066a8a70c1d2d40517e18b4ab/scikit_learn-1.9.0.tar.gz", hash = "sha256:8833266989d3a5110178a9fae30783675460724d0e1efb13b14901d2c660c557", size = 7750767, upload-time = "2026-06-02T11:54:32.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/e2/ff880f62677a17d035817d543cb0fc8727d01eccbee81c5f7fc733a9d856/scikit_learn-1.9.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f401448645a3e7bc115aa3c094097865155b34bff1cba8101857d9104e99074c", size = 8256782, upload-time = "2026-06-02T11:53:08.904Z" }, + { url = "https://files.pythonhosted.org/packages/25/64/eb40435e1a508ab1b4e284ce43ae80f6a162e5be5e38ed5a6fab467a9ea4/scikit_learn-1.9.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd3a8ef0c758555a3b23c03adaa858af32f7736785ded50ad5991f59c4ed03fa", size = 8992419, upload-time = "2026-06-02T11:53:11.551Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/4810a28e473185429e45a57eebcc91fc991b33d889cc0676063e671db03d/scikit_learn-1.9.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7e254636164090da847715a27f8e5478feb98c40a9e0ee90cbd277de9e5ceb8", size = 9281411, upload-time = "2026-06-02T11:53:15.063Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/2b5148f2279196775e1db2aeb85d14b70ac80e7e32b3b28e7ebeafb0901d/scikit_learn-1.9.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5be45aa4a42a68a533913a6ed736cf309de2226411c79ef8d609a5456f1939b1", size = 8261512, upload-time = "2026-06-02T11:53:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/5adbc77656b71f9456a2f5a7a9fdb4bcf9207a6b962889f1c2f9323afa4e/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e50ed4da51974e86e940690e9a3d82e729b62b5a49f7c9bac534d515d39d86f", size = 8837603, upload-time = "2026-06-02T11:53:30.328Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:056c92bb67ad4c28463c2f2653d9701449201e7e7a9e94e321be0f71c4fef2b8", size = 9132097, upload-time = "2026-06-02T11:53:33.456Z" }, + { url = "https://files.pythonhosted.org/packages/3e/04/5acd7ae280c5f93b6ac5ef6cdec14eef4c8d1cd91d85b3292989c94d96b1/scikit_learn-1.9.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5b934c45c252844a91d69fda3a34cff5e7307e1db10d77cb10a3980312c74713", size = 8228299, upload-time = "2026-06-02T11:53:44.817Z" }, + { url = "https://files.pythonhosted.org/packages/0c/39/ffe829a5b8ecb40a518724a997794657fdc354ada5e8fe8e64d998c0bac9/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:38c3dcb9a1ffb85505ec53d54c7b4aea0cff70050425a7760c2af661ac85df05", size = 8789690, upload-time = "2026-06-02T11:53:47.461Z" }, + { url = "https://files.pythonhosted.org/packages/1f/88/8dab5de10c638c083772a6be83a3d8106ced492f74a928c8693638e5bb50/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da76d09304a4706db7cc1e3ebaa3b6b98a67365cc11d2996c4f1e58ba47df714", size = 9087723, upload-time = "2026-06-02T11:53:50.702Z" }, +] + [[package]] name = "scikit-network" version = "0.33.5" @@ -10154,6 +9516,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" }, ] +[[package]] +name = "sentence-transformers" +version = "5.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "scikit-learn", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "scipy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "torch", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "tqdm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "transformers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/d4/7ef93157485e978c016f49da05363c1e4e7237beb5343b64b5631101f0f1/sentence_transformers-5.5.1.tar.gz", hash = "sha256:02b7740dfc60bdbbcb6061625f5d97a5c1a4e2d3baac5f9391b912bb5eae2290", size = 445161, upload-time = "2026-05-20T07:37:44.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/03/ee99a6b030e7a2e056547729f8a4709dd93e13d9c6f07590f74c395c4017/sentence_transformers-5.5.1-py3-none-any.whl", hash = "sha256:4fe11d433badc5282d32f7fc08bc714216b7a5aca426f9df77a45a554756deb7", size = 588887, upload-time = "2026-05-20T07:37:43.004Z" }, +] + [[package]] name = "sentencepiece" version = "0.2.1" @@ -10180,15 +9561,15 @@ wheels = [ [[package]] name = "sentry-sdk" -version = "2.62.0" +version = "2.57.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "urllib3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/5d/a343201726150e05f2036eeb6e493e2e2f8bf8a66f5aa70f2f4ac96f9ca3/sentry_sdk-2.62.0.tar.gz", hash = "sha256:3c870b9f50d9fd15b58c817dbde1c7cfaa9fe3f05df0a4c6edd5571cb82f5491", size = 463986, upload-time = "2026-06-08T13:23:49.223Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/87/46c0406d8b5ddd026f73adaf5ab75ce144219c41a4830b52df4b9ab55f7f/sentry_sdk-2.57.0.tar.gz", hash = "sha256:4be8d1e71c32fb27f79c577a337ac8912137bba4bcbc64a4ec1da4d6d8dc5199", size = 435288, upload-time = "2026-03-31T09:39:29.264Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/07/05440381627877aae223fd68f330df9b9fc6641d08bf65328b55235617a2/sentry_sdk-2.62.0-py3-none-any.whl", hash = "sha256:27f61d13a86c3c1648dec666dd5a64f79772dd6a84b446f11866601ecab24f6f", size = 490586, upload-time = "2026-06-08T13:23:47.486Z" }, + { url = "https://files.pythonhosted.org/packages/c9/64/982e07b93219cb52e1cca5d272cb579e2f3eb001956c9e7a9a6d106c9473/sentry_sdk-2.57.0-py2.py3-none-any.whl", hash = "sha256:812c8bf5ff3d2f0e89c82f5ce80ab3a6423e102729c4706af7413fd1eb480585", size = 456489, upload-time = "2026-03-31T09:39:27.524Z" }, ] [[package]] @@ -10238,14 +9619,14 @@ wheels = [ [[package]] name = "smart-open" -version = "7.6.1" +version = "7.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wrapt", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/65/3ada667d32675399001bf022ad3d9f3989b57101351ebc71d6fbe2384634/smart_open-7.6.1.tar.gz", hash = "sha256:4347996e7ba21db7cd1e059632e0b30395407e4f6c660d2ddffc8f2a9ae5f990", size = 54754, upload-time = "2026-05-09T06:23:37.06Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/d8/1481294b2d110b805c0f5d23ef34158b7d5d4283633c0d34c69ea89bb76b/smart_open-7.0.5.tar.gz", hash = "sha256:d3672003b1dbc85e2013e4983b88eb9a5ccfd389b0d4e5015f39a9ee5620ec18", size = 71693, upload-time = "2024-10-04T13:58:32.442Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/78/0f68b93564b8c6b6987a0696c582ba2591a381ab2f733a501909e949f241/smart_open-7.6.1-py3-none-any.whl", hash = "sha256:b4de6aebef023aca91cc9fb372052e1343ba3f152de215bd22391a663e3ddd21", size = 64845, upload-time = "2026-05-09T06:23:35.386Z" }, + { url = "https://files.pythonhosted.org/packages/06/bc/706838af28a542458bffe74a5d0772ca7f207b5495cd9fccfce61ef71f2a/smart_open-7.0.5-py3-none-any.whl", hash = "sha256:8523ed805c12dff3eaa50e9c903a6cb0ae78800626631c5fe7ea073439847b89", size = 61387, upload-time = "2024-10-04T13:58:35.073Z" }, ] [[package]] @@ -10268,87 +9649,60 @@ wheels = [ [[package]] name = "snowballstemmer" -version = "3.1.1" +version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/f8/0a71edf031f03c40db17503cb8ca78a69a171254e568e7db241b0ab57ea1/snowballstemmer-3.1.1.tar.gz", hash = "sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260", size = 123314, upload-time = "2026-06-03T00:56:40.194Z" } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl", hash = "sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752", size = 104164, upload-time = "2026-06-03T00:56:38.614Z" }, + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] [[package]] -name = "soupsieve" -version = "2.8.4" +name = "sounddevice" +version = "0.5.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } +dependencies = [ + { name = "cffi", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/f9/2592608737553638fca98e21e54bfec40bf577bb98a61b2770c912aab25e/sounddevice-0.5.5.tar.gz", hash = "sha256:22487b65198cb5bf2208755105b524f78ad173e5ab6b445bdab1c989f6698df3", size = 143191, upload-time = "2026-01-23T18:36:43.529Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0a/478e441fd049002cf308520c0d62dd8333e7c6cc8d997f0dda07b9fbcc46/sounddevice-0.5.5-py3-none-any.whl", hash = "sha256:30ff99f6c107f49d25ad16a45cacd8d91c25a1bcdd3e81a206b921a3a6405b1f", size = 32807, upload-time = "2026-01-23T18:36:35.649Z" }, + { url = "https://files.pythonhosted.org/packages/56/f9/c037c35f6d0b6bc3bc7bfb314f1d6f1f9a341328ef47cd63fc4f850a7b27/sounddevice-0.5.5-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:05eb9fd6c54c38d67741441c19164c0dae8ce80453af2d8c4ad2e7823d15b722", size = 108557, upload-time = "2026-01-23T18:36:37.41Z" }, ] [[package]] -name = "sphinx" -version = "9.0.4" +name = "soupsieve" +version = "2.8.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux'", - "python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux'", -] -dependencies = [ - { name = "alabaster", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "babel", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "docutils", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "imagesize", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "jinja2", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "packaging", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pygments", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "requests", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "roman-numerals", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "snowballstemmer", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-applehelp", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-devhelp", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-htmlhelp", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-jsmath", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-qthelp", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-serializinghtml", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, ] [[package]] name = "sphinx" -version = "9.1.0" +version = "9.0.4" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", -] dependencies = [ - { name = "alabaster", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "babel", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "docutils", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "imagesize", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "jinja2", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "packaging", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "pygments", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "requests", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "roman-numerals", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "snowballstemmer", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-applehelp", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-devhelp", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-htmlhelp", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-jsmath", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-qthelp", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinxcontrib-serializinghtml", marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "alabaster", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "babel", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "docutils", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "imagesize", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "jinja2", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "pygments", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "roman-numerals", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "snowballstemmer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinxcontrib-applehelp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinxcontrib-devhelp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinxcontrib-htmlhelp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinxcontrib-jsmath", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinxcontrib-qthelp", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinxcontrib-serializinghtml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, ] [[package]] @@ -10356,8 +9710,7 @@ name = "sphinx-design" version = "0.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sphinx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/13/7b/804f311da4663a4aecc6cf7abd83443f3d4ded970826d0c958edc77d4527/sphinx_design-0.7.0.tar.gz", hash = "sha256:d2a3f5b19c24b916adb52f97c5f00efab4009ca337812001109084a740ec9b7a", size = 2203582, upload-time = "2026-01-19T13:12:53.297Z" } wheels = [ @@ -10420,30 +9773,34 @@ wheels = [ [[package]] name = "sqlalchemy" -version = "2.0.50" +version = "2.0.48" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "greenlet", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/da/6fbf010c8ebb347679d0d100b22fe9ba5e13fd04046c5df7280d2f0bf706/sqlalchemy-2.0.50.tar.gz", hash = "sha256:af5607d11ef90fd6a5c0549fe0045dce1663d427426bcfb506dcb5346a85a3b9", size = 9907424, upload-time = "2026-05-24T19:20:04.018Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/5d/3172686af1770e4de2805f919a51441085f589ddadf3dd76ec582f84f497/sqlalchemy-2.0.50-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1aa6e403663a9c43c8fef7ce4bdb4cf48bcd8d352e91deda2a99f963270bd508", size = 2161366, upload-time = "2026-05-24T20:00:02.061Z" }, - { url = "https://files.pythonhosted.org/packages/0f/90/e98dedea3c3e663a17afcd003a34ba45efdac2cea3b6f2e4585e2b1e2537/sqlalchemy-2.0.50-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51b637a84f9fa35ae1f9017e786cb142974a25305085e1b378b3647a67f65ad3", size = 3318926, upload-time = "2026-05-24T20:07:42.369Z" }, - { url = "https://files.pythonhosted.org/packages/3b/4f/501308c2babb62c11753ecb4ee88ba9eef019419a4d6cbf7cb13e2bad353/sqlalchemy-2.0.50-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2dab927761d9108550f0cf8e66ff21af56f907a0ce0a689793db615e2b55f62c", size = 3319199, upload-time = "2026-05-24T20:14:28.551Z" }, - { url = "https://files.pythonhosted.org/packages/ac/39/d88996c5e03ed6248c3a788d20f0b8d8b376b9f8a495e4bab9df7c72d2f8/sqlalchemy-2.0.50-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:545eae198d37bcf837a10ede3684e2af32458d6f35c597c35c2de7502dc38fc4", size = 3270301, upload-time = "2026-05-24T20:07:44.917Z" }, - { url = "https://files.pythonhosted.org/packages/42/1b/1ae0e65161b51cc43e5ca75430ef79d80e23b5042d645586c2c342c3b92e/sqlalchemy-2.0.50-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fec460e18cdbb4c7773531122ce9a27e96c6ca17af3933941d94da475ad2c86", size = 3293465, upload-time = "2026-05-24T20:14:30.501Z" }, - { url = "https://files.pythonhosted.org/packages/be/b0/a9d19b43f38f878b1278bca5b00b909f7540d41494396dd2561f9ad0956d/sqlalchemy-2.0.50-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae23d8b9d344d30d0a92f06d45825024a5790f1c1dd4cf452636a50d3e58cb", size = 2159807, upload-time = "2026-05-24T19:27:53.086Z" }, - { url = "https://files.pythonhosted.org/packages/f5/2c/191dd58a248fd2cfd4780fa82c375c505e4ad98c8b522fa69ec492130d77/sqlalchemy-2.0.50-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47b71b933e7b4ebad407c8fdfd70d2c4f08b78b3238bb30eebdd6eb32ca51b89", size = 3343358, upload-time = "2026-05-24T20:09:29.279Z" }, - { url = "https://files.pythonhosted.org/packages/8a/2b/514fce8a7df81cf5bad7ff7865de7ac0c5776a38cc043475c4703eb7fe8b/sqlalchemy-2.0.50-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:110fdac56ace278949f00de805edacbd6141e382d992f9ba28238b3a0827a600", size = 3357994, upload-time = "2026-05-24T20:17:13.495Z" }, - { url = "https://files.pythonhosted.org/packages/35/a6/a0e283f5494f92b0d77e319ff77e437b1ffe4a051ba67c81d53234825475/sqlalchemy-2.0.50-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5e4ac70e9e757f6b3e87c0491ff034442ecd8dfd36d041a50564c322dafc0e", size = 3289399, upload-time = "2026-05-24T20:09:32.239Z" }, - { url = "https://files.pythonhosted.org/packages/b7/96/1b07325ba71752d6a028b77d07bed1483ad545f794e8b1dc89b3ba3b3c68/sqlalchemy-2.0.50-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:724f3dcbe53dd0151e3cb5e7ec4ba4c620bede579caacd16275dc35ce06e8615", size = 3321216, upload-time = "2026-05-24T20:17:15.581Z" }, - { url = "https://files.pythonhosted.org/packages/0b/c4/c42356b527296e9862f67990efce31ef78b4cf69cd3f80873a528a060320/sqlalchemy-2.0.50-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:06a9210bdc5f4298cff0781087e2ff45683922252dacc452846373a58761f093", size = 2156697, upload-time = "2026-05-24T19:27:54.764Z" }, - { url = "https://files.pythonhosted.org/packages/60/a1/b1a70e3c4365ac7fe9e347f3710f19b562c866fb96d45e3c891588789a7b/sqlalchemy-2.0.50-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b53784972ade4f8174b9aa661f31a06f8a936d2cfdd602913ff3c6dd40ae873", size = 3284260, upload-time = "2026-05-24T20:09:34.195Z" }, - { url = "https://files.pythonhosted.org/packages/3f/4a/f3ac3caa19f263d57b0a47f8c91bbf56583dc2d3fc63acfbf644abb24fe0/sqlalchemy-2.0.50-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31648fa14460537e768a7303b078e4344d208e0d23e06867c1f376a227ed82db", size = 3302280, upload-time = "2026-05-24T20:17:17.825Z" }, - { url = "https://files.pythonhosted.org/packages/66/55/ccada3e3d62254587819749a0bc69f41173eb48a6e385d10e66d32a9c88e/sqlalchemy-2.0.50-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:03f4323c980ad0e918cc9e5369b015f759f4e534db5bbaf4dc36832c10d05064", size = 3231580, upload-time = "2026-05-24T20:09:36.406Z" }, - { url = "https://files.pythonhosted.org/packages/05/f6/6809349130a2de0e109e7f00fd7d431da9565b9b2868b32ee684754f672b/sqlalchemy-2.0.50-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b9dcc43afef8ac157cd92fce96985d6b8b0cfbd3df4d666f66b4d55a75d202f", size = 3269375, upload-time = "2026-05-24T20:17:20.34Z" }, - { url = "https://files.pythonhosted.org/packages/d0/10/f7220e9b784d295d241c86ed99aeb537f92afcd469a64861f2717e9bb077/sqlalchemy-2.0.50-py3-none-any.whl", hash = "sha256:92064363517a3ff8212b5a93b8c62876579d8dfd1ca5b561335f30152d884fa9", size = 1943861, upload-time = "2026-05-24T19:59:01.119Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1f/73/b4a9737255583b5fa858e0bb8e116eb94b88c910164ed2ed719147bde3de/sqlalchemy-2.0.48.tar.gz", hash = "sha256:5ca74f37f3369b45e1f6b7b06afb182af1fd5dde009e4ffd831830d98cbe5fe7", size = 9886075, upload-time = "2026-03-02T15:28:51.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/6d/b8b78b5b80f3c3ab3f7fa90faa195ec3401f6d884b60221260fd4d51864c/sqlalchemy-2.0.48-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b4c575df7368b3b13e0cebf01d4679f9a28ed2ae6c1cd0b1d5beffb6b2007dc", size = 2157184, upload-time = "2026-03-02T15:38:28.161Z" }, + { url = "https://files.pythonhosted.org/packages/21/4b/4f3d4a43743ab58b95b9ddf5580a265b593d017693df9e08bd55780af5bb/sqlalchemy-2.0.48-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e83e3f959aaa1c9df95c22c528096d94848a1bc819f5d0ebf7ee3df0ca63db6c", size = 3313555, upload-time = "2026-03-02T15:58:57.21Z" }, + { url = "https://files.pythonhosted.org/packages/21/dd/3b7c53f1dbbf736fd27041aee68f8ac52226b610f914085b1652c2323442/sqlalchemy-2.0.48-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f7b7243850edd0b8b97043f04748f31de50cf426e939def5c16bedb540698f7", size = 3313057, upload-time = "2026-03-02T15:52:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/d9/cc/3e600a90ae64047f33313d7d32e5ad025417f09d2ded487e8284b5e21a15/sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:82745b03b4043e04600a6b665cb98697c4339b24e34d74b0a2ac0a2488b6f94d", size = 3265431, upload-time = "2026-03-02T15:58:59.096Z" }, + { url = "https://files.pythonhosted.org/packages/8b/19/780138dacfe3f5024f4cf96e4005e91edf6653d53d3673be4844578faf1d/sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5e088bf43f6ee6fec7dbf1ef7ff7774a616c236b5c0cb3e00662dd71a56b571", size = 3287646, upload-time = "2026-03-02T15:52:31.569Z" }, + { url = "https://files.pythonhosted.org/packages/ef/91/a42ae716f8925e9659df2da21ba941f158686856107a61cc97a95e7647a3/sqlalchemy-2.0.48-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:348174f228b99f33ca1f773e85510e08927620caa59ffe7803b37170df30332b", size = 2155737, upload-time = "2026-03-02T15:49:13.207Z" }, + { url = "https://files.pythonhosted.org/packages/b9/52/f75f516a1f3888f027c1cfb5d22d4376f4b46236f2e8669dcb0cddc60275/sqlalchemy-2.0.48-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53667b5f668991e279d21f94ccfa6e45b4e3f4500e7591ae59a8012d0f010dcb", size = 3337020, upload-time = "2026-03-02T15:50:34.547Z" }, + { url = "https://files.pythonhosted.org/packages/37/9a/0c28b6371e0cdcb14f8f1930778cb3123acfcbd2c95bb9cf6b4a2ba0cce3/sqlalchemy-2.0.48-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34634e196f620c7a61d18d5cf7dc841ca6daa7961aed75d532b7e58b309ac894", size = 3349983, upload-time = "2026-03-02T15:53:25.542Z" }, + { url = "https://files.pythonhosted.org/packages/1c/46/0aee8f3ff20b1dcbceb46ca2d87fcc3d48b407925a383ff668218509d132/sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:546572a1793cc35857a2ffa1fe0e58571af1779bcc1ffa7c9fb0839885ed69a9", size = 3279690, upload-time = "2026-03-02T15:50:36.277Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/a957bc91293b49181350bfd55e6dfc6e30b7f7d83dc6792d72043274a390/sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07edba08061bc277bfdc772dd2a1a43978f5a45994dd3ede26391b405c15221e", size = 3314738, upload-time = "2026-03-02T15:53:27.519Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/569dc8bf3cd375abc5907e82235923e986799f301cd79a903f784b996fca/sqlalchemy-2.0.48-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e3070c03701037aa418b55d36532ecb8f8446ed0135acb71c678dbdf12f5b6e4", size = 2152599, upload-time = "2026-03-02T15:49:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ff/f4e04a4bd5a24304f38cb0d4aa2ad4c0fb34999f8b884c656535e1b2b74c/sqlalchemy-2.0.48-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2645b7d8a738763b664a12a1542c89c940daa55196e8d73e55b169cc5c99f65f", size = 3278825, upload-time = "2026-03-02T15:50:38.269Z" }, + { url = "https://files.pythonhosted.org/packages/fe/88/cb59509e4668d8001818d7355d9995be90c321313078c912420603a7cb95/sqlalchemy-2.0.48-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b19151e76620a412c2ac1c6f977ab1b9fa7ad43140178345136456d5265b32ed", size = 3295200, upload-time = "2026-03-02T15:53:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/1609a4442aefd750ea2f32629559394ec92e89ac1d621a7f462b70f736ff/sqlalchemy-2.0.48-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b193a7e29fd9fa56e502920dca47dffe60f97c863494946bd698c6058a55658", size = 3226876, upload-time = "2026-03-02T15:50:39.802Z" }, + { url = "https://files.pythonhosted.org/packages/37/c3/6ae2ab5ea2fa989fbac4e674de01224b7a9d744becaf59bb967d62e99bed/sqlalchemy-2.0.48-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:36ac4ddc3d33e852da9cb00ffb08cea62ca05c39711dc67062ca2bb1fae35fd8", size = 3265045, upload-time = "2026-03-02T15:53:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/7b17bd50244b78a49d22cc63c969d71dc4de54567dc152a9b46f6fae40ce/sqlalchemy-2.0.48-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69f5bc24904d3bc3640961cddd2523e361257ef68585d6e364166dfbe8c78fae", size = 3558851, upload-time = "2026-03-02T15:57:48.607Z" }, + { url = "https://files.pythonhosted.org/packages/20/0d/213668e9aca61d370f7d2a6449ea4ec699747fac67d4bda1bb3d129025be/sqlalchemy-2.0.48-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd08b90d211c086181caed76931ecfa2bdfc83eea3cfccdb0f82abc6c4b876cb", size = 3525525, upload-time = "2026-03-02T16:04:38.058Z" }, + { url = "https://files.pythonhosted.org/packages/85/d7/a84edf412979e7d59c69b89a5871f90a49228360594680e667cb2c46a828/sqlalchemy-2.0.48-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1ccd42229aaac2df431562117ac7e667d702e8e44afdb6cf0e50fa3f18160f0b", size = 3466611, upload-time = "2026-03-02T15:57:50.759Z" }, + { url = "https://files.pythonhosted.org/packages/86/55/42404ce5770f6be26a2b0607e7866c31b9a4176c819e9a7a5e0a055770be/sqlalchemy-2.0.48-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0dcbc588cd5b725162c076eb9119342f6579c7f7f55057bb7e3c6ff27e13121", size = 3475812, upload-time = "2026-03-02T16:04:40.092Z" }, + { url = "https://files.pythonhosted.org/packages/46/2c/9664130905f03db57961b8980b05cab624afd114bf2be2576628a9f22da4/sqlalchemy-2.0.48-py3-none-any.whl", hash = "sha256:a66fe406437dd65cacd96a72689a3aaaecaebbcd62d81c5ac1c0fdbeac835096", size = 1940202, upload-time = "2026-03-02T15:52:43.285Z" }, ] [[package]] @@ -10471,16 +9828,15 @@ wheels = [ [[package]] name = "sqlmodel" -version = "0.0.38" +version = "0.0.37" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sqlalchemy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/0d/26ec1329960ea9430131fe63f63a95ea4cb8971d49c891ff7e1f3255421c/sqlmodel-0.0.38.tar.gz", hash = "sha256:d583ec237b14103809f74e8630032bc40ab68cd6b754a610f0813c56911a547b", size = 86710, upload-time = "2026-04-02T21:03:55.571Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/26/1d2faa0fd5a765267f49751de533adac6b9ff9366c7c6e7692df4f32230f/sqlmodel-0.0.37.tar.gz", hash = "sha256:d2c19327175794faf50b1ee31cc966764f55b1dedefc046450bc5741a3d68352", size = 85527, upload-time = "2026-02-21T16:39:47.038Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/c7/10c60af0607ab6fa136264f7f39d205932218516226d38585324ffda705d/sqlmodel-0.0.38-py3-none-any.whl", hash = "sha256:84e3fa990a77395461ded72a6c73173438ce8449d5c1c4d97fbff1b1df692649", size = 27294, upload-time = "2026-04-02T21:03:56.406Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e1/7c8d18e737433f3b5bbe27b56a9072a9fcb36342b48f1bef34b6da1d61f2/sqlmodel-0.0.37-py3-none-any.whl", hash = "sha256:2137a4045ef3fd66a917a7717ada959a1ceb3630d95e1f6aaab39dd2c0aef278", size = 27224, upload-time = "2026-02-21T16:39:47.781Z" }, ] [[package]] @@ -10494,15 +9850,15 @@ wheels = [ [[package]] name = "sse-starlette" -version = "3.4.4" +version = "3.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "starlette", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/2b/58abc2d1fd397e7dde08e947e05c884d8ef2f78d5e2588c17a12d42d6994/sse_starlette-3.4.4.tar.gz", hash = "sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0", size = 31819, upload-time = "2026-05-12T17:37:17.019Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/8c/f9290339ef6d79badbc010f067cd769d6601ec11a57d78569c683fb4dd87/sse_starlette-3.3.4.tar.gz", hash = "sha256:aaf92fc067af8a5427192895ac028e947b484ac01edbc3caf00e7e7137c7bef1", size = 32427, upload-time = "2026-03-29T09:00:23.307Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/67/805710444ea8cc75fbf70b920ed431a560c4bf9c57f7d5a3117213189399/sse_starlette-3.4.4-py3-none-any.whl", hash = "sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973", size = 16514, upload-time = "2026-05-12T17:37:15.601Z" }, + { url = "https://files.pythonhosted.org/packages/f8/7f/3de5402f39890ac5660b86bcf5c03f9d855dad5c4ed764866d7b592b46fd/sse_starlette-3.3.4-py3-none-any.whl", hash = "sha256:84bb06e58939a8b38d8341f1bc9792f06c2b53f48c608dd207582b664fc8f3c1", size = 14330, upload-time = "2026-03-29T09:00:21.846Z" }, ] [[package]] @@ -10555,11 +9911,11 @@ wheels = [ [[package]] name = "structlog" -version = "26.1.0" +version = "25.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/89/b4a0bcfdf4f71a3dea31379f095929613d7e4528a0996bca6aa964cd0dca/structlog-26.1.0.tar.gz", hash = "sha256:f63a716cbd1b1291cf7661de7794b455acfa4c43c5bcf1630e6ad5ddc1adb3b7", size = 1459881, upload-time = "2026-06-06T07:33:39.348Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/52/9ba0f43b686e7f3ddfeaa78ac3af750292662284b3661e91ad5494f21dbc/structlog-25.5.0.tar.gz", hash = "sha256:098522a3bebed9153d4570c6d0288abf80a031dfdb2048d59a49e9dc2190fc98", size = 1460830, upload-time = "2025-10-27T08:28:23.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/18/489c97b834dfff9cf2fc2507cede4bcd4b11e67f84bc462acd1992496f86/structlog-26.1.0-py3-none-any.whl", hash = "sha256:e081a26d6c373e6d201eca24eede26d8ffab07f88f477822e679183428d3d91e", size = 73764, upload-time = "2026-06-06T07:33:38.046Z" }, + { url = "https://files.pythonhosted.org/packages/a8/45/a132b9074aa18e799b891b91ad72133c98d8042c70f6240e4c5f9dabee2f/structlog-25.5.0-py3-none-any.whl", hash = "sha256:a8453e9b9e636ec59bd9e79bbd4a72f025981b3ba0f5837aebf48f02f37a7f9f", size = 72510, upload-time = "2025-10-27T08:28:21.535Z" }, ] [[package]] @@ -10654,36 +10010,45 @@ clickhouse = [ { name = "clickhouse-driver", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + [[package]] name = "tiktoken" -version = "0.13.0" +version = "0.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "regex", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/91/10b9c7076bc02c246c853201fdbbe300a4b8c5ed7b84c25f7403f4e32655/tiktoken-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26", size = 984644, upload-time = "2026-05-15T04:50:23.256Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e4/fceae98015fab47fcd49b8bd7f46145bcd187a47e0add1e5378ed67ef980/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4", size = 1119261, upload-time = "2026-05-15T04:50:24.348Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/fe42ad00de01a8c4a49ad8649a2c8a316835a9cad5961b11d21eac0020a5/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173", size = 1138253, upload-time = "2026-05-15T04:50:25.505Z" }, - { url = "https://files.pythonhosted.org/packages/03/c4/ccee1ecccca107e9a16efcecdeeb964c325305038554d466ece65b42338f/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff", size = 1185747, upload-time = "2026-05-15T04:50:27.02Z" }, - { url = "https://files.pythonhosted.org/packages/9d/03/cd0cba295522b91eb55c6b2704f1df895f8226cfe60ab10d4d51d0cc9e69/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed", size = 1241265, upload-time = "2026-05-15T04:50:28.815Z" }, - { url = "https://files.pythonhosted.org/packages/36/18/d4ac9d20956cdebca04841316660ed584c2fecdc2b81722a28bc7ad3b1e4/tiktoken-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b", size = 982970, upload-time = "2026-05-15T04:50:32.961Z" }, - { url = "https://files.pythonhosted.org/packages/74/ed/6bb8d05b9f731f749fee5c6f5ca63e981143c826a5985877330507bd13b7/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7", size = 1115741, upload-time = "2026-05-15T04:50:34.475Z" }, - { url = "https://files.pythonhosted.org/packages/34/de/2ca96b07a82d972b74fe4b46de055b79c904e45c7eab699354a0bfa697dc/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649", size = 1136523, upload-time = "2026-05-15T04:50:35.782Z" }, - { url = "https://files.pythonhosted.org/packages/ee/dc/9dafec002c2d4424378563cf4cf5c7fb93631d2a55013c8b87554ee4012c/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b", size = 1181954, upload-time = "2026-05-15T04:50:36.99Z" }, - { url = "https://files.pythonhosted.org/packages/a1/d0/1f8578c45b2f24759b46f0b50d31878c63c73e6bf0f2227e10ec5c5408dc/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91", size = 1240069, upload-time = "2026-05-15T04:50:38.221Z" }, - { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978, upload-time = "2026-05-15T04:50:42.195Z" }, - { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355, upload-time = "2026-05-15T04:50:43.564Z" }, - { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772, upload-time = "2026-05-15T04:50:44.782Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415, upload-time = "2026-05-15T04:50:46.422Z" }, - { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879, upload-time = "2026-05-15T04:50:48.052Z" }, - { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516, upload-time = "2026-05-15T04:50:52.03Z" }, - { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518, upload-time = "2026-05-15T04:50:53.543Z" }, - { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867, upload-time = "2026-05-15T04:50:55.191Z" }, - { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826, upload-time = "2026-05-15T04:50:56.296Z" }, - { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/4d017d0f76ec3171d469d80fc03dfbb4e48a4bcaddaa831b31d526f05edc/tiktoken-0.12.0.tar.gz", hash = "sha256:b18ba7ee2b093863978fcb14f74b3707cdc8d4d4d3836853ce7ec60772139931", size = 37806, upload-time = "2025-10-06T20:22:45.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/d9/35c5d2d9e22bb2a5f74ba48266fb56c63d76ae6f66e02feb628671c0283e/tiktoken-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c06cf0fcc24c2cb2adb5e185c7082a82cba29c17575e828518c2f11a01f445aa", size = 995284, upload-time = "2025-10-06T20:21:45.622Z" }, + { url = "https://files.pythonhosted.org/packages/01/84/961106c37b8e49b9fdcf33fe007bb3a8fdcc380c528b20cc7fbba80578b8/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f18f249b041851954217e9fd8e5c00b024ab2315ffda5ed77665a05fa91f42dc", size = 1129201, upload-time = "2025-10-06T20:21:47.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d0/3d9275198e067f8b65076a68894bb52fd253875f3644f0a321a720277b8a/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:47a5bc270b8c3db00bb46ece01ef34ad050e364b51d406b6f9730b64ac28eded", size = 1152444, upload-time = "2025-10-06T20:21:48.139Z" }, + { url = "https://files.pythonhosted.org/packages/78/db/a58e09687c1698a7c592e1038e01c206569b86a0377828d51635561f8ebf/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:508fa71810c0efdcd1b898fda574889ee62852989f7c1667414736bcb2b9a4bd", size = 1195080, upload-time = "2025-10-06T20:21:49.246Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/a9e4d2bf91d515c0f74afc526fd773a812232dd6cda33ebea7f531202325/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1af81a6c44f008cba48494089dd98cccb8b313f55e961a52f5b222d1e507967", size = 1255240, upload-time = "2025-10-06T20:21:50.274Z" }, + { url = "https://files.pythonhosted.org/packages/4a/42/6573e9129bc55c9bf7300b3a35bef2c6b9117018acca0dc760ac2d93dffe/tiktoken-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b90f5ad190a4bb7c3eb30c5fa32e1e182ca1ca79f05e49b448438c3e225a49b", size = 994049, upload-time = "2025-10-06T20:21:53.782Z" }, + { url = "https://files.pythonhosted.org/packages/66/c5/ed88504d2f4a5fd6856990b230b56d85a777feab84e6129af0822f5d0f70/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:65b26c7a780e2139e73acc193e5c63ac754021f160df919add909c1492c0fb37", size = 1129008, upload-time = "2025-10-06T20:21:54.832Z" }, + { url = "https://files.pythonhosted.org/packages/f4/90/3dae6cc5436137ebd38944d396b5849e167896fc2073da643a49f372dc4f/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:edde1ec917dfd21c1f2f8046b86348b0f54a2c0547f68149d8600859598769ad", size = 1152665, upload-time = "2025-10-06T20:21:56.129Z" }, + { url = "https://files.pythonhosted.org/packages/a3/fe/26df24ce53ffde419a42f5f53d755b995c9318908288c17ec3f3448313a3/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:35a2f8ddd3824608b3d650a000c1ef71f730d0c56486845705a8248da00f9fe5", size = 1194230, upload-time = "2025-10-06T20:21:57.546Z" }, + { url = "https://files.pythonhosted.org/packages/20/cc/b064cae1a0e9fac84b0d2c46b89f4e57051a5f41324e385d10225a984c24/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83d16643edb7fa2c99eff2ab7733508aae1eebb03d5dfc46f5565862810f24e3", size = 1254688, upload-time = "2025-10-06T20:21:58.619Z" }, + { url = "https://files.pythonhosted.org/packages/1f/05/dcf94486d5c5c8d34496abe271ac76c5b785507c8eae71b3708f1ad9b45a/tiktoken-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a01b12f69052fbe4b080a2cfb867c4de12c704b56178edf1d1d7b273561db160", size = 993995, upload-time = "2025-10-06T20:22:02.788Z" }, + { url = "https://files.pythonhosted.org/packages/a0/70/5163fe5359b943f8db9946b62f19be2305de8c3d78a16f629d4165e2f40e/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:01d99484dc93b129cd0964f9d34eee953f2737301f18b3c7257bf368d7615baa", size = 1128948, upload-time = "2025-10-06T20:22:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/0c/da/c028aa0babf77315e1cef357d4d768800c5f8a6de04d0eac0f377cb619fa/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4a1a4fcd021f022bfc81904a911d3df0f6543b9e7627b51411da75ff2fe7a1be", size = 1151986, upload-time = "2025-10-06T20:22:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5a/886b108b766aa53e295f7216b509be95eb7d60b166049ce2c58416b25f2a/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:981a81e39812d57031efdc9ec59fa32b2a5a5524d20d4776574c4b4bd2e9014a", size = 1194222, upload-time = "2025-10-06T20:22:06.265Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f8/4db272048397636ac7a078d22773dd2795b1becee7bc4922fe6207288d57/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9baf52f84a3f42eef3ff4e754a0db79a13a27921b457ca9832cf944c6be4f8f3", size = 1255097, upload-time = "2025-10-06T20:22:07.403Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b8/57ef1456504c43a849821920d582a738a461b76a047f352f18c0b26c6516/tiktoken-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b4e7ed1c6a7a8a60a3230965bdedba8cc58f68926b835e519341413370e0399a", size = 993712, upload-time = "2025-10-06T20:22:12.115Z" }, + { url = "https://files.pythonhosted.org/packages/72/90/13da56f664286ffbae9dbcfadcc625439142675845baa62715e49b87b68b/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:fc530a28591a2d74bce821d10b418b26a094bf33839e69042a6e86ddb7a7fb27", size = 1128725, upload-time = "2025-10-06T20:22:13.541Z" }, + { url = "https://files.pythonhosted.org/packages/05/df/4f80030d44682235bdaecd7346c90f67ae87ec8f3df4a3442cb53834f7e4/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:06a9f4f49884139013b138920a4c393aa6556b2f8f536345f11819389c703ebb", size = 1151875, upload-time = "2025-10-06T20:22:14.559Z" }, + { url = "https://files.pythonhosted.org/packages/22/1f/ae535223a8c4ef4c0c1192e3f9b82da660be9eb66b9279e95c99288e9dab/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:04f0e6a985d95913cabc96a741c5ffec525a2c72e9df086ff17ebe35985c800e", size = 1194451, upload-time = "2025-10-06T20:22:15.545Z" }, + { url = "https://files.pythonhosted.org/packages/78/a7/f8ead382fce0243cb625c4f266e66c27f65ae65ee9e77f59ea1653b6d730/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0ee8f9ae00c41770b5f9b0bb1235474768884ae157de3beb5439ca0fd70f3e25", size = 1253794, upload-time = "2025-10-06T20:22:16.624Z" }, ] [[package]] @@ -10716,14 +10081,14 @@ wheels = [ [[package]] name = "tinycss2" -version = "1.5.1" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" }, + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, ] [[package]] @@ -10737,12 +10102,8 @@ sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb3 wheels = [ { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, - { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, - { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, - { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, ] @@ -10772,47 +10133,63 @@ wheels = [ [[package]] name = "tomlkit" -version = "0.15.0" +version = "0.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/db/03eaf4331631ef6b27d6e3c9b68c54dc6f0d63d87201fed600cc409307fd/tomlkit-0.15.0.tar.gz", hash = "sha256:7d1a9ecba3086638211b13814ea79c90dd54dd11993564376f3aa92271f5c7a3", size = 161875, upload-time = "2026-05-10T07:38:22.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/af/14b24e41977adb296d6bd1fb59402cf7d60ce364f90c890bd2ec65c43b5a/tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064", size = 187167, upload-time = "2026-01-13T01:14:53.304Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/43/8bd850ee71a191bf072e31302c73a66be413fecdd98fdcd111ecbcce13ca/tomlkit-0.15.0-py3-none-any.whl", hash = "sha256:4dbc8f0fc024412b57ced8757ac7461305126a648ff8c2c807fcb8e133a78738", size = 41328, upload-time = "2026-05-10T07:38:23.517Z" }, + { url = "https://files.pythonhosted.org/packages/b5/11/87d6d29fb5d237229d67973a6c9e06e048f01cf4994dee194ab0ea841814/tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680", size = 39310, upload-time = "2026-01-13T01:14:51.965Z" }, ] [[package]] name = "torch" -version = "2.12.0" +version = "2.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-bindings", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "cuda-toolkit", extra = ["cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "cuda-bindings", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "filelock", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "fsspec", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "jinja2", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "networkx", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nvidia-cudnn-cu13", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nvidia-cusparselt-cu13", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nvidia-nccl-cu13", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "nvidia-nvshmem-cu13", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvshmem-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "setuptools", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sympy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "triton", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "triton", version = "3.6.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/18/62/131124fb95df03811b8260d1d43dcc5ee85ea1a344b964613d7efe77fb08/torch-2.12.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:10802fd383bbfed646212e765a72c37d2185205d4f26eb197a254e8ac7ddcb25", size = 87990344, upload-time = "2026-05-13T14:55:42.154Z" }, - { url = "https://files.pythonhosted.org/packages/12/9c/dda0dbd547dc549839824135f223792fd0e725f28ed0715dda366b7acaa2/torch-2.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c12592630aef72feaf18bd3f197ef587bbfa21131b31c38b23ab2e55fce92e36", size = 426362932, upload-time = "2026-05-13T14:54:15.295Z" }, - { url = "https://files.pythonhosted.org/packages/e2/d2/a7dd5a3f9bdaa7842124e8e2359202b317c48d47d2fc5816fafdf2049adb/torch-2.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:415c1b8d0412f67551c8e89a2daca0fb3e56694af0281ba155eaa9da481f58b4", size = 532170085, upload-time = "2026-05-13T14:55:20.788Z" }, - { url = "https://files.pythonhosted.org/packages/ef/bb/285d643f254731294c9b595a007eac39db4600a98682d7bca688f42ca164/torch-2.12.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b41339df93d491435e790ff8bcbae1c0ce777175889bfd1281d119862793e6a2", size = 88010197, upload-time = "2026-05-13T14:55:35.414Z" }, - { url = "https://files.pythonhosted.org/packages/79/81/76debf1db1343bd929bbb5d74c89fb437c2ed88eb144712557e7bd3eea45/torch-2.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8fbef9f108a863e7722a73740998967e3b074742a834fc5be3a535a2befa7057", size = 426376751, upload-time = "2026-05-13T14:55:03.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/f0/80026028b603c4650ff270fc3785bdef4bd6738765a9cc5a0f5a637d65a2/torch-2.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4b4f64c2c2b11f7510d93dd6412b87025ff6eddd6bb61c3b5a3d892ea20c4756", size = 532261691, upload-time = "2026-05-13T14:52:54.453Z" }, - { url = "https://files.pythonhosted.org/packages/86/ca/01896c80ba921676aa45886b2c5b8d774912de2a1f719de48169c6f755cd/torch-2.12.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:90dd587a5f61bfe1307148b581e2084fc5bc4a06e2b90a20e9a36b81087ff16b", size = 88009511, upload-time = "2026-05-13T14:54:47.411Z" }, - { url = "https://files.pythonhosted.org/packages/a5/04/52bdaf4787eab6ac7d7f5851dff934e4def0bc8ead9c8fd2b69b3e529699/torch-2.12.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:864392c73b7654f4d2b3ae712f607937d0dbb1101c4555fbb41848106b297f39", size = 426383231, upload-time = "2026-05-13T14:53:32.129Z" }, - { url = "https://files.pythonhosted.org/packages/49/8a/94bdecd13f5aaa90d45920b89789d9fe7c6f4af8c3cdd7ce01fcb59908fc/torch-2.12.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5d6b560dfa7d56291c07d615c3bb73e8d9943d9b6d87f76cd0d9d570c4797fa6", size = 532269288, upload-time = "2026-05-13T14:53:49.423Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ad/e95e822f3538171e22640a7fbe839a1fdb666600bf6487025de2ff03b11a/torch-2.12.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:10ee1448a9f304d3b987eb4656f664ba6e4d7b410ca7a5a7c642199777a2cf88", size = 88319556, upload-time = "2026-05-13T14:54:05.574Z" }, - { url = "https://files.pythonhosted.org/packages/b7/07/055d06d985b445d67422d25b033c11cf55bbb81785d4c4e68e28bca5820e/torch-2.12.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:af68dbf403439cae9ceaeaaf92f8352b460787dcd27b92aa05c40dd4a19c0f1e", size = 426397656, upload-time = "2026-05-13T14:52:38.84Z" }, - { url = "https://files.pythonhosted.org/packages/43/94/b0b4fdc3014122e0a7302fb90086d352aa48f2576f0b252561ebb38c01a8/torch-2.12.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:a6a2eebb237d3b1d9ad3b378e86d9b9e0782afdea8b1e0eba6a13646b9b49c07", size = 532183124, upload-time = "2026-05-13T14:53:16.178Z" }, + { url = "https://files.pythonhosted.org/packages/0f/8b/4b61d6e13f7108f36910df9ab4b58fd389cc2520d54d81b88660804aad99/torch-2.10.0-2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:418997cb02d0a0f1497cf6a09f63166f9f5df9f3e16c8a716ab76a72127c714f", size = 79423467, upload-time = "2026-02-10T21:44:48.711Z" }, + { url = "https://files.pythonhosted.org/packages/d3/54/a2ba279afcca44bbd320d4e73675b282fcee3d81400ea1b53934efca6462/torch-2.10.0-2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:13ec4add8c3faaed8d13e0574f5cd4a323c11655546f91fbe6afa77b57423574", size = 79498202, upload-time = "2026-02-10T21:44:52.603Z" }, + { url = "https://files.pythonhosted.org/packages/ec/23/2c9fe0c9c27f7f6cb865abcea8a4568f29f00acaeadfc6a37f6801f84cb4/torch-2.10.0-2-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:e521c9f030a3774ed770a9c011751fb47c4d12029a3d6522116e48431f2ff89e", size = 79498254, upload-time = "2026-02-10T21:44:44.095Z" }, + { url = "https://files.pythonhosted.org/packages/36/ab/7b562f1808d3f65414cd80a4f7d4bb00979d9355616c034c171249e1a303/torch-2.10.0-3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac5bdcbb074384c66fa160c15b1ead77839e3fe7ed117d667249afce0acabfac", size = 915518691, upload-time = "2026-03-11T14:15:43.147Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7a/abada41517ce0011775f0f4eacc79659bc9bc6c361e6bfe6f7052a6b9363/torch-2.10.0-3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:98c01b8bb5e3240426dcde1446eed6f40c778091c8544767ef1168fc663a05a6", size = 915622781, upload-time = "2026-03-11T14:17:11.354Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c6/4dfe238342ffdcec5aef1c96c457548762d33c40b45a1ab7033bb26d2ff2/torch-2.10.0-3-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:80b1b5bfe38eb0e9f5ff09f206dcac0a87aadd084230d4a36eea5ec5232c115b", size = 915627275, upload-time = "2026-03-11T14:16:11.325Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f0/72bf18847f58f877a6a8acf60614b14935e2f156d942483af1ffc081aea0/torch-2.10.0-3-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:46b3574d93a2a8134b3f5475cfb98e2eb46771794c57015f6ad1fb795ec25e49", size = 915523474, upload-time = "2026-03-11T14:17:44.422Z" }, + { url = "https://files.pythonhosted.org/packages/78/89/f5554b13ebd71e05c0b002f95148033e730d3f7067f67423026cc9c69410/torch-2.10.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3282d9febd1e4e476630a099692b44fdc214ee9bf8ee5377732d9d9dfe5712e4", size = 145992610, upload-time = "2026-01-21T16:25:26.327Z" }, + { url = "https://files.pythonhosted.org/packages/ae/30/a3a2120621bf9c17779b169fc17e3dc29b230c29d0f8222f499f5e159aa8/torch-2.10.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a2f9edd8dbc99f62bc4dfb78af7bf89499bca3d753423ac1b4e06592e467b763", size = 915607863, upload-time = "2026-01-21T16:25:06.696Z" }, + { url = "https://files.pythonhosted.org/packages/61/d8/15b9d9d3a6b0c01b883787bd056acbe5cc321090d4b216d3ea89a8fcfdf3/torch-2.10.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:b7bd80f3477b830dd166c707c5b0b82a898e7b16f59a7d9d42778dd058272e8b", size = 79423461, upload-time = "2026-01-21T16:24:50.266Z" }, + { url = "https://files.pythonhosted.org/packages/cc/af/758e242e9102e9988969b5e621d41f36b8f258bb4a099109b7a4b4b50ea4/torch-2.10.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:5fd4117d89ffd47e3dcc71e71a22efac24828ad781c7e46aaaf56bf7f2796acf", size = 145996088, upload-time = "2026-01-21T16:24:44.171Z" }, + { url = "https://files.pythonhosted.org/packages/23/8e/3c74db5e53bff7ed9e34c8123e6a8bfef718b2450c35eefab85bb4a7e270/torch-2.10.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:787124e7db3b379d4f1ed54dd12ae7c741c16a4d29b49c0226a89bea50923ffb", size = 915711952, upload-time = "2026-01-21T16:23:53.503Z" }, + { url = "https://files.pythonhosted.org/packages/c9/5c/dee910b87c4d5c0fcb41b50839ae04df87c1cfc663cf1b5fca7ea565eeaa/torch-2.10.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6d3707a61863d1c4d6ebba7be4ca320f42b869ee657e9b2c21c736bf17000294", size = 79498198, upload-time = "2026-01-21T16:24:34.704Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6f/f2e91e34e3fcba2e3fc8d8f74e7d6c22e74e480bbd1db7bc8900fdf3e95c/torch-2.10.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5c4d217b14741e40776dd7074d9006fd28b8a97ef5654db959d8635b2fe5f29b", size = 146004247, upload-time = "2026-01-21T16:24:29.335Z" }, + { url = "https://files.pythonhosted.org/packages/98/fb/5160261aeb5e1ee12ee95fe599d0541f7c976c3701d607d8fc29e623229f/torch-2.10.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6b71486353fce0f9714ca0c9ef1c850a2ae766b409808acd58e9678a3edb7738", size = 915716445, upload-time = "2026-01-21T16:22:45.353Z" }, + { url = "https://files.pythonhosted.org/packages/1a/0b/39929b148f4824bc3ad6f9f72a29d4ad865bcf7ebfc2fa67584773e083d2/torch-2.10.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:3202429f58309b9fa96a614885eace4b7995729f44beb54d3e4a47773649d382", size = 79851305, upload-time = "2026-01-21T16:24:09.209Z" }, + { url = "https://files.pythonhosted.org/packages/d8/14/21fbce63bc452381ba5f74a2c0a959fdf5ad5803ccc0c654e752e0dbe91a/torch-2.10.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:aae1b29cd68e50a9397f5ee897b9c24742e9e306f88a807a27d617f07adb3bd8", size = 146005472, upload-time = "2026-01-21T16:22:29.022Z" }, + { url = "https://files.pythonhosted.org/packages/54/fd/b207d1c525cb570ef47f3e9f836b154685011fce11a2f444ba8a4084d042/torch-2.10.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6021db85958db2f07ec94e1bc77212721ba4920c12a18dc552d2ae36a3eb163f", size = 915612644, upload-time = "2026-01-21T16:21:47.019Z" }, + { url = "https://files.pythonhosted.org/packages/0e/13/e76b4d9c160e89fff48bf16b449ea324bda84745d2ab30294c37c2434c0d/torch-2.10.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:cdf2a523d699b70d613243211ecaac14fe9c5df8a0b0a9c02add60fb2a413e0f", size = 79498248, upload-time = "2026-01-21T16:23:09.315Z" }, ] [[package]] @@ -10826,7 +10203,7 @@ wheels = [ [[package]] name = "torchvision" -version = "0.27.0" +version = "0.25.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -10834,54 +10211,54 @@ dependencies = [ { name = "torch", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/d6/a7e71e981042d5c573e2e61891b9023b190c88adb75b18bed8594371250c/torchvision-0.27.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:df0c166b6bdf7c47f88e81e8b43bc085451d5c50d0c5d1691bc474c1227d6fed", size = 1758812, upload-time = "2026-05-13T14:57:16.662Z" }, - { url = "https://files.pythonhosted.org/packages/93/f9/f542fb7e4476603fb237ebdc64369a7d11f18eb5a129aa2559cbdb710aee/torchvision-0.27.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9bb9251f64b854124efed95d02953a89f7e2726c3ca662d7ea0151129157297f", size = 7831148, upload-time = "2026-05-13T14:57:08.37Z" }, - { url = "https://files.pythonhosted.org/packages/f6/61/7aa7cc2c9e8750027f6fb9ae3a7393ef43860bcdfe3966e2f71fee800e31/torchvision-0.27.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f44453f107c296d5446a79f7ac59733ad8bf5ddfa04c53805dfbae298a42a798", size = 7575519, upload-time = "2026-05-13T14:56:50.552Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c8/5cd91932f7f3671b0743dc4ae1a4c16b1d0b45bf4087976277d325bda718/torchvision-0.27.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:1a6dd742a150645126df9e0b2e449874c1d635897c773b322c2e067e98382dfe", size = 1758824, upload-time = "2026-05-13T14:57:15.227Z" }, - { url = "https://files.pythonhosted.org/packages/d9/36/7fb7d19477b3d93283b52fea11fa8ee30ab9064a08c97b4a6b91445e26cb/torchvision-0.27.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:65772ff3ec4f4f5d680e30019835555dd239e7fefee4b0a846375fe1cb1592ef", size = 7831034, upload-time = "2026-05-13T14:57:06.483Z" }, - { url = "https://files.pythonhosted.org/packages/62/43/dfd894c3f8b01b5b33fde990f0159c1926ebc7b6e2c4193e2efb7da3c4cb/torchvision-0.27.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7a9966a088d06b4cf6c610e03be62de469efa6f2cd2e7c7eed8e925ed6af59ac", size = 7579774, upload-time = "2026-05-13T14:56:59.337Z" }, - { url = "https://files.pythonhosted.org/packages/d8/ae/36547812e6e047c1d80bcacd1b17a340612b08a6e876e0aabf3d0b9228b0/torchvision-0.27.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:41d6dae73e1af09fa82ded597ae57f2a2314285acde54b25890a8f8e51b999d7", size = 1758826, upload-time = "2026-05-13T14:57:05.262Z" }, - { url = "https://files.pythonhosted.org/packages/ae/30/32c4ea842738728a14e3df8c576c62dedcf5ae5cb6a5c984c6429ebe7524/torchvision-0.27.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:70f071c6f74b60d5fe8851636d8d4cd5f4fa29d57fd9348a87a6f17b990b95ba", size = 7789501, upload-time = "2026-05-13T14:56:57.786Z" }, - { url = "https://files.pythonhosted.org/packages/f6/24/4d0d48684251bd0673f87d633d5d88ab00227983b00591156eed2f86c8d5/torchvision-0.27.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:aaafa6962c9d91f42503de1957d6fa349907d028c06f335bd95da7a5bc57147d", size = 7579868, upload-time = "2026-05-13T14:56:41.618Z" }, - { url = "https://files.pythonhosted.org/packages/fa/23/95dfa40431360f42ca949bf861434bed51164adfa8fb9801e05bf3194f50/torchvision-0.27.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:c5121f1b9ab09a7f73e837871deb8321551f7eaeb19d87aa00de9191968eae44", size = 1845008, upload-time = "2026-05-13T14:57:03.768Z" }, - { url = "https://files.pythonhosted.org/packages/23/b9/9dbdf76b2b49a75ba8088df6f7c755bdb520afb6c6dbac0102b46cde5e99/torchvision-0.27.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:1c01f0d1091ae22b9dfc082b0a0fe5faaf053686a29b4fb082ba7691375c73cf", size = 7791430, upload-time = "2026-05-13T14:56:56.206Z" }, - { url = "https://files.pythonhosted.org/packages/5c/6a/e4a16cf2f3310c2ea7760dc5d9054496844391e0f4c1fae87fefac2f3d9e/torchvision-0.27.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dadea3c5ecfd05bbb2a3312ab0374f213c58bf6459cb059122e2f4dfe13d10ed", size = 7668441, upload-time = "2026-05-13T14:57:02.127Z" }, + { url = "https://files.pythonhosted.org/packages/3e/be/c704bceaf11c4f6b19d64337a34a877fcdfe3bd68160a8c9ae9bea4a35a3/torchvision-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db74a551946b75d19f9996c419a799ffdf6a223ecf17c656f90da011f1d75b20", size = 1874923, upload-time = "2026-01-21T16:27:46.574Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/f143cd71232430de1f547ceab840f68c55e127d72558b1061a71d0b193cd/torchvision-0.25.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f49964f96644dbac2506dffe1a0a7ec0f2bf8cf7a588c3319fed26e6329ffdf3", size = 2344808, upload-time = "2026-01-21T16:27:43.191Z" }, + { url = "https://files.pythonhosted.org/packages/43/ae/ad5d6165797de234c9658752acb4fce65b78a6a18d82efdf8367c940d8da/torchvision-0.25.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:153c0d2cbc34b7cf2da19d73450f24ba36d2b75ec9211b9962b5022fb9e4ecee", size = 8070752, upload-time = "2026-01-21T16:27:33.748Z" }, + { url = "https://files.pythonhosted.org/packages/56/3a/6ea0d73f49a9bef38a1b3a92e8dd455cea58470985d25635beab93841748/torchvision-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2abe430c90b1d5e552680037d68da4eb80a5852ebb1c811b2b89d299b10573b", size = 1874920, upload-time = "2026-01-21T16:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/51/f8/c0e1ef27c66e15406fece94930e7d6feee4cb6374bbc02d945a630d6426e/torchvision-0.25.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:b75deafa2dfea3e2c2a525559b04783515e3463f6e830cb71de0fb7ea36fe233", size = 2344556, upload-time = "2026-01-21T16:27:40.125Z" }, + { url = "https://files.pythonhosted.org/packages/68/2f/f24b039169db474e8688f649377de082a965fbf85daf4e46c44412f1d15a/torchvision-0.25.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f25aa9e380865b11ea6e9d99d84df86b9cc959f1a007cd966fc6f1ab2ed0e248", size = 8072351, upload-time = "2026-01-21T16:27:21.074Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5b/1562a04a6a5a4cf8cf40016a0cdeda91ede75d6962cff7f809a85ae966a5/torchvision-0.25.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:24e11199e4d84ba9c5ee7825ebdf1cd37ce8deec225117f10243cae984ced3ec", size = 1874918, upload-time = "2026-01-21T16:27:39.02Z" }, + { url = "https://files.pythonhosted.org/packages/36/b1/3d6c42f62c272ce34fcce609bb8939bdf873dab5f1b798fd4e880255f129/torchvision-0.25.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f271136d2d2c0b7a24c5671795c6e4fd8da4e0ea98aeb1041f62bc04c4370ef", size = 2309106, upload-time = "2026-01-21T16:27:30.624Z" }, + { url = "https://files.pythonhosted.org/packages/c7/60/59bb9c8b67cce356daeed4cb96a717caa4f69c9822f72e223a0eae7a9bd9/torchvision-0.25.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:855c0dc6d37f462482da7531c6788518baedca1e0847f3df42a911713acdfe52", size = 8071522, upload-time = "2026-01-21T16:27:29.392Z" }, + { url = "https://files.pythonhosted.org/packages/52/99/dca81ed21ebaeff2b67cc9f815a20fdaa418b69f5f9ea4c6ed71721470db/torchvision-0.25.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a8f8061284395ce31bcd460f2169013382ccf411148ceb2ee38e718e9860f5a7", size = 1896209, upload-time = "2026-01-21T16:27:32.159Z" }, + { url = "https://files.pythonhosted.org/packages/28/cc/2103149761fdb4eaed58a53e8437b2d716d48f05174fab1d9fcf1e2a2244/torchvision-0.25.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:146d02c9876858420adf41f3189fe90e3d6a409cbfa65454c09f25fb33bf7266", size = 2310735, upload-time = "2026-01-21T16:27:22.327Z" }, + { url = "https://files.pythonhosted.org/packages/76/ad/f4c985ad52ddd3b22711c588501be1b330adaeaf6850317f66751711b78c/torchvision-0.25.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c4d395cb2c4a2712f6eb93a34476cdf7aae74bb6ea2ea1917f858e96344b00aa", size = 8089557, upload-time = "2026-01-21T16:27:27.666Z" }, ] [[package]] name = "tornado" -version = "6.5.7" +version = "6.5.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/24/95ec527ad67b76d59299e5465b3935d05e4294b7e0290a3924b7487df30b/tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2", size = 519252, upload-time = "2026-06-08T17:34:51.232Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/dc/c7043cab6fed8ae159fc1923ce829ada35c4dbd797d408a43858ffaf9639/tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163", size = 448543, upload-time = "2026-06-08T17:34:38.052Z" }, - { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" }, - { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" }, - { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, + { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, + { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, ] [[package]] name = "tqdm" -version = "4.68.2" +version = "4.67.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/05/0d5260f1f1ca784f4a4a0def9cbe6affe587f5b4025328d446c3d67765f4/tqdm-4.68.2.tar.gz", hash = "sha256:89c230e8dbc67c7615c142487111222f878c77427ea09549960f62389e258add", size = 171923, upload-time = "2026-06-09T13:26:42.539Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/75/1a0392bcc21c44dcdf87b3cf2d137e7829be2c083a1e38d44efca3d57a16/tqdm-4.68.2-py3-none-any.whl", hash = "sha256:d4240441fb5353290b87d6a85968c9decc131a99b8c7faa28269d829de669ede", size = 78578, upload-time = "2026-06-09T13:26:40.731Z" }, + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, ] [[package]] name = "traitlets" -version = "5.15.1" +version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/a9/a2584b8313b89f94869ddb3c4074617a691de1812a614d2d50e32ca5a7a6/traitlets-5.15.1.tar.gz", hash = "sha256:7b1c07854fe25acb39e009bae49f11b79ff6cbb2f27999104e9110e7a6b53722", size = 163344, upload-time = "2026-06-03T12:26:06.181Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl", hash = "sha256:770a53705f84b81ac107e83a1b3328ff2dae16094d8fc3cfc004e4b22dfd8e92", size = 85858, upload-time = "2026-06-03T12:26:04.395Z" }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] [[package]] name = "transformers" -version = "5.10.2" +version = "5.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -10894,49 +10271,67 @@ dependencies = [ { name = "tqdm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8d/38/d5f978bd5091019e89aef29b9a831f5cd70f2598963a3ead8b9570cab592/transformers-5.10.2.tar.gz", hash = "sha256:f9a44b9c8ca9ab1156b467f574d832ea066284299c2fd0ed84641ccb592751fc", size = 8799687, upload-time = "2026-06-04T18:43:49.119Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/9d/fb46e729b461985f41a5740167688b924a4019141e5c164bea77548d3d9e/transformers-5.5.0.tar.gz", hash = "sha256:c8db656cf51c600cd8c75f06b20ef85c72e8b8ff9abc880c5d3e8bc70e0ddcbd", size = 8237745, upload-time = "2026-04-02T16:13:08.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/28/35f7411ff80a3640c1f4fc907dcbb6a65061ebb82f66950e38bfc9f7f740/transformers-5.5.0-py3-none-any.whl", hash = "sha256:821a9ff0961abbb29eb1eb686d78df1c85929fdf213a3fe49dc6bd94f9efa944", size = 10245591, upload-time = "2026-04-02T16:13:03.462Z" }, +] + +[[package]] +name = "triton" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux'", +] wheels = [ - { url = "https://files.pythonhosted.org/packages/73/6f/e1564b0cc182afa05e219a8e09a8e770ffaab879b6b824b56c819bd221da/transformers-5.10.2-py3-none-any.whl", hash = "sha256:8a669db546f82c7c3618cb46ceb0f0afd89292bc70f319c058f8332ec63e268d", size = 11003830, upload-time = "2026-06-04T18:43:45.303Z" }, + { url = "https://files.pythonhosted.org/packages/e0/12/b05ba554d2c623bffa59922b94b0775673de251f468a9609bc9e45de95e9/triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e323d608e3a9bfcc2d9efcc90ceefb764a82b99dea12a86d643c72539ad5d3", size = 188214640, upload-time = "2026-01-20T16:00:35.869Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a8/cdf8b3e4c98132f965f88c2313a4b493266832ad47fb52f23d14d4f86bb5/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca", size = 188266850, upload-time = "2026-01-20T16:00:43.041Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0b/37d991d8c130ce81a8728ae3c25b6e60935838e9be1b58791f5997b24a54/triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c7f76c6e72d2ef08df639e3d0d30729112f47a56b0c81672edc05ee5116ac9", size = 188289450, upload-time = "2026-01-20T16:00:49.136Z" }, + { url = "https://files.pythonhosted.org/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", size = 188400296, upload-time = "2026-01-20T16:00:56.042Z" }, ] [[package]] name = "triton" version = "3.7.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and platform_machine == 'arm64' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'arm64' and sys_platform == 'darwin'", + "python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux'", +] wheels = [ { url = "https://files.pythonhosted.org/packages/b8/c1/5d842314bb6c78442cc60437928781701c6050b8d479bc2a1aed691d37ca/triton-3.7.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9e71fc392675fac364e0ecf4ef3f76f85b7f5433a16f4c3c5fe5f05a52c85fe", size = 188480277, upload-time = "2026-05-07T19:05:03.231Z" }, - { url = "https://files.pythonhosted.org/packages/13/31/8315ea5f8dd18e60970b3022e3a8b93fd37e0b784fbbef86e10c8e6e5ca1/triton-3.7.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22bacffce443f54593dd20f05294d5a40622e0ea9ab632816f87154504356221", size = 201415942, upload-time = "2026-05-07T18:46:06.479Z" }, { url = "https://files.pythonhosted.org/packages/f7/13/ec05adfcd87311d532ba61e3af143e8be59fcd26675884c4682841406a20/triton-3.7.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4bf49b00a7a377a68a6da603a876e797614e6455a80e9021669c476a953ad9a", size = 188505104, upload-time = "2026-05-07T19:05:09.843Z" }, - { url = "https://files.pythonhosted.org/packages/62/7b/468a576e35beef1426e0828e28e9ba9e65f5474d496f16ee126c15646324/triton-3.7.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f111161d49bf903c0eaedde3962353a3d841c08a836839b7cc1025b8426efcf", size = 201457567, upload-time = "2026-05-07T18:46:13.505Z" }, { url = "https://files.pythonhosted.org/packages/01/e1/a59a583de59b8f62c495d67c80ee3ea97d09e91ac80c4c6e76456ed8d8ac/triton-3.7.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abdf6beaa89b1bcfb9a43cd990536ce66091a997841a4814b260b7bee4c88c3c", size = 188503209, upload-time = "2026-05-07T19:05:17.935Z" }, - { url = "https://files.pythonhosted.org/packages/30/b1/b7507bb9815d403927c8dd51d4158ed2e11751a92dbc118a044f247b6848/triton-3.7.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a35d7afe3f3f058e7ec49fcce09794049e0ffc5c59019ac25ec3413741b8c4e7", size = 201453566, upload-time = "2026-05-07T18:46:20.427Z" }, { url = "https://files.pythonhosted.org/packages/a6/8f/0bea7a6a0c989315c9135a1d7fb37e41905cfb3a17cbc1f10044ebd4cc3a/triton-3.7.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc1d61c172d257db80ddf42595131fb196ad2e9bdd751e90fe2ef13531734e8b", size = 188612899, upload-time = "2026-05-07T19:05:24.955Z" }, - { url = "https://files.pythonhosted.org/packages/e1/02/d96f57828d0912aec733b9bc7e0e7dbfd2c6f079a8fa433ac25cb93d1a30/triton-3.7.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70fb9bbdc9f400afc54bbf6eb2670af28829a6ae3996863317964783141daf56", size = 201553816, upload-time = "2026-05-07T18:46:27.49Z" }, ] [[package]] name = "trl" -version = "1.5.1" +version = "0.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accelerate", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "datasets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "jinja2", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "transformers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a4/72/115c84b05d0e9b3458bb485ff3aa170cdd923fd2136e7832e41850475a8c/trl-1.5.1.tar.gz", hash = "sha256:8d73ffd9329ac21ffc47919656da2b7faaa6406fbe3574896a1923f390a9197b", size = 622292, upload-time = "2026-05-27T15:26:20.223Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/2e/30ece0055eee5763126e2d52f6e04aec294bcae34b46d9ca16c53c4b5852/trl-0.24.0.tar.gz", hash = "sha256:eee495223725d3da0596be2607581969db89ba0f7c00b075802addc31e61eac9", size = 368447, upload-time = "2025-10-16T00:10:37.65Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/9a/646429e405d49d0db2e612c418f8278d193158781a9daf3b86356244097f/trl-1.5.1-py3-none-any.whl", hash = "sha256:502a4c71f807fcb2de9768802faf5d1e9c16e52c483f51e80630b10da3451928", size = 761076, upload-time = "2026-05-27T15:26:18.22Z" }, + { url = "https://files.pythonhosted.org/packages/87/5f/c647fedde9d59ae35ee189cc49e419da5ac1d9ad9933cb69401a7eac4705/trl-0.24.0-py3-none-any.whl", hash = "sha256:a9145b7d4a4a33778de117bda48530f0cf5b2ac25acc07db80ad04836f490dfc", size = 423143, upload-time = "2025-10-16T00:10:35.809Z" }, ] [[package]] name = "trove-classifiers" -version = "2026.6.1.19" +version = "2026.1.14.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c2/e3/7ca82ee24c82d344584abd5b8637b3bd056f2900226e8d82fc22f1184b92/trove_classifiers-2026.6.1.19.tar.gz", hash = "sha256:c5132b4b61a829d11cfbd2d72e97f20a45ed6edb95e45c5efdeb5e00836b2745", size = 17059, upload-time = "2026-06-01T19:41:34.649Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/43/7935f8ea93fcb6680bc10a6fdbf534075c198eeead59150dd5ed68449642/trove_classifiers-2026.1.14.14.tar.gz", hash = "sha256:00492545a1402b09d4858605ba190ea33243d361e2b01c9c296ce06b5c3325f3", size = 16997, upload-time = "2026-01-14T14:54:50.526Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/a4/81502f486f01db95bc8320646a8a12511f5e556cb63d5e224d91816605c4/trove_classifiers-2026.6.1.19-py3-none-any.whl", hash = "sha256:ab4c4ec93cc4a4e7815fa759906e05e6bb3f2fbd92ea0f897288c6a43efd15b3", size = 14211, upload-time = "2026-06-01T19:41:33.434Z" }, + { url = "https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl", hash = "sha256:1f9553927f18d0513d8e5ff80ab8980b8202ce37ecae0e3274ed2ef11880e74d", size = 14197, upload-time = "2026-01-14T14:54:49.067Z" }, ] [[package]] @@ -10945,33 +10340,28 @@ version = "0.0.17" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/66/c3/41ae6346443eedb65b96761abfab890a48ce2aa5a8a27af69c5c5d99064d/ty-0.0.17.tar.gz", hash = "sha256:847ed6c120913e280bf9b54d8eaa7a1049708acb8824ad234e71498e8ad09f97", size = 5167209, upload-time = "2026-02-13T13:26:36.835Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/01/0ef15c22a1c54b0f728ceff3f62d478dbf8b0dcf8ff7b80b954f79584f3e/ty-0.0.17-py3-none-linux_armv6l.whl", hash = "sha256:64a9a16555cc8867d35c2647c2f1afbd3cae55f68fd95283a574d1bb04fe93e0", size = 10192793, upload-time = "2026-02-13T13:27:13.943Z" }, { url = "https://files.pythonhosted.org/packages/4c/a5/43746c1ff81e784f5fc303afc61fe5bcd85d0fcf3ef65cb2cef78c7486c7/ty-0.0.17-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f18f5fd927bc628deb9ea2df40f06b5f79c5ccf355db732025a3e8e7152801f6", size = 9564639, upload-time = "2026-02-13T13:26:42.781Z" }, { url = "https://files.pythonhosted.org/packages/d6/b8/280b04e14a9c0474af574f929fba2398b5e1c123c1e7735893b4cd73d13c/ty-0.0.17-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5383814d1d7a5cc53b3b07661856bab04bb2aac7a677c8d33c55169acdaa83df", size = 10061204, upload-time = "2026-02-13T13:27:00.152Z" }, - { url = "https://files.pythonhosted.org/packages/2a/d7/493e1607d8dfe48288d8a768a2adc38ee27ef50e57f0af41ff273987cda0/ty-0.0.17-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c20423b8744b484f93e7bf2ef8a9724bca2657873593f9f41d08bd9f83444c9", size = 10013116, upload-time = "2026-02-13T13:26:34.543Z" }, - { url = "https://files.pythonhosted.org/packages/75/ce/744b15279a11ac7138832e3a55595706b4a8a209c9f878e3ab8e571d9032/ty-0.0.17-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:488bce1a9bea80b851a97cd34c4d2ffcd69593d6c3f54a72ae02e5c6e47f3d0c", size = 11069750, upload-time = "2026-02-13T13:26:48.638Z" }, - { url = "https://files.pythonhosted.org/packages/f2/be/1133c91f15a0e00d466c24f80df486d630d95d1b2af63296941f7473812f/ty-0.0.17-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8df66b91ec84239420985ec215e7f7549bfda2ac036a3b3c065f119d1c06825a", size = 10870862, upload-time = "2026-02-13T13:26:54.715Z" }, { url = "https://files.pythonhosted.org/packages/3e/4a/a2ed209ef215b62b2d3246e07e833081e07d913adf7e0448fc204be443d6/ty-0.0.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:002139e807c53002790dfefe6e2f45ab0e04012e76db3d7c8286f96ec121af8f", size = 10628118, upload-time = "2026-02-13T13:26:45.439Z" }, { url = "https://files.pythonhosted.org/packages/b3/0c/87476004cb5228e9719b98afffad82c3ef1f84334bde8527bcacba7b18cb/ty-0.0.17-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6c4e01f05ce82e5d489ab3900ca0899a56c4ccb52659453780c83e5b19e2b64c", size = 10038185, upload-time = "2026-02-13T13:27:02.693Z" }, - { url = "https://files.pythonhosted.org/packages/46/4b/98f0b3ba9aef53c1f0305519536967a4aa793a69ed72677b0a625c5313ac/ty-0.0.17-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2b226dd1e99c0d2152d218c7e440150d1a47ce3c431871f0efa073bbf899e881", size = 10047644, upload-time = "2026-02-13T13:27:05.474Z" }, { url = "https://files.pythonhosted.org/packages/7c/79/e2a606bd8852383ba9abfdd578f4a227bd18504145381a10a5f886b4e751/ty-0.0.17-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c04e196809ff570559054d3e011425fd7c04161529eb551b3625654e5f2434cb", size = 10718344, upload-time = "2026-02-13T13:26:51.66Z" }, ] [[package]] name = "typeguard" -version = "4.5.2" +version = "4.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/1c/dfba5c4633cafc4c701f237d2ba63b416805047fd6d96aab4cfc40969f98/typeguard-4.5.2.tar.gz", hash = "sha256:5a16dcac23502039299c97c8941651bc33d7ea8cc4b2f7d6bbb1b528f6eea423", size = 80240, upload-time = "2026-05-14T12:59:40.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/e8/66e25efcc18542d58706ce4e50415710593721aae26e794ab1dec34fb66f/typeguard-4.5.1.tar.gz", hash = "sha256:f6f8ecbbc819c9bc749983cc67c02391e16a9b43b8b27f15dc70ed7c4a007274", size = 80121, upload-time = "2026-02-19T16:09:03.392Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/29/74eeb4d3f3ae61ca096b018ad486b3b3c74b17bec09ab4edab721cbefec3/typeguard-4.5.2-py3-none-any.whl", hash = "sha256:fcf9de18bd945cdb4c7b996e12b4c51ce83f92f191314a6d7cf1739586ec98cf", size = 36748, upload-time = "2026-05-14T12:59:39.473Z" }, + { url = "https://files.pythonhosted.org/packages/91/88/b55b3117287a8540b76dbdd87733808d4d01c8067a3b339408c250bb3600/typeguard-4.5.1-py3-none-any.whl", hash = "sha256:44d2bf329d49a244110a090b55f5f91aa82d9a9834ebfd30bcc73651e4a8cc40", size = 36745, upload-time = "2026-02-19T16:09:01.6Z" }, ] [[package]] name = "typer" -version = "0.25.1" +version = "0.24.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -10979,9 +10369,9 @@ dependencies = [ { name = "rich", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "shellingham", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", size = 58409, upload-time = "2026-04-30T19:32:18.271Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, ] [[package]] @@ -11006,15 +10396,15 @@ s3 = [ [[package]] name = "types-aiobotocore" -version = "3.7.0" +version = "3.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore-stubs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(python_full_version < '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/e8/ef1fcb876937dbdddc0f01b5df4ed53f33b166a6367d80a9014d5e5f091d/types_aiobotocore-3.7.0.tar.gz", hash = "sha256:fe35de52c12e5fdb89ca60b3989766e7fe827e3d2e95fcf4583e91581945205c", size = 87992, upload-time = "2026-05-10T03:19:32.353Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/93/e22753dc6b941093f19f0bfe87af5424e00310eaf52dd7d0d8306a6fe094/types_aiobotocore-3.3.0.tar.gz", hash = "sha256:c754c2888631d56c370cab4d2108da2bfd3afe80049303fb7132004ead3b21d6", size = 86908, upload-time = "2026-03-19T02:35:49.176Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/68/0cdfd7df415ee3e769c8e8f9bd8013c64c88cdd7306f72453a02123c58f9/types_aiobotocore-3.7.0-py3-none-any.whl", hash = "sha256:ff4139b3eae22d242b6b39ba56048344b2b86f67daeeca4680da1a6e191681fd", size = 54804, upload-time = "2026-05-10T03:19:29.487Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/53a786a82bde6307fd79059357c1d2f510667019d78dd71d8787c49bec7f/types_aiobotocore-3.3.0-py3-none-any.whl", hash = "sha256:017e9666d5cba2c26134256ad5e4efb320a68352358b9f3257b4e2aae3fb4c18", size = 54364, upload-time = "2026-03-19T02:35:45.567Z" }, ] [[package]] @@ -11031,49 +10421,49 @@ wheels = [ [[package]] name = "types-awscrt" -version = "0.34.1" +version = "0.31.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/59/44409a8fc06b444ab1a6f71dcb29d49a6e17e02424345eb51b051bebb345/types_awscrt-0.34.1.tar.gz", hash = "sha256:559aa04250f6a419a617dfb788f3e10903aaf74700ef23e521b64a411b83b803", size = 19062, upload-time = "2026-06-05T04:40:10.689Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/26/0aa563e229c269c528a3b8c709fc671ac2a5c564732fab0852ac6ee006cf/types_awscrt-0.31.3.tar.gz", hash = "sha256:09d3eaf00231e0f47e101bd9867e430873bc57040050e2a3bd8305cb4fc30865", size = 18178, upload-time = "2026-03-08T02:31:14.569Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/b1/214b12162b452ed6acd230065e6c587cde6b96871e3ce6d653f40888f8df/types_awscrt-0.34.1-py3-none-any.whl", hash = "sha256:20c752b6031544d8f694803c35174aee129f1be5ddf886ae46d22f7ffd9b7d75", size = 45688, upload-time = "2026-06-05T04:40:09.198Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e5/47a573bbbd0a790f8f9fe452f7188ea72b212d21c9be57d5fc0cbc442075/types_awscrt-0.31.3-py3-none-any.whl", hash = "sha256:e5ce65a00a2ab4f35eacc1e3d700d792338d56e4823ee7b4dbe017f94cfc4458", size = 43340, upload-time = "2026-03-08T02:31:13.38Z" }, ] [[package]] name = "types-docker" -version = "7.1.0.20260518" +version = "7.1.0.20260328" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-paramiko", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "types-requests", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "urllib3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/71/ee4bd2b713f0b3b0cecc48fd13952b244f187c3b68cfa0408360f102fde8/types_docker-7.1.0.20260518.tar.gz", hash = "sha256:d194c4b82a4110fc58c84af05a5d9de6d3e54f94357ff745d01b5dca12c8eaaa", size = 33868, upload-time = "2026-05-18T06:08:19.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/de/5f13b22eca604e58af908fbef60f4704a28bcc87ca1d9241d5b8bd433c85/types_docker-7.1.0.20260328.tar.gz", hash = "sha256:6e1a614685bc494580226891da1d01e0cfca6bd00b2761d8239ef09806b2154b", size = 32930, upload-time = "2026-03-28T04:08:02.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/1d/1d174b6f94afe0de50189de0a9dfd4531d2f8170e6dd9ef68ab616aa770b/types_docker-7.1.0.20260518-py3-none-any.whl", hash = "sha256:59893937816bfe40eb2915c84b31c3131107537500287c47d4a10dd7a9d59deb", size = 48183, upload-time = "2026-05-18T06:08:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/91/64/cb764366d6d76495a0ffbda4bdedc5663d585215d0dd8ac808ed6484b48e/types_docker-7.1.0.20260328-py3-none-any.whl", hash = "sha256:3fb95d3ad63fae06d9d5cb18a0394252453b7c06d843bed567d634aa8ede3ebc", size = 47466, upload-time = "2026-03-28T04:08:01.519Z" }, ] [[package]] name = "types-paramiko" -version = "4.0.0.20260518" +version = "4.0.0.20260322" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/b6/4cdb11fb6006be6309844dc5f88b6efef3f5ea5352ade42a1e9308570e28/types_paramiko-4.0.0.20260518.tar.gz", hash = "sha256:286f6830945cba63797eedf375ed87138d93198121253afe66c5d6dbcf91318d", size = 29193, upload-time = "2026-05-18T06:06:36.776Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/cc/b83f1c085cc2c4d85f4ba2f799d1b18840b768d7b1a7dfb7d5cc5470fbc9/types_paramiko-4.0.0.20260322.tar.gz", hash = "sha256:dfcb13d8cf52499a198ced552b78fa685369a376b143abfb90cd49f465e383a0", size = 29040, upload-time = "2026-03-22T04:08:47.815Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/a2/1a54b77758c9c175526bd0448de353f0563e71ba1ddc8bd4ac0c835deafd/types_paramiko-4.0.0.20260518-py3-none-any.whl", hash = "sha256:0ffaf1a6eb796833a49653cba4c7be13af51c8269d75234972d6239763dda270", size = 38791, upload-time = "2026-05-18T06:06:35.771Z" }, + { url = "https://files.pythonhosted.org/packages/d3/92/10415430e8035fe0155582757d9829784202bb198ed84fe9afa5e59d5263/types_paramiko-4.0.0.20260322-py3-none-any.whl", hash = "sha256:c585bcf81b5d2fc722279763d50eca8095777ee949af8706900e9f8411af979b", size = 38809, upload-time = "2026-03-22T04:08:46.622Z" }, ] [[package]] name = "types-requests" -version = "2.33.0.20260518" +version = "2.33.0.20260327" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "urllib3", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/01/c5a19253fe1ac159159ddf9a3a07cec8bb5e486ec4d9002ad2821da0e5d2/types_requests-2.33.0.20260518.tar.gz", hash = "sha256:df7bd3bfe0ca8402dfb841e7d9be714bb5578203283d66d7dc4ef69343449a5e", size = 24752, upload-time = "2026-05-18T06:07:37.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/5f/2e3dbae6e21be6ae026563bad96cbf76602d73aa85ea09f13419ddbdabb4/types_requests-2.33.0.20260327.tar.gz", hash = "sha256:f4f74f0b44f059e3db420ff17bd1966e3587cdd34062fe38a23cda97868f8dd8", size = 23804, upload-time = "2026-03-27T04:23:38.737Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/bc/b139710a3b6018f7fb2b9508b35c8af564e61bf2bf4fa619d088f3e16f85/types_requests-2.33.0.20260518-py3-none-any.whl", hash = "sha256:626d697d1adaaff76e2044dc8c5c051d8f21abc157bdfe204a75558076fe0bf0", size = 21391, upload-time = "2026-05-18T06:07:37.044Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/951e733616c92cb96b57554746d2f65f4464d080cc2cc093605f897aba89/types_requests-2.33.0.20260327-py3-none-any.whl", hash = "sha256:fde0712be6d7c9a4d490042d6323115baf872d9a71a22900809d0432de15776e", size = 20737, upload-time = "2026-03-27T04:23:37.813Z" }, ] [[package]] @@ -11135,11 +10525,11 @@ wheels = [ [[package]] name = "tzdata" -version = "2026.2" +version = "2025.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] [[package]] @@ -11153,16 +10543,16 @@ wheels = [ [[package]] name = "uncalled-for" -version = "0.3.2" +version = "0.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/82/345cc927f7fbdae6065e7768759932fcc827fc20b29b45dfbafa2f1f7da4/uncalled_for-0.3.2.tar.gz", hash = "sha256:89f5dbcd71e2b8f47c030b1fa302e6cce2ec795d1ac565eeb6525c5fe55cb8a2", size = 50032, upload-time = "2026-05-06T13:38:25.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/7c/b5b7d8136f872e3f13b0584e576886de0489d7213a12de6bebf29ff6ebfc/uncalled_for-0.2.0.tar.gz", hash = "sha256:b4f8fdbcec328c5a113807d653e041c5094473dd4afa7c34599ace69ccb7e69f", size = 49488, upload-time = "2026-02-27T17:40:58.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/25/2c87754f3a9e692315f7b811244090e68f362979fc8886b3fbd2985a1d8c/uncalled_for-0.3.2-py3-none-any.whl", hash = "sha256:0ff60b142c7d1f8070bde9d42afaa70aedc77dcc10998c227687e9c15713418e", size = 11444, upload-time = "2026-05-06T13:38:24.025Z" }, + { url = "https://files.pythonhosted.org/packages/ff/7f/4320d9ce3be404e6310b915c3629fe27bf1e2f438a1a7a3cb0396e32e9a9/uncalled_for-0.2.0-py3-none-any.whl", hash = "sha256:2c0bd338faff5f930918f79e7eb9ff48290df2cb05fcc0b40a7f334e55d4d85f", size = 11351, upload-time = "2026-02-27T17:40:56.804Z" }, ] [[package]] name = "unsloth" -version = "2025.9.5" +version = "2026.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accelerate", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -11171,26 +10561,31 @@ dependencies = [ { name = "diffusers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "hf-transfer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "nest-asyncio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "peft", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "protobuf", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "psutil", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sentencepiece", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "torch", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "torchvision", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tqdm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "transformers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "triton", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "triton", version = "3.6.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and 'linux' in sys_platform" }, + { name = "triton", version = "3.7.0", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'arm64' and sys_platform == 'darwin' and 'linux' in sys_platform) or (platform_machine == 'aarch64' and sys_platform == 'linux' and 'linux' in sys_platform)" }, { name = "trl", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "typer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tyro", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "unsloth-zoo", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "wheel", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "xformers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "xformers", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and 'linux' in sys_platform" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/b5/5eb5da36873df1544eaf38522f078db6d1ae1c763f5c2231a006decaf897/unsloth-2025.9.5.tar.gz", hash = "sha256:7863edb453f265ebaa7a0ee7750a6540dec1eaeea87025eabba97d6138ea14df", size = 269444, upload-time = "2025-09-15T11:07:50.953Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/4d/e7815dc6a611b93d569987cbca1b5c5e656b7d67c479e76c969bd3750b18/unsloth-2026.6.3.tar.gz", hash = "sha256:04134610ad00aa358600f36148f57659275b5db677c2806844c4275f9b12a626", size = 77691885, upload-time = "2026-06-11T16:29:35.857Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/78/5fa313bae3ca270f784b46ecff9feec8fceb074bd2664c60c76bd647fb87/unsloth-2025.9.5-py3-none-any.whl", hash = "sha256:7d920353ed1eed28c2ca0676091b9e21d562c06cae758b304e285be97d463e37", size = 309994, upload-time = "2025-09-15T11:07:47.846Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/e03a4f7b245f343793e71882805192b3d8ba57dca2918b9fb9636ac62336/unsloth-2026.6.3-py3-none-any.whl", hash = "sha256:d3d66241c70e5c4620292a6b3e223e0df54c91bdf869d254b21c025f82f9e8a6", size = 73204248, upload-time = "2026-06-11T16:29:31.294Z" }, ] [package.optional-dependencies] @@ -11200,16 +10595,21 @@ huggingface = [ { name = "diffusers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "hf-transfer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "nest-asyncio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "peft", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "protobuf", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "psutil", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "pyyaml", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "sentence-transformers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sentencepiece", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "torchvision", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tqdm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "transformers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "trl", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "typer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tyro", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "unsloth-zoo", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "wheel", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -11217,36 +10617,41 @@ huggingface = [ [[package]] name = "unsloth-zoo" -version = "2025.9.12" +version = "2026.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "accelerate", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "cut-cross-entropy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "accelerate", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "cut-cross-entropy", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "datasets", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "filelock", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "hf-transfer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "mlx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "mlx-lm", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "mlx-vlm", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, { name = "msgspec", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "packaging", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "peft", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "peft", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "pillow", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "protobuf", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "psutil", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "regex", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "sentencepiece", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "torch", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "torchao", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "torch", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "torchao", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "tqdm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "transformers", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "triton", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "trl", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "triton", version = "3.6.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and 'linux' in sys_platform" }, + { name = "triton", version = "3.7.0", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'arm64' and sys_platform == 'darwin' and 'linux' in sys_platform) or (platform_machine == 'aarch64' and sys_platform == 'linux' and 'linux' in sys_platform)" }, + { name = "trl", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "tyro", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "tyro", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "wheel", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/a5/3c2f8cd8ade5d6c1ad3c686bf0be109904e45e701e0ab7561c20ac713826/unsloth_zoo-2025.9.12.tar.gz", hash = "sha256:9a9ca709c739d998cb2b79a2dee92b169375ee232ab0cfe5ed47c8d531e04d9a", size = 227231, upload-time = "2025-09-26T15:24:04.67Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/5c/da6dc3404fb873a512d8b171d2268b573f06242c8739b4bd8f281d168a00/unsloth_zoo-2026.6.3.tar.gz", hash = "sha256:f9d5eeac8b07b8fd5c76f09daff2f657e3a51ca1f663198b646905ae321c4171", size = 914836, upload-time = "2026-06-11T16:16:28.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/37/ca3503aa67effb62f4ab85c7b5574f3414a6909d5b8bc1ff31b1d3801f1a/unsloth_zoo-2025.9.12-py3-none-any.whl", hash = "sha256:cc611b20bb29ea81312dd45e07a537fa2099b0b18a20492d9666641d60833fab", size = 247744, upload-time = "2025-09-26T15:24:02.52Z" }, + { url = "https://files.pythonhosted.org/packages/fe/85/bd76c95a8c96c555c99276fc3cf0f9617e06e700bda41ceeabf2dc1f885c/unsloth_zoo-2026.6.3-py3-none-any.whl", hash = "sha256:7fab997265764eea7a55952a40883760ed281a6e8c7f33f815d07975ee1aa2e9", size = 1004415, upload-time = "2026-06-11T16:16:27.09Z" }, ] [[package]] @@ -11269,61 +10674,31 @@ wheels = [ [[package]] name = "uuid-utils" -version = "0.16.0" +version = "0.14.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/a1/822ceef22d1c139cffebe4b1b660cfaa10253d5c770aa2598dc8e9497593/uuid_utils-0.16.0.tar.gz", hash = "sha256:d6902d4375dfba4c9902c736bb82d3c040417b67f7d0fa48910ddfdb1ac95de7", size = 42596, upload-time = "2026-05-19T07:44:23.28Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/24/24/0e18177e2fbb0b9f54f90fd48fe3302dfda731e22ad650d6e6f8f4b3d3d3/uuid_utils-0.16.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:04af9966ecd82b78eeba5725e29aa1e86fb8eb84b5443dd6a9935f9fadb6678e", size = 565929, upload-time = "2026-05-19T07:44:06.496Z" }, - { url = "https://files.pythonhosted.org/packages/69/2a/47ee18b294af59754ef5acfa96eb027137c98cef7521199b6f70be705de4/uuid_utils-0.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f504efeb20ffd9571621658f7c8093c646d33150406d5742e49ff7cd861615", size = 328059, upload-time = "2026-05-19T07:45:30.533Z" }, - { url = "https://files.pythonhosted.org/packages/89/7c/ed6d8bb48eeecaed6722af1187d722c5243334be750419d10d5f05dffeb2/uuid_utils-0.16.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57d85f48535dc541060f6b82f277cbcd12b78c04008ccc1039546cfcec027327", size = 334759, upload-time = "2026-05-19T07:45:07.715Z" }, - { url = "https://files.pythonhosted.org/packages/ff/33/371bddf9fd47e045c375df9668eea0d96ce9201ab6a03985b0155498e376/uuid_utils-0.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39453f1ebf4398fbeb71607f3437e2ac469c9e38b5921755c1e17ad0158a8907", size = 448927, upload-time = "2026-05-19T07:45:11.464Z" }, - { url = "https://files.pythonhosted.org/packages/dc/f1/b201d5ee005d4987fc072714fcb9f6e75303520cf19d4deec0b4df44bf40/uuid_utils-0.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50361aca5c2a770728a6343df85109fe57f89ac026827f34fe0153563cdc9ce7", size = 327178, upload-time = "2026-05-19T07:44:02.255Z" }, - { url = "https://files.pythonhosted.org/packages/2c/19/25db019727d14630c75c2a75a8ea66dd712bb468adcf410bac8d01ff19fd/uuid_utils-0.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ceef237cf8467fddbf6d8466cc1f6e2c04605ec919046ef5eba10a895b559fcf", size = 504686, upload-time = "2026-05-19T07:43:46.43Z" }, - { url = "https://files.pythonhosted.org/packages/5d/93/c000cd42ebfdd37cc74981ed31c979a1270156572bdebab8b5d61460e750/uuid_utils-0.16.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:24e6fa0d0ade7a9ad60a3c296022474983243df5b4e863babb4828a85ef2e52c", size = 610102, upload-time = "2026-05-19T07:45:53.765Z" }, - { url = "https://files.pythonhosted.org/packages/f1/49/b6a688648368a9cc0137e183657956853a91dc06ef73deda27290d586155/uuid_utils-0.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2e2f369dd734050fe96ae4905c58779b09276d47d5e9a0e5cd33ec7982784341", size = 532255, upload-time = "2026-05-19T07:45:16.936Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4c/b4cf43a5d22bcdb91727acdf54be0d78e83e595b73c5a9a8a4291875f059/uuid_utils-0.16.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:727fae3f0682191ec9c8ce1cd0f71e81b471a2e26b7c5fd66712fc0f11640aa0", size = 562183, upload-time = "2026-05-19T07:45:02.683Z" }, - { url = "https://files.pythonhosted.org/packages/de/43/2dc6c7401c8fab86e46b0b33ada6dcfde949b2fd48877ba6f880862be80e/uuid_utils-0.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9152bff801ec2ccf630df06d67389090a2c612dea87fbf9a887ab4b222929f6f", size = 326171, upload-time = "2026-05-19T07:45:25.186Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f5/48f11fb91f36453611ca148bc441436f279870b1ec6b576dc5167fb6e680/uuid_utils-0.16.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:06fc7db470c37e5c1ab3fd2cd159697d6f8b279d7d23b5b96bd418b115f8caa9", size = 332222, upload-time = "2026-05-19T07:45:09.036Z" }, - { url = "https://files.pythonhosted.org/packages/30/cb/b2b49528521e4a097f129e8bf7850a26f00af46afba778832cf3458a5c00/uuid_utils-0.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e1a1f57fe3631e164dad27b24aa81267810e20575f705af3b0fa734f3a21247", size = 444801, upload-time = "2026-05-19T07:45:37.517Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b3/a28d9c6f7c701dfe01c8020b30e33899a28eb9e4d056b07e7388f50ebf67/uuid_utils-0.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ee392fe59808a731b7b6bf4d453fb6e833774921331cceae5f254d1e9c5b97d", size = 325594, upload-time = "2026-05-19T07:44:44.682Z" }, - { url = "https://files.pythonhosted.org/packages/ed/57/fb19b7951f66a46e03bd1943a61ee9d59c83e994e56e8c97d79aff1f0e47/uuid_utils-0.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bbb92feb4db08cd76e27b4d3b1a82bfde708447317150c614eb9f761a43b387e", size = 502115, upload-time = "2026-05-19T07:43:38.756Z" }, - { url = "https://files.pythonhosted.org/packages/2f/8e/9a129c469b7b77afb62da5c6b7e92591073b845bd0c3108c0d0aa65389fb/uuid_utils-0.16.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c3c5afaaa68b1d6393d653e9fc93a2fde9da1681da01f74b4593f41d31fb5f1", size = 607433, upload-time = "2026-05-19T07:44:11.675Z" }, - { url = "https://files.pythonhosted.org/packages/95/bf/68e60ea053ca30f35df877b96001331398140d5c4983561affa1350331b1/uuid_utils-0.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41a67e546d9adf11c4e4cb5c8e81f000f8b1f000c17912ced089b499855719a5", size = 530645, upload-time = "2026-05-19T07:45:49.278Z" }, - { url = "https://files.pythonhosted.org/packages/60/9b/74c1f47a9b4f138a254e51528e5ffaeba6bf99ecead9f0c4b6fccccfbfcb/uuid_utils-0.16.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d34cf9681e8892fad2a63e393068e544505408748cd8bf0c3517d753a01528d4", size = 563166, upload-time = "2026-05-19T07:44:10.494Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5e/e0323d54321166639eb2be5e8a464f5cb0fc04d72d91f3e78944bb6a1da8/uuid_utils-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed45fb8732d216426227096b55accbb87cba57febc86a044d90780b090eb99d0", size = 326328, upload-time = "2026-05-19T07:45:31.901Z" }, - { url = "https://files.pythonhosted.org/packages/f0/a3/046f6cb958467c3bf4a163a8a53b178b64a62e21ed8ad5b2c1dacb3a2cfc/uuid_utils-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b617a334bb01ef2ff8c22900f5a14125eb9063f602131494cc9dc59519beaa5b", size = 332322, upload-time = "2026-05-19T07:43:41.284Z" }, - { url = "https://files.pythonhosted.org/packages/67/80/01914e3949744db7acd0006885e5542fbebb6e39114857d007d29b3265c2/uuid_utils-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a750d8aeb8ae880aa9a2529606bde0e994bcc7448730c953107f357a28e6102e", size = 445787, upload-time = "2026-05-19T07:45:36.102Z" }, - { url = "https://files.pythonhosted.org/packages/14/ef/f6908f41279f205d70c8a0d5dcb25dd6802741d7f88e3f0123453c3584d3/uuid_utils-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a250e111903c4368745fce5ac2aa607bd477c62d3307e45347338fdb64b38e0", size = 324678, upload-time = "2026-05-19T07:45:12.77Z" }, - { url = "https://files.pythonhosted.org/packages/e6/31/3b5c60172b8c57bf4ca485484b8e4edef550ca324f9287f1183be97422e2/uuid_utils-0.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:420aa3ca403cedb73490b6ea3aeefeea7e0455f5ce60bbf856390ee872ae3306", size = 502456, upload-time = "2026-05-19T07:45:00.821Z" }, - { url = "https://files.pythonhosted.org/packages/88/bf/3da8d497af80fd51d8bf85551c77ede67f07825924ec5987bf9b6031014a/uuid_utils-0.16.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b8a9a7b1065a12d40f2cc25b7d705ab34954cc57095034367bca39ebcf4a876b", size = 607727, upload-time = "2026-05-19T07:44:30.058Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5f/af955feae69cce7fd2121ca3f790ff4b85ad2e17b2149546f50753e1a047/uuid_utils-0.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c8083284488b84ad178e74add64cfd1e74e8be5e30821e5acbc5019281c658b0", size = 529986, upload-time = "2026-05-19T07:45:57.85Z" }, - { url = "https://files.pythonhosted.org/packages/10/cf/3fec757e51bef10eb41ae8075f5442c60e85ff456b42d16a3063f5dc6c80/uuid_utils-0.16.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:27a071a899ba46a551d6524dbbc5a98b88be176d0f55ddf72cf71c005326ac10", size = 98683, upload-time = "2026-05-19T07:44:16.369Z" }, - { url = "https://files.pythonhosted.org/packages/21/05/ca6d60705e71fdeaa3431dad94e279a8213c5573cb2925e1aabf3dc0330a/uuid_utils-0.16.0-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:73486b6aa3f755a6c97000f5ea67e7ac78d6df89bf22980789a1e943e24b74f0", size = 564408, upload-time = "2026-05-19T07:44:38.351Z" }, - { url = "https://files.pythonhosted.org/packages/f2/33/a53afeef1a56051551a0f5a801e4bce411dd73c6a8c99bad16902651256d/uuid_utils-0.16.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9346ce6eb1fbd8b03a6b331d66016afcb4edcdff6eac708e21391600529a016a", size = 325762, upload-time = "2026-05-19T07:45:18.261Z" }, - { url = "https://files.pythonhosted.org/packages/72/ca/4462a4f36365d7ee72d41e05e6bcfe127e861b073ab37c25b2c8a518317c/uuid_utils-0.16.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a0fc6eb3fd821466fbab69cf356c6ec2b7327266bbbc740a2eb57c77c4bef965", size = 332359, upload-time = "2026-05-19T07:45:34.886Z" }, - { url = "https://files.pythonhosted.org/packages/c5/67/9d3373fa7c5a746fdecc64e30caf915c29eb632203508d87676f9243ed03/uuid_utils-0.16.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13a797e5e8f0dadc18351a5aa013815ddac25dce6864072a539d510910c95f71", size = 445483, upload-time = "2026-05-19T07:44:49.598Z" }, - { url = "https://files.pythonhosted.org/packages/57/08/ce01aa6d897fc7f875844fe58cad0a542c8ebf089d9242b654b56260ecb8/uuid_utils-0.16.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57c3583b1f1c00a94f59726a5e2b988fa209221143919a1af5c2fc24e318fc98", size = 326281, upload-time = "2026-05-19T07:44:59.677Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9b/c1ed447328b32229cca38ac4c62d309eab006e5e9c4020e2056a175bc607/uuid_utils-0.16.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:91db59bad97ed2b9d2c6ed25082fe9762b2c422e694fe06786b28cf4e776ac4c", size = 502088, upload-time = "2026-05-19T07:44:09.208Z" }, - { url = "https://files.pythonhosted.org/packages/c1/e0/8442f4efe7bde72f0b4ae5f675d0c7fbe209ad0b54718b8ddf43c46c6fae/uuid_utils-0.16.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:41985e342a30e76366a8becc60bbdb07d72cd1b86ec657b1f31654e9fb1baada", size = 607631, upload-time = "2026-05-19T07:44:19.384Z" }, - { url = "https://files.pythonhosted.org/packages/cc/f7/1bcfdb9d539bd42736dd6076470a42fbb5db23f79712c0a06aa0a3752f7b/uuid_utils-0.16.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26fe23ab60f05de4ad70aaa5b6a4c2a7bbd43055e3dd6f6b31efba0532ac9c71", size = 530971, upload-time = "2026-05-19T07:45:06.348Z" }, - { url = "https://files.pythonhosted.org/packages/d3/89/655408a5485c56bf2c4561eb85f5bca119b1f4020370b4daaeb8d13e46fb/uuid_utils-0.16.0-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4e35e9a986e86806a61288fac3afbb51317f2580929feefd1661891ffd7b8c24", size = 569295, upload-time = "2026-05-19T07:45:22.325Z" }, - { url = "https://files.pythonhosted.org/packages/dd/75/4267ab8baa1e6a8ad7c262e204484b44df0fde0920025ea9b43c2b869726/uuid_utils-0.16.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4fd5c7936a876ba2606ba124603b559a5c2cea458c59b9c31677e6acc3c53cc", size = 329619, upload-time = "2026-05-19T07:44:12.928Z" }, - { url = "https://files.pythonhosted.org/packages/15/77/c794102831e331564f651099cac55006694677938d70f1033b35da451a89/uuid_utils-0.16.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:130f7452c1b87b7c16d0bdc1f32a1de531ae4cc4220ed4e691402bbcfc39e0a9", size = 335121, upload-time = "2026-05-19T07:45:47.974Z" }, - { url = "https://files.pythonhosted.org/packages/8b/3e/458a0a2da75c596b151182a6c7550c6c3d30f479e14e40f69c0336579e59/uuid_utils-0.16.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5ee0bbbd4ca3968422cd8308f0072520bc73dc760cb26c6fa75ca1aca14d210", size = 449631, upload-time = "2026-05-19T07:45:50.645Z" }, - { url = "https://files.pythonhosted.org/packages/ed/15/dd1fab6f7fcd15f2c331d0c1f0f516bb1113a640216460f82be53db3dcf8/uuid_utils-0.16.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0824a31898ef46a9d84d748c3abe27cdb615ac3773c53cc1f84fc8e66dc7c4", size = 328418, upload-time = "2026-05-19T07:44:52.38Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/7b/d1/38a573f0c631c062cf42fa1f5d021d4dd3c31fb23e4376e4b56b0c9fbbed/uuid_utils-0.14.1.tar.gz", hash = "sha256:9bfc95f64af80ccf129c604fb6b8ca66c6f256451e32bc4570f760e4309c9b69", size = 22195, upload-time = "2026-02-20T22:50:38.833Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/b7/add4363039a34506a58457d96d4aa2126061df3a143eb4d042aedd6a2e76/uuid_utils-0.14.1-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:93a3b5dc798a54a1feb693f2d1cb4cf08258c32ff05ae4929b5f0a2ca624a4f0", size = 604679, upload-time = "2026-02-20T22:50:27.469Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ed/b6d6fd52a6636d7c3eddf97d68da50910bf17cd5ac221992506fb56cf12e/uuid_utils-0.14.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b56b0cacd81583834820588378e432b0696186683b813058b707aedc1e16c4b1", size = 344714, upload-time = "2026-02-20T22:50:42.642Z" }, + { url = "https://files.pythonhosted.org/packages/54/6e/dcd3fa031320921a12ec7b4672dea3bd1dd90ddffa363a91831ba834d559/uuid_utils-0.14.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6743ba194de3910b5feb1a62590cd2587e33a73ab6af8a01b642ceb5055862", size = 345699, upload-time = "2026-02-20T22:50:46.87Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d9/3d2eb98af94b8dfffc82b6a33b4dfc87b0a5de2c68a28f6dde0db1f8681b/uuid_utils-0.14.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c915d53f22945e55fe0d3d3b0b87fd965a57f5fd15666fd92d6593a73b1dd297", size = 521836, upload-time = "2026-02-20T22:50:23.057Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c2/d37a7b2e41f153519367d4db01f0526e0d4b06f1a4a87f1c5dfca5d70a8b/uuid_utils-0.14.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:bec8f8ef627af86abf8298e7ec50926627e29b34fa907fcfbedb45aaa72bca43", size = 551407, upload-time = "2026-02-20T22:50:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/6c64bdbf71f58ccde7919e00491812556f446a5291573af92c49a5e9aaef/uuid_utils-0.14.1-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b197cd5424cf89fb019ca7f53641d05bfe34b1879614bed111c9c313b5574cd8", size = 591617, upload-time = "2026-02-20T22:50:24.532Z" }, + { url = "https://files.pythonhosted.org/packages/85/89/d91862b544c695cd58855efe3201f83894ed82fffe34500774238ab8eba7/uuid_utils-0.14.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b5d2ad28063d422ccc2c28d46471d47b61a58de885d35113a8f18cb547e25bf", size = 337678, upload-time = "2026-02-20T22:50:39.768Z" }, + { url = "https://files.pythonhosted.org/packages/77/a1/0857f64d53a90321e6a46a3d4cc394f50e1366132dcd2ae147f9326ca98b/uuid_utils-0.14.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dbe718765f70f5b7f9b7f66b6a937802941b1cc56bcf642ce0274169741e01", size = 338902, upload-time = "2026-02-20T22:50:33.927Z" }, ] [[package]] name = "uvicorn" -version = "0.49.0" +version = "0.42.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "h11", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/1f/fa18009dea8469069cca78a4e877a008ab78f08b064bfc9ab891579077ff/uvicorn-0.49.0.tar.gz", hash = "sha256:ebf4271aa580d9de97f93192d4595176df6e91f9aae919ca73e4fc07df1e66a3", size = 91284, upload-time = "2026-06-03T22:01:30.448Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/ad/4a96c425be6fb67e0621e62d86c402b4a17ab2be7f7c055d9bd2f638b9e2/uvicorn-0.42.0.tar.gz", hash = "sha256:9b1f190ce15a2dd22e7758651d9b6d12df09a13d51ba5bf4fc33c383a48e1775", size = 85393, upload-time = "2026-03-16T06:19:50.077Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/fa/e1388bbcf24ef3274f45c0c1c7b501fd14971037c1b6ee23610553307497/uvicorn-0.49.0-py3-none-any.whl", hash = "sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f", size = 71376, upload-time = "2026-06-03T22:01:29.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/89/f8827ccff89c1586027a105e5630ff6139a64da2515e24dafe860bd9ae4d/uvicorn-0.42.0-py3-none-any.whl", hash = "sha256:96c30f5c7abe6f74ae8900a70e92b85ad6613b745d4879eb9b16ccad15645359", size = 68830, upload-time = "2026-03-16T06:19:48.325Z" }, ] [package.optional-dependencies] @@ -11370,7 +10745,7 @@ wheels = [ [[package]] name = "virtualenv" -version = "21.4.2" +version = "21.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -11378,23 +10753,23 @@ dependencies = [ { name = "platformdirs", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "python-discovery", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0d/4e93c8e6d1001a75763f87d8f5ecda8ebc7f4aa2153dddfaf4ae8892821a/virtualenv-21.4.2.tar.gz", hash = "sha256:38e6ee0a555615c0ea9da2ac7e9998fe8dc3b911dd33ad8eaad2020957653b0c", size = 7613326, upload-time = "2026-05-31T17:01:22.827Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/92/58199fe10049f9703c2666e809c4f686c54ef0a68b0f6afccf518c0b1eb9/virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098", size = 5840618, upload-time = "2026-03-09T17:24:38.013Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/c4/557dc082be035381b85fdb2b74e21d3d21b57750b74f2b47a32f3a639ff9/virtualenv-21.4.2-py3-none-any.whl", hash = "sha256:854210ca524a1a4d0d744734f4acbc721c3ffe163b85bbf5d56d14d5ae2f0fae", size = 7594079, upload-time = "2026-05-31T17:01:20.735Z" }, + { url = "https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f", size = 5825084, upload-time = "2026-03-09T17:24:35.378Z" }, ] [[package]] name = "wasmtime" -version = "45.0.0" +version = "43.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b1/ff/db9cfc61d988bc15303134bb174176a29839976876dfd18c3a12548ad291/wasmtime-45.0.0.tar.gz", hash = "sha256:2ad4bf7ca286ceea35c1e420d10b368d7f83faf9a5ffde87b4ee334a9b7f55f3", size = 128297, upload-time = "2026-05-26T17:57:39.131Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/0e/967542865d59d9529bab604b9b88f09a92636e69cc4b1d30c5013e854493/wasmtime-43.0.0.tar.gz", hash = "sha256:eb98b8e2bc35d03dd69c9dd095a388044323622526fc94a9406b8efc48ddc259", size = 117449, upload-time = "2026-03-31T19:26:23.663Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/c7/7594da7fa8a3bc5e765733ad57aac9b7b27262c4afa47521bd500e4a4574/wasmtime-45.0.0-py3-none-any.whl", hash = "sha256:6251ee5074a8b8bfaa98e6e99cb5d49d6d0f2320b3265d5aa6c2ee5df5fb4519", size = 8019034, upload-time = "2026-05-26T17:57:20.138Z" }, - { url = "https://files.pythonhosted.org/packages/5b/0b/a81b5daf5adea482ecb68d9615f6a348486ab4d8e980a915d4420e57ee4d/wasmtime-45.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:31d10f25c330cebcfb364e9a357123deeec96c41725ff2bba91b705587f38a93", size = 8255954, upload-time = "2026-05-26T17:57:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8c/e9019a28e908214031310aefd78e4755221d02303190b54b2c85cb69573e/wasmtime-45.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:5d1416ec6da8cd87c29e2e9eb074358c91839c2fff971fe428c8921eaae68e73", size = 9681185, upload-time = "2026-05-26T17:57:26.641Z" }, - { url = "https://files.pythonhosted.org/packages/42/56/ed5f492bd553a31c8e28d621f8256f2c7b1a133b28f73525d96ca355891a/wasmtime-45.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:a499f6ab0eebb70dca83d6a4904b743cd122f322af3abe86af08ad753533d946", size = 8582001, upload-time = "2026-05-26T17:57:28.883Z" }, - { url = "https://files.pythonhosted.org/packages/62/12/9b41740da83f51014b88181c9086de0ed75d736a5329baff7323c4fb6eff/wasmtime-45.0.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:bef65282b7de744106a91da43e4d06ba19d2d587bc54abb83b3e757f0c4fc030", size = 8633462, upload-time = "2026-05-26T17:57:31.423Z" }, - { url = "https://files.pythonhosted.org/packages/ea/63/49d8317706a108d9ed1d4166d0fc710796da1b20e591a98a96575dec367a/wasmtime-45.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a0b6ca14b4628a5d1ffa91ccf2c0f2c58fa171f126ec085d564b09d5795395dd", size = 9712524, upload-time = "2026-05-26T17:57:33.839Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ca/67db17c3f098894be798457ce261816fb67c0c1b80c1a53ed1dfa8ed4ff1/wasmtime-43.0.0-py3-none-any.whl", hash = "sha256:9441349d9346230420ed24d357d6f8330fe7251ac5938bb892147728bbe731d7", size = 6472597, upload-time = "2026-03-31T19:26:06.61Z" }, + { url = "https://files.pythonhosted.org/packages/08/42/d9588fa6dad9a609e5acaa72d1d5b346b2913f87c2e95d0c7ddadf5e919b/wasmtime-43.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5a03c7aa03519df58fed5115ad8093d6deac46386115add715e725448e89ab25", size = 6615055, upload-time = "2026-03-31T19:26:10.506Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/25b27545ad916a169583dbea41a6a03c58fe04c1d05fa39797dc43bd50b9/wasmtime-43.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:341542e87caf1f2ef7ff648a78827fcef5751e3e9be2ee07a1fcf3a04413c213", size = 7819110, upload-time = "2026-03-31T19:26:12.335Z" }, + { url = "https://files.pythonhosted.org/packages/d8/9a/4d8760f827931b5b265b83e52316d40b8e0eb999bb8e2d457c2ae172d5cc/wasmtime-43.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:30b042fd4a05d0f8a320baed53fcb971aff8a3789ed6967f4521f87931ace717", size = 6910375, upload-time = "2026-03-31T19:26:14.207Z" }, + { url = "https://files.pythonhosted.org/packages/ce/19/81c748c089a693b102f9a6239f2558a0ffd55fc721fcdd139361aaede1a1/wasmtime-43.0.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:34ff18384ad62625cb1438fd0266f6c74b4a72ddcb8ba30c60a66be3632db44b", size = 6938286, upload-time = "2026-03-31T19:26:15.898Z" }, + { url = "https://files.pythonhosted.org/packages/0f/fa/c37e77c907567a8802696f9ab839b719ea811cf3d59ffc815cc95d894339/wasmtime-43.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c7025d477d807df30dad07c9318ea747c6cfc99764c7cb2a8e44e75b8c43e3be", size = 7852033, upload-time = "2026-03-31T19:26:17.915Z" }, ] [[package]] @@ -11410,70 +10785,50 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, ] [[package]] name = "watchfiles" -version = "1.2.0" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/5b/f4dfd45323e949984a3a7f9dc31d1cbb049921e7d98253488dda72ccdaa9/watchfiles-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6543cf55d170003296d185c0af981f3e1311564907e1f4e08671fc7693a890a5", size = 394562, upload-time = "2026-05-18T04:30:08.46Z" }, - { url = "https://files.pythonhosted.org/packages/98/d8/19483ef075d601c409bce8bcbb5c0f81a10876fff870400568f08ce484a1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d8c2394a065ca86f5d2910ff263ae67c127e1376ccc4f9fc35c71db879f80a", size = 456611, upload-time = "2026-05-18T04:30:45.723Z" }, - { url = "https://files.pythonhosted.org/packages/b1/6a/cc81fbe7ee42f2f22e661a6e12def7807e01b14b2f39e0ff83fd373fd307/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:772b80df316480d894a0e3165fdd19cf77f5d17f9a787f94029465ad0e3529d1", size = 461379, upload-time = "2026-05-18T04:31:29.292Z" }, - { url = "https://files.pythonhosted.org/packages/45/7d/f60a2b19807b21fe8281f3a8da4f59eef0d5f96825ac4680ba2d4f2ebf91/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d516b3283a758e087841aedb8031549fb41ced08f3db10aa6d2bf32dc042525b", size = 575255, upload-time = "2026-05-18T04:30:40.568Z" }, - { url = "https://files.pythonhosted.org/packages/bd/49/77f5b5e6efbcd57482f74948ebb1b97e5c0046d6b61475042d830c84b3ff/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53b2290c92e0506d102cd448fbc610d87079553f86caa39d67440856a8b8bba5", size = 467052, upload-time = "2026-05-18T04:31:17.942Z" }, - { url = "https://files.pythonhosted.org/packages/ee/5a/73e2959af1b97fd5d556f9a8bdba017be23ceeef731869d5eaa0a753d5a3/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a711b51aec4370d0dcda5b6c09463206f133a5759341d7744b953a7b62e1100e", size = 456858, upload-time = "2026-05-18T04:30:30.182Z" }, - { url = "https://files.pythonhosted.org/packages/50/57/1bc8c27fad7e6c19bddee15d276dbb6ab72480ec01c127afff1673aee417/watchfiles-1.2.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:e2ca07fa7d89195ec0865d3d285666286740bfa83d83e5cee204043a31ecc165", size = 467579, upload-time = "2026-05-18T04:32:15.897Z" }, - { url = "https://files.pythonhosted.org/packages/09/6c/3c2e44edba3553c5e3c3b8c8a2a6dee6b9e12ae2cf4bd2378bebf9dc3038/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0618518f282c4ebff60f5e5b1247b6d91bb8b9f4476947563a1e74acc66f3c6", size = 633253, upload-time = "2026-05-18T04:31:37.123Z" }, - { url = "https://files.pythonhosted.org/packages/30/c2/d8c84a882ab39bbefcc4915ab3e91830b7a7e990c5570b0b69075aba3faf/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d191c054d0715c3c95c99df9b8dbf6fd096d8c1e021e8f212e1bd8bc444ccb5", size = 660713, upload-time = "2026-05-18T04:31:24.62Z" }, - { url = "https://files.pythonhosted.org/packages/5f/8f/6af2ea19065c91d8b0ea3516fdfc8c0d349f407e8e9fbf4e5a17360de8ad/watchfiles-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c", size = 393659, upload-time = "2026-05-18T04:30:50.951Z" }, - { url = "https://files.pythonhosted.org/packages/13/01/b32a967c56fb3e3e5be3db52c3d3b87fa4513aa367d8ed1ad96d42952e5f/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc", size = 453207, upload-time = "2026-05-18T04:31:04.231Z" }, - { url = "https://files.pythonhosted.org/packages/04/98/97557a812180338cb1abd32e1cffcc4588f59b5f23e0cb006b2ba95ba64a/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0", size = 459273, upload-time = "2026-05-18T04:31:50.377Z" }, - { url = "https://files.pythonhosted.org/packages/50/94/3dceea03545d2e5ddfd839f0ddd5e1cecbf1697b5a428d5ba11cef6af95d/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01", size = 570476, upload-time = "2026-05-18T04:31:03.071Z" }, - { url = "https://files.pythonhosted.org/packages/cc/f2/d39a5450c3532092b91f81d274360e613c2371bc874a89c7a1a3c5e8d138/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8", size = 465650, upload-time = "2026-05-18T04:30:12.701Z" }, - { url = "https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5", size = 456398, upload-time = "2026-05-18T04:30:13.784Z" }, - { url = "https://files.pythonhosted.org/packages/0d/64/982ef4a4e5bab5b6e5b6becc8cd5e732f6130a78b855f0abec6439a9a135/watchfiles-1.2.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d", size = 465140, upload-time = "2026-05-18T04:31:52.111Z" }, - { url = "https://files.pythonhosted.org/packages/a0/0c/95282abf4ed680b6096010bcfc30c5fa7a041fc5aa5a2ad17a2cc6c75bba/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c", size = 630259, upload-time = "2026-05-18T04:31:25.676Z" }, - { url = "https://files.pythonhosted.org/packages/30/45/607c1de1530c4bdcf2cf1d1ecc2505ddba5d96bd43ba9f2b0e79876f850f/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906", size = 659859, upload-time = "2026-05-18T04:30:24.333Z" }, - { url = "https://files.pythonhosted.org/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", size = 392842, upload-time = "2026-05-18T04:30:27.051Z" }, - { url = "https://files.pythonhosted.org/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", size = 452989, upload-time = "2026-05-18T04:31:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", size = 458978, upload-time = "2026-05-18T04:30:52.606Z" }, - { url = "https://files.pythonhosted.org/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", size = 571847, upload-time = "2026-05-18T04:31:10.862Z" }, - { url = "https://files.pythonhosted.org/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", size = 465974, upload-time = "2026-05-18T04:30:17.006Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", size = 454782, upload-time = "2026-05-18T04:30:35.656Z" }, - { url = "https://files.pythonhosted.org/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", size = 465182, upload-time = "2026-05-18T04:30:20.846Z" }, - { url = "https://files.pythonhosted.org/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", size = 629841, upload-time = "2026-05-18T04:31:05.397Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", size = 658028, upload-time = "2026-05-18T04:31:48.22Z" }, - { url = "https://files.pythonhosted.org/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", size = 391205, upload-time = "2026-05-18T04:30:25.413Z" }, - { url = "https://files.pythonhosted.org/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", size = 451892, upload-time = "2026-05-18T04:32:14.005Z" }, - { url = "https://files.pythonhosted.org/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", size = 458867, upload-time = "2026-05-18T04:31:22.279Z" }, - { url = "https://files.pythonhosted.org/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", size = 571458, upload-time = "2026-05-18T04:32:11.875Z" }, - { url = "https://files.pythonhosted.org/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", size = 464707, upload-time = "2026-05-18T04:30:43.492Z" }, - { url = "https://files.pythonhosted.org/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", size = 454663, upload-time = "2026-05-18T04:30:16.061Z" }, - { url = "https://files.pythonhosted.org/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", size = 463537, upload-time = "2026-05-18T04:31:44.9Z" }, - { url = "https://files.pythonhosted.org/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", size = 629194, upload-time = "2026-05-18T04:31:14.141Z" }, - { url = "https://files.pythonhosted.org/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", size = 656194, upload-time = "2026-05-18T04:31:47.14Z" }, - { url = "https://files.pythonhosted.org/packages/27/0b/a54103cfd732bb703c7a749222011a0483ef3705948dae3b203158601119/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:094b9b70103d4e963499bdea001ee3c2697b144cd9ae6218a62c0f89ec9e31db", size = 396629, upload-time = "2026-05-18T04:32:03.268Z" }, - { url = "https://files.pythonhosted.org/packages/5e/2c/73f31a3b893886206c3f54d73e8ad8dee58cdb2f69ad2622e0a8a9e07f4e/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0ef001f8c25ad0fa9529f914c1600647ecd0f542d11c19b7894768c67b6acb7", size = 457318, upload-time = "2026-05-18T04:31:01.932Z" }, - { url = "https://files.pythonhosted.org/packages/e9/f9/45d021e4a5cc7b9dd567f7cbb06d3b75f751a690063fb6cc7ec60f4e46b7/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0", size = 457771, upload-time = "2026-05-18T04:30:56.331Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, ] [[package]] name = "wcwidth" -version = "0.8.1" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/b4/51fe890511f0f242d07cb1ebe6a5b6db417262b9d2568b460347c57d95cc/wcwidth-0.8.1.tar.gz", hash = "sha256:faf5b4a5366a72dc49cad48cdf21f52bdf63bdda995178e483ba247ff79089b9", size = 1466072, upload-time = "2026-06-08T05:57:23.146Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/6e/95b0e537de1f4d4301f76f944642c6da50d1511cc7b3d64dc418a66c7509/wcwidth-0.8.1-py3-none-any.whl", hash = "sha256:f453740b1e4a4f3291faa37944c555d71056c4da08d59809b307ef4feba695c8", size = 323092, upload-time = "2026-06-08T05:57:21.413Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, ] [[package]] @@ -11505,41 +10860,44 @@ wheels = [ [[package]] name = "websockets" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, ] [[package]] name = "werkzeug" -version = "3.1.8" +version = "3.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/43/76ded108b296a49f52de6bac5192ca1c4be84e886f9b5c9ba8427d9694fd/werkzeug-3.1.7.tar.gz", hash = "sha256:fb8c01fe6ab13b9b7cdb46892b99b1d66754e1d7ab8e542e865ec13f526b5351", size = 875700, upload-time = "2026-03-24T01:08:07.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b2/0bba9bbb4596d2d2f285a16c2ab04118f6b957d8441566e1abb892e6a6b2/werkzeug-3.1.7-py3-none-any.whl", hash = "sha256:4b314d81163a3e1a169b6a0be2a000a0e204e8873c5de6586f453c55688d422f", size = 226295, upload-time = "2026-03-24T01:08:06.133Z" }, ] [[package]] @@ -11605,8 +10963,8 @@ name = "xformers" version = "0.0.35" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, - { name = "torch", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "numpy", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "torch", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/de/5a/6e27734bd793adc44d0b8d294e67cfacf4ec590572c1aef51d683fc7a791/xformers-0.0.35.tar.gz", hash = "sha256:f7fc183a58e4bf0e2ae339a18fb1b1d4a37854c0f2545b4f360fef001646ab76", size = 4258182, upload-time = "2026-02-20T20:33:05.417Z" } wheels = [ @@ -11615,68 +10973,32 @@ wheels = [ [[package]] name = "xxhash" -version = "3.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/2f/e183a1b407002f5af81822bee18b61cdb94b8670208ef34734d8d2b8ebe9/xxhash-3.7.0.tar.gz", hash = "sha256:6cc4eefbb542a5d6ffd6d70ea9c502957c925e800f998c5630ecc809d6702bae", size = 82022, upload-time = "2026-04-25T11:10:32.553Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/26/4e00c88a6a2c8a759cfb77d2a9a405f901e8aa66e60ef1fd0aeb35edda48/xxhash-3.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea6daa712f4e094a30830cf01e9b47d03b24d05cc9dab8609f0d9a9db8454712", size = 30857, upload-time = "2026-04-25T11:05:49.189Z" }, - { url = "https://files.pythonhosted.org/packages/0e/fd/96f132c08b1e5951c68691d3b9ec351ec2edc028f6a01fcd294f46b9d9f0/xxhash-3.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:363c139bf15e1ac5f136b981d3c077eb551299b1effede7f12faa010b8590a60", size = 213613, upload-time = "2026-04-25T11:05:52.571Z" }, - { url = "https://files.pythonhosted.org/packages/82/89/d4e92b796c5ed052d29ed324dbfc1dc1188e0c4bf64bebbf0f8fc20698df/xxhash-3.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a778b25874cb0f862eaab5986bff4ca49ffb0def7c0a34c237b948b3c6c775b2", size = 236726, upload-time = "2026-04-25T11:05:54.395Z" }, - { url = "https://files.pythonhosted.org/packages/40/f1/81fc4361921dc6e557a9c60cb3712f36d244d06eeeb71cd2f4252ac42678/xxhash-3.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e1860f1e43d40e9d904cf22d93e587ea42e010ebce4160877e46bcab4bc232a", size = 212443, upload-time = "2026-04-25T11:05:56.334Z" }, - { url = "https://files.pythonhosted.org/packages/6a/d0/afeddd4cff50a332f50d4b8a2e8857673153ab0564ef472fcdeb0b5430df/xxhash-3.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9122ad6f867c4a0f5e655f5c3bdf89103852009dbb442a3d23e688b9e699e800", size = 445793, upload-time = "2026-04-25T11:05:58.953Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d0/3c91e4e6a05ca4d7df8e39ec3a75b713609258ec84705ab34be6430826a1/xxhash-3.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7d9110d0c3fb02679972837a033251fd186c529aa62f19c132fc909c74052b8", size = 193937, upload-time = "2026-04-25T11:06:00.546Z" }, - { url = "https://files.pythonhosted.org/packages/4e/3a/a6b0772d9801dd4bea4ca4fd34734d6e9b51a711c8a611a24a79de26a878/xxhash-3.7.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:347a93f2b4ce67ce61959665e32a7447c380f8347e55e100daa23766baacf0e5", size = 285188, upload-time = "2026-04-25T11:06:01.96Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f8/cf8e31fd7282230fe7367cd501a2e75b4b67b222bfc7eacccfc20d2652cb/xxhash-3.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:acbb48679ddf3852c45280c10ff10d52ca2cd1da2e552fb81db1ff786c75d0e4", size = 210966, upload-time = "2026-04-25T11:06:03.453Z" }, - { url = "https://files.pythonhosted.org/packages/cc/f0/fd36cc4a81bf52ee5633275daae2b93dd958aace67fd4f5d466ec83b5f35/xxhash-3.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:fe14c356f8b23ad811dc026077a6d4abccdaa7bce5ca98579605550657b6fcfb", size = 241994, upload-time = "2026-04-25T11:06:05.264Z" }, - { url = "https://files.pythonhosted.org/packages/50/17/a4c865ca22d2da6b1bc7d739bf88cab209533cf52ba06ca9da27c3039bee/xxhash-3.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:693d02c6dc7d1aa0a45921d54cd8c1ff629e09dfdc2238471507af1f7a1c6f04", size = 210917, upload-time = "2026-04-25T11:06:08.853Z" }, - { url = "https://files.pythonhosted.org/packages/49/8b/453b35810d697abac3c96bde3528bece685869227da274eb80a4a4d4a119/xxhash-3.7.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:14bf7a54e43825ec131ee7fe3c60e142e7c2c1e676ad0f93fc893432d15414af", size = 275772, upload-time = "2026-04-25T11:06:10.645Z" }, - { url = "https://files.pythonhosted.org/packages/b5/ad/4eed7eab07fd3ee6678f416190f0413d097ab5d7c1278906bf1e9549d789/xxhash-3.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ae3a39a4d96bdb6f8d154fd7f490c4ad06f0532fcd2bb656052a9a7762cf5d31", size = 414068, upload-time = "2026-04-25T11:06:12.511Z" }, - { url = "https://files.pythonhosted.org/packages/d3/4e/fd6f8a680ba248fdb83054fa71a8bfa3891225200de1708b888ef2c49829/xxhash-3.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1cc07c639e3a77ef1d32987464d3e408565b8a3be57b545d3542b191054d9923", size = 191459, upload-time = "2026-04-25T11:06:14.07Z" }, - { url = "https://files.pythonhosted.org/packages/b9/1b/0c2c933809421ffd9bf42b59315552c143c755db5d9a816b2f1ae273e884/xxhash-3.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5e7ce913b61f35b0c1c839a49ac9c8e75dd8d860150688aed353b0ce1bf409d8", size = 30869, upload-time = "2026-04-25T11:06:21.989Z" }, - { url = "https://files.pythonhosted.org/packages/87/ee/2f9f2ed993e77206d1e66991290a1ebe22e843351ca3ebec8e49e01ba186/xxhash-3.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3e7b689c3bce16699efcf736066f5c6cc4472c3840fe4b22bd8279daf4abdac", size = 212977, upload-time = "2026-04-25T11:06:25.019Z" }, - { url = "https://files.pythonhosted.org/packages/de/60/5a91644615a9e9d4e42c2e9925f1908e3a24e4e691d9de7340d565bea024/xxhash-3.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a6545e6b409e3d5cbafc850fb84c55a1ca26ed15a6b11e3bf07a0e0cd84517c8", size = 236373, upload-time = "2026-04-25T11:06:26.482Z" }, - { url = "https://files.pythonhosted.org/packages/22/c0/f3a9384eaaed9d14d4d062a5d953aa0da489bfe9747877aa994caa87cd0b/xxhash-3.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:31ab1461c77a11461d703c88eb949e132a1c6515933cf675d97ec680f4bd18de", size = 212229, upload-time = "2026-04-25T11:06:28.065Z" }, - { url = "https://files.pythonhosted.org/packages/2e/67/02f07a9fd79726804190f2172c4894c3ed9a4ebccaca05653c84beb58025/xxhash-3.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c4d596b7676f811172687ec567cbafb9e4dea2f9be1bbb4f622410cb7f40f40", size = 445462, upload-time = "2026-04-25T11:06:30.048Z" }, - { url = "https://files.pythonhosted.org/packages/40/37/558f5a90c0672fc9b4402dc25d87ac5b7406616e8969430c9ca4e52ee74d/xxhash-3.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13805f0461cba0a857924e70ff91ae6d52d2598f79a884e788db80532614a4a1", size = 193932, upload-time = "2026-04-25T11:06:31.857Z" }, - { url = "https://files.pythonhosted.org/packages/d5/90/aaa09cd58661d32044dbbad7df55bbe22a623032b810e7ed3b8c569a2a6f/xxhash-3.7.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d398f372496152f1c6933a33566373f8d1b37b98b8c9d608fa6edc0976f23b2", size = 284807, upload-time = "2026-04-25T11:06:33.697Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f3/53df3719ab127a02c174f0c1c74924fcd110866e89c966bc7909cfa8fa84/xxhash-3.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d610aa62cdb7d4d497740741772a24a794903bf3e79eaa51d2e800082abe11e5", size = 210445, upload-time = "2026-04-25T11:06:35.488Z" }, - { url = "https://files.pythonhosted.org/packages/72/33/d219975c0e8b6fa2eb9ccd486fe47e21bf1847985b878dd2fbc3126e0d5c/xxhash-3.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:073c23900a9fbf3d26616c17c830db28af9803677cd5b33aea3224d824111514", size = 241273, upload-time = "2026-04-25T11:06:37.24Z" }, - { url = "https://files.pythonhosted.org/packages/c6/75/5f42a1a4c78717d906a4b6a140c6dbf837ab1f547a54d23c4e2903310936/xxhash-3.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:03f8ff4474ee61c845758ce00711d7087a770d77efb36f7e74a6e867301000b8", size = 210709, upload-time = "2026-04-25T11:06:40.958Z" }, - { url = "https://files.pythonhosted.org/packages/8a/85/237e446c25abced71e9c53d269f2cef5bab8a82b3f88a12e00c5368e7368/xxhash-3.7.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:44fba4a5f1d179b7ddc7b3dc40f56f9209046421679b57025d4d8821b376fd8d", size = 275345, upload-time = "2026-04-25T11:06:42.525Z" }, - { url = "https://files.pythonhosted.org/packages/62/34/c2c26c0a6a9cc739bc2a5f0ae03ba8b87deb12b8bce35f7ac495e790dc6d/xxhash-3.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31e3516a0f829d06ded4a2c0f3c7c5561993256bfa1c493975fb9dc7bfa828a1", size = 414056, upload-time = "2026-04-25T11:06:44.343Z" }, - { url = "https://files.pythonhosted.org/packages/a0/aa/5c58e9bc8071b8afd8dcf297ff362f723c4892168faba149f19904132bf4/xxhash-3.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b59ee2ac81de57771a09ecad09191e840a1d2fae1ef684208320591055768f83", size = 191485, upload-time = "2026-04-25T11:06:46.262Z" }, - { url = "https://files.pythonhosted.org/packages/bf/11/4cc834eb3d79f2f2b3a6ef7324195208bcdfbdcf7534d2b17267aa5f3a8f/xxhash-3.7.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:fddbbb69a6fff4f421e7a0d1fa28f894b20112e9e3fab306af451e2dfd0e459b", size = 29624, upload-time = "2026-04-25T11:06:54.311Z" }, - { url = "https://files.pythonhosted.org/packages/23/83/e97d3e7b635fe73a1dfb1e91f805324dd6d930bb42041cbf18f183bc0b6d/xxhash-3.7.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:54876a4e45101cec2bf8f31a973cda073a23e2e108538dad224ba07f85f22487", size = 30638, upload-time = "2026-04-25T11:06:55.864Z" }, - { url = "https://files.pythonhosted.org/packages/f4/40/d84951d80c35db1f4c40a29a64a8520eea5d56e764c603906b4fe763580f/xxhash-3.7.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:0c72fe9c7e3d6dfd7f1e21e224a877917fa09c465694ba4e06464b9511b65544", size = 33323, upload-time = "2026-04-25T11:06:57.336Z" }, - { url = "https://files.pythonhosted.org/packages/2a/6e/46b84017b1301d54091430353d4ad5901654a3e0871649877a416f7f1644/xxhash-3.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:91c3b07cf3362086d8f126c6aecd8e5e9396ad8b2f2219ea7e49a8250c318acd", size = 30874, upload-time = "2026-04-25T11:06:59.834Z" }, - { url = "https://files.pythonhosted.org/packages/f3/29/a804ded9f5d3d3758292678d23e7528b08fda7b7e750688d08b052322475/xxhash-3.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:921c14e93817842dd0dd9f372890a0f0c72e534650b6ab13c5be5cd0db11d47e", size = 213033, upload-time = "2026-04-25T11:07:03.606Z" }, - { url = "https://files.pythonhosted.org/packages/8b/91/1ce5a7d2fdc975267320e2c78fc1cecfe7ab735ccbcf6993ec5dd541cb2c/xxhash-3.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e64a7c9d7dfca3e0fafcbc5e455519090706a3e36e95d655cec3e04e79f95aaa", size = 236140, upload-time = "2026-04-25T11:07:05.396Z" }, - { url = "https://files.pythonhosted.org/packages/34/04/fd595a4fd8617b05fa27bd9b684ecb4985bfed27917848eea85d54036d06/xxhash-3.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2220af08163baf5fa36c2b8af079dc2cbe6e66ae061385267f9472362dfd53c6", size = 212291, upload-time = "2026-04-25T11:07:06.966Z" }, - { url = "https://files.pythonhosted.org/packages/03/fb/f1a379cbc372ae5b9f4ab36154c48a849ca6ebe3ac477067a57865bf3bc6/xxhash-3.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f14bb8b22a4a91325813e3d553b8963c10cf8c756cff65ee50c194431296c655", size = 445532, upload-time = "2026-04-25T11:07:08.525Z" }, - { url = "https://files.pythonhosted.org/packages/65/59/172424b79f8cfd4b6d8a122b2193e6b8ad4b11f7159bb3b6f9b3191329bb/xxhash-3.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:496736f86a9bedaf64b0dc70e3539d0766df01c71ea22032698e88f3f04a1ce9", size = 193990, upload-time = "2026-04-25T11:07:10.315Z" }, - { url = "https://files.pythonhosted.org/packages/b9/19/aeac22161d953f139f07ba5586cb4a17c5b7b6dff985122803bb12933500/xxhash-3.7.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0ff71596bd79816975b3de7130ab1ff4541410285a3c084584eeb1c8239996fd", size = 284876, upload-time = "2026-04-25T11:07:12.15Z" }, - { url = "https://files.pythonhosted.org/packages/77/d5/4fd0b59e7a02242953da05ff679fbb961b0a4368eac97a217e11dae110c1/xxhash-3.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1ad86695c19b1d46fe106925db3c7a37f16be37669dcf58dcc70a9dd6e324676", size = 210495, upload-time = "2026-04-25T11:07:13.952Z" }, - { url = "https://files.pythonhosted.org/packages/aa/fb/976a3165c728c7faf74aa1b5ab3cf6a85e6d731612894741840524c7d28c/xxhash-3.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:970f9f8c50961d639cbd0d988c96f80ddf66006de93641719282c4fe7a87c5e6", size = 241331, upload-time = "2026-04-25T11:07:15.557Z" }, - { url = "https://files.pythonhosted.org/packages/61/2b/876e722d533833f5f9a83473e6ba993e48745701096944e77bbecf29b2c3/xxhash-3.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6e934bbae1e0ec74e27d5f0d7f37ef547ce5ff9f0a7e63fb39e559fc99526734", size = 210744, upload-time = "2026-04-25T11:07:19.055Z" }, - { url = "https://files.pythonhosted.org/packages/21/e6/d7e7baef7ce24166b4668d3c48557bb35a23b92ecadcac7e7718d099ab69/xxhash-3.7.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:3b6b3d28228af044ebcded71c4a3dd86e1dbd7e2f4645bf40f7b5da65bb5fb5a", size = 275406, upload-time = "2026-04-25T11:07:20.908Z" }, - { url = "https://files.pythonhosted.org/packages/92/fe/198b3763b2e01ca908f2154969a2352ec99bda892b574a11a9a151c5ede4/xxhash-3.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:6be4d70d9ab76c9f324ead9c01af6ff52c324745ea0c3731682a0cf99720f1fe", size = 414125, upload-time = "2026-04-25T11:07:23.037Z" }, - { url = "https://files.pythonhosted.org/packages/3a/6d/019a11affd5a5499137cacca53808659964785439855b5aa40dfd3412916/xxhash-3.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:151d7520838d4465461a0b7f4ae488b3b00de16183dd3214c1a6b14bf89d7fb6", size = 191555, upload-time = "2026-04-25T11:07:24.991Z" }, - { url = "https://files.pythonhosted.org/packages/07/f2/36d3310161db7f72efb4562aadde0ed429f1d0531782dd6345b12d2da527/xxhash-3.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8f4608a06e4d61b7a3425665a46d00e0579122e1a2fae97a0c52953a3aad9aa3", size = 31123, upload-time = "2026-04-25T11:07:31.989Z" }, - { url = "https://files.pythonhosted.org/packages/22/29/f10d7ff8c7a733d4403a43b9de18c8fabc005f98cec054644f04418659ee/xxhash-3.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc026e3b89d98e30a8288c95cb696e77d150b3f0fb7a51f73dcd49ee6b5577fa", size = 215793, upload-time = "2026-04-25T11:07:34.919Z" }, - { url = "https://files.pythonhosted.org/packages/8b/fd/778f60aa295f58907938f030a8b514611f391405614a525cccd2ffc00eb5/xxhash-3.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c9b31ab1f28b078a6a1ac1a54eb35e7d5390deddd56870d0be3a0a733d1c321c", size = 237993, upload-time = "2026-04-25T11:07:36.638Z" }, - { url = "https://files.pythonhosted.org/packages/70/f5/736db5de387b4a540e37a05b84b40dc58a1ce974bfd2b4e5754ce29b68c3/xxhash-3.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3bb5fd680c038fd5229e44e9c493782f90df9bef632fd0499d442374688ff70b", size = 214887, upload-time = "2026-04-25T11:07:38.564Z" }, - { url = "https://files.pythonhosted.org/packages/4d/aa/09a095f22fdb9a27fbb716841fbff52119721f9ca4261952d07a912f7839/xxhash-3.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:030c0fd688fce3569fbb49a2feefd4110cbb0b650186fb4610759ecfac677548", size = 448407, upload-time = "2026-04-25T11:07:40.552Z" }, - { url = "https://files.pythonhosted.org/packages/74/8a/b745efeeca9e34a91c26fdc97ad8514c43d5a81ac78565cba80a1353870a/xxhash-3.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b1bde10324f4c31812ae0d0502e92d916ae8917cad7209353f122b8b8f610c3", size = 196119, upload-time = "2026-04-25T11:07:42.101Z" }, - { url = "https://files.pythonhosted.org/packages/8a/5c/0cfceb024af90c191f665c7933b1f318ee234f4797858383bebd1881d52f/xxhash-3.7.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:503722d52a615f2604f5e7611de7d43878df010dc0053094ef91cb9a9ac3d987", size = 286751, upload-time = "2026-04-25T11:07:43.568Z" }, - { url = "https://files.pythonhosted.org/packages/0b/0a/0793e405dc3cf8f4ebe2c1acec1e4e4608cd9e7e50ea691dabbc2a95ccbb/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c72500a3b6d6c30ebfc135035bcace9eb5884f2dc220804efcaaba43e9f611dd", size = 212961, upload-time = "2026-04-25T11:07:45.388Z" }, - { url = "https://files.pythonhosted.org/packages/0c/7e/721118ffc63bfff94aa565bcf2555a820f9f4bdb0f001e0d609bdfad70de/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:43475925a766d01ca8cd9a857fd87f3d50406983c8506a4c07c4df12adcc867f", size = 243703, upload-time = "2026-04-25T11:07:47.053Z" }, - { url = "https://files.pythonhosted.org/packages/2d/94/80ba841287fd97e3e9cac1d228788c8ef623746f570404961eec748ecb5c/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c50269d0055ac1faecfd559886d2cbe4b730de236585aba0e873f9d9dadbe585", size = 213357, upload-time = "2026-04-25T11:07:50.257Z" }, - { url = "https://files.pythonhosted.org/packages/a1/7e/106d4067130c59f1e18a55ffadcd876d8c68534883a1e02685b29d3d8153/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1910df4756a5ab58cfad8744fc2d0f23926e3efcc346ee76e87b974abab922f4", size = 277600, upload-time = "2026-04-25T11:07:51.745Z" }, - { url = "https://files.pythonhosted.org/packages/c5/86/a081dd30da71d720b2612a792bfd55e45fa9a07ac76a0507f60487473c25/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d006faf3b491957efcb433489be3c149efe4787b7063d5cddb8ddaefdc60e0c1", size = 416980, upload-time = "2026-04-25T11:07:53.504Z" }, - { url = "https://files.pythonhosted.org/packages/35/29/1a95221a029a3c1293773869e1ab47b07cbbdd82444a42809e8c60156626/xxhash-3.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:abb65b4e947e958f7b3b0d71db3ce447d1bc5f37f5eab871ce7223bda8768a04", size = 193840, upload-time = "2026-04-25T11:07:55.103Z" }, - { url = "https://files.pythonhosted.org/packages/4f/4e/075559bd712bc62e84915ea46bbee859f935d285659082c129bdbff679dd/xxhash-3.7.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5de686e73690cdaf72b96d4fa083c230ec9020bcc2627ce6316138e2cf2fe2d1", size = 28553, upload-time = "2026-04-25T11:10:23.1Z" }, - { url = "https://files.pythonhosted.org/packages/bd/b1/dfe2629f7c77eb2fa234c72ff537cdd64939763df704e256446ed364a16d/xxhash-3.7.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48b542c347c2089f43dc5a6db31d2a6f3cdb04ee33505ec6e9f653834dbb0bde", size = 36307, upload-time = "2026-04-25T11:10:26.949Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f7/5a484afce0f48dd8083208b42e4911f290a82c7b52458ef2927e4d421a45/xxhash-3.7.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a169a036bed0995e090d1493b283cc2cc8a6f5046821086b843abefff80643bc", size = 32534, upload-time = "2026-04-25T11:10:29.01Z" }, +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160, upload-time = "2025-10-02T14:37:08.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/ec/1cc11cd13e26ea8bc3cb4af4eaadd8d46d5014aebb67be3f71fb0b68802a/xxhash-3.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2b6821e94346f96db75abaa6e255706fb06ebd530899ed76d32cd99f20dc52fa", size = 30809, upload-time = "2025-10-02T14:34:15.484Z" }, + { url = "https://files.pythonhosted.org/packages/90/3b/d1f1a8f5442a5fd8beedae110c5af7604dc37349a8e16519c13c19a9a2de/xxhash-3.6.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b29ee68625ab37b04c0b40c3fafdf24d2f75ccd778333cfb698f65f6c463f62", size = 213550, upload-time = "2025-10-02T14:34:17.878Z" }, + { url = "https://files.pythonhosted.org/packages/a5/86/cf2c0321dc3940a7aa73076f4fd677a0fb3e405cb297ead7d864fd90847e/xxhash-3.6.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:297b7fbf86c82c550e12e8fb71968b3f033d27b874276ba3624ea868c11165a8", size = 193880, upload-time = "2025-10-02T14:34:22.431Z" }, + { url = "https://files.pythonhosted.org/packages/82/fb/96213c8560e6f948a1ecc9a7613f8032b19ee45f747f4fca4eb31bb6d6ed/xxhash-3.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dea26ae1eb293db089798d3973a5fc928a18fdd97cc8801226fae705b02b14b0", size = 210912, upload-time = "2025-10-02T14:34:23.937Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b3/5a4241309217c5c876f156b10778f3ab3af7ba7e3259e6d5f5c7d0129eb2/xxhash-3.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51312c768403d8540487dbbfb557454cfc55589bbde6424456951f7fcd4facb3", size = 191409, upload-time = "2025-10-02T14:34:29.696Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816, upload-time = "2025-10-02T14:34:36.043Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914, upload-time = "2025-10-02T14:34:38.6Z" }, + { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883, upload-time = "2025-10-02T14:34:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392, upload-time = "2025-10-02T14:34:45.042Z" }, + { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431, upload-time = "2025-10-02T14:34:50.798Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1", size = 30821, upload-time = "2025-10-02T14:34:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263", size = 212975, upload-time = "2025-10-02T14:35:00.816Z" }, + { url = "https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d", size = 193936, upload-time = "2025-10-02T14:35:05.013Z" }, + { url = "https://files.pythonhosted.org/packages/2c/bd/4a5f68381939219abfe1c22a9e3a5854a4f6f6f3c4983a87d255f21f2e5d/xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7", size = 210440, upload-time = "2025-10-02T14:35:06.239Z" }, + { url = "https://files.pythonhosted.org/packages/af/3c/0bb129170ee8f3650f08e993baee550a09593462a5cddd8e44d0011102b1/xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd", size = 191495, upload-time = "2025-10-02T14:35:12.971Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3c/0573299560d7d9f8ab1838f1efc021a280b5ae5ae2e849034ef3dee18810/xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db", size = 31072, upload-time = "2025-10-02T14:35:18.844Z" }, + { url = "https://files.pythonhosted.org/packages/e3/8e/c6d158d12a79bbd0b878f8355432075fc82759e356ab5a111463422a239b/xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f", size = 215736, upload-time = "2025-10-02T14:35:21.616Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6b/33e21afb1b5b3f46b74b6bd1913639066af218d704cc0941404ca717fc57/xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee", size = 196070, upload-time = "2025-10-02T14:35:26.586Z" }, + { url = "https://files.pythonhosted.org/packages/96/b6/fcabd337bc5fa624e7203aa0fa7d0c49eed22f72e93229431752bddc83d9/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd", size = 212907, upload-time = "2025-10-02T14:35:28.087Z" }, + { url = "https://files.pythonhosted.org/packages/dc/6c/5cbde9de2cd967c322e651c65c543700b19e7ae3e0aae8ece3469bf9683d/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033", size = 193787, upload-time = "2025-10-02T14:35:33.827Z" }, + { url = "https://files.pythonhosted.org/packages/50/55/15a7b8a56590e66ccd374bbfa3f9ffc45b810886c8c3b614e3f90bd2367c/xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:881b47fc47e051b37d94d13e7455131054b56749b91b508b0907eb07900d1c13", size = 36251, upload-time = "2025-10-02T14:37:04.44Z" }, + { url = "https://files.pythonhosted.org/packages/62/b2/5ac99a041a29e58e95f907876b04f7067a0242cb85b5f39e726153981503/xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6dc31591899f5e5666f04cc2e529e69b4072827085c1ef15294d91a004bc1bd", size = 32481, upload-time = "2025-10-02T14:37:05.869Z" }, ] [[package]] @@ -11699,67 +11021,49 @@ wheels = [ [[package]] name = "yarl" -version = "1.24.2" +version = "1.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "multidict", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "propcache", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/12/1e8f37460ea0f7eb59c221fdaf0ed75e7ac43e97f8093b9c6f411df50a78/yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8", size = 210798, upload-time = "2026-05-19T21:31:05.599Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/c5/1ce244152ff2839645e7cae92f90e7bafcb2c52bea7ff586ac714f14f5df/yarl-1.24.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1", size = 128971, upload-time = "2026-05-19T21:28:20.543Z" }, - { url = "https://files.pythonhosted.org/packages/31/d0/1fb0c1cd27288f39f6974da4318c32768d72c9890984541fdf1e2e32a51d/yarl-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d", size = 91343, upload-time = "2026-05-19T21:28:24.092Z" }, - { url = "https://files.pythonhosted.org/packages/03/ce/d4a646508bed2f8dec6435b40166fe9308dd191262033d3f307b2bbcaecd/yarl-1.24.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae", size = 105704, upload-time = "2026-05-19T21:28:25.872Z" }, - { url = "https://files.pythonhosted.org/packages/4b/07/b3278e82d8bc41485bcf6d856cd0433262593de615b1d3dc43bd3f5bead4/yarl-1.24.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a", size = 97281, upload-time = "2026-05-19T21:28:27.352Z" }, - { url = "https://files.pythonhosted.org/packages/17/5b/4cee6e7c92e487bebe7afc797da0aa54a248ab4e776a68fe369ec29665a5/yarl-1.24.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e", size = 114020, upload-time = "2026-05-19T21:28:29.458Z" }, - { url = "https://files.pythonhosted.org/packages/5c/82/111076571545a7d4f9cca3fbd5c6f40615af58642be09f12328f48022468/yarl-1.24.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50", size = 111450, upload-time = "2026-05-19T21:28:31.262Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ec/08f671f69a444d704aeecebf92af659b67b97a869942411d0a578b08c334/yarl-1.24.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003", size = 106384, upload-time = "2026-05-19T21:28:32.856Z" }, - { url = "https://files.pythonhosted.org/packages/e5/86/ce41e7a7a199340b2330d52b60f25c4074b6636dd0e60b1a80d31a9db042/yarl-1.24.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f", size = 106153, upload-time = "2026-05-19T21:28:35.222Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5d/31be8a729531ab3e55ac3e7e5c800be8c89ea98947f418b2f6ea259fb6ee/yarl-1.24.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f", size = 105322, upload-time = "2026-05-19T21:28:36.642Z" }, - { url = "https://files.pythonhosted.org/packages/47/9b/b57afb22b386ae87ac9940f09878b98d8c333f89113e6fc96fcf4ca9eb64/yarl-1.24.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294", size = 99057, upload-time = "2026-05-19T21:28:38.386Z" }, - { url = "https://files.pythonhosted.org/packages/a3/4f/06348c27c8389256c313e8a57d796808fc0264c915dd5e7cfd3c0e314dc7/yarl-1.24.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2", size = 113502, upload-time = "2026-05-19T21:28:40.091Z" }, - { url = "https://files.pythonhosted.org/packages/5f/1c/284f307b298e4a17b7943b07d9d7ecc4151537f8d137ba51f3bb6c31ca20/yarl-1.24.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c", size = 105253, upload-time = "2026-05-19T21:28:41.987Z" }, - { url = "https://files.pythonhosted.org/packages/c8/bf/0de123bec8619e45c80cbded9085f61b5b4a9eddb8abe6d25d28ee1ec866/yarl-1.24.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b", size = 111345, upload-time = "2026-05-19T21:28:43.93Z" }, - { url = "https://files.pythonhosted.org/packages/90/af/0248eb065e51129d2a9b2436cd1b5c772c19a6b04e5b6a186955671e3319/yarl-1.24.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5", size = 106558, upload-time = "2026-05-19T21:28:45.806Z" }, - { url = "https://files.pythonhosted.org/packages/f0/da/866bcb01076ba49d2b42b309867bed3826421f1c479655eb7a607b44f20b/yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8", size = 129957, upload-time = "2026-05-19T21:28:51.695Z" }, - { url = "https://files.pythonhosted.org/packages/29/b6/170e2b8d4e3bc30e6bfdcca53556537f5bf595e938632dfcb059311f3ff6/yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d", size = 91688, upload-time = "2026-05-19T21:28:54.865Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a5/c9f655d5553ea0b99fdac9d6a99ad3f9b3e73b8e5758bb46f58c9831f74c/yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035", size = 102902, upload-time = "2026-05-19T21:28:56.963Z" }, - { url = "https://files.pythonhosted.org/packages/5d/bc/6b9664d815d79af4ee553337f9d606c56bbf269186ada9172de45f1b5f60/yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576", size = 97931, upload-time = "2026-05-19T21:28:58.56Z" }, - { url = "https://files.pythonhosted.org/packages/98/ec/32ba48acae30fecd60928f5791188b80a9d6ee3840507ffda29fecd37b71/yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8", size = 111030, upload-time = "2026-05-19T21:29:00.148Z" }, - { url = "https://files.pythonhosted.org/packages/82/5a/6f4cd081e5f4934d2ae3a8ef4abe3afacc010d26f0035ee91b35cd7d7c37/yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7", size = 110392, upload-time = "2026-05-19T21:29:02.155Z" }, - { url = "https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c", size = 105612, upload-time = "2026-05-19T21:29:04.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/80/264ab684f181e1a876389374519ff05d10248725535ae2ac4e8ac4e563d6/yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d", size = 104487, upload-time = "2026-05-19T21:29:06.491Z" }, - { url = "https://files.pythonhosted.org/packages/41/07/efabe5df87e96d7ad5959760b888344be48cd6884db127b407c6b5503adc/yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db", size = 102333, upload-time = "2026-05-19T21:29:08.267Z" }, - { url = "https://files.pythonhosted.org/packages/44/0c/bcf7c42603e1009295f586d8890f2ba032c8b53310e815adf0a202c73d9f/yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712", size = 99025, upload-time = "2026-05-19T21:29:10.682Z" }, - { url = "https://files.pythonhosted.org/packages/4f/82/84482ab1a57a0f21a08afe6a7004c61d741f8f2ecc3b05c321577c612164/yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996", size = 110507, upload-time = "2026-05-19T21:29:12.954Z" }, - { url = "https://files.pythonhosted.org/packages/c4/8d/a546ba1dfe1b0f290e05fef145cd07614c0f15df1a707195e512d1e39d1d/yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b", size = 103719, upload-time = "2026-05-19T21:29:14.893Z" }, - { url = "https://files.pythonhosted.org/packages/1a/b6/267f2a09213138473adfce6b8a6e17791d7fee70bd4d9003218e4dec58b0/yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c", size = 110438, upload-time = "2026-05-19T21:29:16.485Z" }, - { url = "https://files.pythonhosted.org/packages/48/2d/1c8d89c7c5f9cad9fb2902445d94e2ab1d7aa35de029afbb8ae95c42d00f/yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1", size = 105719, upload-time = "2026-05-19T21:29:18.367Z" }, - { url = "https://files.pythonhosted.org/packages/82/62/fcf0ce677f17e5c471c06311dd25964be38a4c586993632910d2e75278bc/yarl-1.24.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536", size = 128978, upload-time = "2026-05-19T21:29:23.83Z" }, - { url = "https://files.pythonhosted.org/packages/c1/24/16748d5dab6daec8b0ed81ccec639a1cded0f18dcc62a4f696b4fe366c37/yarl-1.24.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1", size = 91113, upload-time = "2026-05-19T21:29:26.928Z" }, - { url = "https://files.pythonhosted.org/packages/1b/66/b63fff7b71211e866624b21432d5943cbb633eb0c2872d9ee3070648f22c/yarl-1.24.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986", size = 103899, upload-time = "2026-05-19T21:29:28.842Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ac/ba1974b8533909636f7733fe86cf677e3619527c3c2fa913e0ea89c48757/yarl-1.24.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488", size = 97862, upload-time = "2026-05-19T21:29:31.086Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a5/123ac993b5c2ba6f554a140305620cb8f150fa543711bbc49be3ec0a65a4/yarl-1.24.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b", size = 111060, upload-time = "2026-05-19T21:29:32.657Z" }, - { url = "https://files.pythonhosted.org/packages/23/37/c472d3af3509688392134a88a825276770a187f1daa4de3f6dc0a327a751/yarl-1.24.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592", size = 110613, upload-time = "2026-05-19T21:29:34.379Z" }, - { url = "https://files.pythonhosted.org/packages/df/88/09c28dad91e662ccfaa1b78f1c57badde74fc9d0b23e74aef644750ecd73/yarl-1.24.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617", size = 107012, upload-time = "2026-05-19T21:29:36.216Z" }, - { url = "https://files.pythonhosted.org/packages/07/ab/9d4f69d571a94f4d112fa7e2e007200f5a54d319f58c82ac7b7baa61f5c6/yarl-1.24.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92", size = 105887, upload-time = "2026-05-19T21:29:38.746Z" }, - { url = "https://files.pythonhosted.org/packages/8e/9a/000b2b66c0d772a499fc531d21dab92dfeb73b640a12eed6ba89f49bb2d0/yarl-1.24.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a", size = 103620, upload-time = "2026-05-19T21:29:40.368Z" }, - { url = "https://files.pythonhosted.org/packages/41/7c/7c1050f73450fbdaa3f0c72017059f00ce5e13366692f3dba25275a1083d/yarl-1.24.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44", size = 100599, upload-time = "2026-05-19T21:29:42.66Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b1/29e5756b3926705f5f6089bd5b9f50a56eaac550da6e260bf713ead44d04/yarl-1.24.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a", size = 110604, upload-time = "2026-05-19T21:29:44.632Z" }, - { url = "https://files.pythonhosted.org/packages/a3/4b/8415bc96e9b150cde942fbac9a8182985e58f40ce5c54c34ed015407d3ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf", size = 105161, upload-time = "2026-05-19T21:29:46.755Z" }, - { url = "https://files.pythonhosted.org/packages/8b/d4/cde059abfa229553b7298a2eadde2752e723d50aeedaef86ce59da2718ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056", size = 110619, upload-time = "2026-05-19T21:29:48.972Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2c/d6a6c9a61549f7b6c7e6dc6937d195bcf069582b47b7200dcd0e7b256acf/yarl-1.24.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992", size = 107362, upload-time = "2026-05-19T21:29:51Z" }, - { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576, upload-time = "2026-05-19T21:31:03.909Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", size = 123641, upload-time = "2026-03-01T22:04:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", size = 85988, upload-time = "2026-03-01T22:04:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6c/4a90d59c572e46b270ca132aca66954f1175abd691f74c1ef4c6711828e2/yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a", size = 100566, upload-time = "2026-03-01T22:04:47.639Z" }, + { url = "https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598", size = 102678, upload-time = "2026-03-01T22:04:55.176Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c0/b39770b56d4a9f0bb5f77e2f1763cd2d75cc2f6c0131e3b4c360348fcd65/yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c", size = 100163, upload-time = "2026-03-01T22:04:58.492Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b8/35c0750fcd5a3f781058bfd954515dd4b1eab45e218cbb85cf11132215f1/yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2", size = 102919, upload-time = "2026-03-01T22:05:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, + { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, + { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" }, + { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" }, + { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" }, + { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" }, + { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" }, + { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, ] [[package]] name = "zipp" -version = "4.1.0" +version = "3.23.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, ] [[package]] @@ -11770,35 +11074,23 @@ sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529 wheels = [ { url = "https://files.pythonhosted.org/packages/ac/4d/e66465c5411a7cf4866aeadc7d108081d8ceba9bc7abe6b14aa21c671ec3/zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f", size = 640559, upload-time = "2025-09-14T22:16:27.973Z" }, { url = "https://files.pythonhosted.org/packages/3b/13/2b7ed68bd85e69a2069bcc72141d378f22cae5a0f3b353a2c8f50ef30c1b/zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a", size = 5058126, upload-time = "2025-09-14T22:16:31.811Z" }, - { url = "https://files.pythonhosted.org/packages/c9/dd/fdaf0674f4b10d92cb120ccff58bbb6626bf8368f00ebfd2a41ba4a0dc99/zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc", size = 5405390, upload-time = "2025-09-14T22:16:33.486Z" }, - { url = "https://files.pythonhosted.org/packages/0f/67/354d1555575bc2490435f90d67ca4dd65238ff2f119f30f72d5cde09c2ad/zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6", size = 5452914, upload-time = "2025-09-14T22:16:35.277Z" }, { url = "https://files.pythonhosted.org/packages/bb/1f/e9cfd801a3f9190bf3e759c422bbfd2247db9d7f3d54a56ecde70137791a/zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072", size = 5559635, upload-time = "2025-09-14T22:16:37.141Z" }, { url = "https://files.pythonhosted.org/packages/21/88/5ba550f797ca953a52d708c8e4f380959e7e3280af029e38fbf47b55916e/zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277", size = 5048277, upload-time = "2025-09-14T22:16:38.807Z" }, { url = "https://files.pythonhosted.org/packages/46/c0/ca3e533b4fa03112facbe7fbe7779cb1ebec215688e5df576fe5429172e0/zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313", size = 5574377, upload-time = "2025-09-14T22:16:40.523Z" }, { url = "https://files.pythonhosted.org/packages/12/9b/3fb626390113f272abd0799fd677ea33d5fc3ec185e62e6be534493c4b60/zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097", size = 4961493, upload-time = "2025-09-14T22:16:43.3Z" }, - { url = "https://files.pythonhosted.org/packages/8c/a7/bb5a0c1c0f3f4b5e9d5b55198e39de91e04ba7c205cc46fcb0f95f0383c1/zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065", size = 5443672, upload-time = "2025-09-14T22:16:47.076Z" }, - { url = "https://files.pythonhosted.org/packages/27/22/503347aa08d073993f25109c36c8d9f029c7d5949198050962cb568dfa5e/zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa", size = 5822753, upload-time = "2025-09-14T22:16:49.316Z" }, { url = "https://files.pythonhosted.org/packages/e2/be/94267dc6ee64f0f8ba2b2ae7c7a2df934a816baaa7291db9e1aa77394c3c/zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7", size = 5366047, upload-time = "2025-09-14T22:16:51.328Z" }, { url = "https://files.pythonhosted.org/packages/aa/1c/d920d64b22f8dd028a8b90e2d756e431a5d86194caa78e3819c7bf53b4b3/zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00", size = 640436, upload-time = "2025-09-14T22:16:57.774Z" }, { url = "https://files.pythonhosted.org/packages/1e/15/efef5a2f204a64bdb5571e6161d49f7ef0fffdbca953a615efbec045f60f/zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea", size = 5063012, upload-time = "2025-09-14T22:17:01.156Z" }, - { url = "https://files.pythonhosted.org/packages/b7/37/a6ce629ffdb43959e92e87ebdaeebb5ac81c944b6a75c9c47e300f85abdf/zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb", size = 5394148, upload-time = "2025-09-14T22:17:03.091Z" }, - { url = "https://files.pythonhosted.org/packages/e3/79/2bf870b3abeb5c070fe2d670a5a8d1057a8270f125ef7676d29ea900f496/zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a", size = 5451652, upload-time = "2025-09-14T22:17:04.979Z" }, { url = "https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902", size = 5546993, upload-time = "2025-09-14T22:17:06.781Z" }, { url = "https://files.pythonhosted.org/packages/85/c7/3483ad9ff0662623f3648479b0380d2de5510abf00990468c286c6b04017/zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f", size = 5046806, upload-time = "2025-09-14T22:17:08.415Z" }, { url = "https://files.pythonhosted.org/packages/08/b3/206883dd25b8d1591a1caa44b54c2aad84badccf2f1de9e2d60a446f9a25/zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b", size = 5576659, upload-time = "2025-09-14T22:17:10.164Z" }, { url = "https://files.pythonhosted.org/packages/9d/31/76c0779101453e6c117b0ff22565865c54f48f8bd807df2b00c2c404b8e0/zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6", size = 4953933, upload-time = "2025-09-14T22:17:11.857Z" }, - { url = "https://files.pythonhosted.org/packages/1e/73/316e4010de585ac798e154e88fd81bb16afc5c5cb1a72eeb16dd37e8024a/zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708", size = 5433517, upload-time = "2025-09-14T22:17:16.103Z" }, - { url = "https://files.pythonhosted.org/packages/5b/60/dd0f8cfa8129c5a0ce3ea6b7f70be5b33d2618013a161e1ff26c2b39787c/zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512", size = 5814292, upload-time = "2025-09-14T22:17:17.827Z" }, { url = "https://files.pythonhosted.org/packages/fc/5f/75aafd4b9d11b5407b641b8e41a57864097663699f23e9ad4dbb91dc6bfe/zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa", size = 5360237, upload-time = "2025-09-14T22:17:19.954Z" }, { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440, upload-time = "2025-09-14T22:17:27.366Z" }, { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001, upload-time = "2025-09-14T22:17:31.044Z" }, - { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120, upload-time = "2025-09-14T22:17:32.711Z" }, - { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230, upload-time = "2025-09-14T22:17:34.41Z" }, { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173, upload-time = "2025-09-14T22:17:36.084Z" }, { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736, upload-time = "2025-09-14T22:17:37.891Z" }, { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368, upload-time = "2025-09-14T22:17:40.206Z" }, { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022, upload-time = "2025-09-14T22:17:41.879Z" }, - { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952, upload-time = "2025-09-14T22:17:45.271Z" }, - { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054, upload-time = "2025-09-14T22:17:47.08Z" }, { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113, upload-time = "2025-09-14T22:17:48.893Z" }, ]