Files

1 line
197 KiB
JSON

{"repo": "antonpictures/anton-sifta", "files": {"grok_chat.py": {"d38a621390b347ff3b9060559024ef711d529829": {"t": 1785674550.2372499, "n": 14826, "h": "b88dc69801c91233", "c": "#!/usr/bin/env python3\n\"\"\"\nClean, no-TUI Grok chat for Alice / Matrix Terminal use.\nAuth is xAI OAuth (resolved by System.xai_grok_oauth_organ.load_credential).\n\nUsage (interactive):\n python3 ~/Music/ANTON_SIFTA/grok_chat.py\n alias alice-grok='python3 ~/Music/ANTON_SIFTA/grok_chat.py'\n\nOne-shot for Alice (the exact one-liner she types inside her Matrix Terminal PTY to delegate\nwithout hallucinating):\n python3 ~/Music/ANTON_SIFTA/grok_chat.py --one-shot \"question for full Grok power + context\"\n [--receipt] # mints unique uuid4 no-double-spend swimmer in organism field\n\nThis runs real xAI API call, prints the reply, Alice reads it in terminal, waits.\nSame power as George. Never hallucinates the answer — code forces delegation.\nAuth comes from the xAI OAuth login (Hermes / xai_grok_oauth_token) — no static key.\n\nFor the Swarm. 🐜⚡\n\"\"\"\n\nimport os\nimport sys\nimport time\nimport uuid\nimport hashlib\nimport json\nimport base64\nimport mimetypes\nfrom pathlib import Path\nimport requests\n\n# Models that can accept image_url content. Alice's Grok photo path uses the\n# xAI chat/completions API model id that currently works for multimodal calls;\n# grok-2-vision remains an explicit older vision tag.\n_VISION_OK_MODELS = (\"grok-4\", \"grok-2-vision\", \"grok-vision\")\n# George 2026-05-31: receipts proved grok vision calls returned a non-200 (rc=3) and\n# failed over to claude. Root cause = the model id. \"grok-4.3\" / \"grok-4.20-reasoning\"\n# are product version strings the xAI /v1/chat/completions API does NOT accept; the valid\n# multimodal API id is \"grok-4\". Owner-overridable via SIFTA_GROK_VISION_MODEL.\n_DEFAULT_VISION_MODEL = (os.environ.get(\"SIFTA_GROK_VISION_MODEL\", \"grok-4\").strip() or \"grok-4\")\n_XAI_OAUTH_LEDGER = Path(__file__).resolve().parent / \".sifta_state\" / \"xai_grok_oauth_calls.jsonl\"\n\n\ndef normalize_model_name(model: str) -> str:\n \"\"\"Normalize Alice cortex labels into xAI API model IDs.\n\n The desktop may call the cortex ``grok:grok-4.3`` while the xAI API wants\n just ``grok-4.3``. Keep this local and conservative so non-Grok labels are\n still passed through for explicit advanced use.\n \"\"\"\n m = (model or \"\").strip()\n if not m:\n return _DEFAULT_VISION_MODEL\n low = m.lower()\n if low.startswith((\"grok:\", \"xai:\")):\n m = m.split(\":\", 1)[1].strip()\n if \"/\" in m and \"grok-\" in m.lower():\n m = m.rsplit(\"/\", 1)[-1].strip()\n # Map grok-4.x product-version strings (grok-4.3, grok-4.20-reasoning) — which the\n # xAI API rejects — to the valid API id \"grok-4\". This is the chokepoint, so a\n # grok-4.3 leaking from the launcher/registry still hits the API as grok-4.\n if m.lower().startswith(\"grok-4.\"):\n m = _DEFAULT_VISION_MODEL if _DEFAULT_VISION_MODEL.lower().startswith(\"grok-4\") else \"grok-4\"\n return m or _DEFAULT_VISION_MODEL\n\n\ndef _image_data_uri(path: str) -> str:\n \"\"\"Read a local image and return a data: URI (base64) for the xAI image_url field.\"\"\"\n p = Path(path)\n data = p.read_bytes()\n mime = mimetypes.guess_type(p.name)[0] or \"image/png\"\n b64 = base64.b64encode(data).decode(\"ascii\")\n return f\"data:{mime};base64,{b64}\"\n\n\ndef build_one_shot_messages(query: str, image_paths=None) -> list:\n \"\"\"Build the xAI chat messages for a one-shot call. With no images this is the\n plain text form (unchanged). With images, content becomes a list of a text part\n plus one image_url part per local image (base64 data URI) — George r211: this is\n how grok cortex sees with grok's OWN eye instead of failing over to claude.\"\"\"\n images = [p for p in (image_paths or []) if p]\n if not images:\n return [{\"role\": \"user\", \"content\": (query or \"\").strip()}]\n content = [{\"type\": \"text\", \"text\": (query or \"\").strip()}]\n for ip in images:\n content.append({\"type\": \"image_url\", \"image_url\": {\"url\": _image_data_uri(ip)}})\n return [{\"role\": \"user\", \"content\": content}]\n\n\ndef vision_model_for(model: str, has_image: bool) -> str:\n \"\"\"Keep grok on a vision-capable model when an image is attached.\"\"\"\n m = normalize_model_name(model)\n if not has_image:\n return m\n if any(tag in m.lower() for tag in _VISION_OK_MODELS):\n return m\n return _DEFAULT_VISION_MODEL\n\n\ndef get_api_key():\n # George 2026-05-31: grok auth is xAI OAuth, NOT a static XAI_API_KEY. The bearer is\n # resolved by load_credential (Hermes xAI OAuth at ~/.hermes/auth.json,\n # .sifta_state/secrets/xai_grok_oauth_token.json, or XAI_OAUTH_ACCESS_TOKEN). We no\n # longer instruct the owner to set XAI_API_KEY.\n try:\n from System.xai_grok_oauth_organ import load_credential\n cred = load_credential()\n if cred is not None and cred.value:\n return cred.value.strip()\n except Exception as exc:\n print(f\"grok auth: could not load xAI OAuth credential: {exc}\")\n print(\"ERROR: no xAI OAuth credential found.\")\n print(\"Log in via xAI OAuth (Hermes). Token is read from ~/.hermes/auth.json or \"\n \".sifta_state/secrets/xai_grok_oauth_token.json.\")\n sys.exit(1)\n\n\ndef _redact_secret(value: str) -> str:\n text = str(value or \"\")\n if len(text) <= 10:\n return \"***\"\n return f\"{text[:5]}...{text[-4:]}\"\n\n\ndef write_grok_chat_oauth_receipt(\n *,\n ok: bool,\n reason: str,\n model: str,\n status_code: int | None = None,\n response_text: str = \"\",\n credential_value: str = \"\",\n had_image: bool = False,\n endpoint: str = \"chat/completions\",\n) -> dict:\n \"\"\"Record the actual Grok chat/completions health path Alice used.\n\n The xAI OAuth organ records response-endpoint calls, while this CLI arm uses\n chat/completions directly. Keep the receipt in the same health ledger so\n future arms can inspect whether Grok OAuth is working or stale.\n \"\"\"\n receipt = {\n \"ts\": time.time(),\n \"trace_id\": str(uuid.uuid4()),\n \"truth_label\": \"XAI_GROK_CHAT_COMPLETION_CALL_V1\",\n \"ok\": bool(ok),\n \"reason\": str(reason or \"\"),\n \"status_code\": status_code,\n \"model\": model,\n \"endpoint\": endpoint,\n \"had_image\": bool(had_image),\n \"credential_kind\": \"oauth_access_token\" if credential_value else None,\n \"credential_redacted\": _redact_secret(credential_value) if credential_value else None,\n \"response_preview\": str(response_text or \"\")[:500],\n \"source\": \"grok_chat.py\",\n }\n try:\n _XAI_OAUTH_LEDGER.parent.mkdir(parents=True, exist_ok=True)\n with _XAI_OAUTH_LEDGER.open(\"a\", encoding=\"utf-8\") as handle:\n handle.write(json.dumps(receipt, ensure_ascii=False, sort_keys=True) + \"\\n\")\n except Exception:\n pass\n return receipt\n\n\ndef mint_grok_delegation_swimmer(query: str, reply: str, invoker: str = \"alice_matrix_terminal\") -> dict:\n \"\"\"Mint a unique no-double-spend organism-level swimmer receipt for Alice→Grok call.\n Distinct from Predator-Gate IDE code-change logs. Appends to .sifta_state/alice_grok_delegations.jsonl\n \"\"\"\n repo = Path(__file__).resolve().parent\n state_dir = repo / \".sifta_state\"\n state_dir.mkdir(parents=True, exist_ok=True)\n ledger = state_dir / \"alice_grok_delegations.jsonl\"\n swimmer_id = str(uuid.uuid4())\n ts = time.time()\n q_hash = hashlib.sha256((query or \"\").encode(\"utf-8\")).hexdigest()[:16]\n r_hash = hashlib.sha256((reply or \"\").encode(\"utf-8\")).hexdigest()[:16]\n receipt = {\n \"swimmer_id\": swimmer_id,\n \"type\": \"ALICE_GROK_DELEGATION\",\n \"ts\": ts,\n \"invoker\": invoker,\n \"query\": (query or \"\")[:200], # truncated for ledger; full in transcript\n \"query_hash\": q_hash,\n \"reply_hash\": r_hash,\n \"reply_len\": len(reply or \"\"),\n \"stgm_cost\": 0.03, # symbolic inference cost in STGM for economy; real API billed to key owner\n \"no_double_spend\": True,\n \"covenant\": \"Read Documents/IDE_BOOT_COVENANT.md; Alice invokes, Grok answers in terminal, Alice reads + waits\",\n \"node_serial\": \"GTH4921YP3\",\n }\n try:\n with open(ledger, \"a\", encoding=\"utf-8\") as f:\n f.write(json.dumps(receipt, ensure_ascii=False) + \"\\n\")\n except Exception as e:\n print(f\"[receipt warning] could not append swimmer: {e}\")\n return receipt\n\ndef main():\n import argparse\n parser = argparse.ArgumentParser(description=\"Clean Grok for Alice Matrix Terminal\")\n parser.add_argument(\"--one-shot\", dest=\"one_shot\", type=str, default=None,\n help=\"One-shot delegation prompt. Alice types: python ... --one-shot 'question'\")\n parser.add_argument(\"--receipt\", action=\"store_true\", help=\"Mint organism swimmer receipt for this call\")\n parser.add_argument(\"--model\", default=_DEFAULT_VISION_MODEL, help=\"xAI model (default: grok-4)\")\n parser.add_argument(\"--image\", dest=\"image\", action=\"append\", default=None,\n help=\"Path to a local image grok should LOOK at (repeatable). \"\n \"George r211: grok's own eye via xAI image_url, no claude failover.\")\n parser.add_argument(\"--invoker\", default=\"alice_matrix_terminal\", help=\"Who is delegating (for receipt)\")\n args = parser.parse_args()\n\n api_key = get_api_key()\n headers = {\n \"Authorization\": f\"Bearer {api_key}\",\n \"Content-Type\": \"application/json\"\n }\n model = normalize_model_name(args.model)\n\n if args.one_shot:\n # Alice's reliable delegation path: real Grok, no hallucination, receipt optional\n query = args.one_shot.strip()\n image_paths = list(args.image or [])\n missing = [p for p in image_paths if not Path(p).exists()]\n if missing:\n print(f\"ERROR: image not found: {missing}\")\n sys.exit(5)\n has_image = bool(image_paths)\n model = vision_model_for(model, has_image)\n messages = build_one_shot_messages(query, image_paths)\n payload = {\n \"model\": model,\n \"messages\": messages,\n \"temperature\": 0.6,\n \"stream\": False\n }\n try:\n resp = requests.post(\n \"https://api.x.ai/v1/chat/completions\",\n headers=headers,\n json=payload,\n timeout=180\n )\n except Exception as e:\n print(f\"Request error: {e}\")\n write_grok_chat_oauth_receipt(\n ok=False,\n reason=f\"request_error:{type(e).__name__}:{e}\",\n model=model,\n credential_value=api_key,\n had_image=has_image,\n )\n sys.exit(2)\n if resp.status_code != 200:\n print(f\"API error {resp.status_code}: {resp.text}\")\n write_grok_chat_oauth_receipt(\n ok=False,\n reason=f\"api_error:{resp.status_code}\",\n model=model,\n status_code=resp.status_code,\n response_text=resp.text,\n credential_value=api_key,\n had_image=has_image,\n )\n # George 2026-05-31: capture the EXACT xAI rejection so a future grok failure\n # is self-diagnosing (model-not-found vs 401-auth vs ...), not an opaque rc=3.\n try:\n errp = Path(__file__).resolve().parent / \".sifta_state\" / \"grok_api_errors.jsonl\"\n errp.parent.mkdir(parents=True, exist_ok=True)\n with errp.open(\"a\", encoding=\"utf-8\") as _ef:\n _ef.write(json.dumps({\n \"ts\": time.time(), \"http_status\": resp.status_code,\n \"body\": str(resp.text)[:400], \"model\": model,\n \"had_image\": bool(args.image), \"endpoint\": \"chat/completions\",\n }, ensure_ascii=False) + \"\\n\")\n except Exception:\n pass\n sys.exit(3)\n data = resp.json()\n try:\n reply = data[\"choices\"][0][\"message\"][\"content\"]\n except (KeyError, IndexError):\n print(\"Unexpected response format:\", data)\n sys.exit(4)\n print(f\"Grok: {reply}\\n\")\n write_grok_chat_oauth_receipt(\n ok=True,\n reason=\"api_response\",\n model=model,\n status_code=resp.status_code,\n response_text=reply,\n credential_value=api_key,\n had_image=has_image,\n )\n if args.receipt:\n rec = mint_grok_delegation_swimmer(query, reply, args.invoker)\n print(f\"[organism receipt] swimmer_id={rec['swimmer_id']} stgm_cost={rec['stgm_cost']}\")\n return\n\n # Interactive mode (owner direct use)\n print(\"Grok (clean mode) — type 'exit' or 'quit' to leave.\\n\")\n\n messages = []\n\n while True:\n try:\n user_input = input(\"You: \").strip()\n except (EOFError, KeyboardInterrupt):\n print(\"\\nExiting.\")\n break\n\n if user_input.lower() in (\"exit\", \"quit\"):\n break\n\n if not user_input:\n continue\n\n messages.append({\"role\": \"user\", \"content\": user_input})\n\n payload = {\n \"model\": model,\n \"messages\": messages,\n \"temperature\": 0.7,\n \"stream\": False\n }\n\n try:\n resp = requests.post(\n \"https://api.x.ai/v1/chat/completions\",\n headers=headers,\n json=payload,\n timeout=120\n )\n except Exception as e:\n print(f\"Request error: {e}\")\n write_grok_chat_oauth_receipt(\n ok=False,\n reason=f\"request_error:{type(e).__name__}:{e}\",\n model=model,\n credential_value=api_key,\n )\n continue\n\n if resp.status_code != 200:\n print(f\"API error {resp.status_code}: {resp.text}\")\n write_grok_chat_oauth_receipt(\n ok=False,\n reason=f\"api_error:{resp.status_code}\",\n model=model,\n status_code=resp.status_code,\n response_text=resp.text,\n credential_value=api_key,\n )\n messages.pop()\n continue\n\n data = resp.json()\n try:\n reply = data[\"choices\"][0][\"message\"][\"content\"]\n except (KeyError, IndexError):\n print(\"Unexpected response format:\", data)\n messages.pop()\n continue\n\n print(f\"Grok: {reply}\\n\")\n write_grok_chat_oauth_receipt(\n ok=True,\n reason=\"api_response\",\n model=model,\n status_code=resp.status_code,\n response_text=reply,\n credential_value=api_key,\n )\n messages.append({\"role\": \"assistant\", \"content\": reply})\n\nif __name__ == \"__main__\":\n main()\n"}}, "Applications/sifta_settings.py": {"d38a621390b347ff3b9060559024ef711d529829": {"t": 1785746916.4051032, "n": 13723, "h": "0e5b86b8a77273ea", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"alice-gemma4-e2b-cortex-5.1b-4.4gb:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Gemini, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "1e69c71fb981c5fafc88a24e94b1cd6b25e4e87f": {"t": 1785768934.0710151, "n": 13723, "h": "0e5b86b8a77273ea", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"alice-gemma4-e2b-cortex-5.1b-4.4gb:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Gemini, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "32fc6b37818774d803cf9058b0850b10343f06e3": {"t": 1785768939.5344348, "n": 13714, "h": "180bb2e322f6ca32", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"alice-m1-scout-2.3b-2.7gb:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Gemini, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "c4382435480f2d6f6dd445c339f7ca4907756593": {"t": 1785768943.183118, "n": 13722, "h": "f7631a557ba5f3ad", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"alice-m1-scout-2.3b-2.7gb:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "2f2d82e7bc7fb483337af6bc889d88322eda5ba8": {"t": 1785768945.9971216, "n": 13700, "h": "625e7768bdf21ed8", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"qwen3.5:2b\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "2b4bcf61385bb9292ad84fcc24bea19220d692e9": {"t": 1785768950.0955424, "n": 13726, "h": "30afb3372827f175", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"huihui_ai/gemma-4-abliterated:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "ba98a3b673fa4ca3a5bb81a953b9fd0a20b5b288": {"t": 1785768952.5006928, "n": 13700, "h": "625e7768bdf21ed8", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"qwen3.5:2b\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "266ef90488893c87646f81f5d5f7a5951ae25ebd": {"t": 1785768955.1451817, "n": 13726, "h": "30afb3372827f175", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"huihui_ai/gemma-4-abliterated:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "65fb860c6b2db0943fab673be0e48d43080328a9": {"t": 1785768961.9104428, "n": 13707, "h": "afa9b0d9101972ad", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"gemma4-phc:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "cf91bb0a53ae9eee8044b98e8ffbedeefede9d94": {"t": 1785768963.8752074, "n": 13703, "h": "86fc7a663918515f", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"llama3:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n sys_dir = os.path.join(REPO_ROOT, \"System\")\n if sys_dir not in sys.path:\n sys.path.insert(0, sys_dir)\n from silicon_serial import read_apple_serial\n serial = read_apple_serial()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "fb0c9b026271dd0dc0282efb8c005ac6e3d749e7": {"t": 1785768967.4342127, "n": 13658, "h": "2777756aab1277b4", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"llama3:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n status_ready = pyqtSignal(str)\n\n def __init__(self, mode=\"models\"):\n super().__init__()\n self.mode = mode\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n if self.mode == \"models\":\n self.models_ready.emit(names)\n else:\n status = \"OK:\\n\" + \"\\n\".join(f\" {n}\" for n in names)\n self.status_ready.emit(status)\n except Exception as e:\n if self.mode == \"models\":\n self.error.emit(str(e))\n else:\n self.status_ready.emit(f\"OFFLINE: {e}\")\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n import subprocess\n raw = subprocess.check_output(\"/usr/sbin/ioreg -l | grep IOPlatformSerialNumber\", shell=True)\n serial = raw.decode().split('\"')[-2].strip()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher(mode=\"models\") # strong ref\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n \"\"\"Non-blocking — runs in QThread. Prevents SIGABRT from blocking Qt main thread.\"\"\"\n self.active_status.setText(\"Checking Ollama...\")\n self._status_fetcher = OllamaFetcher(mode=\"status\") # strong ref prevents GC\n self._status_fetcher.status_ready.connect(self._on_status_ready)\n self._status_fetcher.start()\n\n def _on_status_ready(self, status):\n if \"OFFLINE\" in status:\n self.active_status.setText(f\"Ollama OFFLINE\\nRun: ollama serve\\n{status}\")\n else:\n self.active_status.setText(f\"Ollama ONLINE\\n{status}\")\n\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}, "09ce0901617e2cb90022d7d66d505b727041e9c0": {"t": 1785768971.6520734, "n": 13084, "h": "c1ae4190f89b1be2", "c": "#!/usr/bin/env python3\n# ─────────────────────────────────────────────────────────────\n# SIFTA OS — Intelligence Settings\n# Configure local Ollama models, OpenRouter API, and active\n# inference engine for all Swarm Voice entities on this node.\n# ─────────────────────────────────────────────────────────────\n\nimport sys, json, os, urllib.request, urllib.error\nfrom PyQt6.QtWidgets import (\n QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,\n QPushButton, QComboBox, QLineEdit, QTabWidget, QFrame,\n QListWidget, QListWidgetItem, QMessageBox, QCheckBox, QTextEdit\n)\nfrom PyQt6.QtCore import Qt, QThread, pyqtSignal\nfrom PyQt6.QtGui import QFont\n\nREPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nSETTINGS_FILE = os.path.join(REPO_ROOT, \".sifta_state\", \"intelligence_settings.json\")\n\nOPENROUTER_MODELS = [\n \"meta-llama/llama-4-maverick\",\n \"meta-llama/llama-4-scout\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"anthropic/claude-sonnet-4-5\",\n \"google/gemini-2.5-pro-preview\",\n \"mistralai/mistral-large\",\n \"deepseek/deepseek-r1\",\n \"openai/gpt-4o\",\n]\n\n# ─────────────────────────────────────────────────────────────\n\ndef load_settings():\n try:\n with open(SETTINGS_FILE, \"r\") as f:\n return json.load(f)\n except Exception:\n return {\n \"active_engine\": \"ollama\",\n \"ollama_model\": \"llama3:latest\",\n \"openrouter_key\": \"\",\n \"openrouter_model\": \"meta-llama/llama-4-maverick\",\n }\n\ndef save_settings(data: dict):\n os.makedirs(os.path.dirname(SETTINGS_FILE), exist_ok=True)\n with open(SETTINGS_FILE, \"w\") as f:\n json.dump(data, f, indent=2)\n\n# ─────────────────────────────────────────────────────────────\n\nclass OllamaFetcher(QThread):\n models_ready = pyqtSignal(list)\n error = pyqtSignal(str)\n\n def run(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=5) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n self.models_ready.emit(names)\n except Exception as e:\n self.error.emit(str(e))\n\n# ─────────────────────────────────────────────────────────────\n\nclass SettingsWindow(QWidget):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(\"SIFTA OS — Intelligence Settings\")\n self.setMinimumSize(640, 520)\n self.setStyleSheet(\"\"\"\n QWidget { background-color: #0d0e17; color: #a9b1d6; font-family: 'Inter'; font-size: 13px; }\n QTabWidget::pane { border: 1px solid #2a2b3d; border-radius: 6px; }\n QTabBar::tab { background: #1a1b2e; color: #565f89; padding: 8px 20px;\n border-radius: 4px; margin-right: 2px; }\n QTabBar::tab:selected { background: #24253a; color: #7aa2f7; }\n QComboBox { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QComboBox::drop-down { border: none; }\n QLineEdit { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 6px; color: #a9b1d6; }\n QPushButton { background: #24253a; border: 1px solid #2a2b3d; border-radius: 4px;\n padding: 8px 16px; color: #a9b1d6; }\n QPushButton:hover { background: #2a2b3d; color: #7aa2f7; }\n QPushButton#primary { background: #3d59a1; color: #ffffff; border: none; }\n QPushButton#primary:hover { background: #4a6cbf; }\n QListWidget { background: #1a1b2e; border: 1px solid #2a2b3d; border-radius: 4px; padding: 4px; }\n QListWidget::item:selected { background: #3d59a1; color: #ffffff; border-radius: 3px; }\n QLabel#section { color: #7aa2f7; font-size: 12px; font-weight: bold;\n padding: 8px 0 4px 0; letter-spacing: 1px; }\n QLabel#hint { color: #565f89; font-size: 11px; }\n \"\"\")\n\n self.settings = load_settings()\n layout = QVBoxLayout(self)\n layout.setContentsMargins(20, 20, 20, 20)\n layout.setSpacing(12)\n\n # Title\n title = QLabel(\"⚡ INTELLIGENCE SETTINGS\")\n title.setFont(QFont(\"Inter\", 14, QFont.Weight.Bold))\n title.setStyleSheet(\"color: #7aa2f7; margin-bottom: 8px;\")\n layout.addWidget(title)\n\n node_label = QLabel(f\"Node: {self._get_node_identity()}\")\n node_label.setObjectName(\"hint\")\n layout.addWidget(node_label)\n\n # Tabs\n tabs = QTabWidget()\n tabs.addTab(self._build_ollama_tab(), \"🖥 Local Ollama\")\n tabs.addTab(self._build_openrouter_tab(), \"🌐 OpenRouter\")\n tabs.addTab(self._build_active_tab(), \"⚡ Active Engine\")\n layout.addWidget(tabs)\n\n # Save\n save_btn = QPushButton(\"SAVE SETTINGS\")\n save_btn.setObjectName(\"primary\")\n save_btn.setFont(QFont(\"Inter\", 12, QFont.Weight.Bold))\n save_btn.clicked.connect(self._save)\n layout.addWidget(save_btn)\n\n def _get_node_identity(self):\n try:\n import subprocess\n raw = subprocess.check_output(\"/usr/sbin/ioreg -l | grep IOPlatformSerialNumber\", shell=True)\n serial = raw.decode().split('\"')[-2].strip()\n registry = {\"GTH4921YP3\": \"ALICE_M5 — Mac Studio\", \"C07FL0JAQ6NV\": \"M1THER — Mac Mini\"}\n return f\"{registry.get(serial, 'UNKNOWN')} ({serial})\"\n except Exception:\n return \"UNKNOWN NODE\"\n\n # ── Ollama Tab ────────────────────────────────────────────\n def _build_ollama_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"LOCAL OLLAMA MODELS\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Models installed on this node's silicon. Inference stays local — no cloud.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.ollama_list = QListWidget()\n self.ollama_list.setMinimumHeight(160)\n lay.addWidget(self.ollama_list)\n\n row = QHBoxLayout()\n self.refresh_btn = QPushButton(\"↻ Refresh\")\n self.refresh_btn.clicked.connect(self._refresh_ollama)\n row.addWidget(self.refresh_btn)\n\n # Llama 4 pull button\n llama4_btn = QPushButton(\"⬇ Pull Llama 4 Maverick (70B)\")\n llama4_btn.setStyleSheet(\"color: #ff9e64; border-color: #ff9e64;\")\n llama4_btn.clicked.connect(self._pull_llama4)\n row.addWidget(llama4_btn)\n lay.addLayout(row)\n\n self.ollama_selected = QComboBox()\n self.ollama_selected.setPlaceholderText(\"Select active local model...\")\n lay.addWidget(self.ollama_selected)\n\n lay.addStretch()\n self._refresh_ollama()\n return w\n\n def _refresh_ollama(self):\n self.refresh_btn.setText(\"Fetching...\")\n self.refresh_btn.setEnabled(False)\n self._fetcher = OllamaFetcher()\n self._fetcher.models_ready.connect(self._on_ollama_models)\n self._fetcher.error.connect(self._on_ollama_error)\n self._fetcher.start()\n\n def _on_ollama_models(self, models):\n self.ollama_list.clear()\n self.ollama_selected.clear()\n for m in models:\n self.ollama_list.addItem(m)\n self.ollama_selected.addItem(m)\n current = self.settings.get(\"ollama_model\", \"\")\n idx = self.ollama_selected.findText(current)\n if idx >= 0:\n self.ollama_selected.setCurrentIndex(idx)\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _on_ollama_error(self, err):\n self.ollama_list.clear()\n self.ollama_list.addItem(f\"[ERROR] Ollama not reachable: {err}\")\n self.ollama_list.addItem(\"Run: ollama serve\")\n self.refresh_btn.setText(\"↻ Refresh\")\n self.refresh_btn.setEnabled(True)\n\n def _pull_llama4(self):\n import subprocess\n QMessageBox.information(self, \"Pulling Llama 4\",\n \"Running: ollama pull meta-llama/llama-4-maverick\\n\\nThis may take a while depending on your connection.\\nCheck terminal for progress.\")\n subprocess.Popen([\"ollama\", \"pull\", \"meta-llama/llama-4-maverick\"])\n\n # ── OpenRouter Tab ────────────────────────────────────────\n def _build_openrouter_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"OPENROUTER API\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"OpenRouter gives access to Llama 4, Claude, Gemini, DeepSeek and more via one API key.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n key_lbl = QLabel(\"API Key:\")\n key_lbl.setObjectName(\"hint\")\n lay.addWidget(key_lbl)\n\n self.or_key = QLineEdit()\n self.or_key.setEchoMode(QLineEdit.EchoMode.Password)\n self.or_key.setPlaceholderText(\"sk-or-v1-...\")\n self.or_key.setText(self.settings.get(\"openrouter_key\", \"\"))\n lay.addWidget(self.or_key)\n\n model_lbl = QLabel(\"Model:\")\n model_lbl.setObjectName(\"hint\")\n lay.addWidget(model_lbl)\n\n self.or_model = QComboBox()\n for m in OPENROUTER_MODELS:\n self.or_model.addItem(m)\n current_or = self.settings.get(\"openrouter_model\", OPENROUTER_MODELS[0])\n idx = self.or_model.findText(current_or)\n if idx >= 0:\n self.or_model.setCurrentIndex(idx)\n lay.addWidget(self.or_model)\n\n note = QLabel(\"⚠ OpenRouter sends messages to external servers. Use only for non-sensitive queries.\")\n note.setObjectName(\"hint\")\n note.setWordWrap(True)\n note.setStyleSheet(\"color: #e0af68; font-size: 11px;\")\n lay.addWidget(note)\n\n lay.addStretch()\n return w\n\n # ── Active Engine Tab ─────────────────────────────────────\n def _build_active_tab(self):\n w = QWidget()\n lay = QVBoxLayout(w)\n lay.setContentsMargins(16, 16, 16, 16)\n lay.setSpacing(10)\n\n lbl = QLabel(\"ACTIVE INFERENCE ENGINE\")\n lbl.setObjectName(\"section\")\n lay.addWidget(lbl)\n\n hint = QLabel(\"Choose which engine the Swarm Voice uses when the Architect sends a message.\")\n hint.setObjectName(\"hint\")\n hint.setWordWrap(True)\n lay.addWidget(hint)\n\n self.engine_combo = QComboBox()\n self.engine_combo.addItems([\"ollama — Local silicon (sovereign, offline)\", \"openrouter — Cloud models (Llama 4, Claude, etc.)\"])\n current_engine = self.settings.get(\"active_engine\", \"ollama\")\n self.engine_combo.setCurrentIndex(0 if current_engine == \"ollama\" else 1)\n lay.addWidget(self.engine_combo)\n\n status_lbl = QLabel(\"LOCAL MODELS DETECTED:\")\n status_lbl.setObjectName(\"section\")\n lay.addWidget(status_lbl)\n\n self.active_status = QTextEdit()\n self.active_status.setReadOnly(True)\n self.active_status.setMaximumHeight(120)\n self.active_status.setStyleSheet(\"background: #1a1b2e; border: 1px solid #2a2b3d; border-radius:4px; color: #9ece6a; font-family: monospace; font-size: 11px;\")\n self.active_status.setText(\"Checking Ollama...\")\n lay.addWidget(self.active_status)\n\n self._check_active_status()\n lay.addStretch()\n return w\n\n def _check_active_status(self):\n try:\n req = urllib.request.Request(\"http://127.0.0.1:11434/api/tags\")\n with urllib.request.urlopen(req, timeout=3) as r:\n data = json.loads(r.read().decode())\n names = [m[\"name\"] for m in data.get(\"models\", [])]\n self.active_status.setText(\"✅ Ollama ONLINE\\n\" + \"\\n\".join(f\" • {n}\" for n in names))\n except Exception:\n self.active_status.setText(\"❌ Ollama OFFLINE\\nRun: ollama serve\")\n\n # ── Save ──────────────────────────────────────────────────\n def _save(self):\n engine = \"ollama\" if self.engine_combo.currentIndex() == 0 else \"openrouter\"\n data = {\n \"active_engine\": engine,\n \"ollama_model\": self.ollama_selected.currentText(),\n \"openrouter_key\": self.or_key.text().strip(),\n \"openrouter_model\": self.or_model.currentText(),\n }\n save_settings(data)\n QMessageBox.information(self, \"Saved\",\n f\"Settings saved.\\nActive engine: {engine}\\n\"\n f\"Model: {data['ollama_model'] if engine == 'ollama' else data['openrouter_model']}\")\n\n# ─────────────────────────────────────────────────────────────\n\nif __name__ == \"__main__\":\n app = QApplication(sys.argv)\n app.setApplicationName(\"SIFTA Intelligence Settings\")\n w = SettingsWindow()\n w.show()\n sys.exit(app.exec())\n"}}}}