"""Tradecraft extractor (HUMINT/SIGINT methods, OPSEC procedures).""" import logging from .base import BaseExtractor from storage.models import Tradecraft from analysis.prompts import TRADECRAFT_SYSTEM_PROMPT, TRADECRAFT_EXTRACTION_PROMPT logger = logging.getLogger(__name__) class TradecraftExtractor(BaseExtractor): EXTRACTOR_NAME = "tradecraft" def get_system_prompt(self) -> str: return TRADECRAFT_SYSTEM_PROMPT def get_extraction_prompt(self, text: str) -> str: return TRADECRAFT_EXTRACTION_PROMPT.format(document=text) def get_json_schema(self) -> dict: return {"properties": {"items": {"type": "array"}}, "required": ["items"]} def process_response(self, data: dict, doc_id: str) -> int: items = data.get('items', []) if isinstance(data, list): items = data count = 0 for item in items: try: tc = Tradecraft( method=item.get('method', ''), domain=item.get('domain', ''), description=item.get('description', ''), operational_notes=item.get('operational_notes', ''), countermeasures=item.get('countermeasures', ''), source_doc_ids=[doc_id], source_context=item.get('source_context', '')[:500], ) self.db.insert_tradecraft(tc) count += 1 except Exception as e: logger.warning("Failed to process tradecraft item: %s", e) return count