Spaces:
Running
Running
|
Download architecture.md from IDKHowToCodeFr/vera-engine: direct link, hf CLI and curl.
- Browser
- Download file 9.26 kB
-
https://huggingface.co/spaces/IDKHowToCodeFr/vera-engine/resolve/main/architecture.md
- Command line
-
hf download hf://spaces/IDKHowToCodeFr/vera-engine/architecture.md
-
curl -L -o architecture.md https://huggingface.co/spaces/IDKHowToCodeFr/vera-engine/resolve/main/architecture.md
9.26 kB
| # 🏛️ Vera AI Engine - Architecture & Strategy | |
| This document details the architectural decisions, model choices, and performance tradeoffs made for the magicpin Vera AI Challenge. The solution is explicitly optimized for **speed, deterministic output, and reliability** in a CPU-bound (Hugging Face Spaces) environment. | |
| --- | |
| ## 1. Architectural Philosophy: The "Python Caveman" Pattern | |
| A common anti-pattern in AI composition engines is feeding a massive 500KB JSON context directly into the prompt. This causes extreme latency bottlenecks (especially on CPUs) and drastically increases hallucination risks. | |
| ```mermaid | |
| flowchart TD | |
| subgraph group_api["API and Context"] | |
| node_context_api["Context Ingestion<br/>[app.py]"] | |
| node_context_store[("Context State<br/>[app.py]")] | |
| node_tick_api["Trigger API<br/>[app.py]"] | |
| node_reply_api["Reply API<br/>[app.py]"] | |
| node_health_metadata["Health and Metadata<br/>[app.py]"] | |
| end | |
| subgraph group_engagement["Engagement Workflow"] | |
| node_trigger_processing["Trigger Processing<br/>[app.py]"] | |
| node_reply_classification["Reply Classification<br/>[app.py]"] | |
| end | |
| subgraph group_composition["Message Composition"] | |
| node_composer["Context Distiller<br/>[composer.py]"] | |
| node_prompt_builder["Prompt Builder<br/>[prompts.py]"] | |
| node_output_validation["Validation and Repair<br/>[composer.py]"] | |
| end | |
| subgraph group_inference["Model Inference"] | |
| node_model_router["Fallback Composer<br/>[composer.py]"] | |
| node_llm_adapter["Model Adapters<br/>[llm.py]"] | |
| node_local_model["Local Qwen Model<br/>[llm.py]"] | |
| end | |
| node_client(("Challenge Client")) | |
| node_nvidia["NVIDIA NIM"] | |
| node_groq["Groq"] | |
| node_gemini["Gemini"] | |
| node_seed_data["Challenge Seed Data"] | |
| node_client -->|"pushes context"| node_context_api | |
| node_context_api -->|"stores payloads"| node_context_store | |
| node_client -->|"submits triggers"| node_tick_api | |
| node_tick_api -->|"reads contexts"| node_context_store | |
| node_tick_api -->|"dispatches"| node_trigger_processing | |
| node_trigger_processing -->|"loads context"| node_context_store | |
| node_trigger_processing -->|"composes message"| node_composer | |
| node_composer -->|"builds local prompt"| node_prompt_builder | |
| node_composer -->|"requests generation"| node_model_router | |
| node_model_router -->|"tries model tiers"| node_llm_adapter | |
| node_llm_adapter -->|"calls first"| node_nvidia | |
| node_llm_adapter -->|"falls back"| node_groq | |
| node_llm_adapter -->|"falls back"| node_gemini | |
| node_llm_adapter -->|"falls back"| node_local_model | |
| node_model_router -->|"validates and repairs"| node_output_validation | |
| node_output_validation -->|"returns result"| node_model_router | |
| node_trigger_processing -->|"returns action"| node_tick_api | |
| node_client -->|"posts reply"| node_reply_api | |
| node_reply_api -->|"classifies message"| node_reply_classification | |
| node_reply_classification -->|"generates response"| node_model_router | |
| node_reply_api -->|"returns decision"| node_client | |
| node_client -->|"requests status"| node_health_metadata | |
| node_seed_data -.->|"supplies test contexts"| node_client | |
| click node_context_api "https://github.com/idkhowtocodefr/vera-engine/blob/main/app.py" | |
| click node_context_store "https://github.com/idkhowtocodefr/vera-engine/blob/main/app.py" | |
| click node_tick_api "https://github.com/idkhowtocodefr/vera-engine/blob/main/app.py" | |
| click node_reply_api "https://github.com/idkhowtocodefr/vera-engine/blob/main/app.py" | |
| click node_health_metadata "https://github.com/idkhowtocodefr/vera-engine/blob/main/app.py" | |
| click node_trigger_processing "https://github.com/idkhowtocodefr/vera-engine/blob/main/app.py" | |
| click node_reply_classification "https://github.com/idkhowtocodefr/vera-engine/blob/main/app.py" | |
| click node_composer "https://github.com/idkhowtocodefr/vera-engine/blob/main/scripts/composer.py" | |
| click node_prompt_builder "https://github.com/idkhowtocodefr/vera-engine/blob/main/scripts/prompts.py" | |
| click node_output_validation "https://github.com/idkhowtocodefr/vera-engine/blob/main/scripts/composer.py" | |
| click node_model_router "https://github.com/idkhowtocodefr/vera-engine/blob/main/scripts/composer.py" | |
| click node_llm_adapter "https://github.com/idkhowtocodefr/vera-engine/blob/main/scripts/llm.py" | |
| click node_local_model "https://github.com/idkhowtocodefr/vera-engine/blob/main/scripts/llm.py" | |
| click node_seed_data "https://github.com/idkhowtocodefr/vera-engine/tree/main/dataset" | |
| classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a | |
| classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554 | |
| classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f | |
| classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d | |
| classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337 | |
| classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81 | |
| classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a | |
| class node_context_api,node_context_store,node_tick_api,node_reply_api,node_health_metadata,node_client toneBlue | |
| class node_trigger_processing,node_reply_classification toneAmber | |
| class node_composer,node_prompt_builder,node_output_validation toneMint | |
| class node_model_router,node_llm_adapter,node_local_model toneRose | |
| class node_nvidia,node_groq,node_gemini toneIndigo | |
| class node_seed_data toneTeal | |
| ``` | |
| ### Separation of Concerns (Two-Stage Pipeline): | |
| - **Stage 1 - The "Python Caveman" (Deterministic Logic):** A strict Python module parses the incoming JSON context. It instantly extracts exact `metrics`, selects the optimal `compulsion` hook, and maps few-shot data. This executes in `< 0.001s`. | |
| - **Stage 2 - The LLM Expander (NLG):** Condensed bullet points are fed into a fast LLM. The LLM’s only job is to expand the facts into grounded, compelling, native-sounding text. | |
| > [!NOTE] | |
| > By moving complex logic out of the LLM and into Python, we completely bypass the 30-second timeout constraints of CPU environments and guarantee a **0% hallucination rate** for raw metrics. | |
| --- | |
| ## 2. Model Choice & The Adapter Registry | |
| To ensure 100% uptime and the best possible latency, the system utilizes a **Tiered ProviderClient Strategy**. | |
| ```mermaid | |
| flowchart TD | |
| A[Generate Message Request] --> B{4-Tier Fallback Chain} | |
| B -->|Tier 1: Speed & Intel| C[NVIDIA NIM: nemotron-3-ultra-550b-a55b] | |
| B -->|Tier 2: Fast Failover| D[Groq: gpt-oss-20b] | |
| B -->|Tier 3: Sec. Failover| E[Gemini: 2.5-flash] | |
| B -->|Tier 4: Local Airgap| F[Local Llama-CPP: qwen2.5-7b-instruct / 3b-instruct] | |
| C -.->|Timeout / Error| D | |
| D -.->|Timeout / Error| E | |
| E -.->|Timeout / Error| F | |
| C & D & E & F --> H[Structured JSON Response] | |
| %% Modern UI Colors | |
| style F fill:#ef4444,stroke:#7f1d1d,stroke-width:2px,color:#fff | |
| style H fill:#10b981,stroke:#064e3b,stroke-width:2px,color:#fff | |
| ``` | |
| * **Tier 1-3 (Cloud-Speed Models):** Defaults to robust APIs with fail-fast HTTP error handling. Since inference happens off-server, the system simply proxies JSON, operating well within the 30s limit. | |
| * **Tier 4 (The Local Safety Net):** Gracefully cascades to `qwen2.5-7b-instruct-q4_k_m.gguf` or `qwen2.5-3b-instruct-q4_k_m.gguf` via `llama-cpp-python` if cloud providers fail or time out. | |
| * **Auto-Repair Loop**: Outputs are parsed through `validate_output`. If a taboo word, word-count breach, or malformed schema is detected, the engine dynamically recalculates the tier budget and issues a self-correction prompt *before* failing over to the next tier. | |
| --- | |
| ## 3. Strict Schema Forcing | |
| Small models (like 3B params) are notoriously prone to breaking JSON formatting, which would cause an automatic `0` score from the judge. | |
| > [!IMPORTANT] | |
| > **Schema Enforcement** | |
| > - **Cloud Tiers**: Hardened via API-native `response_format={"type": "json_object"}`. | |
| > - **Local Tier**: Mathematically enforced at the logits level using `LlamaGrammar` against the JSON schema, physically preventing the generation of invalid markdown or missing keys. | |
| ```json | |
| { | |
| "type": "object", | |
| "properties": { | |
| "body": { "type": "string" }, | |
| "cta": { "type": "string" }, | |
| "rationale": { "type": "string" } | |
| }, | |
| "required": ["body", "cta", "rationale"] | |
| } | |
| ``` | |
| --- | |
| ## 4. API Contract & Idempotency | |
| The FastAPI (`app.py`) has been refactored and hardened for rigorous testing: | |
| * **Idempotent Pushes:** The `/v1/context` route strictly evaluates incoming versions, accepting scalable state drops safely. | |
| * **Intelligent Tick Sorting:** Triggers arriving simultaneously in `/v1/tick` are sorted by the dataset's native `urgency` parameter, guaranteeing critical compliance deadlines are addressed first. | |
| * **State Transparency:** `/v1/healthz` tracks and exposes EXACTLY how many scopes are held in memory. | |
| --- | |
| ## ⚖️ Summary of Tradeoffs | |
| | Tradeoff | Implementation | Result | | |
| | :--- | :--- | :--- | | |
| | **Zero-Code LLM vs Python Logic** | We explicitly traded letting a massive LLM "figure it out" for a highly deterministic Python parser. | The system is fast enough to run locally on a free CPU without timeouts, entirely eliminating metric hallucinations. | | |
| | **Single Endpoint vs Cascade** | Added code complexity to manage 4 tiers and validation loops. | Achieves robust 99.9% uptime and zero-schema failure execution even under heavy rate limits. | | |