import os from pathlib import Path APP_TITLE = "MitrAnlil Yükseköğretim Mevzuatı AI Asistanı" APP_VERSION = "MitrAnlil Normative Runtime v1.3" OFFICIAL_SOURCE_URL = ( "https://www.mevzuat.gov.tr/" ) ROOT_DIR = Path(__file__).resolve().parent DATA_DIR = Path(os.getenv("MITRANLIL_DATA_DIR", str(ROOT_DIR / "data"))).resolve() SOURCE_DIR = DATA_DIR / "source" NORMALIZED_DIR = DATA_DIR / "normalized" STRUCTURAL_DIR = DATA_DIR / "structural" MCKF_DIR = DATA_DIR / "mckf" FEEDBACK_DIR = DATA_DIR / "feedback" ANALYTICS_DIR = DATA_DIR / "analytics" ADMIN_DIR = DATA_DIR / "admin" TEST_DATA_DIR = DATA_DIR / "tests" REGISTRY_DIR = DATA_DIR / "registry" ONBOARDING_DIR = DATA_DIR / "onboarding" INSTITUTION_REGISTRY_PATH = ONBOARDING_DIR / "institutions.json" SUBMISSIONS_DIR = ONBOARDING_DIR / "submissions" CANDIDATE_BUILDS_DIR = ONBOARDING_DIR / "builds" PUBLISH_BACKUPS_DIR = ONBOARDING_DIR / "backups" SOURCE_TEXT_PATH = SOURCE_DIR / "2547_clean.txt" LEGAL_DOCUMENT_REGISTRY_PATH = REGISTRY_DIR / "legal_documents.json" DECISION_CONTRACT_REGISTRY_PATH = REGISTRY_DIR / "normative_decision_contracts.json" MCKF_ONTOLOGY_PATH = MCKF_DIR / "2547_mckf_ontology.json" MCKF_SEMANTIC_FRAMES_PATH = MCKF_DIR / "2547_semantic_frames.jsonl" MCKF_RETRIEVAL_INDEX_PATH = MCKF_DIR / "2547_retrieval_index.json" CORPUS_MCKF_ONTOLOGY_PATH = MCKF_DIR / "corpus_mckf_ontology.json" CORPUS_SEMANTIC_FRAMES_PATH = MCKF_DIR / "corpus_semantic_frames.jsonl" CORPUS_RETRIEVAL_INDEX_PATH = MCKF_DIR / "corpus_retrieval_index.json" CROSS_DOCUMENT_EDGES_PATH = MCKF_DIR / "cross_document_edges.jsonl" RDFOX_PILOT_MANIFEST_PATH = MCKF_DIR / "rdfox_pilot_manifest.json" RDFOX_PILOT_TRIPLES_PATH = MCKF_DIR / "rdfox_pilot_triples.nt" RDFOX_PILOT_RULES_PATH = MCKF_DIR / "rdfox_pilot_rules.dlog" MCKF_SHAPES_PATH = MCKF_DIR / "mckf_shapes.ttl" MCKF_VALIDATION_REPORT_PATH = MCKF_DIR / "validation_report.json" RUNTIME_BUILD_MANIFEST_PATH = MCKF_DIR / "runtime_build_manifest.json" FEEDBACK_LOG_PATH = Path(os.getenv("FEEDBACK_LOG_PATH", str(FEEDBACK_DIR / "dialogue_feedback.jsonl"))) USAGE_LOG_PATH = Path(os.getenv("USAGE_LOG_PATH", str(ANALYTICS_DIR / "usage_events.jsonl"))) CLARIFICATION_LOG_PATH = Path(os.getenv("CLARIFICATION_LOG_PATH", str(ANALYTICS_DIR / "clarification_events.jsonl"))) ADMIN_EXAMPLES_PATH = Path(os.getenv("ADMIN_EXAMPLES_PATH", str(ADMIN_DIR / "example_questions.json"))) LLM_PROVIDER = os.getenv("LLM_PROVIDER", "auto").strip().lower() HF_MODEL = os.getenv("HF_MODEL") or os.getenv("GEN_MODEL", "Qwen/Qwen2.5-7B-Instruct") HF_TOKEN = os.getenv("HF_TOKEN") or os.getenv("HUGGINGFACEHUB_API_TOKEN") GROQ_API_KEY = os.getenv("GROQ_API_KEY") # NOT: llama-3.3-70b-versatile, Groq tarafından 16 Ağustos 2026'da tamamen # kapatılıyor (bkz. https://console.groq.com/docs/deprecations). Groq'un # resmi önerisi openai/gpt-oss-120b veya qwen/qwen3.6-27b. gpt-oss-120b'yi # seçtik: daha büyük parametre sayısı + reasoning modu, katı JSON claim # şemamız (proof_bundle.py) için daha güvenilir talimat takibi sağlıyor, # ayrıca Groq'ta token başına daha ucuz ve daha hızlı (bkz. sohbet # geçmişindeki fiyat/hız karşılaştırması). Free tier'da TPM sınırı # llama-3.3-70b-versatile'a göre daha düşük (8K vs 12K) — demo öncesi # Groq konsolünden hesap tier'ını ve gerçek istek hacmini test et. GROQ_MODEL = os.getenv("GROQ_MODEL", "openai/gpt-oss-120b") OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini") # NOT: proof_bundle.py'deki synthesis claim mekanizması ve llm_claim_prompt # içindeki few-shot örnekler çıktı uzunluğunu artırdı; 1000 tokenlık eski # sınır, çok maddeli sentez cevaplarında JSON'un ortadan kesilip parse # hatası vermesine yol açabilirdi. 1500'e çıkarıldı — bu, girdi promptunun # değil yalnızca modelin ÜRETTİĞİ çıktının üst sınırıdır. MAX_NEW_TOKENS = int(os.getenv("MAX_NEW_TOKENS", "1500")) MAX_CONTEXT_CHARS = int(os.getenv("MAX_CONTEXT_CHARS", "3000")) CHATBOT_HEIGHT = int(os.getenv("CHATBOT_HEIGHT", "660")) EVAL_CONTEXT_MAX_CHARS = int(os.getenv("EVAL_CONTEXT_MAX_CHARS", "6000"))