{
    "_comment_exporter": "=== HTML Exporter Settings ===",
    "_comment_base_url": "Base URL is now driven by CREATE.csv (bucket column)",
    "_comment_split": "Split size - articles per subfolder (e.g. 500 = folder_1, folder_2, etc.)",
    "split_size": 5385,
    "_comment_workers": "Parallel worker processes (1=sequential, recommended 4-6)",
    "worker_count": 4,
    "_comment_template": "Template to use. Available: modern, wiki, pinterest, monochrome, high-contrast, glassmorphism, generatepress-orange, gallery, cyberpunk, bento, flat-modern, dev-docs, premium-magazine, classic-magazine, brutalist, vivid-contrast, index",
    "template": "midnight-gold",
    "export": {
        "_comment_sitemap": "Generate sitemap.xml",
        "generate_sitemap": true,
        "_comment_index": "Generate index.html with 10 article summaries",
        "generate_index": true,
        "_comment_about": "Generate about-us.html",
        "generate_about": true,
        "_comment_related": "Related articles count",
        "related_articles_count": 10
    },
    "data_folder": "database",
    "export_folder": "export",
    "inject_folder": "inject",
    "memory": {
        "_comment_batch": "Batch size for processing articles",
        "batch_size": 100,
        "cache_json": false,
        "cache_templates": false
    },
    "_comment_scraper": "=== Pinterest Scraper Settings ===",
    "image_result": 15,
    "_comment_min_snippet": "Minimum number of description results required per keyword to save snippet",
    "min_snippet": 15,
    "_comment_snippet_max_page_size": "Max page size to scroll when trying to reach min_snippet",
    "snippet_max_page_size": 50,
    "_comment_related_kw": "=== Related Keywords (Google Suggest) ===",
    "_comment_max_related_kw": "Max related keywords to fetch per keyword",
    "max_related_kw": 10,
    "_comment_suggest_hl": "Language code for Google Suggest",
    "suggest_hl": "en",
    "_comment_suggest_gl": "Geo location for Google Suggest",
    "suggest_gl": "US",
    "concurrency": 25,
    "max_retries": 3,
    "retry_delay": 3,
"ai": {
        "base_url": "https://api.deepinfra.com/v1/openai",
        "api_key": "",
        "key_file": "api_keys.txt",
        "model": "mistralai/Mistral-Nemo-Instruct-2407",
        "concurrency": 100,
        "_comment_fallback": "Fallback models tried in order when primary model fails (rate limit, error, timeout). Uses same base_url and api_key unless overridden.",
        "fallback_models": [
            "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo"
        ],
        "max_retries": 2,
        "retry_delay": 5
    },
    "_comment_go": "=== Go Scraper Engine Settings ===",
    "go": {
        "_comment_warmup": "Send one warmup request per new TLS session (not per keyword). Sessions are recycled on error/non-200, so a fresh session warms up again.",
        "warmup_requests": false,
        "_comment_writer_batch": "Rows per SQLite transaction commit (scrape/snippet)",
        "writer_batch_size": 100,
        "_comment_ai_writer_batch": "Rows per SQLite transaction commit (AI title/article)",
        "ai_writer_batch_size": 200,
        "_comment_global_rate": "Max requests per second across all workers and services (0 = unlimited). Keeps total traffic under the Pinterest/Google threshold.",
        "global_rate_per_sec": 10,
        "_comment_proxy_rate": "Max requests per second per proxy IP (0 = unlimited, rely on concurrency)",
        "proxy_rate_per_sec": 0,
        "_comment_adaptive": "Auto-adjust rate on 429 responses (experimental)",
        "adaptive_rate": false,
        "_comment_session_bank": "Parallel TLS sessions per proxy. On a rotating proxy each session exits via its own IP, so higher = more IP budget. 12-20 recommended.",
        "session_bank_size": 12,
        "_comment_session_rotate": "Replace a session after N requests (fresh TLS fingerprint + cookies)",
        "session_rotate_after": 50
    }
}
