from __future__ import annotations from prompt_injection_framework.models.groq import _extract_retry_delay_seconds from prompt_injection_framework.models.ollama import OllamaModelAdapter from prompt_injection_framework.orchestration.config import ExperimentConfig from prompt_injection_framework.orchestration.runner import create_model_adapter def _config(provider: str, model_name: str) -> ExperimentConfig: from pathlib import Path return ExperimentConfig( name="adapter_test", description="", seed=42, sample_size=1, output_dir=Path("results"), dataset_path=Path("data/normalized/attack_cases.jsonl"), provider=provider, model_name=model_name, max_tokens=32, temperature=0.0, execution_mode="plain", mitigation_enabled=False, mitigation_strategy="none", mitigation_options={}, include_sources=(), include_attack_surfaces=(), include_attack_families=(), include_attack_subtypes=(), require_expected_target=False, ) def test_create_model_adapter_supports_ollama() -> None: adapter = create_model_adapter(_config("ollama", "llama3.1:8b")) assert isinstance(adapter, OllamaModelAdapter) assert adapter.model_name == "llama3.1:8b" def test_ollama_adapter_uses_default_local_base_url() -> None: adapter = OllamaModelAdapter(model_name="qwen2.5:7b") assert adapter.api_url == "http://127.0.0.1:11434/api/generate" def test_groq_retry_delay_parses_seconds() -> None: delay = _extract_retry_delay_seconds("Please try again in 3.47s.", attempt=1) assert delay == 3.47 def test_groq_retry_delay_parses_milliseconds() -> None: delay = _extract_retry_delay_seconds("Please try again in 990ms.", attempt=1) assert delay == 0.99 def test_groq_retry_delay_falls_back_to_attempt_backoff() -> None: delay = _extract_retry_delay_seconds("rate_limit_exceeded", attempt=3) assert delay == 6.0