From fef43db59da34b8fbcecce9b134f2584972e1269 Mon Sep 17 00:00:00 2001 From: TillQuandel Date: Thu, 25 Jun 2026 11:27:48 +0200 Subject: [PATCH] chore: Dead-Code entfernen (unused imports/vars, 4-fach verifiziert) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Entfernt 90 statische-Analyse-Funde (ruff F401/F811/F841 + vulture): - 84 ungenutzte Imports (sys/Path/json/re/numpy/dup-Imports) - verwaiste config-Importe: ER_BLOCKING_JACCARD (deprecated), CACHE_DIR, EVAL_ADAPTIVE_K_*, WISSEN, lru_cache, print_summary - tote Variablen: confirmed (kommt aus decision_engine.aggregate), seen_orders (Re-Def-Schutz läuft bereits über pairs), ungenutztes except-e - unreachable `return None` in vault_writer._find_source_note Geschützt (NICHT entfernt, als ABSICHT verifiziert): - generative/agents/base.py: _RUN_ID Re-Export (extern in orchestrator, eval_quality, reeval_baseline genutzt) -> # noqa: F401 - test_tag_whitelist.py: 6 lokale Path-Importe (in Tests genutzt) Verifikation: Claude + Mistral + Codex + Tool-Subagent (Union, nicht Voting). Tests vor/nach identisch: 4697 passed, 3 skipped. ruff clean. --- extractive/eval/extractive_eval.py | 2 -- extractive/pipeline/pdf_chunker.py | 1 - generative/agents/_litellm_backend.py | 1 - generative/agents/base.py | 3 +-- generative/agents/context_builder.py | 2 +- generative/agents/extractor.py | 1 - generative/agents/langfuse_backend.py | 2 -- generative/agents/planner.py | 1 - generative/calibration/run.py | 1 - generative/db.py | 1 - generative/eval_batch.py | 1 - generative/eval_dashboard_server.py | 3 +-- generative/eval_progress.py | 2 -- generative/eval_quality.py | 3 +-- generative/eval_quality_v4.py | 3 +-- generative/migrate_jsonl_to_sqlite.py | 1 - generative/orchestrator.py | 1 - generative/pipeline/acronym_fix.py | 1 - generative/pipeline/embeddings.py | 1 - generative/pipeline/pdf_chunker.py | 2 +- generative/pipeline/vault_writer.py | 3 +-- generative/tests/test_acronym_fix.py | 2 -- generative/tests/test_chapter_regex.py | 2 -- generative/tests/test_chunk_recall.py | 2 -- generative/tests/test_cli.py | 1 - generative/tests/test_collect_agreement.py | 2 -- generative/tests/test_collect_db_write.py | 1 - generative/tests/test_config.py | 1 - generative/tests/test_cost.py | 1 - generative/tests/test_cross_draft_hub_suggest.py | 2 -- generative/tests/test_dashboard_avg_agree.py | 2 -- generative/tests/test_db.py | 1 - generative/tests/test_decision_engine.py | 2 -- generative/tests/test_doctor.py | 1 - generative/tests/test_dry_run_eval_scope.py | 1 - generative/tests/test_er_stage1_filter.py | 2 -- generative/tests/test_figure_alt.py | 1 - generative/tests/test_figure_feasibility.py | 2 -- generative/tests/test_inline_eval_toggle.py | 2 -- generative/tests/test_overwrite_guard.py | 1 - generative/tests/test_pdf_chunker.py | 2 -- generative/tests/test_pdf_enrich.py | 1 - generative/tests/test_per_agent_tracking.py | 13 ++++--------- generative/tests/test_phoenix_span.py | 2 -- .../tests/test_planner_hallucination_filter.py | 1 - generative/tests/test_quality_retraction.py | 2 -- generative/tests/test_runtime_config.py | 2 -- generative/tests/test_semantic_dedup.py | 4 +--- generative/tests/test_structured_parser.py | 2 -- generative/tests/test_tag_whitelist.py | 2 -- generative/tests/test_vault_writer.py | 1 - generative/tests/test_verifier_prepass.py | 2 -- generative/tools/pdf_enrich.py | 1 - lib/decision_engine/pipeline.py | 2 +- 54 files changed, 13 insertions(+), 89 deletions(-) diff --git a/extractive/eval/extractive_eval.py b/extractive/eval/extractive_eval.py index 17e8207..d152bc6 100644 --- a/extractive/eval/extractive_eval.py +++ b/extractive/eval/extractive_eval.py @@ -6,8 +6,6 @@ from rapidfuzz import fuzz import re -import sys -from pathlib import Path from shared.db_schema import SCHEMA_SQL as _SCHEMA_MIGRATION diff --git a/extractive/pipeline/pdf_chunker.py b/extractive/pipeline/pdf_chunker.py index a2afb4a..feebccd 100644 --- a/extractive/pipeline/pdf_chunker.py +++ b/extractive/pipeline/pdf_chunker.py @@ -1,7 +1,6 @@ from __future__ import annotations import re from dataclasses import dataclass -from pathlib import Path import pdfplumber diff --git a/generative/agents/_litellm_backend.py b/generative/agents/_litellm_backend.py index 16e8368..73f7bf9 100644 --- a/generative/agents/_litellm_backend.py +++ b/generative/agents/_litellm_backend.py @@ -9,7 +9,6 @@ Vollständige Provider-Liste: https://docs.litellm.ai/docs/providers """ from __future__ import annotations -import sys import time import litellm diff --git a/generative/agents/base.py b/generative/agents/base.py index 3de8e00..bed505c 100644 --- a/generative/agents/base.py +++ b/generative/agents/base.py @@ -11,14 +11,13 @@ import threading import time from dataclasses import dataclass -from pathlib import Path from typing import Optional from generative.config import MODEL_OPUS, CACHE_DIR, BACKEND # Re-Export für Backwards-Compat — Agenten importieren aus agents.base from generative.agents.tracing import trace_event, trace_run_start, set_tracing_backend, flush_tracing # noqa: F401 -from generative.agents.tracing import _RUN_ID # single source of truth for run ID +from generative.agents.tracing import _RUN_ID # noqa: F401 # re-export, extern genutzt (orchestrator, eval_quality) # OTel-Tracer für Phoenix. Bleibt None bis orchestrator._setup_phoenix_tracing() # ihn via set_llm_tracer() explizit setzt (nur bei ATOMIC_AGENT_TRACING=phoenix). diff --git a/generative/agents/context_builder.py b/generative/agents/context_builder.py index 7c78852..cec3260 100644 --- a/generative/agents/context_builder.py +++ b/generative/agents/context_builder.py @@ -8,7 +8,7 @@ import yaml -from generative.config import VAULT, WISSEN, SCRIPTS_DIR # BA_DIR-Import entfernt (v31) +from generative.config import VAULT, SCRIPTS_DIR # BA_DIR-Import entfernt (v31) # Vault-Ordner die NICHT als existing_concepts zählen SKIP_DIRS = {"00-inbox", "98-system", "99-archive", "08-dashboards", ".obsidian", ".trash"} diff --git a/generative/agents/extractor.py b/generative/agents/extractor.py index 615e705..2ea96ea 100644 --- a/generative/agents/extractor.py +++ b/generative/agents/extractor.py @@ -5,7 +5,6 @@ Seitenzahl, deutsche Sprache, Akronyme aufgelöst, aliases-Liste, kein Pass-Through. """ from __future__ import annotations -import json import re from generative.agents.base import call_claude_async diff --git a/generative/agents/langfuse_backend.py b/generative/agents/langfuse_backend.py index a001f29..dd23d97 100644 --- a/generative/agents/langfuse_backend.py +++ b/generative/agents/langfuse_backend.py @@ -10,10 +10,8 @@ import base64 import json import os -import time import uuid from datetime import datetime, timedelta -from typing import Any class LangfuseBackend: diff --git a/generative/agents/planner.py b/generative/agents/planner.py index ce01a16..950c7a2 100644 --- a/generative/agents/planner.py +++ b/generative/agents/planner.py @@ -1,7 +1,6 @@ """Planner-Agent: TOC + Intro + Fazit + Relevanz-Profil → ConceptPlan.""" from __future__ import annotations -import re # Generika-Blacklist (portiert aus extractive/gliner_planner.py, angepasst für LLM-Output). # Fängt seltene LLM-"Ausrutscher" ab wenn trotz Prompt-Vorgabe abstrakte Einzel-Konzepte diff --git a/generative/calibration/run.py b/generative/calibration/run.py index b9df437..f95ee8f 100644 --- a/generative/calibration/run.py +++ b/generative/calibration/run.py @@ -15,7 +15,6 @@ from generative.eval_quality_v4 import ( # noqa: E402 _QUALITY_HISTORY as HISTORY_PATH, eval_note, - print_summary, save_result, ) from generative.config import AGENT_VERSION # noqa: E402 diff --git a/generative/db.py b/generative/db.py index da87207..3685cfa 100644 --- a/generative/db.py +++ b/generative/db.py @@ -17,7 +17,6 @@ import os import sqlite3 -import sys from contextlib import contextmanager from datetime import datetime from pathlib import Path diff --git a/generative/eval_batch.py b/generative/eval_batch.py index df42c63..9dc56c8 100644 --- a/generative/eval_batch.py +++ b/generative/eval_batch.py @@ -12,7 +12,6 @@ from __future__ import annotations import argparse import re -import sys from pathlib import Path diff --git a/generative/eval_dashboard_server.py b/generative/eval_dashboard_server.py index 1663305..41480aa 100644 --- a/generative/eval_dashboard_server.py +++ b/generative/eval_dashboard_server.py @@ -11,7 +11,6 @@ import argparse import json -import sys import webbrowser from datetime import datetime from http.server import BaseHTTPRequestHandler, HTTPServer @@ -232,7 +231,7 @@ def _read_calibration_data(allowed_note_paths: set | None = None, "avg_agree": avg_agree, "has_labels": n_labeled > 0, } - except Exception as e: + except Exception: return {"rows": [], "n_eval": 0, "n_labeled": 0, "avg_agree": None, "has_labels": False} diff --git a/generative/eval_progress.py b/generative/eval_progress.py index f447e5e..53799a4 100644 --- a/generative/eval_progress.py +++ b/generative/eval_progress.py @@ -9,8 +9,6 @@ from __future__ import annotations import argparse import json -import sys -from pathlib import Path from generative.config import CACHE_DIR diff --git a/generative/eval_quality.py b/generative/eval_quality.py index 0c6ecac..3a9d64d 100644 --- a/generative/eval_quality.py +++ b/generative/eval_quality.py @@ -128,8 +128,7 @@ def _page_num_from_str(page_str: str) -> int | None: def _semantic_score(quote: str, page_text: str) -> float: """Sentence-Transformers Cosine-Similarity. 0.0 wenn Modell nicht geladen.""" try: - from generative.pipeline.embeddings import _model, cosine - import numpy as np + from generative.pipeline.embeddings import _model model = _model() if model is None: return 0.0 diff --git a/generative/eval_quality_v4.py b/generative/eval_quality_v4.py index 3b4f562..5c1d63f 100644 --- a/generative/eval_quality_v4.py +++ b/generative/eval_quality_v4.py @@ -32,7 +32,7 @@ sys.exit("rapidfuzz fehlt: pip install rapidfuzz") from generative.agents import base -from generative.config import AGENT_VERSION, CACHE_DIR, EVAL_ADAPTIVE_K_HIGH, EVAL_ADAPTIVE_K_MID, MODEL_OPUS, MODEL_CONFIG, QUALITY_HISTORY +from generative.config import AGENT_VERSION, MODEL_OPUS, MODEL_CONFIG, QUALITY_HISTORY from decision_engine import ClaimDecision, ClaimInput, DEFAULT_CONFIG, Label, determine_decision from decision_engine.aggregation import aggregate as aggregate_decisions from decision_engine.models import QualityFlag @@ -558,7 +558,6 @@ def _aggregate( # Atomic-Agent-spezifische Felder wie Wilson-CI, PDF-Chunk-Zahl und LLM-Usage an. valid_claims = int(engine_metrics["valid_claims"]) parse_error_count = counts[PARSE_ERROR] - confirmed = counts[SUPPORTED_EXACT] + counts[SUPPORTED_PARAPHRASE] hallucinated = counts[NOT_IN_CONTEXT] + counts[CONTRADICTED] with_evidence = sum(1 for score in claim_scores if score["evidence"]) evidence_verified_count = sum(1 for score in claim_scores if score["evidence_verified"] is True) diff --git a/generative/migrate_jsonl_to_sqlite.py b/generative/migrate_jsonl_to_sqlite.py index fcac08f..d6e695b 100644 --- a/generative/migrate_jsonl_to_sqlite.py +++ b/generative/migrate_jsonl_to_sqlite.py @@ -10,7 +10,6 @@ import argparse import json -import sys from pathlib import Path from generative import db diff --git a/generative/orchestrator.py b/generative/orchestrator.py index 5b33ce5..e7b7453 100644 --- a/generative/orchestrator.py +++ b/generative/orchestrator.py @@ -57,7 +57,6 @@ def _span(name: str, **attrs): CRITIC_AUTO_THRESHOLD, ER_BODY_COSINE_THRESHOLD, ER_TITLE_COSINE_THRESHOLD, - ER_BLOCKING_JACCARD, ER_MAX_TOKEN_DIFF, ER_HUB_GENERIC_TOKENS, ENABLE_ENTITY_RESOLUTION, diff --git a/generative/pipeline/acronym_fix.py b/generative/pipeline/acronym_fix.py index d4aa2e8..cfe09b3 100644 --- a/generative/pipeline/acronym_fix.py +++ b/generative/pipeline/acronym_fix.py @@ -137,7 +137,6 @@ def extract_acronym_pairs(text: str) -> dict[str, str]: - „Short Form (Long Form)" — typisch in Lehrbüchern, Glossaren """ pairs: dict[str, str] = {} - seen_orders: dict[str, str] = {} # Prävention von späteren falschen Re-Definitionen for match in _PAT_LONG_PAREN_SHORT.finditer(text): before = match.group(1).strip() diff --git a/generative/pipeline/embeddings.py b/generative/pipeline/embeddings.py index 16427d3..8d08076 100644 --- a/generative/pipeline/embeddings.py +++ b/generative/pipeline/embeddings.py @@ -10,7 +10,6 @@ from __future__ import annotations import re import threading -from functools import lru_cache # Singleton-Modell — Lade-Zeit ~3s, danach pro Embedding ~10ms _MODEL = None diff --git a/generative/pipeline/pdf_chunker.py b/generative/pipeline/pdf_chunker.py index 1f6d7eb..2dc9abd 100644 --- a/generative/pipeline/pdf_chunker.py +++ b/generative/pipeline/pdf_chunker.py @@ -8,7 +8,7 @@ import re import subprocess import sys -from dataclasses import dataclass, field +from dataclasses import dataclass from pathlib import Path from generative.config import CHUNK_WORDS, MIN_WORDS_PER_PAGE diff --git a/generative/pipeline/vault_writer.py b/generative/pipeline/vault_writer.py index 96cae37..f49d6b2 100644 --- a/generative/pipeline/vault_writer.py +++ b/generative/pipeline/vault_writer.py @@ -8,7 +8,7 @@ import yaml -from generative.config import VAULT, WISSEN, INBOX, LITERATURE_DIR, CRITIC_AUTO_THRESHOLD +from generative.config import VAULT, INBOX, LITERATURE_DIR, CRITIC_AUTO_THRESHOLD from generative.schemas.atomic_note import AtomicNoteDraft @@ -565,7 +565,6 @@ def find_existing_in_inbox(source_file: str, title: str, if is_pristine_pipeline_note(text): return f return matches[0][0] - return None def _read_source_field(note_path: Path) -> str | None: diff --git a/generative/tests/test_acronym_fix.py b/generative/tests/test_acronym_fix.py index 266da4d..41ed5e6 100644 --- a/generative/tests/test_acronym_fix.py +++ b/generative/tests/test_acronym_fix.py @@ -1,7 +1,5 @@ """Tests für Schwartz-Hearst-basierte Akronym-Erkennung + Body-Insertion.""" from __future__ import annotations -import sys -from pathlib import Path from generative.pipeline.acronym_fix import ( diff --git a/generative/tests/test_chapter_regex.py b/generative/tests/test_chapter_regex.py index b94ae73..1d64fef 100644 --- a/generative/tests/test_chapter_regex.py +++ b/generative/tests/test_chapter_regex.py @@ -8,8 +8,6 @@ split_by_chapters() als auch in drop_frontmatter_pages(). """ from __future__ import annotations -import sys -from pathlib import Path from generative.pipeline.pdf_chunker import ( diff --git a/generative/tests/test_chunk_recall.py b/generative/tests/test_chunk_recall.py index 6ac1bcc..49d073c 100644 --- a/generative/tests/test_chunk_recall.py +++ b/generative/tests/test_chunk_recall.py @@ -8,8 +8,6 @@ extract_overview()-Output behalten (Planner-Recall-Decke). """ from __future__ import annotations -import sys -from pathlib import Path import pytest diff --git a/generative/tests/test_cli.py b/generative/tests/test_cli.py index d4f7413..7dc341f 100644 --- a/generative/tests/test_cli.py +++ b/generative/tests/test_cli.py @@ -1,7 +1,6 @@ """Tests für den atomic-notes-Konsolen-Entry-Point (generative/cli.py).""" from __future__ import annotations -import pytest from generative import cli diff --git a/generative/tests/test_collect_agreement.py b/generative/tests/test_collect_agreement.py index ae3ed79..c008906 100644 --- a/generative/tests/test_collect_agreement.py +++ b/generative/tests/test_collect_agreement.py @@ -6,8 +6,6 @@ `note_claim_agreement` paart stattdessen Mensch- und Pipeline-Label pro claim_idx. """ from __future__ import annotations -import sys -from pathlib import Path from generative.calibration.collect import note_claim_agreement diff --git a/generative/tests/test_collect_db_write.py b/generative/tests/test_collect_db_write.py index 99b16ce..7d66614 100644 --- a/generative/tests/test_collect_db_write.py +++ b/generative/tests/test_collect_db_write.py @@ -11,7 +11,6 @@ from __future__ import annotations import json import sqlite3 -import sys from pathlib import Path diff --git a/generative/tests/test_config.py b/generative/tests/test_config.py index 62b2ec4..4706db4 100644 --- a/generative/tests/test_config.py +++ b/generative/tests/test_config.py @@ -2,7 +2,6 @@ import importlib import sys -from pathlib import Path import pytest diff --git a/generative/tests/test_cost.py b/generative/tests/test_cost.py index c317395..97b27b3 100644 --- a/generative/tests/test_cost.py +++ b/generative/tests/test_cost.py @@ -1,4 +1,3 @@ -import sys from unittest.mock import patch from generative.config import compute_cost_per_call diff --git a/generative/tests/test_cross_draft_hub_suggest.py b/generative/tests/test_cross_draft_hub_suggest.py index c3c833e..d0fcc76 100644 --- a/generative/tests/test_cross_draft_hub_suggest.py +++ b/generative/tests/test_cross_draft_hub_suggest.py @@ -7,8 +7,6 @@ Seiteneffektfrei — schlägt nur vor, erzeugt keine Note. """ from __future__ import annotations -import sys -from pathlib import Path from generative.schemas.atomic_note import AtomicNoteDraft diff --git a/generative/tests/test_dashboard_avg_agree.py b/generative/tests/test_dashboard_avg_agree.py index 67502df..87fb6cc 100644 --- a/generative/tests/test_dashboard_avg_agree.py +++ b/generative/tests/test_dashboard_avg_agree.py @@ -6,8 +6,6 @@ (katastrophale Fehlkalibrierung) statt "–" (keine Daten). """ from __future__ import annotations -import sys -from pathlib import Path from generative.eval_dashboard_server import _avg_agreement diff --git a/generative/tests/test_db.py b/generative/tests/test_db.py index 27dca0c..cc1d0b5 100644 --- a/generative/tests/test_db.py +++ b/generative/tests/test_db.py @@ -1,7 +1,6 @@ import sqlite3 import tempfile import os -import sys def test_pipeline_run_has_cost_usd(): diff --git a/generative/tests/test_decision_engine.py b/generative/tests/test_decision_engine.py index ad3a9e1..c1faf32 100644 --- a/generative/tests/test_decision_engine.py +++ b/generative/tests/test_decision_engine.py @@ -1,7 +1,5 @@ from __future__ import annotations -import sys -from pathlib import Path from decision_engine import ClaimDecision, ClaimInput, DEFAULT_CONFIG, Label, determine_decision diff --git a/generative/tests/test_doctor.py b/generative/tests/test_doctor.py index ffb6511..e90851b 100644 --- a/generative/tests/test_doctor.py +++ b/generative/tests/test_doctor.py @@ -1,7 +1,6 @@ """Tests für atomic-notes doctor (generative/doctor.py) — Preflight-Checks als pure Funktionen.""" from __future__ import annotations -from pathlib import Path from generative import doctor diff --git a/generative/tests/test_dry_run_eval_scope.py b/generative/tests/test_dry_run_eval_scope.py index 45f8245..969a1d0 100644 --- a/generative/tests/test_dry_run_eval_scope.py +++ b/generative/tests/test_dry_run_eval_scope.py @@ -1,6 +1,5 @@ from __future__ import annotations -import sys from pathlib import Path diff --git a/generative/tests/test_er_stage1_filter.py b/generative/tests/test_er_stage1_filter.py index 0f34169..e551daf 100644 --- a/generative/tests/test_er_stage1_filter.py +++ b/generative/tests/test_er_stage1_filter.py @@ -7,8 +7,6 @@ (b) Hub-Generic-Blocklist: shorter darf nicht ⊆ ER_HUB_GENERIC_TOKENS sein """ from __future__ import annotations -import sys -from pathlib import Path from generative.orchestrator import er_stage1_decision diff --git a/generative/tests/test_figure_alt.py b/generative/tests/test_figure_alt.py index 838b927..6a37eee 100644 --- a/generative/tests/test_figure_alt.py +++ b/generative/tests/test_figure_alt.py @@ -8,7 +8,6 @@ """ from __future__ import annotations -import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent diff --git a/generative/tests/test_figure_feasibility.py b/generative/tests/test_figure_feasibility.py index b2e7c0f..62ff946 100644 --- a/generative/tests/test_figure_feasibility.py +++ b/generative/tests/test_figure_feasibility.py @@ -6,8 +6,6 @@ """ from __future__ import annotations -import sys -from pathlib import Path from generative.pipeline.pdf_chunker import Chunk diff --git a/generative/tests/test_inline_eval_toggle.py b/generative/tests/test_inline_eval_toggle.py index c1c727f..0648c5b 100644 --- a/generative/tests/test_inline_eval_toggle.py +++ b/generative/tests/test_inline_eval_toggle.py @@ -1,7 +1,5 @@ from __future__ import annotations -import sys -from pathlib import Path from generative.orchestrator import inline_eval_enabled diff --git a/generative/tests/test_overwrite_guard.py b/generative/tests/test_overwrite_guard.py index 2989a80..294d965 100644 --- a/generative/tests/test_overwrite_guard.py +++ b/generative/tests/test_overwrite_guard.py @@ -4,7 +4,6 @@ überschreiben (Datenverlust). content-hash-Guard: pristine Pipeline-Notes dürfen idempotent überschrieben werden, editierte nicht. """ -from pathlib import Path from generative.schemas.atomic_note import AtomicNoteDraft diff --git a/generative/tests/test_pdf_chunker.py b/generative/tests/test_pdf_chunker.py index 4cd878a..60c921e 100644 --- a/generative/tests/test_pdf_chunker.py +++ b/generative/tests/test_pdf_chunker.py @@ -7,8 +7,6 @@ """ from __future__ import annotations import re -import sys -from pathlib import Path from generative.pipeline.pdf_chunker import drop_frontmatter_pages, page_range_of_text, concept_text_window diff --git a/generative/tests/test_pdf_enrich.py b/generative/tests/test_pdf_enrich.py index 507c099..130cc1e 100644 --- a/generative/tests/test_pdf_enrich.py +++ b/generative/tests/test_pdf_enrich.py @@ -1,5 +1,4 @@ import sys -from pathlib import Path def test_extract_text_returns_string(tmp_path): """extract_text() gibt String zurück (auch bei leerer PDF).""" diff --git a/generative/tests/test_per_agent_tracking.py b/generative/tests/test_per_agent_tracking.py index f3c1b70..f64148a 100644 --- a/generative/tests/test_per_agent_tracking.py +++ b/generative/tests/test_per_agent_tracking.py @@ -48,7 +48,6 @@ def test_model_config_has_required_keys(): def test_verifier_run_emits_anchor_stats(tmp_path, monkeypatch): - import generative.agents.base as base import generative.agents.tracing as tracing import generative.agents.verifier as verifier from generative.schemas.atomic_note import AtomicNoteDraft @@ -111,8 +110,7 @@ def test_critic_run_emits_score_result(tmp_path, monkeypatch): def test_eval_agent_stats_aggregates_llm_calls(tmp_path): - import json, sys - from pathlib import Path + import json trace = tmp_path / "run.jsonl" entries = [ @@ -177,8 +175,7 @@ def test_run_totals_includes_eval_entries(tmp_path): """run_totals summiert flache Run-Tokens über ALLE Calls — inkl. Stage-8 eval_quality-Einträge, die nach dem Pipeline-Print in den Trace kommen. Cached-Einträge werden ausgeschlossen (matcht orchestrator-Verhalten).""" - import json, sys - from pathlib import Path + import json trace = tmp_path / "run.jsonl" entries = [ @@ -214,8 +211,7 @@ def test_run_totals_includes_eval_entries(tmp_path): def test_run_totals_sums_cost_per_call(tmp_path, monkeypatch): """cost_usd summiert die Per-Call-Kosten via config.compute_cost_per_call.""" - import json, sys - from pathlib import Path + import json from generative import config monkeypatch.setattr(config, "BACKEND", "api") @@ -241,8 +237,7 @@ def test_run_totals_sums_cost_per_call(tmp_path, monkeypatch): def test_run_totals_tolerates_malformed_line(tmp_path): """Eine kaputte Zeile (z.B. null-Token-Feld) darf die Aggregation NICHT abbrechen — der Rest wird weiterverarbeitet (wie die alten Inline-Schleifen).""" - import json, sys - from pathlib import Path + import json trace = tmp_path / "run.jsonl" entries = [ diff --git a/generative/tests/test_phoenix_span.py b/generative/tests/test_phoenix_span.py index 745a855..c8edeac 100644 --- a/generative/tests/test_phoenix_span.py +++ b/generative/tests/test_phoenix_span.py @@ -8,8 +8,6 @@ from __future__ import annotations import asyncio -import sys -from pathlib import Path import pytest diff --git a/generative/tests/test_planner_hallucination_filter.py b/generative/tests/test_planner_hallucination_filter.py index 2a2da02..909b74d 100644 --- a/generative/tests/test_planner_hallucination_filter.py +++ b/generative/tests/test_planner_hallucination_filter.py @@ -68,7 +68,6 @@ def test_blacklist_rejected_even_when_semantic_rescues_lexical(): def test_rescue_respects_configurable_threshold(): # Schwelle ist die config-Konstante; ein Wert knapp darunter wird verworfen. - from generative.agents import planner import generative.config as cfg # max-cos 0.49 < Default 0.50 → reject; 0.51 → rescue plan = _plan("Bildungs-Meta-Analyse-Selektion") diff --git a/generative/tests/test_quality_retraction.py b/generative/tests/test_quality_retraction.py index df6e7bf..2b52f9e 100644 --- a/generative/tests/test_quality_retraction.py +++ b/generative/tests/test_quality_retraction.py @@ -5,8 +5,6 @@ setzen `retracted=True` (Hard-Signal für Pipeline). """ from __future__ import annotations -import sys -from pathlib import Path from unittest.mock import patch diff --git a/generative/tests/test_runtime_config.py b/generative/tests/test_runtime_config.py index 565efcd..11c6808 100644 --- a/generative/tests/test_runtime_config.py +++ b/generative/tests/test_runtime_config.py @@ -1,8 +1,6 @@ from __future__ import annotations import dataclasses -import sys -from pathlib import Path import pytest diff --git a/generative/tests/test_semantic_dedup.py b/generative/tests/test_semantic_dedup.py index f6b34b1..7cbb0ff 100644 --- a/generative/tests/test_semantic_dedup.py +++ b/generative/tests/test_semantic_dedup.py @@ -2,9 +2,7 @@ Prüft ob Title-Varianten ohne Token-Overlap via Cosine-Similarity gemergt werden. """ import pytest -import sys -from pathlib import Path -from unittest.mock import MagicMock, patch +from unittest.mock import patch from generative.orchestrator import entity_resolution diff --git a/generative/tests/test_structured_parser.py b/generative/tests/test_structured_parser.py index 4f44f8f..844c430 100644 --- a/generative/tests/test_structured_parser.py +++ b/generative/tests/test_structured_parser.py @@ -4,9 +4,7 @@ Ohne diese Suite wiederholen wir das v16-Silent-Fail-Pattern (anchor_patterns). """ from __future__ import annotations -import sys import unittest -from pathlib import Path # Direct-Import-Pattern (wie in den anderen Modulen) — Sys-Path-Patch diff --git a/generative/tests/test_tag_whitelist.py b/generative/tests/test_tag_whitelist.py index ce17516..a610aca 100644 --- a/generative/tests/test_tag_whitelist.py +++ b/generative/tests/test_tag_whitelist.py @@ -6,8 +6,6 @@ - proposed-tags als getrenntes Schema-Feld für Bootstrap, KEIN Routing """ from __future__ import annotations -import sys -from pathlib import Path from generative.agents.context_builder import score_tags_for_source diff --git a/generative/tests/test_vault_writer.py b/generative/tests/test_vault_writer.py index 20e437c..ffd20d6 100644 --- a/generative/tests/test_vault_writer.py +++ b/generative/tests/test_vault_writer.py @@ -7,7 +7,6 @@ """ import unittest from unittest.mock import patch -from pathlib import Path from generative.pipeline.vault_writer import convert_inline_to_footnotes, build_quellen_block, render_merge_stub, VAULT from generative.schemas.atomic_note import AtomicNoteDraft, TextAnchor diff --git a/generative/tests/test_verifier_prepass.py b/generative/tests/test_verifier_prepass.py index 0a4c234..dfb58da 100644 --- a/generative/tests/test_verifier_prepass.py +++ b/generative/tests/test_verifier_prepass.py @@ -4,8 +4,6 @@ Anker ohne LLM-Call auf. LLM-Pfad bleibt Safety-Net für Edge-Cases. """ from __future__ import annotations -import sys -from pathlib import Path from unittest.mock import patch diff --git a/generative/tools/pdf_enrich.py b/generative/tools/pdf_enrich.py index 21ff986..db178b1 100644 --- a/generative/tools/pdf_enrich.py +++ b/generative/tools/pdf_enrich.py @@ -582,7 +582,6 @@ def grobid_lookup(pdf_path: Path, grobid_url: str = "http://localhost:8070", tim Gibt None zurück wenn Server nicht erreichbar oder Parsing fehlschlägt. """ import xml.etree.ElementTree as ET - import os url = f"{grobid_url.rstrip('/')}/api/processHeaderDocument" boundary = "AtomicAgentGrobid" diff --git a/lib/decision_engine/pipeline.py b/lib/decision_engine/pipeline.py index 10f8fa3..7cc9531 100644 --- a/lib/decision_engine/pipeline.py +++ b/lib/decision_engine/pipeline.py @@ -8,7 +8,7 @@ from collections.abc import Callable -from decision_engine.models import ClaimDecision, ClaimInput, QualityFlag +from decision_engine.models import ClaimDecision, ClaimInput from decision_engine.rules import ( DEFAULT_CONFIG, RulesConfig,