Spaces:
Running
Running
Agentic Systems Studio landing and agent trace
Browse files- README.md +31 -5
- __pycache__/app.cpython-313.pyc +0 -0
- demo.js +90 -0
- gradio/app.py +199 -0
- gradio/requirements.txt +1 -0
- index.html +36 -18
- styles.css +72 -0
README.md
CHANGED
|
@@ -1,10 +1,36 @@
|
|
| 1 |
---
|
| 2 |
title: Agentic Systems Studio
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
| 7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
title: Agentic Systems Studio
|
| 3 |
+
emoji: "🧭"
|
| 4 |
+
colorFrom: gray
|
| 5 |
+
colorTo: green
|
| 6 |
sdk: static
|
| 7 |
+
app_file: index.html
|
| 8 |
+
pinned: true
|
| 9 |
+
license: mit
|
| 10 |
+
short_description: Studio landing and a plan-tools-answer trace
|
| 11 |
+
tags:
|
| 12 |
+
- agents
|
| 13 |
+
- llmops
|
| 14 |
+
- rag
|
| 15 |
+
- portfolio
|
| 16 |
---
|
| 17 |
|
| 18 |
+
# Agentic Systems Studio
|
| 19 |
+
|
| 20 |
+
Landing page and a small **agent trace** for [Hanumanthu Harsha Vardhan](https://huggingface.co/hharsha).
|
| 21 |
+
|
| 22 |
+
Original branding for [agentic-systems-studio.com](https://agentic-systems-studio.com). Not a GitHub-search clone. The trace is a browser mock: a planner picks tools, each tool returns a real link or checklist from this studio's public projects, and the last step writes the answer. No paid LLM and no Space hardware.
|
| 23 |
+
|
| 24 |
+
## Why this is static
|
| 25 |
+
|
| 26 |
+
New Gradio Spaces on free `cpu-basic` returned **HTTP 402** (PRO required, September 2026). [`gradio/app.py`](https://huggingface.co/spaces/hharsha/agentic-systems-studio/blob/main/gradio/app.py) is the same trace, ready if the account can host Gradio later. The live page does not need that.
|
| 27 |
+
|
| 28 |
+
## Linked projects
|
| 29 |
+
|
| 30 |
+
- [agentfleet](https://github.com/hharsha98/agentfleet)
|
| 31 |
+
- [Vibespace](https://github.com/hharsha98/Vibespace)
|
| 32 |
+
- [agent-os](https://github.com/hharsha98/agent-os)
|
| 33 |
+
- [retrievallab](https://github.com/hharsha98/retrievallab)
|
| 34 |
+
- [agentops-studio](https://github.com/hharsha98/agentops-studio)
|
| 35 |
+
- [careeragent](https://github.com/hharsha98/careeragent)
|
| 36 |
+
- [Retrieval Lab](https://huggingface.co/spaces/hharsha/retrieval-lab-demo)
|
__pycache__/app.cpython-313.pyc
ADDED
|
Binary file (12.4 kB). View file
|
|
|
demo.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const CATALOG = [
|
| 2 |
+
{ id: "agentfleet", name: "AgentFleet", blurb: "Self-hostable multi-agent operations. A goal becomes a task DAG, with evals, cost governance, and guardrails.", url: "https://github.com/hharsha98/agentfleet", tags: ["agent", "fleet", "orchestr", "dag", "eval", "guardrail", "ops"] },
|
| 3 |
+
{ id: "vibespace", name: "Vibespace", blurb: "Agentic development environment: terminal grid for coding agents, a kanban that dispatches them, shared memory.", url: "https://github.com/hharsha98/Vibespace", tags: ["ide", "terminal", "kanban", "claude", "cursor", "codex", "vibe"] },
|
| 4 |
+
{ id: "agent-os", name: "Agent OS", blurb: "Local command center for agents already on the machine. Dry-run by default, sandboxed, gated control.", url: "https://github.com/hharsha98/agent-os", tags: ["local", "os", "sandbox", "dry-run", "desktop"] },
|
| 5 |
+
{ id: "retrievallab", name: "RetrievalLab", blurb: "Advanced RAG made visible: hybrid search, reranking, query transforms, recall@k and MRR.", url: "https://github.com/hharsha98/retrievallab", tags: ["rag", "retriev", "search", "rerank", "citation", "pdf", "chunk"] },
|
| 6 |
+
{ id: "agentops", name: "AgentOps Studio", blurb: "Operations lab — orchestration, cited RAG, MCP-style tools, traces. A different product from AgentFleet.", url: "https://github.com/hharsha98/agentops-studio", tags: ["mcp", "trace", "observ", "llmops", "docker", "kubernetes"] },
|
| 7 |
+
{ id: "careeragent", name: "CareerAgent", blurb: "Job-hunt agents: cited CV chat, company research, tailored bullets, Kanban tracking.", url: "https://github.com/hharsha98/careeragent", tags: ["career", "cv", "job", "resume", "hiring"] },
|
| 8 |
+
];
|
| 9 |
+
const EXTRAS = [
|
| 10 |
+
["Studio site", "https://agentic-systems-studio.com", "Product home for Agentic Systems Studio."],
|
| 11 |
+
["Retrieval Lab Demo", "https://huggingface.co/spaces/hharsha/retrieval-lab-demo", "Browser chat-with-PDF with citations."],
|
| 12 |
+
["Showcase dataset", "https://huggingface.co/datasets/hharsha/agentic-systems-showcase", "Project records. No invented papers."],
|
| 13 |
+
["LinkedIn", "https://www.linkedin.com/in/hanumanthu1", "Hanumanthu Harsha Vardhan."],
|
| 14 |
+
];
|
| 15 |
+
const CHECKLIST = [
|
| 16 |
+
"Pin the model and the prompt template; log both with the trace id.",
|
| 17 |
+
"Store retrieved passage ids, not just the final answer, so citations can be audited.",
|
| 18 |
+
"Gate tool side effects. Read-only by default; writes need an explicit confirm step.",
|
| 19 |
+
"Run a small golden set (recall@k or a rubric) before changing the chunker or the embedder.",
|
| 20 |
+
"Ship the public demo without a card. This page does not request GPU hardware.",
|
| 21 |
+
"Cloud notes for this profile: AWS and GCP only. Do not describe Azure estates that are not owned.",
|
| 22 |
+
];
|
| 23 |
+
|
| 24 |
+
function pick(goal) {
|
| 25 |
+
const text = goal.toLowerCase();
|
| 26 |
+
const scored = CATALOG.map((item) => {
|
| 27 |
+
let score = item.tags.reduce((n, tag) => n + (text.includes(tag) ? 1 : 0), 0);
|
| 28 |
+
if (text.includes(item.name.toLowerCase()) || text.includes(item.id)) score += 3;
|
| 29 |
+
return { score, item };
|
| 30 |
+
}).sort((a, b) => b.score - a.score);
|
| 31 |
+
const chosen = scored.filter((row) => row.score > 0).slice(0, 3).map((row) => row.item);
|
| 32 |
+
return chosen.length ? chosen : [CATALOG[0], CATALOG[3], CATALOG[4]];
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
function escapeHtml(s) {
|
| 36 |
+
return s.replace(/[&<>]/g, (c) => ({ "&": "&", "<": "<", ">": ">" }[c]));
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
function renderCards() {
|
| 40 |
+
const bits = CATALOG.map((item) => `<a class="card" href="${item.url}" target="_blank" rel="noreferrer"><strong>${item.name}</strong><span>${item.blurb}</span></a>`);
|
| 41 |
+
for (const [name, url, blurb] of EXTRAS) {
|
| 42 |
+
bits.push(`<a class="card" href="${url}" target="_blank" rel="noreferrer"><strong>${name}</strong><span>${blurb}</span></a>`);
|
| 43 |
+
}
|
| 44 |
+
document.getElementById("cards").innerHTML = bits.join("");
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
function run() {
|
| 48 |
+
const goal = document.getElementById("goal").value.trim();
|
| 49 |
+
const out = document.getElementById("trace");
|
| 50 |
+
if (goal.length < 8) {
|
| 51 |
+
out.textContent = "Give the agent a goal of at least a short sentence.";
|
| 52 |
+
return;
|
| 53 |
+
}
|
| 54 |
+
const projects = pick(goal);
|
| 55 |
+
const wantsRetrieval = projects.some((p) => p.id === "retrievallab") || /rag|pdf|retriev|citation/.test(goal.toLowerCase());
|
| 56 |
+
const plan = [
|
| 57 |
+
"Restate the goal and refuse anything that is not in the studio catalog.",
|
| 58 |
+
"Select at most three public projects whose tags overlap the goal.",
|
| 59 |
+
"If the goal is about documents, attach the retrieval demo contract (chunk, embed, cite).",
|
| 60 |
+
"Attach an LLMOps checklist and name AWS/GCP only.",
|
| 61 |
+
"Write the answer as a trace, not as a hidden chain of thought.",
|
| 62 |
+
];
|
| 63 |
+
const names = projects.map((p) => p.name).join(", ");
|
| 64 |
+
const toolItems = projects.map((p) => `<li><code>${escapeHtml(p.name)}</code> — ${escapeHtml(p.blurb)} → <a href="${p.url}">${p.url}</a></li>`).join("");
|
| 65 |
+
const retrieval = wantsRetrieval
|
| 66 |
+
? `<p><strong>retrieval_notes</strong> — contract for the public demo, not a second product.</p>
|
| 67 |
+
<ul>
|
| 68 |
+
<li>Chunk on page boundaries, embed, return top-k and a citation table.</li>
|
| 69 |
+
<li>If generation is unavailable, keep the extractive sentences. Do not fill gaps from memory.</li>
|
| 70 |
+
<li>Try it: <a href="https://huggingface.co/spaces/hharsha/retrieval-lab-demo">Retrieval Lab</a></li>
|
| 71 |
+
</ul>`
|
| 72 |
+
: "";
|
| 73 |
+
out.innerHTML = `
|
| 74 |
+
<h3>1 · Plan</h3>
|
| 75 |
+
<ol>${plan.map((s) => `<li>${s}</li>`).join("")}</ol>
|
| 76 |
+
<h3>2 · Tools</h3>
|
| 77 |
+
<p><strong>repo_catalog</strong> — read-only lookup over the six public products.</p>
|
| 78 |
+
<ul>${toolItems}</ul>
|
| 79 |
+
${retrieval}
|
| 80 |
+
<p><strong>llmops_checklist</strong></p>
|
| 81 |
+
<ul>${CHECKLIST.map((s) => `<li>${s}</li>`).join("")}</ul>
|
| 82 |
+
<h3>3 · Answer</h3>
|
| 83 |
+
<p>For “${escapeHtml(goal.replace(/\.$/, ""))}”, start with <strong>${escapeHtml(names)}</strong>. Ship the smallest loop a reviewer can click: a catalog entry, a retrieval path with citations, and a checklist that gates side effects. The trace above is the whole agent. It ran in the browser on rules and this catalog — there is no hidden paid model on this Space.</p>
|
| 84 |
+
<p>Studio: <a href="https://agentic-systems-studio.com">agentic-systems-studio.com</a> · GitHub: <a href="https://github.com/hharsha98">hharsha98</a> · Nuremberg.</p>
|
| 85 |
+
`;
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
renderCards();
|
| 89 |
+
document.getElementById("run").addEventListener("click", run);
|
| 90 |
+
run();
|
gradio/app.py
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
|
| 3 |
+
CATALOG = [
|
| 4 |
+
{
|
| 5 |
+
"id": "agentfleet",
|
| 6 |
+
"name": "AgentFleet",
|
| 7 |
+
"blurb": "Self-hostable multi-agent operations. A goal becomes a task DAG, with evals, cost governance, and guardrails.",
|
| 8 |
+
"url": "https://github.com/hharsha98/agentfleet",
|
| 9 |
+
"tags": ["agent", "fleet", "orchestr", "dag", "eval", "guardrail", "ops"],
|
| 10 |
+
},
|
| 11 |
+
{
|
| 12 |
+
"id": "vibespace",
|
| 13 |
+
"name": "Vibespace",
|
| 14 |
+
"blurb": "Agentic development environment: terminal grid for coding agents, a kanban that dispatches them, shared memory.",
|
| 15 |
+
"url": "https://github.com/hharsha98/Vibespace",
|
| 16 |
+
"tags": ["ide", "terminal", "kanban", "claude", "cursor", "codex", "vibe"],
|
| 17 |
+
},
|
| 18 |
+
{
|
| 19 |
+
"id": "agent-os",
|
| 20 |
+
"name": "Agent OS",
|
| 21 |
+
"blurb": "Local command center for agents already on the machine. Dry-run by default, sandboxed, gated control.",
|
| 22 |
+
"url": "https://github.com/hharsha98/agent-os",
|
| 23 |
+
"tags": ["local", "os", "sandbox", "dry-run", "desktop"],
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"id": "retrievallab",
|
| 27 |
+
"name": "RetrievalLab",
|
| 28 |
+
"blurb": "Advanced RAG made visible: hybrid search, reranking, query transforms, recall@k and MRR.",
|
| 29 |
+
"url": "https://github.com/hharsha98/retrievallab",
|
| 30 |
+
"tags": ["rag", "retriev", "search", "rerank", "citation", "pdf", "chunk"],
|
| 31 |
+
},
|
| 32 |
+
{
|
| 33 |
+
"id": "agentops",
|
| 34 |
+
"name": "AgentOps Studio",
|
| 35 |
+
"blurb": "Operations lab — orchestration, cited RAG, MCP-style tools, traces. A different product from AgentFleet.",
|
| 36 |
+
"url": "https://github.com/hharsha98/agentops-studio",
|
| 37 |
+
"tags": ["mcp", "trace", "observ", "llmops", "docker", "kubernetes"],
|
| 38 |
+
},
|
| 39 |
+
{
|
| 40 |
+
"id": "careeragent",
|
| 41 |
+
"name": "CareerAgent",
|
| 42 |
+
"blurb": "Job-hunt agents: cited CV chat, company research, tailored bullets, Kanban tracking.",
|
| 43 |
+
"url": "https://github.com/hharsha98/careeragent",
|
| 44 |
+
"tags": ["career", "cv", "job", "resume", "hiring"],
|
| 45 |
+
},
|
| 46 |
+
]
|
| 47 |
+
|
| 48 |
+
CHECKLIST = [
|
| 49 |
+
"Pin the model and the prompt template; log both with the trace id.",
|
| 50 |
+
"Store retrieved passage ids, not just the final answer, so citations can be audited.",
|
| 51 |
+
"Gate tool side effects. Read-only by default; writes need an explicit confirm step.",
|
| 52 |
+
"Run a small golden set (recall@k or a rubric) before changing the chunker or the embedder.",
|
| 53 |
+
"Ship on CPU first. This studio's public Hub demos stay on cpu-basic.",
|
| 54 |
+
"Cloud notes for this profile: AWS and GCP only. Do not describe Azure estates that are not owned.",
|
| 55 |
+
]
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def cards_html() -> str:
|
| 59 |
+
bits = []
|
| 60 |
+
for item in CATALOG:
|
| 61 |
+
bits.append(
|
| 62 |
+
f"<a class='card' href='{item['url']}' target='_blank' rel='noreferrer'>"
|
| 63 |
+
f"<strong>{item['name']}</strong><span>{item['blurb']}</span></a>"
|
| 64 |
+
)
|
| 65 |
+
extras = [
|
| 66 |
+
("Studio site", "https://agentic-systems-studio.com", "Product home for Agentic Systems Studio."),
|
| 67 |
+
("Retrieval Lab Demo", "https://huggingface.co/spaces/hharsha/retrieval-lab-demo", "CPU chat-with-PDF with citations."),
|
| 68 |
+
("Showcase dataset", "https://huggingface.co/datasets/hharsha/agentic-systems-showcase", "Project records, no invented papers."),
|
| 69 |
+
("LinkedIn", "https://www.linkedin.com/in/hanumanthu1", "Hanumanthu Harsha Vardhan."),
|
| 70 |
+
]
|
| 71 |
+
for name, url, blurb in extras:
|
| 72 |
+
bits.append(
|
| 73 |
+
f"<a class='card alt' href='{url}' target='_blank' rel='noreferrer'>"
|
| 74 |
+
f"<strong>{name}</strong><span>{blurb}</span></a>"
|
| 75 |
+
)
|
| 76 |
+
return "<div class='grid'>" + "".join(bits) + "</div>"
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
def pick_projects(goal: str) -> list[dict]:
|
| 80 |
+
text = goal.lower()
|
| 81 |
+
scored = []
|
| 82 |
+
for item in CATALOG:
|
| 83 |
+
score = sum(1 for tag in item["tags"] if tag in text)
|
| 84 |
+
if item["name"].lower() in text or item["id"] in text:
|
| 85 |
+
score += 3
|
| 86 |
+
scored.append((score, item))
|
| 87 |
+
scored.sort(key=lambda pair: pair[0], reverse=True)
|
| 88 |
+
chosen = [item for score, item in scored if score > 0][:3]
|
| 89 |
+
if not chosen:
|
| 90 |
+
chosen = [CATALOG[0], CATALOG[3], CATALOG[4]]
|
| 91 |
+
return chosen
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
def run_agent(goal: str) -> str:
|
| 95 |
+
goal = (goal or "").strip()
|
| 96 |
+
if len(goal) < 8:
|
| 97 |
+
return "Give the agent a goal of at least a short sentence. Example: *Design a cited RAG demo and the ops checks before I ship it.*"
|
| 98 |
+
projects = pick_projects(goal)
|
| 99 |
+
wants_retrieval = any(p["id"] == "retrievallab" for p in projects) or any(
|
| 100 |
+
w in goal.lower() for w in ("rag", "pdf", "retriev", "citation")
|
| 101 |
+
)
|
| 102 |
+
wants_ops = any(w in goal.lower() for w in ("ops", "deploy", "eval", "ship", "llmops", "aws", "gcp", "trace"))
|
| 103 |
+
tools = ["repo_catalog"]
|
| 104 |
+
if wants_retrieval:
|
| 105 |
+
tools.append("retrieval_notes")
|
| 106 |
+
if wants_ops or True:
|
| 107 |
+
tools.append("llmops_checklist")
|
| 108 |
+
|
| 109 |
+
plan = [
|
| 110 |
+
"Restate the goal and refuse anything that is not in the studio catalog.",
|
| 111 |
+
"Select at most three public projects whose tags overlap the goal.",
|
| 112 |
+
"If the goal is about documents, attach the retrieval demo contract (chunk, embed, cite).",
|
| 113 |
+
"Attach an LLMOps checklist and name AWS/GCP only.",
|
| 114 |
+
"Write the answer as a trace, not as a hidden chain of thought.",
|
| 115 |
+
]
|
| 116 |
+
lines = ["## 1 · Plan"]
|
| 117 |
+
for i, step in enumerate(plan, start=1):
|
| 118 |
+
lines.append(f"{i}. {step}")
|
| 119 |
+
lines.append("\n## 2 · Tools")
|
| 120 |
+
lines.append("**repo_catalog** — read-only lookup over the six public products.")
|
| 121 |
+
for p in projects:
|
| 122 |
+
lines.append(f"- `{p['name']}` — {p['blurb']} → {p['url']}")
|
| 123 |
+
if "retrieval_notes" in tools:
|
| 124 |
+
lines.append("")
|
| 125 |
+
lines.append("**retrieval_notes** — contract for the CPU demo, not a second product.")
|
| 126 |
+
lines.append("- Chunk on page boundaries, embed with MiniLM-class vectors, return top-k and a citation table.")
|
| 127 |
+
lines.append("- If generation is unavailable, keep the extractive sentences. Do not fill gaps from memory.")
|
| 128 |
+
lines.append("- Try it: https://huggingface.co/spaces/hharsha/retrieval-lab-demo")
|
| 129 |
+
lines.append("")
|
| 130 |
+
lines.append("**llmops_checklist** — six checks, no cloud inventory beyond what the profile owns.")
|
| 131 |
+
for item in CHECKLIST:
|
| 132 |
+
lines.append(f"- {item}")
|
| 133 |
+
names = ", ".join(p["name"] for p in projects)
|
| 134 |
+
lines.append("\n## 3 · Answer")
|
| 135 |
+
lines.append(
|
| 136 |
+
f"For “{goal.rstrip('.')}”, start with **{names}**. "
|
| 137 |
+
"Ship the smallest loop that a reviewer can click: a catalog entry, a retrieval path with citations, and a checklist that gates side effects. "
|
| 138 |
+
"The trace above is the whole agent. It ran on CPU with rules and the studio catalog — there is no hidden paid model in this Space."
|
| 139 |
+
)
|
| 140 |
+
lines.append(
|
| 141 |
+
"\nStudio: https://agentic-systems-studio.com · GitHub: https://github.com/hharsha98 · Nuremberg."
|
| 142 |
+
)
|
| 143 |
+
return "\n".join(lines)
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
CSS = """
|
| 147 |
+
@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,560;9..144,680&family=Source+Sans+3:wght@400;600&display=swap');
|
| 148 |
+
.gradio-container {background: #f3efe6 !important;}
|
| 149 |
+
h1, h2, h3 {font-family: Fraunces, Georgia, serif !important;}
|
| 150 |
+
.grid {display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 12px; margin-top: 8px;}
|
| 151 |
+
.card {
|
| 152 |
+
display: flex; flex-direction: column; gap: 6px;
|
| 153 |
+
text-decoration: none; color: #1c1915;
|
| 154 |
+
background: #fffdf8; border: 1px solid #e3d9c8; border-radius: 16px;
|
| 155 |
+
padding: 14px 14px 12px; min-height: 112px;
|
| 156 |
+
font-family: "Source Sans 3", ui-sans-serif, system-ui, sans-serif;
|
| 157 |
+
}
|
| 158 |
+
.card strong {font-family: Fraunces, Georgia, serif; font-size: 1.15rem;}
|
| 159 |
+
.card span {color: #5c564c; line-height: 1.35;}
|
| 160 |
+
.card:hover {border-color: #1f4d3a;}
|
| 161 |
+
footer {display: none !important;}
|
| 162 |
+
"""
|
| 163 |
+
|
| 164 |
+
EXAMPLES = [
|
| 165 |
+
"Plan a cited RAG demo I can run on a laptop, and the checks before I ship it.",
|
| 166 |
+
"I want a local-first place to supervise several coding agents. What should I open?",
|
| 167 |
+
"Compare AgentFleet and AgentOps Studio for an LLMOps walkthrough.",
|
| 168 |
+
]
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
def build():
|
| 172 |
+
with gr.Blocks(title="Agentic Systems Studio", css=CSS, theme=gr.themes.Soft(primary_hue="green", neutral_hue="stone")) as demo:
|
| 173 |
+
gr.Markdown(
|
| 174 |
+
"""
|
| 175 |
+
# Agentic Systems Studio
|
| 176 |
+
Hanumanthu Harsha Vardhan · Nuremberg · agents, RAG, LLMOps
|
| 177 |
+
|
| 178 |
+
A studio map and a CPU agent trace. The trace is deliberate: **plan, call tools, answer**. It uses this catalog only — it does not search GitHub at large and it does not pretend to be someone else's project.
|
| 179 |
+
"""
|
| 180 |
+
)
|
| 181 |
+
with gr.Tabs():
|
| 182 |
+
with gr.Tab("Studio"):
|
| 183 |
+
gr.HTML(cards_html())
|
| 184 |
+
gr.Markdown(
|
| 185 |
+
"Email [mechaharsh@gmail.com](mailto:mechaharsh@gmail.com) · "
|
| 186 |
+
"[GitHub hharsha98](https://github.com/hharsha98)"
|
| 187 |
+
)
|
| 188 |
+
with gr.Tab("Agent trace"):
|
| 189 |
+
goal = gr.Textbox(label="Goal", lines=3, placeholder=EXAMPLES[0])
|
| 190 |
+
gr.Examples(examples=EXAMPLES, inputs=goal)
|
| 191 |
+
go = gr.Button("Run plan → tools → answer", variant="primary")
|
| 192 |
+
out = gr.Markdown()
|
| 193 |
+
go.click(run_agent, goal, out)
|
| 194 |
+
goal.submit(run_agent, goal, out)
|
| 195 |
+
return demo
|
| 196 |
+
|
| 197 |
+
|
| 198 |
+
if __name__ == "__main__":
|
| 199 |
+
build().launch()
|
gradio/requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
gradio==5.50.0
|
index.html
CHANGED
|
@@ -1,19 +1,37 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</html>
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 6 |
+
<title>Agentic Systems Studio</title>
|
| 7 |
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,560&family=Source+Sans+3:wght@400;600;700&display=swap" />
|
| 8 |
+
<link rel="stylesheet" href="./styles.css" />
|
| 9 |
+
</head>
|
| 10 |
+
<body>
|
| 11 |
+
<main>
|
| 12 |
+
<div class="kicker">Nuremberg · agents · RAG · LLMOps</div>
|
| 13 |
+
<h1>Agentic Systems Studio</h1>
|
| 14 |
+
<p class="lede">Hanumanthu Harsha Vardhan. A product map and a CPU-free agent trace: plan, call tools, answer. The trace only knows this studio's public projects. It is not a GitHub-wide search and it is not someone else's Space.</p>
|
| 15 |
+
<div class="row">
|
| 16 |
+
<a class="btn" href="https://agentic-systems-studio.com">Studio site</a>
|
| 17 |
+
<a class="btn ghost" href="https://github.com/hharsha98">GitHub</a>
|
| 18 |
+
<a class="btn ghost" href="https://www.linkedin.com/in/hanumanthu1">LinkedIn</a>
|
| 19 |
+
<a class="btn ghost" href="https://huggingface.co/spaces/hharsha/retrieval-lab-demo">Retrieval Lab</a>
|
| 20 |
+
</div>
|
| 21 |
+
<h2 style="margin-top:28px">Products</h2>
|
| 22 |
+
<div id="cards" class="grid"></div>
|
| 23 |
+
<section class="panel">
|
| 24 |
+
<h2>Agent trace</h2>
|
| 25 |
+
<p class="lede">Type a goal. The mock plans in the open, looks up the catalog, attaches a retrieval note when the goal is about documents, and ends with an LLMOps checklist. AWS and GCP only.</p>
|
| 26 |
+
<label for="goal">Goal</label>
|
| 27 |
+
<textarea id="goal">Plan a cited RAG demo I can run on a laptop, and the checks before I ship it.</textarea>
|
| 28 |
+
<div class="row" style="margin-top:10px">
|
| 29 |
+
<button id="run" type="button">Run plan → tools → answer</button>
|
| 30 |
+
</div>
|
| 31 |
+
<div id="trace" class="trace"></div>
|
| 32 |
+
</section>
|
| 33 |
+
<p class="note">Gradio hosting on new cpu-basic Spaces returned HTTP 402 without PRO. <code>gradio/app.py</code> is the same trace for a PRO Space. This page runs entirely in the browser. Email <a href="mailto:mechaharsh@gmail.com">mechaharsh@gmail.com</a>.</p>
|
| 34 |
+
</main>
|
| 35 |
+
<script type="module" src="./demo.js"></script>
|
| 36 |
+
</body>
|
| 37 |
</html>
|
styles.css
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
:root {
|
| 3 |
+
--ink: #1c1915;
|
| 4 |
+
--muted: #5e584e;
|
| 5 |
+
--paper: #f4efe6;
|
| 6 |
+
--card: #fffdf8;
|
| 7 |
+
--line: #e4d9c8;
|
| 8 |
+
--pine: #1f4d3a;
|
| 9 |
+
--copper: #b85c38;
|
| 10 |
+
}
|
| 11 |
+
* { box-sizing: border-box; }
|
| 12 |
+
body {
|
| 13 |
+
margin: 0;
|
| 14 |
+
color: var(--ink);
|
| 15 |
+
background:
|
| 16 |
+
radial-gradient(900px 420px at 0% -10%, #efe2cc 0%, transparent 50%),
|
| 17 |
+
var(--paper);
|
| 18 |
+
font-family: "Source Sans 3", "Segoe UI", sans-serif;
|
| 19 |
+
}
|
| 20 |
+
main { max-width: 980px; margin: 0 auto; padding: 36px 18px 64px; }
|
| 21 |
+
.kicker { letter-spacing: .16em; text-transform: uppercase; font-size: 12px; color: var(--copper); font-weight: 700; }
|
| 22 |
+
h1 { font-family: Fraunces, Georgia, serif; font-weight: 560; font-size: clamp(2rem, 4vw, 3rem); line-height: 1.05; margin: 6px 0 8px; }
|
| 23 |
+
h2 { font-family: Fraunces, Georgia, serif; font-size: 1.45rem; margin: 0 0 8px; }
|
| 24 |
+
.lede { color: var(--muted); max-width: 46rem; font-size: 1.05rem; }
|
| 25 |
+
a { color: var(--pine); }
|
| 26 |
+
.panel {
|
| 27 |
+
background: var(--card);
|
| 28 |
+
border: 1px solid var(--line);
|
| 29 |
+
border-radius: 16px;
|
| 30 |
+
padding: 16px;
|
| 31 |
+
margin-top: 14px;
|
| 32 |
+
}
|
| 33 |
+
label { display: block; font-size: 13px; font-weight: 700; margin-bottom: 6px; }
|
| 34 |
+
input[type="file"], textarea, input[type="range"] { width: 100%; }
|
| 35 |
+
textarea {
|
| 36 |
+
font: inherit;
|
| 37 |
+
border: 1px solid var(--line);
|
| 38 |
+
border-radius: 12px;
|
| 39 |
+
padding: 10px 12px;
|
| 40 |
+
background: #fff;
|
| 41 |
+
min-height: 78px;
|
| 42 |
+
}
|
| 43 |
+
.row { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
|
| 44 |
+
button, .btn {
|
| 45 |
+
font: inherit;
|
| 46 |
+
background: var(--pine);
|
| 47 |
+
color: #f6f1e8;
|
| 48 |
+
border: 0;
|
| 49 |
+
border-radius: 999px;
|
| 50 |
+
padding: 10px 16px;
|
| 51 |
+
cursor: pointer;
|
| 52 |
+
text-decoration: none;
|
| 53 |
+
display: inline-block;
|
| 54 |
+
}
|
| 55 |
+
button.ghost, .btn.ghost { background: transparent; color: var(--pine); border: 1px solid var(--pine); }
|
| 56 |
+
button:disabled { opacity: .55; cursor: wait; }
|
| 57 |
+
.status { color: var(--muted); font-size: .95rem; min-height: 1.2em; }
|
| 58 |
+
.answer { white-space: pre-wrap; line-height: 1.45; }
|
| 59 |
+
table { width: 100%; border-collapse: collapse; font-size: .92rem; }
|
| 60 |
+
th, td { text-align: left; vertical-align: top; border-top: 1px solid var(--line); padding: 8px 6px; }
|
| 61 |
+
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 12px; }
|
| 62 |
+
.card {
|
| 63 |
+
display: flex; flex-direction: column; gap: 6px;
|
| 64 |
+
background: var(--card); border: 1px solid var(--line); border-radius: 16px;
|
| 65 |
+
padding: 14px; text-decoration: none; color: inherit; min-height: 120px;
|
| 66 |
+
}
|
| 67 |
+
.card:hover { border-color: var(--pine); }
|
| 68 |
+
.card strong { font-family: Fraunces, Georgia, serif; font-size: 1.15rem; }
|
| 69 |
+
.card span { color: var(--muted); }
|
| 70 |
+
.trace { line-height: 1.45; }
|
| 71 |
+
.trace h3 { font-family: Fraunces, Georgia, serif; margin: 16px 0 6px; }
|
| 72 |
+
footer.note { margin-top: 22px; color: var(--muted); font-size: .92rem; }
|