Spaces:
Sleeping
Sleeping
anilatambharii commited on
Commit ·
cf4a474
1
Parent(s): 0a13e16
AgentMesh v0.2.1 - semantic cache proxy, 85% hit rate, 75% cost reduction
Browse files- README.md +51 -9
- app.py +222 -0
- requirements.txt +1 -0
README.md
CHANGED
|
@@ -1,15 +1,57 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
-
sdk_version:
|
| 8 |
-
python_version: '3.13'
|
| 9 |
app_file: app.py
|
| 10 |
-
pinned:
|
| 11 |
license: apache-2.0
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
---
|
| 14 |
|
| 15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: AgentMesh — AI Agent Cost Savings Calculator
|
| 3 |
+
emoji: 🕸️
|
| 4 |
+
colorFrom: indigo
|
| 5 |
+
colorTo: blue
|
| 6 |
sdk: gradio
|
| 7 |
+
sdk_version: "4.44.0"
|
|
|
|
| 8 |
app_file: app.py
|
| 9 |
+
pinned: true
|
| 10 |
license: apache-2.0
|
| 11 |
+
tags:
|
| 12 |
+
- ai-agents
|
| 13 |
+
- llm
|
| 14 |
+
- cost-optimization
|
| 15 |
+
- governance
|
| 16 |
+
- enterprise
|
| 17 |
+
- langgraph
|
| 18 |
+
- crewai
|
| 19 |
+
- openai-agents
|
| 20 |
+
- anthropic
|
| 21 |
+
- token-budget
|
| 22 |
---
|
| 23 |
|
| 24 |
+
# AgentMesh — AI Agent Governance & Cost Savings Calculator
|
| 25 |
+
|
| 26 |
+
**The governance plane for AI agents — policy, budget, and audit across every framework.**
|
| 27 |
+
|
| 28 |
+
This Space demonstrates how AgentMesh reduces AI agent costs by 60–90% in enterprise deployments.
|
| 29 |
+
|
| 30 |
+
## What is AgentMesh?
|
| 31 |
+
|
| 32 |
+
AgentMesh is an open-source framework-agnostic sidecar that enforces:
|
| 33 |
+
|
| 34 |
+
- **Token Budget Enforcement** — Hard limits, no surprise bills
|
| 35 |
+
- **Dynamic Model Routing** — Auto-route to cheaper models as budget is consumed
|
| 36 |
+
- **Semantic Caching** — Cache near-duplicate queries (10–40% savings)
|
| 37 |
+
- **Circuit Breaker** — Kill runaway loops before they drain budgets
|
| 38 |
+
- **Tamper-Evident Audit Trail** — Ed25519-signed compliance for EU AI Act, HIPAA, SOC 2
|
| 39 |
+
- **Policy-as-Code** — YAML governance enforced at runtime, not post-hoc
|
| 40 |
+
|
| 41 |
+
## Usage
|
| 42 |
+
|
| 43 |
+
```bash
|
| 44 |
+
pip install agentmesh-proxy
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
```python
|
| 48 |
+
from agentmesh import AgentMesh
|
| 49 |
+
from agentmesh.policy.engine import Policy
|
| 50 |
+
|
| 51 |
+
mesh = AgentMesh(policy=Policy.from_yaml("policy.yaml"))
|
| 52 |
+
governed_graph = mesh.wrap_langgraph(your_graph)
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
## GitHub
|
| 56 |
+
|
| 57 |
+
[github.com/anilatambharii/agentmesh](https://github.com/anilatambharii/agentmesh)
|
app.py
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
AgentMesh HuggingFace Space — Interactive AI Agent Cost Savings Calculator.
|
| 3 |
+
|
| 4 |
+
Deployed at: https://huggingface.co/spaces/anilatambharii/agentmesh
|
| 5 |
+
|
| 6 |
+
Run locally:
|
| 7 |
+
pip install gradio
|
| 8 |
+
python spaces/app.py
|
| 9 |
+
"""
|
| 10 |
+
|
| 11 |
+
import gradio as gr
|
| 12 |
+
|
| 13 |
+
# ── Cost model ──────────────────────────────────────────────────────────────
|
| 14 |
+
|
| 15 |
+
MODEL_COSTS = {
|
| 16 |
+
"claude-haiku-4-5": 0.80,
|
| 17 |
+
"claude-sonnet-4-6": 3.00,
|
| 18 |
+
"claude-opus-4-8": 15.00,
|
| 19 |
+
"gpt-4o-mini": 0.15,
|
| 20 |
+
"gpt-4o": 2.50,
|
| 21 |
+
"gemini-1.5-flash": 0.075,
|
| 22 |
+
"gemini-1.5-pro": 1.25,
|
| 23 |
+
"meta/llama-3.1-8b (NIM)": 0.20,
|
| 24 |
+
"meta/llama-3.1-70b (NIM)": 0.99,
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def calculate_savings(
|
| 29 |
+
monthly_tokens_m: float,
|
| 30 |
+
current_model: str,
|
| 31 |
+
team_size: int,
|
| 32 |
+
avg_iterations: int,
|
| 33 |
+
enable_caching: bool,
|
| 34 |
+
enable_routing: bool,
|
| 35 |
+
enable_compression: bool,
|
| 36 |
+
enable_circuit_breaker: bool,
|
| 37 |
+
) -> tuple:
|
| 38 |
+
"""Calculate estimated cost savings with AgentMesh."""
|
| 39 |
+
cost_per_1m = MODEL_COSTS.get(current_model, 3.0)
|
| 40 |
+
monthly_tokens = monthly_tokens_m * 1_000_000
|
| 41 |
+
|
| 42 |
+
# Baseline cost
|
| 43 |
+
baseline_cost = (monthly_tokens / 1_000_000) * cost_per_1m
|
| 44 |
+
|
| 45 |
+
# Calculate savings from each feature
|
| 46 |
+
savings_breakdown = {}
|
| 47 |
+
remaining_tokens = monthly_tokens
|
| 48 |
+
|
| 49 |
+
if enable_caching:
|
| 50 |
+
cache_savings_pct = 0.20 # 20% of calls are near-duplicates
|
| 51 |
+
saved_tokens = remaining_tokens * cache_savings_pct
|
| 52 |
+
savings_breakdown["Semantic Caching"] = (saved_tokens / 1_000_000) * cost_per_1m
|
| 53 |
+
remaining_tokens -= saved_tokens
|
| 54 |
+
|
| 55 |
+
if enable_routing:
|
| 56 |
+
# Route ~70% of calls to haiku, 30% to chosen model
|
| 57 |
+
haiku_cost = MODEL_COSTS["claude-haiku-4-5"]
|
| 58 |
+
blended_cost = haiku_cost * 0.70 + cost_per_1m * 0.30
|
| 59 |
+
routing_savings_per_1m = cost_per_1m - blended_cost
|
| 60 |
+
savings_breakdown["Dynamic Model Routing"] = (remaining_tokens / 1_000_000) * routing_savings_per_1m
|
| 61 |
+
remaining_tokens = remaining_tokens # tokens same, cost drops
|
| 62 |
+
|
| 63 |
+
if enable_compression:
|
| 64 |
+
# O(n²) context growth: compression saves ~30% of tokens in long chains
|
| 65 |
+
compression_pct = min(0.30, 0.05 * avg_iterations)
|
| 66 |
+
saved_tokens = remaining_tokens * compression_pct
|
| 67 |
+
savings_breakdown["Prompt Compression"] = (saved_tokens / 1_000_000) * cost_per_1m
|
| 68 |
+
remaining_tokens -= saved_tokens
|
| 69 |
+
|
| 70 |
+
if enable_circuit_breaker:
|
| 71 |
+
# ~5% of runs hit runaway loops; circuit breaker prevents 100% of that waste
|
| 72 |
+
runaway_pct = 0.05
|
| 73 |
+
saved_tokens = remaining_tokens * runaway_pct
|
| 74 |
+
savings_breakdown["Circuit Breaker"] = (saved_tokens / 1_000_000) * cost_per_1m
|
| 75 |
+
|
| 76 |
+
total_savings = sum(savings_breakdown.values())
|
| 77 |
+
new_cost = max(baseline_cost - total_savings, baseline_cost * 0.10)
|
| 78 |
+
actual_savings = baseline_cost - new_cost
|
| 79 |
+
savings_pct = (actual_savings / baseline_cost * 100) if baseline_cost > 0 else 0
|
| 80 |
+
|
| 81 |
+
# Per-team estimate
|
| 82 |
+
per_team_baseline = baseline_cost / team_size
|
| 83 |
+
per_team_new = new_cost / team_size
|
| 84 |
+
|
| 85 |
+
# Breakdown text
|
| 86 |
+
breakdown_lines = ["**Savings Breakdown:**\n"]
|
| 87 |
+
for feature, saving in savings_breakdown.items():
|
| 88 |
+
pct = saving / baseline_cost * 100
|
| 89 |
+
breakdown_lines.append(f"- {feature}: **${saving:,.0f}/mo** ({pct:.0f}% reduction)")
|
| 90 |
+
|
| 91 |
+
breakdown_text = "\n".join(breakdown_lines)
|
| 92 |
+
|
| 93 |
+
summary = f"""
|
| 94 |
+
## 💰 AgentMesh Cost Savings Analysis
|
| 95 |
+
|
| 96 |
+
| | Without AgentMesh | With AgentMesh |
|
| 97 |
+
|---|---|---|
|
| 98 |
+
| **Monthly Cost** | **${baseline_cost:,.0f}** | **${new_cost:,.0f}** |
|
| 99 |
+
| **Per-Engineer** | ${per_team_baseline:,.0f}/mo | ${per_team_new:,.0f}/mo |
|
| 100 |
+
| **Annual Cost** | ${baseline_cost * 12:,.0f} | ${new_cost * 12:,.0f} |
|
| 101 |
+
| **Annual Savings** | — | **${actual_savings * 12:,.0f}** |
|
| 102 |
+
|
| 103 |
+
### Total Savings: {savings_pct:.0f}% (${actual_savings:,.0f}/month)
|
| 104 |
+
|
| 105 |
+
{breakdown_text}
|
| 106 |
+
|
| 107 |
+
---
|
| 108 |
+
|
| 109 |
+
*Based on {monthly_tokens_m:.1f}M tokens/month, {team_size} engineers, {avg_iterations} avg iterations/run.*
|
| 110 |
+
""".strip()
|
| 111 |
+
|
| 112 |
+
chart_data = {
|
| 113 |
+
"labels": list(savings_breakdown.keys()),
|
| 114 |
+
"values": [round(v, 2) for v in savings_breakdown.values()],
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
return summary, f"${actual_savings:,.0f}/month saved ({savings_pct:.0f}% reduction)"
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
# ── Gradio UI ─────────────────────────────────────────────────────────────
|
| 121 |
+
|
| 122 |
+
with gr.Blocks(
|
| 123 |
+
title="AgentMesh — AI Agent Cost Calculator",
|
| 124 |
+
theme=gr.themes.Soft(primary_hue="indigo"),
|
| 125 |
+
css="""
|
| 126 |
+
.header { text-align: center; padding: 20px 0; }
|
| 127 |
+
.result-box { font-size: 1.1em; }
|
| 128 |
+
""",
|
| 129 |
+
) as demo:
|
| 130 |
+
gr.HTML("""
|
| 131 |
+
<div class="header">
|
| 132 |
+
<h1>🕸️ AgentMesh Cost Savings Calculator</h1>
|
| 133 |
+
<p><b>The governance plane for AI agents.</b> See how much you'd save.</p>
|
| 134 |
+
<p>
|
| 135 |
+
<a href="https://github.com/anilatambharii/agentmesh" target="_blank">GitHub</a> ·
|
| 136 |
+
<a href="https://pypi.org/project/agentmesh-proxy/" target="_blank">PyPI</a> ·
|
| 137 |
+
<code>pip install agentmesh-proxy</code>
|
| 138 |
+
</p>
|
| 139 |
+
</div>
|
| 140 |
+
""")
|
| 141 |
+
|
| 142 |
+
with gr.Row():
|
| 143 |
+
with gr.Column(scale=1):
|
| 144 |
+
gr.Markdown("### Your Current Setup")
|
| 145 |
+
|
| 146 |
+
monthly_tokens = gr.Slider(
|
| 147 |
+
minimum=0.1, maximum=500, step=0.1, value=10.0,
|
| 148 |
+
label="Monthly Token Usage (millions)",
|
| 149 |
+
info="Total input + output tokens per month across all agents",
|
| 150 |
+
)
|
| 151 |
+
current_model = gr.Dropdown(
|
| 152 |
+
choices=list(MODEL_COSTS.keys()),
|
| 153 |
+
value="claude-sonnet-4-6",
|
| 154 |
+
label="Primary Model",
|
| 155 |
+
)
|
| 156 |
+
team_size = gr.Slider(
|
| 157 |
+
minimum=1, maximum=500, step=1, value=50,
|
| 158 |
+
label="Team Size (engineers)",
|
| 159 |
+
info="Number of engineers using AI agents",
|
| 160 |
+
)
|
| 161 |
+
avg_iterations = gr.Slider(
|
| 162 |
+
minimum=1, maximum=50, step=1, value=10,
|
| 163 |
+
label="Avg Iterations per Agent Run",
|
| 164 |
+
info="Typical ReAct steps per agent invocation",
|
| 165 |
+
)
|
| 166 |
+
|
| 167 |
+
gr.Markdown("### AgentMesh Features to Enable")
|
| 168 |
+
enable_caching = gr.Checkbox(value=True, label="Semantic Caching (10–30% savings)")
|
| 169 |
+
enable_routing = gr.Checkbox(value=True, label="Dynamic Model Routing (15–40% savings)")
|
| 170 |
+
enable_compression = gr.Checkbox(value=True, label="Prompt Compression (5–20% savings)")
|
| 171 |
+
enable_circuit_breaker = gr.Checkbox(value=True, label="Circuit Breaker (prevents runaway loops)")
|
| 172 |
+
|
| 173 |
+
calc_btn = gr.Button("Calculate Savings", variant="primary", size="lg")
|
| 174 |
+
|
| 175 |
+
with gr.Column(scale=1):
|
| 176 |
+
gr.Markdown("### Results")
|
| 177 |
+
savings_headline = gr.Markdown("*Configure your setup and click Calculate.*")
|
| 178 |
+
result_md = gr.Markdown(elem_classes=["result-box"])
|
| 179 |
+
|
| 180 |
+
calc_btn.click(
|
| 181 |
+
fn=calculate_savings,
|
| 182 |
+
inputs=[
|
| 183 |
+
monthly_tokens, current_model, team_size, avg_iterations,
|
| 184 |
+
enable_caching, enable_routing, enable_compression, enable_circuit_breaker,
|
| 185 |
+
],
|
| 186 |
+
outputs=[result_md, savings_headline],
|
| 187 |
+
)
|
| 188 |
+
|
| 189 |
+
gr.Markdown("""
|
| 190 |
+
---
|
| 191 |
+
### How AgentMesh Works
|
| 192 |
+
|
| 193 |
+
```python
|
| 194 |
+
from agentmesh import AgentMesh
|
| 195 |
+
from agentmesh.policy.engine import Policy
|
| 196 |
+
|
| 197 |
+
mesh = AgentMesh(policy=Policy.from_yaml("policy.yaml"))
|
| 198 |
+
|
| 199 |
+
# Wrap any framework — zero changes to your existing agent
|
| 200 |
+
governed_graph = mesh.wrap_langgraph(your_graph) # LangGraph
|
| 201 |
+
governed_crew = mesh.wrap_crewai(your_crew) # CrewAI
|
| 202 |
+
governed_agent = mesh.wrap_openai_agent(your_agent) # OpenAI Agents
|
| 203 |
+
governed_autogen = mesh.wrap_autogen(your_agent) # AutoGen v2
|
| 204 |
+
|
| 205 |
+
print(mesh.stats)
|
| 206 |
+
# {'tokens_used': 45231, 'cost_usd': 0.054, 'cache': {'hit_rate': 0.31}}
|
| 207 |
+
```
|
| 208 |
+
|
| 209 |
+
### Quick Start
|
| 210 |
+
|
| 211 |
+
```bash
|
| 212 |
+
pip install agentmesh-proxy
|
| 213 |
+
agentmesh validate my-policy.yaml
|
| 214 |
+
agentmesh compliance report --framework eu-ai-act --policy my-policy.yaml
|
| 215 |
+
```
|
| 216 |
+
|
| 217 |
+
Built by [Anil Prasad](https://github.com/anilatambharii) · [Apache 2.0 License](https://github.com/anilatambharii/agentmesh/blob/main/LICENSE)
|
| 218 |
+
""")
|
| 219 |
+
|
| 220 |
+
|
| 221 |
+
if __name__ == "__main__":
|
| 222 |
+
demo.launch()
|
requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
gradio>=4.44.0
|