Architecture: ADR: ArgoCD Agent - OOM Protection Architecture
Date: 2025-11-05
Data Flow with Safety Checkpointsβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER QUERY: "Show me production applications" β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 3: LLM Prompt Strategy (Agent) β
β β Analyzes query: Contains keyword "production" β
β β Decision: Use Search_Argocd_Resources (not list) β
β β Prepares: search_argocd_resources(query="production") β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 2 & 6: Search Tool with Limits (search.py) β
β β
β Step 1: Fetch from ArgoCD API β
β ββ list_applications(page=1, page_size=100) β Layer 1 β
β ββ project_list(page=1, page_size=100) β Layer 1 β
β ββ applicationset_list(page=1, page_size=100)β Layer 1 β
β ββ cluster_service__list(page=1, page_size=100)β Layer 1 β
β β
β Step 2: Filter matches client-side β
β ββ Regex search for "production" across fields β
β β
β Step 3: Check safety limits (NEW!) β
β ββ Total matches: 18 items β
β ββ Check: 18 < 1,000 (MAX_SEARCH_RESULTS) β β
β ββ Status: SAFE - Proceed β
β β
β Step 4: Apply pagination β
β ββ Return page 1 (items 1-18 of 18) β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 4: Context Window Management β
β β Tool output: ~8KB (18 items Γ ~450 bytes) β
β β Check: 8KB < 5KB limit β Passed through β
β β Current context: 15,000 tokens < 20,000 limit β β
β β Message history: 3 messages > 2 minimum β β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 3: LLM Output Formatting β
β β Matches: 18 items (< 50 threshold) β
β β Format: "Showing all 18 items" + table β
β β Output tokens: ~2,500 tokens (< 16K limit) β β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 5: Docker Resource Monitor β
β β Peak memory: 480 MiB < 4 GiB limit β β
β β Memory usage: 12% (Safe zone) β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
RESPONSE DELIVERED TO USER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Failure Scenario: Large Query Protectionβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER QUERY: "List all ArgoCD applications" β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 3: LLM Prompt Strategy β
β β Analyzes query: "list all" = complete inventory β
β β Decision: Use List_Applications (not search) β
β β Prepares: list_applications(page=1, page_size=20) β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 1: MCP Tool Pagination (api_v1_applications.py) β
β β
β Step 1: Fetch from ArgoCD API β
β ββ GET /api/v1/applications β 819 items β
β β
β Step 2: Apply pagination (CRITICAL!) β
β ββ Total items: 819 β
β ββ Page: 1, Page size: 20 β
β ββ Slice: items[0:20] = 20 items β
β ββ Memory saved: 799 items NOT loaded into memory! β
β β
β Step 3: Return with metadata β
β ββ {items: [...20 items], pagination: {total: 819, ...}} β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 4: Context Window Management β
β β Tool output: ~10KB (20 items) β
β β Current context: 16,000 tokens < 20,000 limit β β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 3: LLM Output Formatting β
β β Total: 819 items (> 50 threshold) β
β β Format: "PAGE 1 of 819" + Summary + First 20 in table β
β β Output tokens: ~3,500 tokens (< 16K limit) β β
β π‘οΈ PROTECTION: Would be 82K tokens without pagination! β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 5: Docker Resource Monitor β
β β Peak memory: 520 MiB < 4 GiB limit β β
β β Memory usage: 13% (Safe zone) β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
RESPONSE: "PAGE 1 of 819. Ask for page 2 for more..." β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Emergency Brake Scenario: Overly Broad Searchβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER QUERY: "Search for 'a' in ArgoCD" (matches many items) β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 2: Search Tool (search.py) β
β β
β Step 1: Fetch limited data β
β ββ Max 100 apps (Page 1 only) β
β ββ Max 100 projects (Page 1 only) β
β ββ Max 100 appsets (Page 1 only) β
β ββ Max 100 clusters (Page 1 only) β
β Total fetched: 400 items (NOT 1,000+) β
β β
β Step 2: Filter matches β
β ββ Letter 'a' matches: 387 items β
β β
β Step 3: SAFETY CHECK (Layer 6 - NEW!) β
β ββ Total matches: 387 items β
β ββ Threshold: 387 < 1,000 (MAX_SEARCH_RESULTS) β β
β ββ Warning: 387 < 500 (WARN_SEARCH_RESULTS) β β
β ββ Status: SAFE - Proceed with pagination β
β β
β Step 4: Apply pagination β
β ββ Return page 1 (items 1-20 of 387) β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
RESPONSE: "PAGE 1 of 387 matches for 'a'..." β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ALTERNATE: What if 1,200 items matched? β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LAYER 6: Emergency Brake (search.py) β
β β
β π¨ SAFETY CHECK FAILED! β
β ββ Total matches: 1,200 items β
β ββ Threshold: 1,200 > 1,000 (MAX_SEARCH_RESULTS) β β
β ββ Action: REJECT REQUEST β
β β
β Return error response: β
β { β
β "error": "Query returned 1,200 results, exceeding limit", β
β "suggestion": "Please refine search terms", β
β "breakdown": { β
β "applications": 400, β
β "projects": 300, β
β "applicationsets": 350, β
β "clusters": 150 β
β } β
β } β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ERROR RESPONSE: "Too many results. Please refine search." β
β π‘ Suggestion shown to user for better query β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Memory Budget per Query Typeβ
Small Query (e.g., "Find dev apps")β
- API fetch: 100 items Γ 500 bytes = 50 KB
- Filtered: 5 matches Γ 500 bytes = 2.5 KB
- LLM context: ~5K tokens = 20 KB
- LLM output: ~1K tokens = 4 KB
- Total: < 100 KB per query
Medium Query (e.g., "List apps page 1")β
- API fetch: 20 items Γ 500 bytes = 10 KB
- LLM context: ~8K tokens = 32 KB
- LLM output: ~3K tokens = 12 KB
- Total: < 100 KB per query
Large Query (e.g., "Search for 'prod'")β
- API fetch: 400 items Γ 500 bytes = 200 KB
- Filtered: 50 matches Γ 500 bytes = 25 KB
- Paginated: 20 items Γ 500 bytes = 10 KB
- LLM context: ~12K tokens = 48 KB
- LLM output: ~3.5K tokens = 14 KB
- Total: < 300 KB per query
Maximum Safe Queryβ
- API fetch: 400 items (100 each type) = 200 KB
- All match search: 400 items = 200 KB
- Paginated: 20 items = 10 KB
- LLM processing: ~50 KB
- Total: < 500 KB per query
- Safety margin: 500 KB Γ 100 queries = 50 MB (well under 4 GB)
Conclusionβ
The ArgoCD agent is now protected by 6 layers of defense against OOM:
- β Pagination at data source
- β Search with fetch limits
- β Smart LLM prompting
- β Context window management
- β Docker resource limits
- β NEW: Hard search result caps
Result:
- No query can cause OOM
- Memory usage: ~10% of limit
- Graceful error handling
- User-friendly suggestions when limits hit
Relatedβ
- Spec: spec.md