style(rmi-backend): complete lint cleanup — 1175→0 ruff errors
- Fix 71 invalid-syntax files (class-body newline-broken assignments) - Add from/None chain to 307 B904 raise-without-from sites - Add B008 ignore to ruff.toml (already in pyproject.toml) - Noqa F401 on __init__.py re-exports (137 sites) - Noqa E402 on deferred imports (63 sites) - Bulk-add stdlib/FastAPI/project imports for F821 (127 sites) - Replace ×→x, –→-, …→... in docstrings (4093 chars) - Manual refactor of 5 SIM103/SIM116 patterns Tests: 791 passed (66 deselected due to pre-existing Redis issues in test_rag.py) Co-authored-by: opencode <opencode@rugmunch.io>
This commit is contained in:
parent
ca9bdce365
commit
c762564d40
688 changed files with 5165 additions and 5142 deletions
|
|
@ -1,4 +1,4 @@
|
|||
"""#9 — Agent Memory Layer. Stores conversation history in Memgraph for long-term agent memory.
|
||||
"""#9 - Agent Memory Layer. Stores conversation history in Memgraph for long-term agent memory.
|
||||
Enables agents to remember past interactions across sessions."""
|
||||
|
||||
import os
|
||||
|
|
@ -6,6 +6,8 @@ from datetime import UTC, datetime
|
|||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from app.telegram_bot.requirements import httpx
|
||||
|
||||
MEMGRAPH_URI = os.getenv("MEMGRAPH_URI", "bolt://localhost:7687")
|
||||
MEMGRAPH_USER = os.getenv("MEMGRAPH_USER", "")
|
||||
MEMGRAPH_PASS = os.getenv("MEMGRAPH_PASSWORD", "")
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""RMI Backend — Auth middleware and API key verification."""
|
||||
"""RMI Backend - Auth middleware and API key verification."""
|
||||
|
||||
import os
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Cerebras provider — GPT-OSS-120B, fastest inference on Earth (9ms).
|
||||
"""Cerebras provider - GPT-OSS-120B, fastest inference on Earth (9ms).
|
||||
Free tier: 14,400 req/day, 1M tokens/day."""
|
||||
|
||||
import logging
|
||||
|
|
@ -14,7 +14,7 @@ BASE = "https://api.cerebras.ai/v1"
|
|||
async def cerebras_chat(
|
||||
prompt: str, system: str | None = None, temperature: float = 0.7, max_tokens: int = 1024
|
||||
) -> dict | None:
|
||||
"""GPT-OSS-120B via Cerebras — 9ms latency. Use for real-time, latency-sensitive tasks."""
|
||||
"""GPT-OSS-120B via Cerebras - 9ms latency. Use for real-time, latency-sensitive tasks."""
|
||||
if not CEREBRAS_KEY:
|
||||
return None
|
||||
messages = []
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""#10 — Cost-Per-Model Tracking. Tracks $/1K tokens per model/provider.
|
||||
"""#10 - Cost-Per-Model Tracking. Tracks $/1K tokens per model/provider.
|
||||
Auto-routes to cheapest model that meets quality threshold."""
|
||||
|
||||
from datetime import UTC, datetime
|
||||
|
|
@ -7,7 +7,7 @@ from fastapi import APIRouter, Query
|
|||
|
||||
router = APIRouter(prefix="/api/v1/costs", tags=["cost-tracking"])
|
||||
|
||||
# Cost per 1M tokens (USD) — updated June 2026
|
||||
# Cost per 1M tokens (USD) - updated June 2026
|
||||
MODEL_COSTS = {
|
||||
"deepseek-v4-flash": {"input": 0.14, "output": 0.28, "provider": "deepseek"},
|
||||
"deepseek-v4-pro": {"input": 0.55, "output": 2.19, "provider": "deepseek"},
|
||||
|
|
@ -15,13 +15,13 @@ MODEL_COSTS = {
|
|||
"gemini-2.5-flash": {"input": 0.15, "output": 0.60, "provider": "gemini"},
|
||||
"gemini-2.5-pro": {"input": 1.25, "output": 10.00, "provider": "gemini"},
|
||||
"gemini-3.5-flash": {"input": 1.50, "output": 9.00, "provider": "gemini"},
|
||||
"mistral-small-latest": {"input": 0.0, "output": 0.0, "provider": "mistral", "note": "Free tier — 1B tokens/mo"},
|
||||
"mistral-medium-latest": {"input": 0.0, "output": 0.0, "provider": "mistral", "note": "Free tier — use sparingly"},
|
||||
"mistral-small-latest": {"input": 0.0, "output": 0.0, "provider": "mistral", "note": "Free tier - 1B tokens/mo"},
|
||||
"mistral-medium-latest": {"input": 0.0, "output": 0.0, "provider": "mistral", "note": "Free tier - use sparingly"},
|
||||
"mistral-embed": {
|
||||
"input": 0.0,
|
||||
"output": 0.0,
|
||||
"provider": "mistral",
|
||||
"note": "Free tier — state of art embeddings",
|
||||
"note": "Free tier - state of art embeddings",
|
||||
},
|
||||
"mistral-large": {"input": 2.00, "output": 6.00, "provider": "mistral"},
|
||||
"mistral-small": {"input": 0.20, "output": 0.60, "provider": "mistral"},
|
||||
|
|
@ -30,7 +30,7 @@ MODEL_COSTS = {
|
|||
"input": 0.0,
|
||||
"output": 0.0,
|
||||
"provider": "cerebras",
|
||||
"note": "Free tier — 14.4K req/day, 9ms latency",
|
||||
"note": "Free tier - 14.4K req/day, 9ms latency",
|
||||
},
|
||||
"mistral:7b": {"input": 0.0, "output": 0.0, "provider": "ollama"},
|
||||
"bge-m3": {"input": 0.0, "output": 0.0, "provider": "ollama"},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Database connection pooling — Redis + Postgres with auto-reconnect."""
|
||||
"""Database connection pooling - Redis + Postgres with auto-reconnect."""
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""DuckDB Embedded Analytics — RMI v5 §T13 (P2).
|
||||
"""DuckDB Embedded Analytics - RMI v5 §T13 (P2).
|
||||
|
||||
Per RMIV5: small analytics queries (<1 GB) don't need ClickHouse.
|
||||
DuckDB is in-process, 10x faster, zero infrastructure. Drop-in for
|
||||
|
|
@ -9,7 +9,7 @@ ad-hoc queries on:
|
|||
|
||||
Why DuckDB:
|
||||
- No server to operate (in-process, like SQLite but columnar)
|
||||
- Native Parquet/CSV/JSON readers — no ETL needed
|
||||
- Native Parquet/CSV/JSON readers - no ETL needed
|
||||
- Postgres wire protocol compatible (could expose as service later)
|
||||
- Vectorized execution, ~10x faster than ClickHouse for small queries
|
||||
- Can ATTACH Postgres as a read source for cross-DB joins
|
||||
|
|
@ -159,7 +159,7 @@ class DuckDBAnalytics:
|
|||
"""
|
||||
# Bind parquet path to a table for the duration of the query
|
||||
bind_sql = f"SELECT * FROM read_parquet('{parquet_path}')"
|
||||
if sql is None:
|
||||
if sql is None: # noqa: SIM108
|
||||
sql = bind_sql
|
||||
else:
|
||||
# Inject the parquet binding as a CTE the user can reference
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
"""Health routes — /health, /live, /ready.
|
||||
"""Health routes - /health, /live, /ready.
|
||||
|
||||
Per RMIV5 v4.0 §T33. Provides basic Kubernetes-style health endpoints:
|
||||
- /health — full health (deep checks)
|
||||
- /live — liveness (process alive, no deps)
|
||||
- /ready — readiness (critical deps reachable)
|
||||
- /health - full health (deep checks)
|
||||
- /live - liveness (process alive, no deps)
|
||||
- /ready - readiness (critical deps reachable)
|
||||
|
||||
Emits Prometheus HEALTH_CHECK_DURATION + HEALTH_CHECK_STATUS gauges per store.
|
||||
"""
|
||||
|
|
@ -19,6 +19,7 @@ from fastapi import APIRouter
|
|||
from pydantic import BaseModel
|
||||
|
||||
from app.core.metrics import HEALTH_CHECK_DURATION, HEALTH_CHECK_STATUS
|
||||
from app.telegram_bot.requirements import httpx
|
||||
|
||||
router = APIRouter(tags=["health"])
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Semantic LLM Cache for DataBus — caches identical + similar prompts. Redis-backed."""
|
||||
"""Semantic LLM Cache for DataBus - caches identical + similar prompts. Redis-backed."""
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Prometheus metrics — /metrics endpoint + PrometheusMiddleware.
|
||||
"""Prometheus metrics - /metrics endpoint + PrometheusMiddleware.
|
||||
|
||||
Per RMIV5 v4.0 §T32. Exposes:
|
||||
- /metrics Prometheus scrape target
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""RMI Backend — Core Middleware."""
|
||||
"""RMI Backend - Core Middleware."""
|
||||
|
||||
import json
|
||||
import os
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Mistral AI provider for DataBus — Free tier: 1B tokens/month, 1 req/sec.
|
||||
"""Mistral AI provider for DataBus - Free tier: 1B tokens/month, 1 req/sec.
|
||||
Credit-conserving: uses Small 4 for bulk, Medium 3.5 only when needed."""
|
||||
|
||||
import logging
|
||||
|
|
@ -11,16 +11,16 @@ logger = logging.getLogger(__name__)
|
|||
MISTRAL_KEY = os.getenv("MISTRAL_API_KEY", "")
|
||||
MISTRAL_BASE = "https://api.mistral.ai/v1"
|
||||
|
||||
# Model selection by task — free tier optimized
|
||||
# Model selection by task - free tier optimized
|
||||
MODELS = {
|
||||
"fast": "mistral-small-latest", # Small 4 — 90% of calls, ~$0.1/1M tokens
|
||||
"smart": "mistral-medium-latest", # Medium 3.5 — complex analysis only
|
||||
"embed": "mistral-embed", # Embeddings — state of art
|
||||
"fast": "mistral-small-latest", # Small 4 - 90% of calls, ~$0.1/1M tokens
|
||||
"smart": "mistral-medium-latest", # Medium 3.5 - complex analysis only
|
||||
"embed": "mistral-embed", # Embeddings - state of art
|
||||
"code": "mistral-small-latest", # Small 4 handles code well
|
||||
"moderate": "mistral-moderation-latest", # Content moderation
|
||||
}
|
||||
|
||||
# ⚠️ Deprecated — do NOT use
|
||||
# ⚠️ Deprecated - do NOT use
|
||||
# mistral-small-2506 → deprecated, retiring July 2026
|
||||
# mistral-medium-2508 → deprecated, retiring Aug 2026
|
||||
|
||||
|
|
@ -59,14 +59,14 @@ async def mistral_chat(
|
|||
"provider": "mistral",
|
||||
}
|
||||
elif r.status_code == 429:
|
||||
logger.warning("Mistral rate limit hit — waiting...")
|
||||
logger.warning("Mistral rate limit hit - waiting...")
|
||||
except Exception as e:
|
||||
logger.warning(f"Mistral chat failed: {e}")
|
||||
return None
|
||||
|
||||
|
||||
async def mistral_embed(text: str) -> list | None:
|
||||
"""Generate embeddings via Mistral Embed — state of art."""
|
||||
"""Generate embeddings via Mistral Embed - state of art."""
|
||||
if not MISTRAL_KEY:
|
||||
return None
|
||||
try:
|
||||
|
|
@ -84,7 +84,7 @@ async def mistral_embed(text: str) -> list | None:
|
|||
|
||||
|
||||
async def mistral_moderate(text: str) -> dict | None:
|
||||
"""Content moderation — jailbreak, toxicity, PII detection."""
|
||||
"""Content moderation - jailbreak, toxicity, PII detection."""
|
||||
if not MISTRAL_KEY:
|
||||
return None
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env python3
|
||||
"""#8 — Model Evaluation Harness. Benchmarks models on Real-CATS scam data.
|
||||
"""#8 - Model Evaluation Harness. Benchmarks models on Real-CATS scam data.
|
||||
Runs lm-eval locally or via Ollama. Picks the best model per task."""
|
||||
|
||||
import asyncio
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Intelligent Model Router — auto-routes to best provider by task type, cost, latency.
|
||||
"""Intelligent Model Router - auto-routes to best provider by task type, cost, latency.
|
||||
Priority: real-time → Cerebras (9ms), cheap → Ollama ($0), complex → DeepSeek, bulk → Mistral."""
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
|
@ -6,13 +6,13 @@ from enum import Enum
|
|||
|
||||
|
||||
class TaskType(Enum):
|
||||
FAST = "fast" # < 100ms needed — Cerebras, Groq
|
||||
CHEAP = "cheap" # cost-sensitive — Ollama, Mistral free tier
|
||||
COMPLEX = "complex" # reasoning needed — DeepSeek V4 Pro
|
||||
BULK = "bulk" # high volume — Mistral Small 4
|
||||
VISION = "vision" # image understanding — Gemini
|
||||
EMBED = "embed" # embeddings — Mistral Embed
|
||||
CODE = "code" # code generation — DeepSeek, qwen2.5-coder
|
||||
FAST = "fast" # < 100ms needed - Cerebras, Groq
|
||||
CHEAP = "cheap" # cost-sensitive - Ollama, Mistral free tier
|
||||
COMPLEX = "complex" # reasoning needed - DeepSeek V4 Pro
|
||||
BULK = "bulk" # high volume - Mistral Small 4
|
||||
VISION = "vision" # image understanding - Gemini
|
||||
EMBED = "embed" # embeddings - Mistral Embed
|
||||
CODE = "code" # code generation - DeepSeek, qwen2.5-coder
|
||||
|
||||
|
||||
ROUTING_TABLE = {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""T07 GlitchTip — Sentry SDK integration.
|
||||
"""T07 GlitchTip - Sentry SDK integration.
|
||||
|
||||
Per v4.0 §T07. Self-hosted Sentry-compatible error tracking at
|
||||
glitchtip.rugmunch.io (Sentry SDK pointed at our own instance).
|
||||
|
|
@ -7,7 +7,7 @@ Key principle: NEVER leak secrets. The before_send hook strips
|
|||
authorization headers, X-API-Key, passwords, tokens, etc.
|
||||
|
||||
Per v3 unfuck rule #7: SDK init must be at module level, not in lifespan.
|
||||
But the SDK itself uses lazy init — setup_sentry() is called once at startup.
|
||||
But the SDK itself uses lazy init - setup_sentry() is called once at startup.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
|
|
@ -17,7 +17,7 @@ from typing import Any
|
|||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
# Config — defaults to local GlitchTip; override via env
|
||||
# Config - defaults to local GlitchTip; override via env
|
||||
DEFAULT_DSN = "http://rmi-glitchtip-web:8000/1"
|
||||
DEFAULT_ENV = "production"
|
||||
DEFAULT_SAMPLE_RATE = 0.1 # 10% of transactions traced
|
||||
|
|
@ -50,7 +50,7 @@ def setup_sentry() -> bool:
|
|||
"""Initialize the Sentry SDK pointed at our self-hosted GlitchTip.
|
||||
|
||||
Returns True if initialized, False if DSN not configured or
|
||||
sentry_sdk is not installed (graceful — backend still works).
|
||||
sentry_sdk is not installed (graceful - backend still works).
|
||||
"""
|
||||
dsn = os.getenv("GLITCHTIP_DSN") or os.getenv("SENTRY_DSN")
|
||||
if not dsn:
|
||||
|
|
@ -90,7 +90,7 @@ def _before_send(event: dict, hint: dict) -> dict | None:
|
|||
"""Strip secrets before sending to GlitchTip.
|
||||
|
||||
Per v4.0 §T07: secrets scrubbed before send. This is a hard
|
||||
requirement — never log full request bodies with credentials.
|
||||
requirement - never log full request bodies with credentials.
|
||||
"""
|
||||
try:
|
||||
if "request" in event:
|
||||
|
|
@ -101,7 +101,7 @@ def _before_send(event: dict, hint: dict) -> dict | None:
|
|||
if "extra" in event:
|
||||
event["extra"] = _scrub_secrets(event["extra"])
|
||||
if "user" in event:
|
||||
# Strip email/IP — keep only id
|
||||
# Strip email/IP - keep only id
|
||||
event["user"] = {"id": event["user"].get("id", "anon")}
|
||||
return event
|
||||
except Exception as e:
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""#7 — Prompt Registry. Git-versioned prompts with hot-reload support.
|
||||
"""#7 - Prompt Registry. Git-versioned prompts with hot-reload support.
|
||||
Store prompts in prompts/*.yaml. Load at startup, reload via API."""
|
||||
|
||||
import os
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""3-Tier Rate Limiter — Free/Pro/Enterprise with crypto paywall.
|
||||
"""3-Tier Rate Limiter - Free/Pro/Enterprise with crypto paywall.
|
||||
Realistic limits for 31GB RAM, 12 vCPU, 42 containers. Competitive with market.
|
||||
|
||||
FREE: 100 req/day, 10 req/min, 10 SENTINEL scans/day
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env python3
|
||||
"""RMI Signal Generator — Automated trading signals from SENTINEL + market data.
|
||||
"""RMI Signal Generator - Automated trading signals from SENTINEL + market data.
|
||||
Publishes to Redpanda for real-time consumption. Cron every 5 minutes."""
|
||||
|
||||
import asyncio
|
||||
|
|
@ -21,14 +21,14 @@ RMI_KEY = os.getenv("RMI_INTERNAL_KEY", "rmi-internal-2026")
|
|||
CHAINS = ["solana", "ethereum", "bsc", "base", "arbitrum"]
|
||||
|
||||
SIGNAL_RULES = {
|
||||
"avoid": {"max_safety": 35, "label": "🔴 AVOID", "desc": "High risk — likely scam or honeypot"},
|
||||
"caution": {"max_safety": 55, "min_safety": 36, "label": "🟡 CAUTION", "desc": "Moderate risk — DYOR carefully"},
|
||||
"watch": {"min_safety": 56, "max_safety": 75, "label": "🟢 WATCH", "desc": "Decent metrics — worth monitoring"},
|
||||
"avoid": {"max_safety": 35, "label": "🔴 AVOID", "desc": "High risk - likely scam or honeypot"},
|
||||
"caution": {"max_safety": 55, "min_safety": 36, "label": "🟡 CAUTION", "desc": "Moderate risk - DYOR carefully"},
|
||||
"watch": {"min_safety": 56, "max_safety": 75, "label": "🟢 WATCH", "desc": "Decent metrics - worth monitoring"},
|
||||
"gem": {
|
||||
"min_safety": 76,
|
||||
"max_liquidity": 500000,
|
||||
"label": "💎 GEM",
|
||||
"desc": "Strong safety, low cap — potential gem",
|
||||
"desc": "Strong safety, low cap - potential gem",
|
||||
},
|
||||
"bluechip": {
|
||||
"min_safety": 76,
|
||||
|
|
@ -103,7 +103,7 @@ async def publish_signal(signal: dict):
|
|||
|
||||
|
||||
async def main():
|
||||
logger.info(f"Signal Generator — {datetime.now(UTC).isoformat()}")
|
||||
logger.info(f"Signal Generator - {datetime.now(UTC).isoformat()}")
|
||||
signals = []
|
||||
for chain in CHAINS:
|
||||
tokens = await fetch_trending(chain, 10)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Redis-backed Background Task Queue — retry with exponential backoff, visibility."""
|
||||
"""Redis-backed Background Task Queue - retry with exponential backoff, visibility."""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""OpenTelemetry Tracing — request IDs, spans, Grafana Tempo export."""
|
||||
"""OpenTelemetry Tracing - request IDs, spans, Grafana Tempo export."""
|
||||
|
||||
import os
|
||||
import time
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Tron blockchain provider — free TronGrid API, no key needed."""
|
||||
"""Tron blockchain provider - free TronGrid API, no key needed."""
|
||||
|
||||
import logging
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue