0ef5fcb1c5
Security / Dependency audit (pip-audit) (push) Has been cancelled
Security / CodeQL (javascript-typescript) (push) Has been cancelled
Security / CodeQL (python) (push) Has been cancelled
Security / Secret scan (gitleaks) (push) Has been cancelled
rust / test (ubuntu) (push) Has been cancelled
rust / simulator e2e (macos-latest) (push) Has been cancelled
rust / simulator e2e (ubuntu-latest) (push) Has been cancelled
rust / simulator e2e (windows-latest) (push) Has been cancelled
rust / wheels (aarch64-apple-darwin) (push) Has been cancelled
rust / wheels (x86_64-unknown-linux-gnu) (push) Has been cancelled
rust / wheels (x86_64-apple-darwin) (push) Has been cancelled
rust / audit (push) Has been cancelled
rust / parity (nightly, allowed to fail during Phase 0) (push) Has been cancelled
CI / commitlint (push) Has been skipped
Dev Containers / validate (.devcontainer/devcontainer.json, default) (push) Failing after 0s
Dev Containers / validate (.devcontainer/memory-stack/devcontainer.json, memory-stack) (push) Failing after 0s
Dev Containers / validate-worktree (push) Failing after 0s
CI / changes (push) Failing after 4s
Deploy Documentation / validate (push) Has been skipped
Deploy Documentation / deploy (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, claude) (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, codex) (push) Failing after 1s
Install Native E2E / install-native (ubuntu-latest) (push) Failing after 1s
OpenCode Plugin / typecheck + build + test (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, copilot) (push) Failing after 1s
Release Please / release-please (push) Failing after 1s
Wrap E2E / docker-wrap-e2e (push) Failing after 1s
Wrap Native E2E / wrap-native (ubuntu-latest) (push) Failing after 1s
Init E2E / docker-init-e2e (push) Failing after 4s
Merge Conflicts / merge-conflicts (push) Failing after 4s
CI / lint (push) Has been cancelled
CI / build-wheel (push) Has been cancelled
CI / build-wheel-windows (push) Has been cancelled
CI / prefetch-model (push) Has been cancelled
CI / test-dashboard-ui (push) Has been cancelled
CI / test (1) (push) Has been cancelled
CI / test (2) (push) Has been cancelled
CI / test (3) (push) Has been cancelled
CI / test (4) (push) Has been cancelled
CI / test-extras (push) Has been cancelled
CI / test-agno (push) Has been cancelled
CI / build (push) Has been cancelled
CI / workflow-validation (push) Has been cancelled
CI / docker-native-e2e (push) Has been cancelled
CI / windows-native-wrapper (push) Has been cancelled
CI / macos-native-wrapper (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / promote-latest (push) Has been cancelled
Init Native E2E / init-native (macos-latest, claude) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, codex) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, copilot) (push) Has been cancelled
Install Native E2E / install-native (macos-latest) (push) Has been cancelled
Wrap Native E2E / wrap-native (macos-latest) (push) Has been cancelled
384 lines
11 KiB
Python
384 lines
11 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Real-world benchmark for DynamicContentDetector.
|
|
|
|
Tests the detector against realistic system prompts from AI coding agents,
|
|
chatbots, and enterprise applications.
|
|
"""
|
|
|
|
import statistics
|
|
import time
|
|
from dataclasses import dataclass
|
|
from typing import Any
|
|
|
|
from headroom.cache.dynamic_detector import (
|
|
DetectorConfig,
|
|
DynamicContentDetector,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class BenchmarkResult:
|
|
"""Result of a single benchmark run."""
|
|
|
|
name: str
|
|
content_length: int
|
|
spans_found: int
|
|
categories: list[str]
|
|
static_length: int
|
|
dynamic_length: int
|
|
latency_ms: float
|
|
tiers_used: list[str]
|
|
warnings: list[str]
|
|
|
|
|
|
# Real-world system prompts
|
|
REAL_WORLD_PROMPTS = {
|
|
"claude_code_style": """You are Claude, an AI assistant created by Anthropic to be helpful, harmless, and honest.
|
|
|
|
Today is Tuesday, January 7, 2026.
|
|
Current time: 10:30:45 AM PST.
|
|
|
|
You are operating in a software development environment with access to:
|
|
- File system operations
|
|
- Terminal commands
|
|
- Web search
|
|
|
|
Session ID: sess_abc123def456ghi789jkl012
|
|
Request ID: req_xyz789abc123def456ghi789
|
|
User: tchopra
|
|
Workspace: /Users/tchopra/claude-projects/headroom
|
|
|
|
Be concise, accurate, and helpful. Follow the user's instructions carefully.""",
|
|
"enterprise_assistant": """You are an enterprise AI assistant for Acme Corporation.
|
|
|
|
Current Date: 2026-01-07T10:30:00Z
|
|
Last Updated: 2026-01-07T09:00:00Z
|
|
|
|
User Profile:
|
|
- Name: John Smith
|
|
- Employee ID: EMP-2024-00542
|
|
- Department: Engineering
|
|
- Manager: Sarah Johnson
|
|
- Location: San Francisco, CA
|
|
- Hire Date: March 15, 2023
|
|
|
|
System Status:
|
|
- API Version: v2.3.1-beta
|
|
- Server Load: 45%
|
|
- Active Users: 1,247
|
|
- Queue Length: 23
|
|
|
|
Budget Information:
|
|
- Monthly Allowance: $5,000.00
|
|
- Used This Month: $2,341.67
|
|
- Remaining: $2,658.33
|
|
|
|
Help the user with their work tasks while following company policies.""",
|
|
"coding_agent": """You are an autonomous coding agent with access to tools.
|
|
|
|
Environment:
|
|
- OS: macOS Darwin 25.1.0
|
|
- Working Directory: /Users/developer/projects/myapp
|
|
- Git Branch: feature/JIRA-1234-add-auth
|
|
- Last Commit: a1b2c3d4e5f6 (2 hours ago)
|
|
- Node Version: v20.10.0
|
|
- Python Version: 3.11.7
|
|
|
|
Current Task Context:
|
|
- Task ID: 550e8400-e29b-41d4-a716-446655440000
|
|
- Created: 2026-01-07T08:15:30Z
|
|
- Priority: High
|
|
- Estimated Time: 2 hours
|
|
|
|
API Keys Available:
|
|
- OPENAI_API_KEY: sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
- ANTHROPIC_API_KEY: sk-ant-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
- DATABASE_URL: postgresql://user:pass@localhost:5432/mydb
|
|
|
|
Execute tasks step by step, verify each action, and report progress.""",
|
|
"customer_support": """You are a customer support agent for TechStore Inc.
|
|
|
|
Current Time: January 7, 2026, 3:45 PM EST
|
|
Support Ticket: #TKT-2026-0107-4521
|
|
|
|
Customer Information:
|
|
- Name: Alice Chen
|
|
- Email: alice.chen@email.com
|
|
- Phone: (555) 123-4567
|
|
- Customer Since: August 2021
|
|
- Loyalty Tier: Gold
|
|
- Total Purchases: $12,456.78
|
|
|
|
Recent Orders:
|
|
- Order #ORD-2026-0105-7823 - iPhone 15 Pro - $1,199.00 - Delivered
|
|
- Order #ORD-2025-1220-3456 - AirPods Pro - $249.00 - Delivered
|
|
- Order #ORD-2025-1115-9012 - MacBook Air - $1,299.00 - Returned
|
|
|
|
Active Issues:
|
|
- Case #CS-2026-0107-001 - Battery drain issue - Open since today
|
|
|
|
Provide helpful, empathetic support while following company guidelines.""",
|
|
"data_analysis": """You are a data analysis assistant.
|
|
|
|
Report Generated: 2026-01-07 10:30:00 UTC
|
|
Report ID: RPT-550e8400-e29b-41d4-a716-446655440000
|
|
Data Range: 2025-12-01 to 2025-12-31
|
|
|
|
Summary Statistics:
|
|
- Total Revenue: $1,234,567.89
|
|
- Total Orders: 45,678
|
|
- Average Order Value: $27.03
|
|
- Top Product: Widget Pro ($234,567.00)
|
|
- Top Region: California (23.4%)
|
|
|
|
Key Metrics:
|
|
- DAU: 125,000
|
|
- MAU: 890,000
|
|
- Churn Rate: 2.3%
|
|
- NPS Score: 67
|
|
|
|
Anomalies Detected:
|
|
- Spike on Dec 15: 3.2x normal traffic
|
|
- Drop on Dec 25: 0.4x normal (expected - holiday)
|
|
|
|
Help analyze the data and provide insights.""",
|
|
"minimal_static": """You are a helpful AI assistant.
|
|
|
|
Your role is to:
|
|
1. Answer questions accurately
|
|
2. Be concise and clear
|
|
3. Follow instructions carefully
|
|
4. Admit when you don't know something
|
|
|
|
Always be helpful, harmless, and honest.""",
|
|
"heavy_dynamic": """Session started at 2026-01-07T10:30:45.123Z
|
|
Request ID: req_abc123def456ghi789jkl012mno345pqr678
|
|
Trace ID: 550e8400-e29b-41d4-a716-446655440000
|
|
Parent Span: span_xyz789abc123
|
|
User Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
|
|
IP Address: 192.168.1.100
|
|
Geo: San Francisco, CA, USA (37.7749, -122.4194)
|
|
|
|
Auth Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
|
Token Expires: 2026-01-07T11:30:45Z
|
|
Refresh Token: rt_abc123def456
|
|
|
|
Last Login: 2026-01-06T18:45:30Z
|
|
Login Count: 1,247
|
|
Account Balance: $5,432.10
|
|
Credit Limit: $10,000.00
|
|
|
|
Real-time Stock Prices (as of 10:30 AM):
|
|
- AAPL: $185.42 (+1.2%)
|
|
- GOOGL: $142.89 (-0.5%)
|
|
- MSFT: $378.23 (+0.8%)
|
|
- AMZN: $156.78 (+2.1%)
|
|
|
|
Process this request.""",
|
|
}
|
|
|
|
|
|
def run_benchmark(
|
|
prompts: dict[str, str],
|
|
tiers: list[str],
|
|
iterations: int = 10,
|
|
) -> dict[str, Any]:
|
|
"""Run benchmark on prompts with specified tiers."""
|
|
|
|
config = DetectorConfig(tiers=tiers) # type: ignore
|
|
detector = DynamicContentDetector(config)
|
|
|
|
results: dict[str, list[BenchmarkResult]] = {}
|
|
|
|
for name, content in prompts.items():
|
|
results[name] = []
|
|
|
|
for _ in range(iterations):
|
|
start = time.perf_counter()
|
|
result = detector.detect(content)
|
|
elapsed = (time.perf_counter() - start) * 1000
|
|
|
|
categories = list({s.category.value for s in result.spans})
|
|
|
|
results[name].append(
|
|
BenchmarkResult(
|
|
name=name,
|
|
content_length=len(content),
|
|
spans_found=len(result.spans),
|
|
categories=categories,
|
|
static_length=len(result.static_content),
|
|
dynamic_length=len(result.dynamic_content),
|
|
latency_ms=elapsed,
|
|
tiers_used=result.tiers_used,
|
|
warnings=result.warnings,
|
|
)
|
|
)
|
|
|
|
return results
|
|
|
|
|
|
def print_results(
|
|
results: dict[str, list[BenchmarkResult]],
|
|
tier_name: str,
|
|
):
|
|
"""Print benchmark results."""
|
|
|
|
print(f"\n{'=' * 80}")
|
|
print(f"BENCHMARK RESULTS: {tier_name}")
|
|
print(f"{'=' * 80}")
|
|
|
|
for name, runs in results.items():
|
|
latencies = [r.latency_ms for r in runs]
|
|
avg_latency = statistics.mean(latencies)
|
|
std_latency = statistics.stdev(latencies) if len(latencies) > 1 else 0
|
|
|
|
# Use first run for span info (consistent across runs)
|
|
first = runs[0]
|
|
|
|
compression = (
|
|
(1 - first.static_length / first.content_length) * 100
|
|
if first.content_length > 0
|
|
else 0
|
|
)
|
|
|
|
print(f"\n📄 {name}")
|
|
print(f" Content: {first.content_length:,} chars")
|
|
print(f" Spans found: {first.spans_found}")
|
|
print(f" Categories: {', '.join(first.categories) if first.categories else 'none'}")
|
|
print(f" Static: {first.static_length:,} chars | Dynamic: {first.dynamic_length:,} chars")
|
|
print(f" Compression: {compression:.1f}% removed")
|
|
print(f" Latency: {avg_latency:.2f}ms ± {std_latency:.2f}ms")
|
|
print(f" Tiers used: {', '.join(first.tiers_used)}")
|
|
if first.warnings:
|
|
print(f" ⚠️ Warnings: {len(first.warnings)}")
|
|
|
|
|
|
def print_comparison(all_results: dict[str, dict[str, list[BenchmarkResult]]]):
|
|
"""Print comparison across tiers."""
|
|
|
|
print(f"\n{'=' * 80}")
|
|
print("TIER COMPARISON")
|
|
print(f"{'=' * 80}")
|
|
|
|
prompts = list(REAL_WORLD_PROMPTS.keys())
|
|
tiers = list(all_results.keys())
|
|
|
|
# Header
|
|
header = f"{'Prompt':<25}"
|
|
for tier in tiers:
|
|
header += f" | {tier:>12} spans | {'latency':>8}"
|
|
print(header)
|
|
print("-" * len(header))
|
|
|
|
for prompt in prompts:
|
|
row = f"{prompt:<25}"
|
|
for tier in tiers:
|
|
if prompt in all_results[tier]:
|
|
runs = all_results[tier][prompt]
|
|
spans = runs[0].spans_found
|
|
latency = statistics.mean([r.latency_ms for r in runs])
|
|
row += f" | {spans:>12} | {latency:>7.2f}ms"
|
|
else:
|
|
row += f" | {'N/A':>12} | {'N/A':>8}"
|
|
print(row)
|
|
|
|
# Summary
|
|
print(f"\n{'=' * 80}")
|
|
print("SUMMARY")
|
|
print(f"{'=' * 80}")
|
|
|
|
for tier in tiers:
|
|
all_latencies = []
|
|
total_spans = 0
|
|
for runs in all_results[tier].values():
|
|
all_latencies.extend([r.latency_ms for r in runs])
|
|
total_spans += runs[0].spans_found
|
|
|
|
avg = statistics.mean(all_latencies)
|
|
p50 = statistics.median(all_latencies)
|
|
p99 = (
|
|
sorted(all_latencies)[int(len(all_latencies) * 0.99)] if len(all_latencies) > 1 else avg
|
|
)
|
|
|
|
print(f"\n{tier}:")
|
|
print(f" Total spans detected: {total_spans}")
|
|
print(f" Avg latency: {avg:.2f}ms")
|
|
print(f" P50 latency: {p50:.2f}ms")
|
|
print(f" P99 latency: {p99:.2f}ms")
|
|
|
|
|
|
def show_detection_details(prompt_name: str, content: str):
|
|
"""Show detailed detection for a specific prompt."""
|
|
|
|
print(f"\n{'=' * 80}")
|
|
print(f"DETECTION DETAILS: {prompt_name}")
|
|
print(f"{'=' * 80}")
|
|
|
|
config = DetectorConfig(tiers=["regex"])
|
|
detector = DynamicContentDetector(config)
|
|
result = detector.detect(content)
|
|
|
|
print(f"\nOriginal content ({len(content)} chars):")
|
|
print("-" * 40)
|
|
print(content[:500] + "..." if len(content) > 500 else content)
|
|
|
|
print(f"\n\nDetected spans ({len(result.spans)}):")
|
|
print("-" * 40)
|
|
for span in result.spans:
|
|
print(
|
|
f" [{span.category.value:12}] '{span.text[:50]}{'...' if len(span.text) > 50 else ''}'"
|
|
)
|
|
|
|
print(f"\n\nStatic content ({len(result.static_content)} chars):")
|
|
print("-" * 40)
|
|
print(
|
|
result.static_content[:500] + "..."
|
|
if len(result.static_content) > 500
|
|
else result.static_content
|
|
)
|
|
|
|
print(f"\n\nDynamic content ({len(result.dynamic_content)} chars):")
|
|
print("-" * 40)
|
|
print(result.dynamic_content if result.dynamic_content else "(none)")
|
|
|
|
|
|
def main():
|
|
"""Run the benchmark."""
|
|
|
|
print("🚀 Dynamic Content Detector - Real World Benchmark")
|
|
print("=" * 80)
|
|
|
|
iterations = 20
|
|
|
|
# Test each tier configuration
|
|
tier_configs = {
|
|
"regex_only": ["regex"],
|
|
# "regex+ner": ["regex", "ner"], # Uncomment if spacy installed
|
|
# "all_tiers": ["regex", "ner", "semantic"], # Uncomment if all deps installed
|
|
}
|
|
|
|
all_results: dict[str, dict[str, list[BenchmarkResult]]] = {}
|
|
|
|
for tier_name, tiers in tier_configs.items():
|
|
print(f"\n⏱️ Running {tier_name} ({iterations} iterations per prompt)...")
|
|
results = run_benchmark(REAL_WORLD_PROMPTS, tiers, iterations)
|
|
all_results[tier_name] = results
|
|
print_results(results, tier_name)
|
|
|
|
# Print comparison if multiple tiers tested
|
|
if len(all_results) > 1:
|
|
print_comparison(all_results)
|
|
|
|
# Show detailed detection for a few prompts
|
|
print("\n" + "=" * 80)
|
|
print("DETAILED DETECTION EXAMPLES")
|
|
print("=" * 80)
|
|
|
|
for name in ["claude_code_style", "enterprise_assistant", "heavy_dynamic"]:
|
|
show_detection_details(name, REAL_WORLD_PROMPTS[name])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|