sammoftah commited on
Commit
e9eafe8
·
verified ·
1 Parent(s): 61ac8d0

Polish submission copy and candidate board naming

Browse files
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 a project is not.
23
 
24
- HF Agentic Search turns a project brief into a research plan, searches the Hugging Face Hub
25
- from several angles, inspects candidate metadata and Dataset Viewer evidence, tests explicit
26
- constraints, and returns a ranked shortlist with visible reasons. It is designed to be honest
27
- about what it could verify and what still requires human review.
 
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:** `TODO: add a public demo-video URL before final validation`
33
- - **Social post:** `TODO: add the public social-media post URL before final validation`
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 targeting **Best Agent**, **Tiny Titan**, and
123
- **Off Brand**. The custom interface is served through Gradio rather than default Gradio
124
- components.
125
 
126
- Final README checklist from the hackathon email:
127
 
128
- - Tags are present in the YAML block: `track:backyard`, `sponsor:openai`, `achievement:offbrand`.
129
- - The app runs as a Gradio Space inside `build-small-hackathon`.
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 must be replaced with real public links before running the final validator.
133
 
134
- This project was designed, implemented, tested, and prepared for deployment with OpenAI Codex.
135
- Codex-attributed commits are available in the linked public GitHub repository.
 
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-QsNcetEb.js"></script>
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 Canvas from './Canvas.jsx';
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
- <Canvas />
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">