Polish submission copy and candidate board naming
Browse files- README.md +17 -17
- frontend/dist/assets/index-D5kjkl_L.js +0 -0
- frontend/dist/index.html +1 -1
- frontend/src/App.jsx +1 -1
- frontend/src/components/CandidateBoard.jsx +128 -0
- frontend/src/components/ResearchWorkspace.jsx +2 -2
README.md
CHANGED
|
@@ -19,18 +19,19 @@ models:
|
|
| 19 |
|
| 20 |
# HF Agentic Search
|
| 21 |
|
| 22 |
-
Finding a dataset is easy. Deciding whether it actually fits
|
| 23 |
|
| 24 |
-
HF Agentic Search turns a project brief into a research
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
|
|
|
| 28 |
|
| 29 |
- **Submission Space:** https://huggingface.co/spaces/build-small-hackathon/HF-Agentic-Search
|
| 30 |
- **Working staging Space:** https://huggingface.co/spaces/sammoftah/HF-Agentic-Search
|
| 31 |
- **Source:** https://github.com/OsamaMoftah/HF-Agentic-Search
|
| 32 |
-
- **Demo video:** `
|
| 33 |
-
- **Social post:** `
|
| 34 |
- **Team usernames:** `sammoftah`
|
| 35 |
|
| 36 |
## Why it is agentic
|
|
@@ -119,17 +120,16 @@ cd frontend && npm run build
|
|
| 119 |
|
| 120 |
## Build Small submission
|
| 121 |
|
| 122 |
-
Submitted to the **Backyard AI** track and
|
| 123 |
-
**Off Brand**. The
|
| 124 |
-
|
| 125 |
|
| 126 |
-
|
| 127 |
|
| 128 |
-
-
|
| 129 |
-
- The
|
| 130 |
-
- The declared model is `HuggingFaceTB/SmolLM2-360M-Instruct` at 360M parameters, below the 32B limit.
|
| 131 |
- Team username is listed above.
|
| 132 |
-
- Demo video and social-post URLs
|
| 133 |
|
| 134 |
-
|
| 135 |
-
|
|
|
|
| 19 |
|
| 20 |
# HF Agentic Search
|
| 21 |
|
| 22 |
+
Finding a dataset is easy. Deciding whether it actually fits an ML project is not.
|
| 23 |
|
| 24 |
+
HF Agentic Search turns a plain-language project brief into a small research loop: it plans
|
| 25 |
+
targeted Hugging Face Hub searches, inspects candidate cards and Dataset Viewer evidence,
|
| 26 |
+
checks schemas and samples, then returns a ranked shortlist with transparent reasons. The app
|
| 27 |
+
is built for engineers who care less about popularity and more about whether the data can
|
| 28 |
+
actually support the model or evaluation they are trying to ship.
|
| 29 |
|
| 30 |
- **Submission Space:** https://huggingface.co/spaces/build-small-hackathon/HF-Agentic-Search
|
| 31 |
- **Working staging Space:** https://huggingface.co/spaces/sammoftah/HF-Agentic-Search
|
| 32 |
- **Source:** https://github.com/OsamaMoftah/HF-Agentic-Search
|
| 33 |
+
- **Demo video:** `PENDING: add a public demo-video URL before final validation`
|
| 34 |
+
- **Social post:** `PENDING: add the public social-media post URL before final validation`
|
| 35 |
- **Team usernames:** `sammoftah`
|
| 36 |
|
| 37 |
## Why it is agentic
|
|
|
|
| 120 |
|
| 121 |
## Build Small submission
|
| 122 |
|
| 123 |
+
Submitted to the **Backyard AI** track and positioned for **Best Agent**, **Tiny Titan**, and
|
| 124 |
+
**Off Brand**. The app runs as a Gradio Space inside the `build-small-hackathon` organization,
|
| 125 |
+
with a custom React interface served through `gr.Server`.
|
| 126 |
|
| 127 |
+
Submission readiness:
|
| 128 |
|
| 129 |
+
- YAML tags are present: `track:backyard`, `sponsor:openai`, `achievement:offbrand`.
|
| 130 |
+
- The model is `HuggingFaceTB/SmolLM2-360M-Instruct` at 360M parameters, well below the 32B limit.
|
|
|
|
| 131 |
- Team username is listed above.
|
| 132 |
+
- Demo video and social-post URLs are the remaining fields to replace before the final validator run.
|
| 133 |
|
| 134 |
+
Built, tested, deployed, and prepared for submission with OpenAI Codex. Codex-attributed commits
|
| 135 |
+
are available in the linked public GitHub repository.
|
frontend/dist/assets/index-D5kjkl_L.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
frontend/dist/index.html
CHANGED
|
@@ -6,7 +6,7 @@
|
|
| 6 |
<meta name="theme-color" content="#f4faff" />
|
| 7 |
<meta name="description" content="Evidence-led agentic dataset discovery for Hugging Face." />
|
| 8 |
<title>HF Agentic Search</title>
|
| 9 |
-
<script type="module" crossorigin src="/assets/index-
|
| 10 |
<link rel="stylesheet" crossorigin href="/assets/index-DnaN9mhA.css">
|
| 11 |
</head>
|
| 12 |
<body>
|
|
|
|
| 6 |
<meta name="theme-color" content="#f4faff" />
|
| 7 |
<meta name="description" content="Evidence-led agentic dataset discovery for Hugging Face." />
|
| 8 |
<title>HF Agentic Search</title>
|
| 9 |
+
<script type="module" crossorigin src="/assets/index-D5kjkl_L.js"></script>
|
| 10 |
<link rel="stylesheet" crossorigin href="/assets/index-DnaN9mhA.css">
|
| 11 |
</head>
|
| 12 |
<body>
|
frontend/src/App.jsx
CHANGED
|
@@ -28,7 +28,7 @@ function Workspace() {
|
|
| 28 |
<section className="hero">
|
| 29 |
<div className="hero-copy">
|
| 30 |
<span className="section-index">Agentic dataset research</span>
|
| 31 |
-
<h1>A new way to search for datasets.</h1>
|
| 32 |
<p>
|
| 33 |
Describe the model or evaluation you want to build. The agent turns that brief
|
| 34 |
into testable data requirements, searches the Hub from several angles, inspects
|
|
|
|
| 28 |
<section className="hero">
|
| 29 |
<div className="hero-copy">
|
| 30 |
<span className="section-index">Agentic dataset research</span>
|
| 31 |
+
<h1>A new way to search for Hugging Face datasets.</h1>
|
| 32 |
<p>
|
| 33 |
Describe the model or evaluation you want to build. The agent turns that brief
|
| 34 |
into testable data requirements, searches the Hub from several angles, inspects
|
frontend/src/components/CandidateBoard.jsx
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import React from 'react';
|
| 2 |
+
import { useGame } from '../GameProvider.jsx';
|
| 3 |
+
|
| 4 |
+
const LANES = [
|
| 5 |
+
{
|
| 6 |
+
status: 'recommended',
|
| 7 |
+
title: 'Recommended',
|
| 8 |
+
description: 'Ready for a first experiment',
|
| 9 |
+
},
|
| 10 |
+
{
|
| 11 |
+
status: 'conditional',
|
| 12 |
+
title: 'Review gaps',
|
| 13 |
+
description: 'Useful, but one or more checks need attention',
|
| 14 |
+
},
|
| 15 |
+
{
|
| 16 |
+
status: 'rejected',
|
| 17 |
+
title: 'Rejected',
|
| 18 |
+
description: 'Does not satisfy this project brief',
|
| 19 |
+
},
|
| 20 |
+
];
|
| 21 |
+
|
| 22 |
+
const CHECKS = [
|
| 23 |
+
['domain', 'Domain'],
|
| 24 |
+
['required_fields', 'Schema'],
|
| 25 |
+
['language', 'Lang'],
|
| 26 |
+
['license', 'License'],
|
| 27 |
+
['accessible', 'Access'],
|
| 28 |
+
];
|
| 29 |
+
|
| 30 |
+
function shortName(id) {
|
| 31 |
+
return id?.split('/').pop()?.replaceAll('_', ' ') || id;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
function mainGap(dataset) {
|
| 35 |
+
if (dataset.status === 'recommended') return 'All critical evidence checks passed.';
|
| 36 |
+
if (dataset.rejection_reasons?.length) return dataset.rejection_reasons[0];
|
| 37 |
+
return dataset.weakness || 'Review the remaining evidence gaps before using it.';
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
function compactEvidence(dataset) {
|
| 41 |
+
const features = dataset.features?.slice(0, 3).join(', ');
|
| 42 |
+
const examples = dataset.num_examples ? `${dataset.num_examples.toLocaleString()} rows` : 'size unknown';
|
| 43 |
+
return features ? `${features} · ${examples}` : examples;
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
export default function CandidateBoard() {
|
| 47 |
+
const { state, selected, selectDataset } = useGame();
|
| 48 |
+
const datasets = state.datasets || [];
|
| 49 |
+
const counts = LANES.map((lane) => ({
|
| 50 |
+
...lane,
|
| 51 |
+
count: datasets.filter((dataset) => dataset.status === lane.status).length,
|
| 52 |
+
}));
|
| 53 |
+
|
| 54 |
+
if (!datasets.length) {
|
| 55 |
+
return (
|
| 56 |
+
<div className="candidate-board empty">
|
| 57 |
+
<div className="workflow-preview" aria-hidden="true">
|
| 58 |
+
<div><span>01</span><strong>Search</strong><small>Multiple Hub queries</small></div>
|
| 59 |
+
<i />
|
| 60 |
+
<div><span>02</span><strong>Test</strong><small>Schema and sample checks</small></div>
|
| 61 |
+
<i />
|
| 62 |
+
<div><span>03</span><strong>Explain</strong><small>Documented evidence</small></div>
|
| 63 |
+
</div>
|
| 64 |
+
<strong>Every candidate must earn its place.</strong>
|
| 65 |
+
<p>The agent searches broadly, then narrows the field by checking the actual dataset, not just its title.</p>
|
| 66 |
+
</div>
|
| 67 |
+
);
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
return (
|
| 71 |
+
<div className="candidate-board">
|
| 72 |
+
<div className="decision-summary">
|
| 73 |
+
{counts.map((lane) => (
|
| 74 |
+
<div className={`decision-stat stat-${lane.status}`} key={lane.status}>
|
| 75 |
+
<span>{lane.title}</span>
|
| 76 |
+
<strong>{lane.count}</strong>
|
| 77 |
+
</div>
|
| 78 |
+
))}
|
| 79 |
+
<p>Read left to right as a decision queue: usable now, usable with caveats, or not a fit for this brief.</p>
|
| 80 |
+
</div>
|
| 81 |
+
|
| 82 |
+
<div className="candidate-lanes">
|
| 83 |
+
{counts.map((lane) => {
|
| 84 |
+
const laneDatasets = datasets.filter((dataset) => dataset.status === lane.status);
|
| 85 |
+
return (
|
| 86 |
+
<section className={`candidate-lane lane-${lane.status}`} key={lane.status}>
|
| 87 |
+
<div className="lane-heading">
|
| 88 |
+
<div>
|
| 89 |
+
<strong>{lane.title}</strong>
|
| 90 |
+
<span>{lane.description}</span>
|
| 91 |
+
</div>
|
| 92 |
+
<b>{lane.count}</b>
|
| 93 |
+
</div>
|
| 94 |
+
|
| 95 |
+
{laneDatasets.length ? laneDatasets.map((dataset) => (
|
| 96 |
+
<button
|
| 97 |
+
type="button"
|
| 98 |
+
className={`candidate-card ${selected?.id === dataset.id ? 'active' : ''}`}
|
| 99 |
+
key={dataset.id}
|
| 100 |
+
onClick={() => selectDataset(dataset)}
|
| 101 |
+
>
|
| 102 |
+
<div className="candidate-card-top">
|
| 103 |
+
<strong title={dataset.id}>{shortName(dataset.id)}</strong>
|
| 104 |
+
<span>{dataset.score}</span>
|
| 105 |
+
</div>
|
| 106 |
+
<p>{mainGap(dataset)}</p>
|
| 107 |
+
<small>{compactEvidence(dataset)}</small>
|
| 108 |
+
<div className="check-dots" aria-label="Evidence checks">
|
| 109 |
+
{CHECKS.map(([key, label]) => {
|
| 110 |
+
const value = dataset.checks?.[key] || 'unknown';
|
| 111 |
+
return (
|
| 112 |
+
<span className={`check-dot check-${value}`} key={key} title={`${label}: ${value}`}>
|
| 113 |
+
{label}
|
| 114 |
+
</span>
|
| 115 |
+
);
|
| 116 |
+
})}
|
| 117 |
+
</div>
|
| 118 |
+
</button>
|
| 119 |
+
)) : (
|
| 120 |
+
<div className="candidate-empty">No candidates in this tier yet.</div>
|
| 121 |
+
)}
|
| 122 |
+
</section>
|
| 123 |
+
);
|
| 124 |
+
})}
|
| 125 |
+
</div>
|
| 126 |
+
</div>
|
| 127 |
+
);
|
| 128 |
+
}
|
frontend/src/components/ResearchWorkspace.jsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
import React, { useMemo } from 'react';
|
| 2 |
import { useGame } from '../GameProvider.jsx';
|
| 3 |
-
import
|
| 4 |
|
| 5 |
const STEPS = [
|
| 6 |
{ type: 'plan', label: 'Understand', detail: 'Turn the brief into explicit requirements' },
|
|
@@ -89,7 +89,7 @@ export default function ResearchWorkspace() {
|
|
| 89 |
</div>
|
| 90 |
<span className="panel-count">{state.datasets.length}</span>
|
| 91 |
</div>
|
| 92 |
-
<
|
| 93 |
</section>
|
| 94 |
|
| 95 |
<aside className="check-panel">
|
|
|
|
| 1 |
import React, { useMemo } from 'react';
|
| 2 |
import { useGame } from '../GameProvider.jsx';
|
| 3 |
+
import CandidateBoard from './CandidateBoard.jsx';
|
| 4 |
|
| 5 |
const STEPS = [
|
| 6 |
{ type: 'plan', label: 'Understand', detail: 'Turn the brief into explicit requirements' },
|
|
|
|
| 89 |
</div>
|
| 90 |
<span className="panel-count">{state.datasets.length}</span>
|
| 91 |
</div>
|
| 92 |
+
<CandidateBoard />
|
| 93 |
</section>
|
| 94 |
|
| 95 |
<aside className="check-panel">
|