hharsha commited on
Commit
903fbb7
·
verified ·
1 Parent(s): 1f44333

Agentic Systems Studio landing and agent trace

Browse files
Files changed (7) hide show
  1. README.md +31 -5
  2. __pycache__/app.cpython-313.pyc +0 -0
  3. demo.js +90 -0
  4. gradio/app.py +199 -0
  5. gradio/requirements.txt +1 -0
  6. index.html +36 -18
  7. styles.css +72 -0
README.md CHANGED
@@ -1,10 +1,36 @@
1
  ---
2
  title: Agentic Systems Studio
3
- emoji: 👁
4
- colorFrom: purple
5
- colorTo: pink
6
  sdk: static
7
- pinned: false
 
 
 
 
 
 
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;" }[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
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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; }